一 【手把手教你】入门量化回测最强神器backtrader

1引言
目前基于Python的量化回测框架有很多,开源框架有zipline、vnpy、pyalgotrader和backtrader等,而量化平台有Quantopian、聚宽、万矿、优矿、米筐、掘金等,这些量化框架或平台各有优劣 。就个人而言,比较偏好用backtrader,因为它功能十分完善,有完整的使用文档,安装相对简单 。优点是运行速度快 , 支持pandas的矢量运算;支持参数自动寻优运算 , 内置了talib股票分析技术指标库;支持多品种、多策略、多周期的回测和交易;支持pyflio、empyrica分析模块库、alphalens多因子分析模块库等;扩展灵活,可以集成TensorFlow、PyTorch和Keras等机器学习、神经网络分析模块 。而不足之处在于 , backtrader学习起来相对复杂,编程过程中使用了大量的元编程,如果Python编程基础不扎实,学起来会感到吃力 。本文作为backtrader的入门系列之一 , 对其运行框架进行简要介绍,并以实际案例展示量化回测的过程 。
2backtrader简介
如果将backtrader包分解为核心组件,主要包括以下组成部分:数据加载:将交易策略的数据加载到回测框架中 。
交易策略:该模块是编程过程中最复杂的部分,需要设计交易决策,得出买入/卖出信号 。回测框架设置:需要设置初始资金佣金数据馈送交易策略交易头寸大小 。运行回测:运行Cerebro回测并打印出所有已执行的交易 。评估性能:以图形和风险收益等指标对交易策略的回测结果进行评价 。
“Lines”是backtrader回测的数据,由一系列的点组成,通常包括以下类别的数据:Open, High, Low, Close, Volume, OpenInterest 。Data Feeds、Indicators和Strategies都会生成 Lines 。价格数据中的所有”Open” (开盘价)按时间组成一条 Line 。所以,一组含有以上6个类别的价格数据,共有6条 Lines 。如果算上“DateTime”,一共有7条 Lines 。当访问一条 Line 的数据时 , 会默认指向下标为 0 的数据 。最后一个数据通过下标 -1 来访问,在-1之后是索引0,用于访问当前时刻 。因此 , 在回测过程中,无需知道已经处理了多少条/分钟/天/月,”0”一直指向当前值,下标 -1 来访问最后一个值 。
3回测应用实例
量化回测说白了是使用历史数据去验证交易策略的性能,因此回测的第一步是搭建交易策略 , 这也是backtrader要设置的最重要和复杂的部分,策略设定好后,其余部分的代码编写是手到擒来 。
01构建策略
交易策略类代码包含重要的参数和用于执行策略的功能,要定义的参数或函数名如下:
params-全局参数,可?。焊慕灰撞呗灾斜淞?参数的值,可用于参数调优 。
log:日志,可?。杭锹疾呗缘闹葱腥罩?,可以打印出该函数提供的日期时间和txt变量 。
__init__:用于初始化交易策略的类实例的代码 。
notify_order,可?。焊俳灰字噶畹淖刺?。order具有提交,接受 , 买入/卖出执行和价格,已取消/拒绝等状态 。
notify_trade,可?。焊俳灰椎淖刺?nbsp;, 任何已平仓的交易都将报告毛利和净利润 。
next,必?。褐贫ń灰撞呗缘暮?策略模块最核心的部分 。
下面以一个简单的单均线策略为例 , 展示backtrader的使用过程,即当收盘价上涨突破20日均线买入 , 当收盘价下跌跌穿20日均线卖出 。为简单起见,不报告交易回测的日志,因此log、notify_order和notify_trade函数省略不写 。
classmy_strategy1(bt.Strategy):
39;maperiod&指定价格序列
self.dataclose=self.datas[0].close
添加移动均线指标,内置了talib模块
self.sma=bt.indicators.SimpleMovingAverage(
self.datas[0],period=self.params.maperiod)
defnext(self):
ifself.order:检查是否持仓
ifnotself.position:执行买入条件判断:收盘价格上涨突破20日均线
ifself.dataclose[0]>self.sma[0]:
执行卖出条件判断:收盘价格跌破20日均线
ifself.dataclose[0]<self.sma[0]:
39;axes.unicode_minus&先引入后面可能用到的包
importpandasaspd
fromdatetimeimportdatetime
importbacktraderasbt
importmatplotlib.pyplotasplt
%matplotlibinline
39;font.sans-serif&39;SimHei&使用tushare旧版接口获取数据
importtushareasts
defget_data(code,start=&39;,end=&39;):
df=ts.get_k_data(code,autype=&39;,start=start,end=end)
df.index=pd.to_datetime(df.date)
df[&39;]=0
df=df[[&39;,&39;,&39;,&39;,&39;,&39;]]
returndf
dataframe=get_data(&39;)
加载数据
data=https://www.30zx.com/bt.feeds.PandasData(dataname=dataframe,fromdate=start,todate=end)
03 回测设置
回测设置主要包括几项:回测系统初始化,数据加载到回测系统,添加交易策略,broker设置 , 头寸规模设置作为策略一部分的交易规模等,最后显示执行交易策略时积累的总资金和净收益 。
将数据传入回测系统
cerebro.adddata(data)
设置初始资本为10,000
startcash=10000
cerebro.broker.setcash(startcash)
39;净收益: {round(pnl,2)}&39;%Y%m%d&39;%Y%m%d&39;初始资金:{startcash}\\n回测期间:{d1}:{d2}&运行回测系统
cerebro.run()
打印结果
print(f&39;)结果如下:初始资金:10000
回测期间:20100331:20200331
总资金:12065.36
净收益:2065.36
05 可视化
对上述结果进行可视化 , 使用内置的matplotlib画图 。至此 , 简单的单均线回测就完成了 。下面图形展示了浦发银行在回测期间的价格走势、买卖点和交易总资金的变化等 。当然,本文着重以最简化的例子展示backtrader的框架和运行过程,要想更详细的展示回测过程和结果,还需要加入其他函数和模块,关于Analyzers分析模块的应用请留意下一篇推文 。
【一 【手把手教你】入门量化回测最强神器backtrader】%matplotlibinline39;candlestick')
4
以上就是朝夕生活(www.30zx.com)关于“【手把手教你】入门量化回测最强神器backtrader(一)”的详细内容,希望对大家有所帮助!

猜你喜欢