今天是 :
您的位置: 网站首页 > AI量化 >

    D期货量化交易策略ual Thrust(期货)

    阅读次数:     发布时间:2024-07-19 01:57:00

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

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

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

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

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

     

    1. from __future__ import print_function, absolute_import
    2. """
    3. 计算前N天的最高价-收盘价和收盘价-最低价。然后取这2N个价差的最大值,乘以k值。把结果称为触发值。
    4. 没有明确止损。这个系统是反转系统,也就是说,如果在价格超过(开盘+触发值)时手头有空单,则平空开多。
    5. 选用了SHFE的rb2010 在2020-02-07 15:00:00 到 2020-04-15 15:00:00' 进行回测。
    6. 1:为回测方便,本策略使用了on_bar的一分钟来计算,实盘中可能需要使用on_tick。
    7. """
    8.  
    9.  
    10. def init(context):
    11.  
    12. context.symbol = 'SHFE.rb2010' # 订阅&交易标的, 此处订阅的是上期所的螺纹钢 2010
    13.  
    14. context.N = 5
    15. context.k2 = 0.2
    16.  
    17. time = context.now.strftime('%H:%M:%S')
    18.  
    19. if '09:00:00' < time < '15:00:00' or '21:00:00' < time < '23:00:00':
    20. # 如果是交易时间段,等到开盘时间确保进入algo()
    21. schedule(schedule_func = algo, date_rule = '1d', time_rule = '21:00:00')
    22.  
    23. subscribe(symbols=context.symbol, frequency='60s', count = 1)
    24.  
    25.  
    26. # 取历史数据
    27. fields='symbol,open,high,low,close', count=context.N + 1, df=True)
    28. # 回测模式下,开盘价可以直接用history_n取到
    29. # 获取当天的开盘价
    30. # 去掉当天的实时数据
    31. # 如果是实时模式,开盘价需要用current取到
    32. # 获取当天的开盘价
    33. # 计算Dual Thrust 的上下轨
    34. HC = data['close'].max()
    35. LL = data['low'].min()
    36. context.buy_line = current_open + range * context.k1 # 上轨
    37. def on_bar(context, bars):
    38. bar = bars[0]
    39. buy_line = context.buy_line
    40. # 获取现有持仓
    41. position_short = context.account().position(symbol=context.symbol, side=PositionSide_Short)
    42.  
    43. # 如果超过range的上界
    44. if position_long: # 已经持有多仓,直接返回
    45. elif position_short: # 已经持有空仓,平仓再做多。
    46. order_type=OrderType_Market, position_effect=PositionEffect_Close)
    47. order_volume(symbol=context.symbol, volume=1, side=OrderSide_Buy,
    48. print('市价单开多仓', context.symbol)
    49. order_volume(symbol=context.symbol, volume=1, side=OrderSide_Buy,
    50. print('市价单开多仓', context.symbol)
    51. elif bar.close < sell_line:
    52. order_volume(symbol=context.symbol, volume=1, side=OrderSide_Sell,
    53. print('市价单平多仓', context.symbol)
    54. order_type=OrderType_Market, position_effect=PositionEffect_Open)
    55. elif position_short: # 已经持有空仓,直接返回。
    56. else: # 没有持仓,直接开空
    57. order_type=OrderType_Market, position_effect=PositionEffect_Open)
    58. if __name__ == '__main__':
    59. strategy_id策略ID,由系统生成
    60. mode实时模式:MODE_LIVE回测模式:MODE_BACKTEST
    61. backtest_start_time回测开始时间
    62. backtest_adjust股票复权方式不复权:ADJUST_NONE前复权:ADJUST_PREV后复权:ADJUST_POST
    63. backtest_commission_ratio回测佣金比例
    64. '''
    65. filename='main.py',
    66. token='token_id',
    67. backtest_end_time='2020-04-15 15:00:00',
    68. backtest_commission_ratio=0.0001,
    69. 4. 回测结果与稳健性分析

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

      可以发现,在2020年2月-2020年4月,不论k1、k2如何设置,收益率均维持为正,回撤比较稳定。在其他月份,回测结果较差。说明回测参数设置对于回测结果的影响较小,回测期对于回测结果的影响较大。 <p style="box-sizing: border-box; margin-top: 0px; margin-right: 0px; margin-left: 0px; color: rgb(51, 51, 51); font-family: " microsoft="" yahei",="" helvetica,="" "meiryo="" ui",="" "malgun="" gothic",="" "segoe="" "trebuchet="" ms",="" monaco,="" monospace,="" tahoma,="" stxihei,="" 华文细黑,="" stheiti,="" "helvetica="" neue",="" "droid="" sans",="" "wenquanyi="" micro="" hei",="" freesans,="" arimo,="" arial,="" simsun,="" 宋体,="" heiti,="" 黑体,="" sans-serif;="" font-size:="" 15.4px;="" margin-bottom:="" 0px="" !important;"="">注:此策略只用于学习、交流、演示,不构成任何投资建议。