暂无分类
暂无标签
发布于2021-01-13 21:27 阅读(118) 评论(0) 点赞(3) 收藏(2)
0
1
2
3
4
5
6
7
8
9
我们本期的源码给大家带来的是视频配套的量化交易框架backtrader的双均线策略回测源码,利用backtrader来回测我们之前的双均线交易策略。
开始前,我们需要安装backtrader的包
pip install backtrader
安装完成之后,我们下面就开始利用backtrader进行我们策略的回测。
我们按照步骤,跟大家进行回测源码的解析。
导入包
import backtrader as btimport tushare as tsimport pandas as pdfrom datetime import datetime
定义一个方法进行数据的预处理,数据预处理主要是为了按照backtrader的数据格式要求进行整理,整理成backtrader可识别的数据结构。
def get_data(start): df = ts.pro_bar(ts_code='000001.SZ', adj='qfq', start_date=start) df = df.iloc[::-1] df.index = pd.to_datetime(df.trade_date) df['openinterest'] = 0 df = df[['open', 'high', 'low', 'close', 'vol', 'openinterest']] df = df.rename(columns={'vol': 'volume'}) return df
继承backtrader提供的strategy类,根据我们策略的思维,进行回测策略的编写。这边的核心代码部分是next的函数方法。
class MyStrategy(bt.Strategy): def log(self, txt, dt = None): dt = dt or self.datas[0].datetime.date(0) print('%s,%s' % (dt.isoformat(), txt)) def __init__(self): # 指定价格序列 self.dataclose = self.datas[0].close # 交易定订单状态初始化 self.order = None # 计算两条均线的值 self.wma = bt.talib.WMA(self.dataclose, timeperiod=15) self.dema = bt.talib.DEMA(self.dataclose, timeperiod=15) def next(self): # 检查订单状态 if self.order: print("等待成交") # 检查持仓 if not self.position: # 没有持仓,买入开仓 if self.dema[0] > self.wma[0]: print('===============') print("快均线上穿慢均线,执行买入") self.order = self.buy(size=5000) else: # 手里有持仓,判断卖平 if self.dema[0] < self.wma[0]: print('===============') print("快均线下穿慢均线,执行卖出") self.order = self.sell(size=5000) def notify_order(self, order): if order.status in [order.Submitted, order.Accepted]: if order.status in [order.Submitted]: self.log("提交订单……") if order.status in [order.Accepted]: self.log("接受订单……") return if order.status in [order.Completed]: if order.isbuy(): self.log("执行买入,%.2f"%order.executed.price) if order.issell(): self.log("执行卖出,%.2f"%order.executed.price) self.log('订单完成!') print("======================") self.order = None
最后,我们将数据和策略放入backtrader的broker,同时设定初始化参数,比如资金和手续费等。设置完成后,我们调用start方法启动回测,回测完成后,我们画出回测结果的可视化图形。
# 第一步 获取数据start = datetime(2020, 1, 1)end = datetime(2020, 11, 26)k_line_data = get_data(start.date().strftime("%Y%M%D"))# 最终需要的数据data = bt.feeds.PandasData(dataname=k_line_data, fromdate=start, todate=end)# 加载backtrader引擎back_trader = bt.Cerebro()# 将数据传入back_trader.adddata(data)# 策略加进来back_trader.addstrategy(MyStrategy)#back_trader.broker.set_coc(True)# 账户资金初始化startCash = 100000back_trader.broker.setcash(startCash)# 设置手续费back_trader.broker.setcommission(commission=0.001)# 输出初始数据d1 = start.strftime("%Y%M%D")d2 = end.strftime("%Y%M%D")print(f'初始化资金:{startCash},回测时间:{d1}:{d2}')# 开启回测results = back_trader.run()print('最终资金:%.2f'%back_trader.broker.getvalue())back_trader.plot(style='candlestick')
回测结果如下:
我们简单看下回测结果:
我们设置的初始资金是10万元整,最终的资金是122685,盈利了22685元。
在回测的区间,从2020年1月到2020年11月26号间,总共进行了4次交易,2次2次亏损。
从盈利结果来看,似乎是不错的。
但是,这里jeevan要提醒大家一点的是,回测不仅仅只是看回测最后的资金,一个好的策略,还应当包括策略的胜率,盈亏比,夏普率等等的因素综合考虑。我们这里仅演示如何使用backtrader,并不是一个完整的回测分析。
关于回测,我们后续会专门开课题跟大家讲如何进行真正的回测。
更多内容,欢迎关注头条号西瓜视频进行学习。
喜欢我们知识内容的,欢迎转发,点个【在看】支持下吧。转发本文章到朋友圈,给我们留言,即可获得完整的打包源码哦。
原文链接:https://blog.csdn.net/weixin_32616931/article/details/112536162
0
1
2
3
4
5
作者:虎王168
链接: https://www.pythonheidong.com/blog/article/764504/eba106c963a8209793f9/
来源: python黑洞网
任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任
昵称:
评论内容:(最多支持255个字符)
Copyright © 2018-2019 python黑洞网 All Rights Reserved 版权所有,并保留所有权利。 京ICP备18063182号-1
投诉与举报,广告合作请联系z452as@163.com或QQ3083709327
免责声明:网站文章均由用户上传,仅供读者学习交流使用,禁止用做商业用途。若文章涉及色情,反动,侵权等违法信息,请向我们举报,一经核实我们会立即删除!