【手把手教你】用backtrader量化回测海龟交易策略 01 引言海龟交易策略是比较经典的趋势交易系统之一,涵盖了从入场交易(品种选择)、仓位管理(基于ATR加减仓)、离场(触... 

您所在的位置:网站首页 雪球如何建立模拟仓位信息系统 【手把手教你】用backtrader量化回测海龟交易策略 01 引言海龟交易策略是比较经典的趋势交易系统之一,涵盖了从入场交易(品种选择)、仓位管理(基于ATR加减仓)、离场(触... 

【手把手教你】用backtrader量化回测海龟交易策略 01 引言海龟交易策略是比较经典的趋势交易系统之一,涵盖了从入场交易(品种选择)、仓位管理(基于ATR加减仓)、离场(触... 

#【手把手教你】用backtrader量化回测海龟交易策略 01 引言海龟交易策略是比较经典的趋势交易系统之一,涵盖了从入场交易(品种选择)、仓位管理(基于ATR加减仓)、离场(触... | 来源: 网络整理| 查看: 265

来源:雪球App,作者: Python金融量化,(https://xueqiu.com/1444657641/154494557)

01 引言

海龟交易策略是比较经典的趋势交易系统之一,涵盖了从入场交易(品种选择)、仓位管理(基于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