python实现马丁策略回测3000只股票的实例代码


Posted in Python onJanuary 22, 2021

上一篇文章讲解了如何实现马丁策略,但没有探索其泛化能力,所以这次来尝试回测3000只股票来查看盈利比例。

批量爬取股票数据

这里爬取数据继续使用tushare,根据股票代码来遍历,因为爬取数据需要一定时间,不妨使用多线程来爬取,这里要注意tushare规定每分钟爬取不能超过500次,除非你有很多积分,所以线程数要适当调低。

首先我们生成上证与深证所有股票的代码:

#上证代码
shanghaicode = []
for i in range(600000, 604000, 1):
 shanghaicode.append(str(i))
 
#深证代码
shenzhencode = []
for i in range(1000000, 1005000, 1):
 i = str(i)[1:] 
 shenzhencode.append(i)

然后再定义一个爬取函数,broker则是上一篇文章创建的实例:

def getalldata(code):
  if os.path.exists(datapath + code + '.csv'):
   print(code + 'already existed!')
   return
  metadata = broker.get_stock_pro(code)
  if len(metadata) == 0:
   return
  metadata.to_csv('C:/Users/abc/Desktop/' + code + '.csv',index = False)
  print(code + 'finished!')

导入多线程需要的模块

from concurrent.futures.thread import ThreadPoolExecutor #多线程

遍历所有代码开始爬取,max_workers可适当调整

executor = ThreadPoolExecutor(max_workers=3)
 for datatemp in executor.map(getalldata, shenzhencode):
  pass 
 
 executor = ThreadPoolExecutor(max_workers=3)
 for datatemp in executor.map(getalldata, shanghaicode):
  pass

批量回测股票

数据爬好后则可开始回测了,因为回测是CPU瓶颈运算,所以这里就不使用多线程了,速度差不多。

首先将一只股票的回测程序封装到函数中,回测时间设置为2020年全年,起始资金设置为20万元:

def martinmulti(code):
 broker = backtesting(200000,'20200101', '20201231')
 #获取股票数据
 metadata = pd.read_csv(datapath + code)
 data = np.array(metadata['close'])
 exdata = np.array(metadata['pre_close'])
 everyChange = np.array(metadata['change'])
 date = metadata['trade_date'].values
 everyChange = everyChange/data
 #开始回测
 broker.startbackmartin(data, exdata, everyChange, date)
 dicttemp = {'股票代码': code,'终止现金': broker.cash}
 return dicttemp

遍历股票代码回测并记录终止现金

cashlist = pd.DataFrame(columns= ['股票代码','终止现金'])
for code in datalist:
 datatemp = martinmulti(code)
 cashlist = cashlist.append(datatemp,ignore_index=True)

回测过程如下

python实现马丁策略回测3000只股票的实例代码

接下来看看哪支股票获得了最大利润:

python实现马丁策略回测3000只股票的实例代码

看看平均值

cashlist.mean()
Out[12]: 
终止现金 208279.115166

可以从均值看出马丁策略赚作为一种相对保险的方法赚的不多,当然想要找到一劳永逸的方法是不可能的,并且用平均数不能代表一切,那看看盈利比例如何:

plt.rcParams['font.sans-serif'] = ['SimHei']
plt.style.use('ggplot')
plt.title("盈利分布(万元)")
bins = []
for i in range(10000, 600000, 10000):
 bins.append(i)
plt.hist(cashlist['终止现金'],bins = bins)
plt.axvline(x = cashlist.mean().values,ls="-",c="green")#添加垂直直线

python实现马丁策略回测3000只股票的实例代码

可以看出有折腰的也有翻倍的,且绝大部分集中于20w元旁边,分布图形整体往20万右侧偏移,该策略还有待改进。

到此这篇关于python实现马丁策略回测3000只股票的文章就介绍到这了,更多相关python股票策略回测内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python获取本地计算机名字的方法
Apr 29 Python
用Python实现服务器中只重载被修改的进程的方法
Apr 30 Python
关于Python元祖,列表,字典,集合的比较
Jan 06 Python
Python实现在线暴力破解邮箱账号密码功能示例【测试可用】
Sep 06 Python
使用python装饰器计算函数运行时间的实例
Apr 21 Python
浅谈numpy生成数组的零值问题
Nov 12 Python
详解django自定义中间件处理
Nov 21 Python
python协程之动态添加任务的方法
Feb 19 Python
详解Pandas之容易让人混淆的行选择和列选择
Jul 10 Python
在tensorflow中实现去除不足一个batch的数据
Jan 20 Python
tensorflow入门:TFRecordDataset变长数据的batch读取详解
Jan 20 Python
Softmax函数原理及Python实现过程解析
May 22 Python
Python爬虫回测股票的实例讲解
Jan 22 #Python
python+selenium实现12306模拟登录的步骤
Jan 21 #Python
python基于爬虫+django,打造个性化API接口
Jan 21 #Python
Python 无限级分类树状结构生成算法的实现
Jan 21 #Python
python 制作网站筛选工具(附源码)
Jan 21 #Python
python使用scapy模块实现ping扫描的过程详解
Jan 21 #Python
Python 中如何使用 virtualenv 管理虚拟环境
Jan 21 #Python
You might like
php中使用Akismet防止垃圾评论的代码
2011/06/10 PHP
PHP学习散记_编码(json_encode 中文不显示)
2011/11/10 PHP
PHP const定义常量及global定义全局常量实例解析
2020/05/28 PHP
[原创]网络复制内容时常用的正则+editplus
2006/11/30 Javascript
javascript StringBuilder类实现
2008/12/22 Javascript
浅析jquery的作用与优势
2013/12/02 Javascript
JS保留两位小数,多位小数的示例代码
2014/01/07 Javascript
js函数模拟显示桌面.scf程序示例
2014/04/20 Javascript
node.js中watch机制详解
2014/11/17 Javascript
javascript与css3动画结合使用小结
2015/03/11 Javascript
javascript中Function类型详解
2015/04/28 Javascript
JavaScript实现仿淘宝商品购买数量的增减效果
2016/01/22 Javascript
JavaScript的Backbone.js框架入门学习指引
2016/05/07 Javascript
easyui datebox 时间限制,datebox开始时间限制结束时间,datebox截止日期比起始日期大的实现代码
2017/01/12 Javascript
微信小程序 安全包括(框架、功能模块、账户使用)详解
2017/01/16 Javascript
angular+bootstrap的双向数据绑定实例
2017/03/03 Javascript
JS点击缩略图整屏居中放大图片效果
2017/07/04 Javascript
浅谈在fetch方法中添加header后遇到的预检请求问题
2017/08/31 Javascript
详解Javascript中new()到底做了些什么?
2018/03/29 Javascript
解决Vue.js由于延时显示了{{message}}引用界面的问题
2018/08/25 Javascript
vue + typescript + video.js实现 流媒体播放 视频监控功能
2019/07/07 Javascript
vue中filters 传入两个参数 / 使用两个filters的实现方法
2019/07/15 Javascript
[00:32]2018DOTA2亚洲邀请赛VGJ.T出场
2018/04/03 DOTA
PyCharm设置SSH远程调试的方法
2018/07/17 Python
python使用minimax算法实现五子棋
2019/07/29 Python
vscode写python时的代码错误提醒和自动格式化的方法
2020/05/07 Python
css3 伪类选择器快速复习小结
2019/09/10 HTML / CSS
Hertz荷兰:荷兰和全球租车
2018/01/07 全球购物
马来西亚与新加坡长途巴士售票网站:BusOnlineTicket.com
2018/11/05 全球购物
高三英语教学反思
2014/01/13 职场文书
技校个人求职信范文
2014/01/25 职场文书
幼儿园师德师风学习材料
2014/05/29 职场文书
群众路线教育实践活动民主生活会个人检查对照思想汇报
2014/10/04 职场文书
Vue+Flask实现图片传输功能
2022/04/01 Vue.js
Python之Matplotlib绘制热力图和面积图
2022/04/13 Python
使用refresh_token实现无感刷新页面
2022/04/26 Javascript