PDF下载 下载

Dual Thrust(期货)

阅读 735
  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. """ init函数是在策略开始运行时被调用,进行初始化工作的函数"""
  18. # 设置要进行回测的合约 合约名称写法详见 https://www.myquant.cn/docs/python/python_concept#44e233ec21d880c2
  19. # 或者可以在掘金终端的仿真交易中输入这个代码看是否查询的是需要的标的
  20. context.symbol = 'SHFE.rb2010' # 订阅&交易标的, 此处订阅的是上期所的螺纹钢 2010
  21. # 设置参数。
  22. context.N = 5
  23. context.k1 = 0.2
  24. context.k2 = 0.2
  25. # 订阅行情 第一个参数是标的, 第二个是时间周期,表示日线,第三个指指定设置count参数,表示需要的滑窗大
  26. # 详见 https://www.myquant.cn/docs/python/python_subscribe#15ad56f8be8519c0
  27. # 只需要最新价,所以只需要订阅一个, 如果用tick,次数太多,用一分钟线代替
  28. subscribe(symbols=context.symbol, frequency='60s', count=1)
  29. schedule(schedule_func=algo, date_rule='1d', time_rule='8:50:00')
  30. def algo(context):
  31. # 获取历史的n条信息,data是一个pandas的DataFrame详见
  32. # https://www.myquant.cn/docs/python/python_select_api#6fb030ec42984aff
  33. data = history_n(symbol=context.symbol, frequency='1d', end_time=context.now,
  34. fields='symbol,open,high,low,close', count=context.N + 1, df=True)
  35. # 获取当天的开盘价
  36. current_open = data.open.loc[0]
  37. # 去掉当天的实时数据
  38. data.drop(context.N, inplace=True)
  39. # 计算Dual Thrust 的上下轨
  40. HH = data.high.max()
  41. HC = data.close.max()
  42. LC = data.close.min()
  43. LL = data.close.min()
  44. range = max(HH - LC, HC - LL)
  45. context.buy_line = current_open + range * context.k1 # 上轨
  46. context.sell_line = current_open - range * context.k2 # 下轨
  47. def on_bar(context, bars):
  48. """
  49. 当init中subscribe订阅过的标的有新tick的时候,on_tick 会被调用,用来处理计算和交易下单逻辑
  50. 详见 https://www.myquant.cn/docs/python/python_data_event#b198d6b609adb1d4
  51. :context 是在多个函数直接传递变量的全局变量,所有的数据都可以通过context来传递
  52. :tick 是当前触发on_tick的tick。参考https://www.myquant.cn/docs/python/python_object_data#29852bf1b0fd29bb
  53. """
  54. # 取出订阅的这一分钟的bar
  55. bar = bars[0]
  56. buy_line = context.buy_line
  57. sell_line = context.sell_line
  58. # 获取现有持仓 返回的是一个list的各种合约的持仓对象 详见
  59. # https://www.myquant.cn/docs/python/python_object_trade#Position%20-%20%E6%8C%81%E4%BB%93%E5%AF%B9%E8%B1%A1
  60. position_long = context.account().position(symbol=context.symbol, side=PositionSide_Long)
  61. position_short = context.account().position(symbol=context.symbol, side=PositionSide_Short)
  62. # 交易逻辑部分
  63. if bar.close > buy_line:
  64. if position_long: # 已经持有多仓,直接返回
  65. return
  66. elif position_short: # 已经持有空仓,平仓再做多。
  67. order_volume(symbol=context.symbol, volume=1, side=OrderSide_Buy,
  68. order_type=OrderType_Market, position_effect=PositionEffect_Close)
  69. order_volume(symbol=context.symbol, volume=1, side=OrderSide_Buy,
  70. order_type=OrderType_Market, position_effect=PositionEffect_Open)
  71. else: # 没有持仓。
  72. order_volume(symbol=context.symbol, volume=1, side=OrderSide_Buy,
  73. order_type=OrderType_Market, position_effect=PositionEffect_Open)
  74. elif bar.close < sell_line:
  75. if position_long: # 已经持有多仓, 平多再开空。
  76. order_volume(symbol=context.symbol, volume=1, side=OrderSide_Sell,
  77. order_type=OrderType_Market, position_effect=PositionEffect_Close)
  78. order_volume(symbol=context.symbol, volume=1, side=OrderSide_Sell,
  79. order_type=OrderType_Market, position_effect=PositionEffect_Open)
  80. elif position_short: # 已经持有空仓,直接返回。
  81. return
  82. else: #没有持仓。
  83. order_volume(symbol=context.symbol, volume=1, side=OrderSide_Sell,
  84. order_type=OrderType_Market, position_effect=PositionEffect_Open)
  85. if __name__ == '__main__':
  86. '''
  87. strategy_id策略ID,由系统生成
  88. filename文件名,请与本文件名保持一致
  89. mode实时模式:MODE_LIVE回测模式:MODE_BACKTEST
  90. token绑定计算机的ID,可在系统设置-密钥管理中生成
  91. backtest_start_time回测开始时间
  92. backtest_end_time回测结束时间
  93. backtest_adjust股票复权方式不复权:ADJUST_NONE前复权:ADJUST_PREV后复权:ADJUST_POST
  94. backtest_initial_cash回测初始资金
  95. backtest_commission_ratio回测佣金比例
  96. backtest_slippage_ratio回测滑点比例
  97. '''
  98. run(strategy_id='strategy_id',
  99. filename='main.py',
  100. mode=MODE_BACKTEST,
  101. token='token_id',
  102. backtest_start_time='2020-02-07 15:00:00',
  103. backtest_end_time='2020-04-15 15:00:00',
  104. backtest_initial_cash=10000,
  105. backtest_commission_ratio=0.0001,
  106. backtest_slippage_ratio=0.0001)

0 篇笔记