1. 原理

由Michael Chalek在20世纪80年代开发的Dual Thrust策略是一个趋势跟踪策略。

其核心思想是定义一个区间,区间的上界和下界分别为支撑线和阻力线。当价格超过上界时,如果持有空仓,先平再开多;如果没有仓位,直接开多。当价格跌破下界时,如果持有多仓,则先平仓,再开空仓;如果没有仓位,直接开空仓。

上下界的设定是交易策略的核心部分。在计算上下界时共用到:最高价、最低价、收盘价、开盘价四个参数。

公式如下:

Range = Max(HH-LC,HC-LL)

上限:Open + K1 Range
下限:Open + k2 
Range

K1 和 K2一般根据自己经验以及回测结果进行优化。

2. 策略逻辑

第一步:设置参数N、k1、k2
第二步:计算HH、LC、HC、LL
第三步:计算range
第四步:设定做多和做空信号

回测标的:SHFE.rb2010
回测期:2020-02-07 15:00:00 到 2020-04-15 15:00:00
回测初始资金:3万

注意:若修改回测期,需要修改对应的回测标的。

3. 策略代码

  1. # coding=utf-8
  2. from __future__ import print_function, absolute_import
  3. from gm.api import *
  4. """
  5. Dual Thrust是一个趋势跟踪系统
  6. 计算前N天的最高价-收盘价和收盘价-最低价。然后取这2N个价差的最大值,乘以k值。把结果称为触发值。
  7. 在今天的开盘,记录开盘价,然后在价格超过上轨(开盘+触发值)时马上买入,或者价格低于下轨(开盘-触发值)时马上卖空。
  8. 没有明确止损。这个系统是反转系统,也就是说,如果在价格超过(开盘+触发值)时手头有空单,则平空开多。
  9. 同理,如果在价格低于(开盘-触发值)时手上有多单,则平多开空。
  10. 选用了SHFE的rb2010 在2020-02-07 15:00:00 到 2020-04-15 15:00:00' 进行回测。
  11. 注意:
  12. 1:为回测方便,本策略使用了on_bar的一分钟来计算,实盘中可能需要使用on_tick。
  13. 2:实盘中,如果在收盘的那一根bar或tick触发交易信号,需要自行处理,实盘可能不会成交
  14. """
  15. # 策略中必须有init方法
  16. def init(context):
  17. # 设置要进行回测的合约(可以在掘金终端的仿真交易中查询标的代码)
  18. context.symbol = 'SHFE.rb2010' # 订阅&交易标的, 此处订阅的是上期所的螺纹钢 2010
  19. # 设置参数
  20. context.N = 5
  21. context.k1 = 0.2
  22. context.k2 = 0.2
  23. # 获取当前时间
  24. time = context.now.strftime('%H:%M:%S')
  25. # 如果策略执行时间点是交易时间段,则直接执行algo定义buy_line和sell_line,以防直接进入on_bar()导致context.buy_line和context.sell_line未定义
  26. if '09:00:00' < time < '15:00:00' or '21:00:00' < time < '23:00:00':
  27. algo(context)
  28. # 如果是交易时间段,等到开盘时间确保进入algo()
  29. schedule(schedule_func = algo, date_rule = '1d', time_rule = '09:00:00')
  30. schedule(schedule_func = algo, date_rule = '1d', time_rule = '21:00:00')
  31. # 只需要最新价,所以只需要订阅一个, 如果用tick,次数太多,用一分钟线代替
  32. subscribe(symbols=context.symbol, frequency='60s', count = 1)
  33. def algo(context):
  34. # 取历史数据
  35. data = history_n(symbol=context.symbol, frequency='1d', end_time=context.now,
  36. fields='symbol,open,high,low,close', count=context.N + 1, df=True)
  37. # 取开盘价
  38. # 回测模式下,开盘价可以直接用history_n取到
  39. if context.mode == 2:
  40. # 获取当天的开盘价
  41. current_open = data['open'].loc[context.N]
  42. # 去掉当天的实时数据
  43. data.drop(context.N, inplace = True)
  44. # 如果是实时模式,开盘价需要用current取到
  45. else:
  46. # 获取当天的开盘价
  47. current_open = current(context.symbol)[0]['open']
  48. # 计算Dual Thrust 的上下轨
  49. HH = data['high'].max()
  50. HC = data['close'].max()
  51. LC = data['close'].min()
  52. LL = data['low'].min()
  53. range = max(HH - LC, HC - LL)
  54. context.buy_line = current_open + range * context.k1 # 上轨
  55. context.sell_line = current_open - range * context.k2 # 下轨
  56. def on_bar(context, bars):
  57. # 取出订阅的这一分钟的bar
  58. bar = bars[0]
  59. # 取出买卖线
  60. buy_line = context.buy_line
  61. sell_line = context.sell_line
  62. # 获取现有持仓
  63. position_long = context.account().position(symbol=context.symbol, side=PositionSide_Long)
  64. position_short = context.account().position(symbol=context.symbol, side=PositionSide_Short)
  65. # 交易逻辑部分
  66. # 如果超过range的上界
  67. if bar.close > buy_line:
  68. if position_long: # 已经持有多仓,直接返回
  69. return
  70. elif position_short: # 已经持有空仓,平仓再做多。
  71. order_volume(symbol=context.symbol, volume=1, side=OrderSide_Buy,
  72. order_type=OrderType_Market, position_effect=PositionEffect_Close)
  73. print('市价单平空仓', context.symbol)
  74. order_volume(symbol=context.symbol, volume=1, side=OrderSide_Buy,
  75. order_type=OrderType_Market, position_effect=PositionEffect_Open)
  76. print('市价单开多仓', context.symbol)
  77. else: # 没有持仓时,市价开多。
  78. order_volume(symbol=context.symbol, volume=1, side=OrderSide_Buy,
  79. order_type=OrderType_Market, position_effect=PositionEffect_Open)
  80. print('市价单开多仓', context.symbol)
  81. # 如果低于range的下界
  82. elif bar.close < sell_line:
  83. if position_long: # 已经持有多仓, 平多再开空。
  84. order_volume(symbol=context.symbol, volume=1, side=OrderSide_Sell,
  85. order_type=OrderType_Market, position_effect=PositionEffect_Close)
  86. print('市价单平多仓', context.symbol)
  87. order_volume(symbol=context.symbol, volume=1, side=OrderSide_Sell,
  88. order_type=OrderType_Market, position_effect=PositionEffect_Open)
  89. print('市价单开空仓', context.symbol)
  90. elif position_short: # 已经持有空仓,直接返回。
  91. return
  92. else: # 没有持仓,直接开空
  93. order_volume(symbol=context.symbol, volume=1, side=OrderSide_Sell,
  94. order_type=OrderType_Market, position_effect=PositionEffect_Open)
  95. print('市价单开空仓', context.symbol)
  96. if __name__ == '__main__':
  97. '''
  98. strategy_id策略ID,由系统生成
  99. filename文件名,请与本文件名保持一致
  100. mode实时模式:MODE_LIVE回测模式:MODE_BACKTEST
  101. token绑定计算机的ID,可在系统设置-密钥管理中生成
  102. backtest_start_time回测开始时间
  103. backtest_end_time回测结束时间
  104. backtest_adjust股票复权方式不复权:ADJUST_NONE前复权:ADJUST_PREV后复权:ADJUST_POST
  105. backtest_initial_cash回测初始资金
  106. backtest_commission_ratio回测佣金比例
  107. backtest_slippage_ratio回测滑点比例
  108. '''
  109. run(strategy_id='strategy_id',
  110. filename='main.py',
  111. mode=MODE_BACKTEST,
  112. token='token_id',
  113. backtest_start_time='2020-02-07 15:00:00',
  114. backtest_end_time='2020-04-15 15:00:00',
  115. backtest_initial_cash= 30000,
  116. backtest_commission_ratio=0.0001,
  117. backtest_slippage_ratio=0.0001)

4. 回测结果与稳健性分析

设定初始资金3万,手续费率为0.01%,滑点比率为0.01%,N=5,K1=0.2,K2=0.2,回测期为2020-02-07 到 2020-04-15时,回测结果如下图所示。

回测期策略累计收益率为9.88%,年化收益率为52.29%。同期沪深300指数收益率为-2.63%,策略跑赢沪深300指数。最大回撤为5.20%,夏普比率为2.63。

为了检验策略的稳健性,设置不同的k1、k2参数,并且设置不同的回测期,检验回测结果。回测结果如下表所示。

K1 K2 回测期 年化收益率 最大回撤
0.2 0.2 2020.02.07-2020.04.15 52.29% 5.20%
0.3 0.3 2020.02.07-2020.04.15 54.93% 8.80%
0.4 0.4 2020.02.07-2020.04.15 43.40% 4.58%
0.5 0.5 2020.02.07-2020.04.15 -22.15% 7.08%
0.5 0.5 2020.04.07-2020.06.15 6.43% 4.60%
0.5 0.5 2020.06.07-2020.09.15 -24.21% 9.80%

可以发现,在2020年2月-2020年4月,不论k1、k2如何设置,收益率均维持为正,回撤比较稳定。在其他月份,回测结果较差。说明回测参数设置对于回测结果的影响较小,回测期对于回测结果的影响较大。

Dual Thrust(期货)相关推荐

  1. python量化外汇交易_用Python实现一个Dual Thrust数字货币量化交易策略

    Dual Thrust交易算法介绍 Dual Thrust交易算法是由Michael Chalek开发的著名量化交易策略.它通常用于期货,外汇和股票市场.Dual Thrust的概念属于典型的突破交易 ...

  2. python 用while输出数字金字塔_用Python实现一个Dual Thrust数字货币量化交易策略

    Dual Thrust交易算法介绍 Dual Thrust交易算法是由Michael Chalek开发的著名量化交易策略.它通常用于期货,外汇和股票市场.Dual Thrust的概念属于典型的突破交易 ...

  3. 第四章:经典量化策略集锦(第四篇:进军交易系统,从 Dual Thrust 中学“趋势”)

    导语: "趋势"这个字眼,大家肯定不陌生,炒股票的老股民天天口里说着 "趋势为王", 那么今天我们向大家介绍一个趋势跟踪交易系统:Dual Thrust ,其简 ...

  4. 经典的期货量化交易策略大全

    1.双均线策略(期货) 双均线策略是简单移动平均线策略的加强版.移动平均线目的是过滤掉时间序列中的高频扰动,保留有用的低频趋势.它以滞后性的代价获得了平滑性,比如,在一轮牛市行情后,只有当价格出现大幅 ...

  5. 经典的期货量化交易策略大全(含源代码)

    1.双均线策略(期货) 双均线策略是简单移动平均线策略的加强版.移动平均线目的是过滤掉时间序列中的高频扰动,保留有用的低频趋势.它以滞后性的代价获得了平滑性,比如,在一轮牛市行情后,只有当价格出现大幅 ...

  6. 民锋国际期货量化交易策略源代码大全

    1.alpha对冲(期货) 投资者在市场交易中面临着系统性风险(即贝塔或Beta.β风险)和非系统性风险(即阿尔法或Alpha.α风险),通过对系统性风险进行度量并将其分离,从而获取超额绝对收益(即阿 ...

  7. 5种经典程序化日内交易策略

    日内交易一般有手工和程序化两种,收益来说手工收益要大于程序化. 国内程序化交易还处于起步阶段,本文摘取了海外比较公开的日内交易策略思想给予大家一些分享. 在做程序化交易的过程中,首先要碰到的问题是如何 ...

  8. 0、本专栏的预计更新的内容与更新时间表(2022-05-07更新目录排版)

    最近专栏增加了咨询服务,凡是以299元购买专栏的,提供三次免费的咨询服务.咨询服务是提供问题解决方向及解决方法(比如关于backtrader某方面的使用问题,量化投资相关的问题),并不是代写策略及根据 ...

  9. 国内4种常用日内CTA策略介绍及实现

    本文首发于微信公众号:优矿量化实验室.文章内容属作者个人观点,不代表和讯网立场.投资者据此操作,风险请自担. 本文将向大家介绍四种常见的CTA策略(Dual Thrust.R-Breaker.菲阿里四 ...

  10. 那些CTA策略的表现如何(一)

    致力于量化策略开发,高质量社群,交易思路分享等相关内容 『正文』 ˇ 大家好,我是乌克兰剑圣. 今天我们盘点一下从年初到现在,松鼠CTA策略表现如何(样本外跟踪). 由于策略较多,我选了5个周期长短不 ...

最新文章

  1. PHP 读取数据库内容并以二维数组按指定列输出实例
  2. post php数据,php post数据
  3. 跨部门不配合工作_跨部门协作,队友总是“甩锅”,这三个方法教你快速避坑!...
  4. win10 dns异常上不了网如何解决
  5. 用python批量执行VBA代码
  6. 单调有界定理适用于函数吗_第二百零二夜:导数与三角函数
  7. 卡耐基梅陇大学计算机学院名人,卡耐基梅陇大学
  8. bind mysql django_Django+bind dlz DNS管理平台
  9. 团队作业4——第一次项目冲刺(Alpha版本)4.25
  10. showDialog 必须Stateful
  11. android 权限库EasyPermissions
  12. ElasticSearch2.1 基于空间位置geo_query距离计算
  13. 推荐CSDN排名前1000博主
  14. 中科易安:公安对接流动人口管理智能锁需要联网吗?
  15. Python基础学习资料视频下载链接
  16. 关于微信商户企业付款给用户限额问题的说明
  17. IDA Pro 4.9.0.863 Advanced Full with SDK
  18. 乐视智能门锁S7评测
  19. 第六届山东省赛总结贴
  20. bzoj2668 [cqoi2012]交换棋子

热门文章

  1. GandCrab4.0勒索病毒解密工具
  2. Python 批量爬取猫咪图片实现千图成像
  3. 华为交换机基础命令合集
  4. CCNA考试题库中英文翻译版及答案7
  5. latex教程 / 矢量图转换 / 文献引用bibitem
  6. C语言算法7744问题
  7. matlab画函数微分图,【matlab】ode45求解二阶微分方程,绘制曲线图 | 使用函数句柄的方法...
  8. Java中list集合去重方法
  9. ResNet网络结构详解及代码复现
  10. 不一样的AI:“上天入地”的IBM人工智能