01 引言
海龟交易策略是比较经典的趋势交易系统之一,涵盖了从入场交易、仓位管理、离场的整个进程 。机械套用海龟交易法则在A股长进行交易可能效果不佳,但其交易系统的思惟以及动态仓位管理依然值患上发掘以及学习鉴戒 。公家号推文《
用Python量化海龟交易法则
》扼要介绍了海龟交易法则的基本原理,使用Python对于其买卖信号进行了可视化分析,并应用Pandas对于相干指数以及个股运用简化版的海龟交易规则进行了历史回测 。本文在此基础上,应用backtrader框架对于海龟交易法则进行完全的量化回测 。关于backtrader的入门以及使用见公家号系列推文 。
backtrader系列推文:
入门量化回测最强神器backtrader
入门量化回测最强神器backtrader
入门量化回测最强神器backtrader
backtrader如何加载股票因子数据?以换手率、市盈率为例进行回测
如何用backtrader对于股票组合进行量化回测?
02 策略代码
下列代码使用Jupyter notebook进行编译 。
from__future__import(absolute_import,division,print_function,unicode_literals)
importbacktraderasbt
importpandasaspd
importtushareasts
importmatplotlib.pyplotasplt
%matplotlibinline
frompylabimportmpl
mpl.rcParams[&39;]=[&39;]
mpl.rcParams[&39;]=False
使用tushare获取数据,依据backtrader的数据格式对于数据进行处理 。
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
交易策略
回顾一下海龟交易法则的策略思路:
入场前提:当收盘价突破20日价格高点时,买入一单元股票;
加仓前提:当价格大于上一次买入价格的0.5个ATR , 买入一单元股票,加仓次数不超过3次;
止损前提:当价格小于上一次买入价格的2个ATR时清仓;
离场前提:当价格跌破10日价格低点时清仓 。
这里的20日价格高点以及10日价格低点形成唐奇安通道 , 所以海龟交易法则也能够理解成通道突破的趋势跟踪 。
大家可能有一个疑难 , 唐奇安通道为啥是以20日、10线为上下轨线,不能是30日、5日或者其他吗?固然,这里的20日以及10日参数实际上是依据经验而定的 。不同标的参数选取可能存在必定差异,下面无妨将时间周期作为可变参数,通过参数优化选取适合的时间周期进行回测 。
classTurtleStrategy(bt.Strategy):39;long_period&39;short_period&39;printlog&海龟交易法则中的唐奇安通道以及平均波幅ATR
self.H_line=bt.indicators.Highest(self.data.high(-1),period=self.p.long_period)
self.L_line=bt.indicators.Lowest(self.data.low(-1),period=self.p.short_period)
self.TR=bt.indicators.Max((self.data.high(0)-self.data.low(0)),\\
abs(self.data.close(-1)-self.data.high(0)),\\
abs(self.data.close(-1)-self.data.low(0)))
self.ATR=bt.indicators.SimpleMovingAverage(self.TR,period=14)
入?。杭鄹裢黄粕瞎煜咔铱詹质?br />ifself.buy_signal>0andself.buy_count==0:
self.buy_size=self.broker.getvalue()*0.01/self.ATR
self.buy_size=int(self.buy_size/100)*100
self.sizer.p.stake=self.buy_size
self.buy_count=1
self.order=self.buy()
离?。杭鄹竦葡鹿煜咔页植质?br />elifself.sell_signal<0andself.buy_count>0:
self.order=self.sell()
self.buy_count=0
交易记录日志
deflog(self,txt,dt=None,doprint=False):
ifself.params.printlogordoprint:
dt=dtorself.datas[0].datetime.date(0)
print(f&39;)
如果order为submitted/accepted,返回空
iforder.statusin[order.Submitted,order.Accepted]:
return
39;买入:\\n价格:{order.executed.price},\\
本钱:{order.executed.value},\\
手续费:{order.executed.co妹妹}&39;卖出:\\n价格:{order.executed.price},\\
本钱:{order.executed.value},\\
手续费{order.executed.co妹妹}&如果指令取缔/交易失败,讲演结果
eliforder.statusin[order.Canceled,order.Margin,order.Rejected]:
self.log(&39;)
self.order=None
39;策略收益:\\n毛收益{trade.pnl:.2f},净收益{trade.pnlco妹妹:.2f}&39;(组合线:{self.p.long_period},{self.p.short_period});\\
期末总资金:{self.broker.getvalue():.2f}&39;stake&39;qfq&39;r&39;价格走势\\n&39;:&39;期间累计涨幅:{(dd.close[-1]/dd.close[0]-1)*100:.2f}%&39;round,pad=0.5&39;yellow&39;green&39;&创立主节制器
cerebro=bt.Cerebro()
获取数据
df=ts.get_k_data(code,autype=&39;,start=start,end=end)
df.index=pd.to_datetime(df.date)
df=df[[&39;,&39;,&39;,&39;,&39;]]
broker设置资金、手续费
cerebro.broker.setcash(startcash)
cerebro.broker.setco妹妹ission(co妹妹ission=com)
39;期初总资金:%.2f&39;sh&39;上证综指&39;2010-01-01&39;2020-07-17&39;sh&39;2010-01-01&39;2020-07-17&回测实例df00,df0,df1,df2,df3,df4=performance(&39;,50,5,&39;,&39;,1000000,0.001)
39;line&39;total_value&39;账户价值&39;total_position_value&39;持仓市值&39;year_rate&39;年化收益%&39;bar&39;601318&39;中国平安&39;2010-01-01&39;2020-07-17&39;601318&39;2010-01-01&39;2020-07-16',startcash=100000)
中国平安回测绩效指标:
中国平安回测期间账户价值:
中国平安回测期间持仓市值:
中国平安回测期间年化收益:
04
【「手把手教你」用backtrader量化回测海龟交易策略】以上就是朝夕生活(www.30zx.com)关于“「手把手教你」用backtrader量化回测海龟交易策略”的详细内容,希望对大家有所帮助!
猜你喜欢
- 奥迪A4L烧机油大修,不是所有大修都能治烧机油的,得对路才行
- 大银行消费贷利率降到3.24%?收入不乱的工作更易拿到低息贷款
- 常上“不健康”网站无人知?看到这个提醒就要谨慎中病毒了
- 「手把手教你」Python实现量价形态选股
- PPT 一文读懂供应链金融
- 金融从业第一关——证券从业资格考试
- 「手把手教你」使用pyfinance进行证券收益分析
- 在家偷看“不良网站”,以为能瞒天过海?手机上这3痕迹出卖你!
- 优先股概念概念股龙头有哪些?2023优先股概念概念股龙头一览
