海龟交易法则在期货中的python代码实现

一、什么是海龟交易法则

海龟交易法是著名的公开交易系统,1983年著名的商品投机家理查德. 丹尼斯在一个交易员培训班上推广而闻名于世。其法则覆盖了交易的各个方面,并且不给交易员留下一点主观想象决策的余地。它是一套非常完整的趋势跟随型的自动化交易策略,具备一个完整的交易系统的所有成分。.这个复杂的策略在入场条件、仓位控制、资金管理、止损止盈等各个环节,都进行了详细的设计,它基本上可以作为复杂交易策略设计和开发的模板。对于币市的大涨大跌行情,海龟交易法则正是应付这种极端行情的利器。

二、策略的实现方法

  1. 趋势信号的捕捉

    在趋势信号的扑捉上,海龟交易法则使用了一个非常重要的技术指标——唐奇安通道(Donchian channel)。这个通道很类似布林通道(Bollinger Bands),只是在具体计算方式上有些不一样。 唐奇安通道指标是Richard Donchian发明的,由3条不同颜色的曲线组成,该指标用周期(一般都是20,可以进行修改)内的最高价和最低价来显示市场价格的波动性,当其通道窄时表示市场波动较小,反之通道宽则表示市场波动比较大。

    当价格冲破该通道的上轨道时,就是可能的买信号;反之,冲破下轨时就是可能的卖信号。唐奇安通道的各项指标的计算方法为:

    • 上轨 = Max(最高价,n), n日最高价的最大值
    • 下轨 = Min(最低价,n),n日最低价的最小值
    • 中轨 = ( 上轨 + 下轨 ) / 2
  2. 仓位的基本单位Unit

    海龟法则的加仓原则是定义好一个小单位(Unit),使得该仓位的预期价值波动与总净资产的1%对应。也就是说,如果买入了这1个小单位的资产,那当天该仓位的市值变动幅度不会超过总净资产的1%。

    那么,如何定义这个小单位?又如何预估这个小单位能带来的价值波动呢?首先,在预估这个小单位带来的价值波动(该价值波动被称为N)上,海龟策略使用了对历史的价格波动进行统计的方法。具体计算公式如下:

    • TrueRange = Max( High − Low, High − PreClose, PreClose − Low )
    • N = ( 前19日的N值之和 + 当时的TrueRange ) / 20
      其中,High表示当日最高价,Low表示当日最低价,PreClose表示前一日收盘价。
      我们可以从定义上看出,N值确实能很恰当地表达该资产在价格上的最近波动幅度。
      这样,一个Unit就应该是这样计算出来的:
    • Unit = ( 1% * Total_net ) / N
      其中total_net就是总资产净值。
      可以看出,一个Unit的资产的价格波动幅度 = 总净资产的1%。
  3. 建仓

    建仓的动作来自于趋势突破信号的产生。如果当前价格冲破唐奇安通道上轨,就产生了一个买的建仓信号,如果当前价格跌破下轨,就产生了一个卖空的建仓信号。初始建仓的大小为1个Unit。

  4. 加仓

    • 如果开的底仓是多仓,且行情最新价在上一次建仓(或者加仓)的基础上又上涨了0.5N,就再加一个Unit的多仓。
    • 如果开的底仓是空仓,且行情最新价在上一次建仓(或者加仓)的基础上又下跌了0.5N,就再加一个Unit的空仓。
    • 我们看到,海龟策略其实是一个追涨杀跌的策略的。
  5. 止损

    • 如果开的底仓是多仓,且行情最新价在上一次建仓(或者加仓)的基础上又下跌了2N,就卖出全部头寸,平仓止损。
    • 如果开的底仓是空仓,且行情最新价在上一次建仓(或者加仓)的基础上又上涨了2N,就买入全部头寸,平仓止损。
    • 当然,也可以自定义止损方案,使止损策略更符合所选的合约、适应自定义的个性化策略优化方案。
  6. 止盈

    • 如果开的底仓是多仓,且行情最新价跌破了10日唐奇安通道的下轨,就清空所有头寸结束策略。
    • 如果开的底仓是空仓,且行情最新价升破了10日唐奇安通道的上轨,就清空所有头寸结束策略。
    • 当然,可以自定义动态止盈方案。

三、代码实现

  • 工具:

模拟、实盘交易开源框架 TqSdk

(TqSdk文档: http://doc.shinnytech.com/pysdk/latest/index.html

Python 金融指数处理库Ta-Lib

(Talib文档:https://mrjbq7.github.io/ta-lib/doc_index.html

  1. 指标计算

    获取K线序列,根据定义计算出唐奇安通道上下轨。

    把K线转为pandas.DataFrame便于计算;使用talib库的ATR函数计算出N值(即平均真实波幅),然后根据账户权益的1%计算买卖单位unit。

  2.  建仓

    在净持仓数为0时:获取最新行情价,如果当前最新价大于唐奇安通道的上轨,则买入一个unit(此时持多仓);如果当前最新价小于唐奇安通道的下轨,则卖出一个unit(此时持空仓)。

  3. 加仓、止损、止盈

    在净持仓数不为0时:判断是持多仓还是空仓,获取最新行情价,根据加仓、止损、止盈策略的条件进行相应的仓位操作。

  4. 策略源代码

    https://github.com/shinnytech/tqsdk-python/blob/master/tqsdk/demo/example/turtle.py

四、回测

  1. 回测初始参数设置

    • 初始账户资金:100万
    • 回测日期:2018.9.10 —— 2018.11.12
    • 唐其安通道开仓天数周期:20
    • 唐其安通道止盈天数周期:10
    • 计算ATR所用天数:20
    • 允许下单的最高风险度:50%
    • 回测时盘口行情quote的更新频率:和K线分钟线的更新频率一致
  2. 回测结果

    海龟策略回测结果
    合约代码 合约品种 收益率 风险度 最大回撤 年化夏普率
    SHFE.hc1901 热卷 16.01% 44.64% 10.70% 2.1534
  3. 上表回测合约的累积收益走势图

    策略参考:https://www.douban.com/group/topic/104900172/