PDF下载 下载

菲阿里四价(期货)

阅读 491
  1. # coding=utf-8
  2. from __future__ import print_function, absolute_import
  3. from gm.api import *
  4. """
  5. 上轨=昨日最高点;
  6. 下轨=昨日最低点;
  7. 止损=今日开盘价;
  8. 如果没有持仓,且现价大于了昨天最高价做多,小于昨天最低价做空。
  9. 如果有多头持仓,当价格跌破了开盘价止损。
  10. 如果有空头持仓,当价格上涨超过开盘价止损。
  11. 选取SHFE的rb2010 在 2020-02-07 15:00:00 到 2020-04-15 15:00:00 进行了回测。
  12. 注意:
  13. 1:为回测方便,本策略使用了on_bar的一分钟来计算,实盘中可能需要使用on_tick。
  14. 2:实盘中,如果在收盘的那一根bar或tick触发交易信号,需要自行处理,实盘可能不会成交。
  15. 3:本策略使用在15点收盘时全平的方式来处理不持有隔夜单的情况,实际使用中15点是无法平仓的。
  16. """
  17. # 策略中必须有init方法
  18. def init(context):
  19. """ init函数是在策略开始运行时被调用,进行初始化工作的函数"""
  20. # 设置要进行回测的合约 合约名称写法详见 https://www.myquant.cn/docs/python/python_concept#44e233ec21d880c2
  21. # 或者可以在掘金终端的仿真交易中输入这个代码看是否查询的是需要的标的
  22. context.symbol = 'SHFE.rb2010' # 订阅&交易标的, 此处订阅的是上期所的螺纹钢 2010
  23. # 订阅行情 第一个参数是标的, 第二个是时间周期,表示日线,第三个指指定设置count参数,表示需要的滑窗大
  24. # 详见 https://www.myquant.cn/docs/python/python_subscribe#15ad56f8be8519c0
  25. # 只需要最新价,所以只需要订阅一个, 如果用tick,次数太多,用一分钟线代替
  26. subscribe(symbols=context.symbol, frequency='60s', count=1)
  27. context.count = 0 # 记录开仓次数,确保一天只开一次,开多了会有一些问题
  28. schedule(schedule_func=algo, date_rule='1d', time_rule='8:50:00')
  29. def algo(context):
  30. # 获取历史的n条信息,data是一个pandas的DataFrame详见
  31. # https://www.myquant.cn/docs/python/python_select_api#6fb030ec42984aff
  32. context.data = history_n(symbol=context.symbol, frequency='1d', end_time=context.now,
  33. fields='symbol,open,high,low',count=2, df=True)
  34. def on_bar(context, bars):
  35. """
  36. 当init中subscribe订阅过的标的有新tick的时候,on_tick 会被调用,用来处理计算和交易下单逻辑
  37. 详见 https://www.myquant.cn/docs/python/python_data_event#b198d6b609adb1d4
  38. :context 是在多个函数直接传递变量的全局变量,所有的数据都可以通过context来传递
  39. :tick 是当前触发on_tick的tick。参考https://www.myquant.cn/docs/python/python_object_data#29852bf1b0fd29bb
  40. """
  41. # 取出订阅的这一分钟的bar
  42. bar = bars[0]
  43. data = context.data
  44. # 获取现有持仓 返回的是一个list的各种合约的持仓对象 详见
  45. # https://www.myquant.cn/docs/python/python_object_trade#Position%20-%20%E6%8C%81%E4%BB%93%E5%AF%B9%E8%B1%A1
  46. position_long = context.account().position(symbol=context.symbol, side=PositionSide_Long)
  47. position_short = context.account().position(symbol=context.symbol, side=PositionSide_Short)
  48. # 交易逻辑部分
  49. if position_long: # 多头持仓小于开盘价止损。
  50. if bar.close < data.loc[1, 'open']:
  51. order_volume(symbol=context.symbol, volume=1, side=OrderSide_Sell,
  52. order_type=OrderType_Market, position_effect=PositionEffect_Close)
  53. elif position_short: # 空头持仓大于开盘价止损。
  54. if bar.close > data.loc[1, 'open']:
  55. order_volume(symbol=context.symbol, volume=1, side=OrderSide_Buy,
  56. order_type=OrderType_Market, position_effect=PositionEffect_Close)
  57. else: # 没有持仓。
  58. if bar.close > data.loc[0, 'high'] and not context.count: # 当前的最新价大于了前一天的最高价
  59. # 开多
  60. order_volume(symbol=context.symbol, volume=1, side=OrderSide_Buy,
  61. order_type=OrderType_Market, position_effect=PositionEffect_Open)
  62. context.count = 1
  63. elif bar.close < data.loc[0, 'low'] and not context.count: # 当前最新价小于了前一天的最低价
  64. # 开空
  65. order_volume(symbol=context.symbol, volume=1, side=OrderSide_Sell,
  66. order_type=OrderType_Market, position_effect=PositionEffect_Open)
  67. context.count = 1
  68. # context.now 返回运行时间, 详见 https://www.myquant.cn/docs/python/python_concept#8079e2e4dad05879
  69. if context.now.hour == 15 : #每天收盘重新置0
  70. print('close all')
  71. order_close_all() # 时间超过下午2:55以后,全部平仓。
  72. context.count = 0
  73. if __name__ == '__main__':
  74. run(strategy_id='strategy_id',
  75. filename='main.py',
  76. mode=MODE_BACKTEST,
  77. token='token_id',
  78. backtest_start_time='2020-02-07 15:00:00',
  79. backtest_end_time='2020-04-15 15:00:00',
  80. backtest_initial_cash=10000,
  81. backtest_commission_ratio=0.0001,
  82. backtest_slippage_ratio=0.0001)

0 篇笔记