【手把手教你】用backtrader量化回测海龟交易策略 01 引言海龟交易策略是比较经典的趋势交易系统之一,涵盖了从入场交易(品种选择)、仓位管理(基于ATR加减仓)、离场(触... |
您所在的位置:网站首页 › 雪球如何建立模拟仓位信息系统 › 【手把手教你】用backtrader量化回测海龟交易策略 01 引言海龟交易策略是比较经典的趋势交易系统之一,涵盖了从入场交易(品种选择)、仓位管理(基于ATR加减仓)、离场(触... |
来源:雪球App,作者: Python金融量化,(https://xueqiu.com/1444657641/154494557) ![]() 海龟交易策略是比较经典的趋势交易系统之一,涵盖了从入场交易(品种选择)、仓位管理(基于ATR加减仓)、离场(触发条件)的整个过程。机械套用海龟交易法则在A股上进行交易可能效果不佳,但其交易系统的思维和动态仓位管理仍然值得挖掘和学习借鉴。公众号推文《【手把手教你】用Python量化海龟交易法则》简要介绍了海龟交易法则的基本原理,使用Python对其买卖信号进行了可视化分析,并利用Pandas对相关指数和个股运用简化版的海龟交易规则进行了历史回测。本文在此基础上,利用backtrader框架对海龟交易法则进行完整的量化回测。关于backtrader的入门和使用见公众号系列推文。 backtrader系列推文: (1)【手把手教你】入门量化回测最强神器backtrader(一) (2)【手把手教你】入门量化回测最强神器backtrader(二) (3)【手把手教你】入门量化回测最强神器backtrader(三) (4)backtrader如何加载股票因子数据?以换手率、市盈率为例进行回测【附Python代码】 (5)如何用backtrader对股票组合进行量化回测? 02 策略代码以下代码使用Jupyter notebook进行编译。 from __future__ import (absolute_import, division, print_function,unicode_literals)import backtrader as btimport pandas as pdimport tushare as tsimport matplotlib.pyplot as plt%matplotlib inlinefrom pylab import mplmpl.rcParams['font.sans-serif']=['SimHei']mpl.rcParams['axes.unicode_minus']=False 使用tushare获取数据,根据backtrader的数据格式对数据进行处理。 def get_data(code,start='2010-01-01',end='2020-07-16'): df=ts.get_k_data(code,autype='qfq',start=start,end=end) df.index=pd.to_datetime(df.date) df['openinterest']=0 df=df[['open','high','low','close','volume','openinterest']] return df 交易策略 回顾一下海龟交易法则的策略思路: 入场条件:当收盘价突破20日价格高点时,买入一单元股票; 加仓条件:当价格大于上一次买入价格的0.5个ATR(平均波幅),买入一单元股票,加仓次数不超过3次; 止损条件:当价格小于上一次买入价格的2个ATR时清仓; 离场条件:当价格跌破10日价格低点时清仓。 这里的20日价格高点和10日价格低点构成唐奇安通道,所以海龟交易法则也可以理解成通道突破的趋势跟踪。 大家可能有一个疑问,唐奇安通道为啥是以20日、10线为上下轨线,不能是30日、5日或其他吗?当然,这里的20日和10日参数其实是根据经验而定的。不同标的参数选取可能存在一定差异,下面不妨将时间周期作为可变参数,通过参数优化选取合适的时间周期进行回测。 class TurtleStrategy(bt.Strategy): #默认参数 params = (('long_period',20), ('short_period',10), ('printlog', False), ) def __init__(self): self.order = None self.buyprice = 0 self.buycomm = 0 self.buy_size = 0 self.buy_count = 0 # 海龟交易法则中的唐奇安通道和平均波幅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) # 价格与上下轨线的交叉 self.buy_signal = bt.ind.CrossOver(self.data.close(0), self.H_line) self.sell_signal = bt.ind.CrossOver(self.data.close(0), self.L_line) def next(self): if self.order: return #入场:价格突破上轨线且空仓时 if self.buy_signal > 0 and self.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() #加仓:价格上涨了买入价的0.5的ATR且加仓次数少于3次(含) elif self.data.close >self.buyprice+0.5*self.ATR[0] and self.buy_count > 0 and self.buy_count |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |