「手把手教你」用backtrader量化回测海龟交易策略

01引言

海龟交易策略是比较经典的趋势交易系统之一,涵盖了从入场交易(品种选择)、仓位管理(基于ATR加减仓)、离场(触发条件)的整个过程。机械套用海龟交易法则在A股上进行交易可能效果不佳,但其交易系统的思维和动态仓位管理仍然值得挖掘和学习借鉴。公众号推文《

【手把手教你】用Python量化海龟交易法则

》简要介绍了海龟交易法则的基本原理,使用Python对其买卖信号进行了可视化分析,并利用Pandas对相关指数和个股运用简化版的海龟交易规则进行了历史回测。本文在此基础上,利用backtrader框架对海龟交易法则进行完整的量化回测。关于backtrader的入门和使用见公众号系列推文。

backtrader系列推文:

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

(2)【手把手教你】入门量化回测最强神器backtrader(二)

(3)【手把手教你】入门量化回测最强神器backtrader(三)

(4)backtrader如何加载股票因子数据?以换手率、市盈率为例进行回测【附Python代码】

(5)如何用backtrader对股票组合进行量化回测?

02策略代码

以下代码使用Jupyternotebook进行编译。

from__future__import(absolute_import,division,print_function,unicode_literals)import%['']=['SimHei']['_minus']=False

使用tushare获取数据,根据backtrader的数据格式对数据进行处理。

defget_data(code,start='2010-01-01',='2020-07-16'):df=_k_data(code,autype='qfq',start=start,=)=_datetime()df['openinterest']=0df=df[['open','high','low','close','volume','openinterest']]returndf

交易策略

回顾一下海龟交易法则的策略思路:

入场条件:当收盘价突破20日价格高点时,买入一单元股票;

加仓条件:当价格大于上一次买入价格的0.5个ATR(平均波幅),买入一单元股票,加仓次数不超过3次;

止损条件:当价格小于上一次买入价格的2个ATR时清仓;

离场条件:当价格跌破10日价格低点时清仓。

这里的20日价格高点和10日价格低点构成唐奇安通道,所以海龟交易法则也可以理解成通道突破的趋势跟踪。

大家可能有一个疑问,唐奇安通道为啥是以20日、10线为上下轨线,不能是30日、5日或其他吗?当然,这里的20日和10日参数其实是根据经验而定的。不同标的参数选取可能存在一定差异,下面不妨将时间周期作为可变参数,通过参数优化选取合适的时间周期进行回测。

classTurtleStrategy():海龟交易法则中的唐奇安通道和平均波幅_line=((-1),period=_period)_line=((-1),period=_period)=(((0)-(0)),\abs((-1)-(0)),\abs((-1)-(0)))=(,period=14)入场:价格突破上轨线且空仓时__count==0:_size=()*0.01/_size=int(_size/100)*100=__count=1=()离场:价格跌破下轨线且持仓时__count0:=()_count=0交易记录日志(默认不打印结果)deflog(self,txt,dt=None,doprint=False)::dt=[0].(0)print(f'{()},{txt}')如果order为submitted/accepted,返回空[,]:return如果指令取消/交易失败,报告结果[,,]:('交易失败')=None创建主控制器cerebro=()获取数据df=_k_data(code,autype='qfq',start=start,=)=_datetime()df=df[['open','high','low','close','volume']]broker设置资金、手续费(startcash)(commission=com)回测实例
df00,df0,df1,df2,df3,df4=performance('sh',50,5,'2010-01-01','2020-07-17',1000000,0.001)

#输出结果:

2020-07-17,(组合线:50,5);期末总资金:1541612.17

量化回测绩效评价指标:

df00

对交易标的回测结果进行可视化,包含账户价值、持仓价值和每年的年化收益率。

defplot_result_py(data,v,title,plot_type='line',zoom=False):代码略,完整代码见知识星球
plot_result_py(df0,'total_value','账户价值')

plot_result_py(df4,'total_position_value','持仓市值')

plot_result_py(df3,'year_rate','年化收益%',plot_type='bar')

个股回测

由于指数不可直接交易,下面以中国平安(601318)股票为例进行回测。下图显示,如果以“买入持有”策略交易中国平安,十年来累计收益率达到232.62%,远远跑赢上证综指。

plot_stock('601318','中国平安','2010-01-01','2020-07-17')

参数优化显示,中国平安最佳参数刚好是海龟交易法则提出的(20,10)日组合,看来先贤总结的经验还是值得推敲的。

long_list=range(20,70,5)short_list=range(5,20,5)main('601318',long_list,short_list,'2010-01-01','2020-07-16',startcash=100000)

中国平安回测绩效指标:

中国平安回测期间账户价值:

中国平安回测期间持仓市值:

中国平安回测期间年化收益:

04结语

本文基于backtrader,构建了海龟交易法则的完整回测框架,并分别以上证综指和中国平安为例进行了回测。从回测实例看,海龟交易法则优于“买入持有”策略,(20,10)日线的参数选择可能只适合某些标的。当然这里只是简单举了两个例子,所以还无法将结论进一步推广。本文的目的主要在于为大家深入研究海龟交易法则的量化提供思路和分析框架,而不在于验证该策略是否适用于A股市场。上述回测过程给人的直观感受是回归交易法则更像是一个择时策略,即在价格触发某条件时买入\卖出。实际上择时和选股有时候是一个硬币的两面,没有本质上的区别。如果以所有A股为股票池(当然可以先剔除ST、业绩亏损、超大盘等),加入遍历循环,当某只股票满足突破上轨(如20日最高价)时买入构建投资组合,当跌破下轨(如10日最低价)或满足止损条件时从组合中剔除,这时候海龟交易法则兼有选股和择时,感兴趣的读者可以进一步去挖掘和分析。

参考资料:

1.backtrader官方文档和安装包原生代码

2.知乎:量化投资2:基于backtrader实现完整海龟法则量化回测

关于Python金融量化


免责声明:本文章如果文章侵权,请联系我们处理,本站仅提供信息存储空间服务如因作品内容、版权和其他问题请于本站联系