期货网格交策(源码)

129 篇文章 5 订阅

原 期货网格交易策略(附源码)

网格交易策略

网格交易策略简介

什么是网格交易策略?

​ 网格交易是利用市场震荡行情获利的一种主动交易策略,其本质是利用投资标的在一段震荡行情中价格在网格区间内的反复运动以进行加仓减仓的操作以达到投资收益最大化的目的。通俗点讲就是根据建立不同数量.不同大小的网格,在突破网格的时候建仓,回归网格的时候减仓,力求能够捕捉到价格的震荡变化趋势,达到盈利的目的。

网格的设置与建仓

​ 网格交易策略至关重要的一点就是网格的数量.间隔还有每个网格仓位数量的设置,但这会因不同的行情和相应判断而有所不同,建仓的数量不应过多,以防到多次触发网格建仓导致资金不足的情况。

行业轮动策略实现(基于掘金量化平台

策略思想

  • 本策略首先计算了SHFE.rb1801过去300个1min收盘价的均值和标准差

  • 并用均值加减2和3个标准差得到网格的区间分界线,分别配以0.3和0.5的仓位权重

  • 随后根据上突破区间开多仓,下突破区间开空仓,反向突破反向操作和回归平仓来进行相应仓位的调整

网格设置

    context.band = np.mean(timeseries) + np.array([-40, -3, -2, 2, 3, 40]) * np.std(timeseries)
    context.weight = [0.5, 0.3, 0.0, 0.3, 0.5]
    grid = pd.cut([bar.close], context.band, labels=[0, 1, 2, 3, 4])[0]context.band = np.mean(timeseries) + np.array([-40, -3, -2, 2, 3, 40]) * np.std(timeseries)
    context.weight = [0.5, 0.3, 0.0, 0.3, 0.5]
    grid = pd.cut([bar.close], context.band, labels=[0, 1, 2, 3, 4])[0]

​ 获取网格区间分界线和设置相应的仓位权重并得到相应的区间

获取多仓仓位

position_long = context.account().position(symbol=context.symbol, side=PositionSide_Long) = context.account().position(symbol=context.symbol, side=PositionSide_Long)

​ 获取上一交易日可调用get_previous_trading_date函数,返回值为字符串格式:

  • symbol需要设置标的代码。

  • side需要设置枚举常量,PositionSide_Long为多仓,PositionSide_Short为空仓。

下单到目标比例

order_target_percent(symbol=context.symbol, percent=context.weight[grid], order_type=OrderType_Market,
                                 position_side=PositionSide_Long)(symbol=context.symbol, percent=context.weight[grid], order_type=OrderType_Market,
                                 position_side=PositionSide_Long)

​ 固定时间调仓可使用schedule函数进行定时任务配置:

  • symbol需要设置标的代码。

  • percent为比例,此处设置为相应网格对应的权重

  • order_type需要设置枚举常量,OrderType_Market为市价单,OrderType_Limit为限价单

  • side需要设置枚举常量,PositionSide_Long为多仓,PositionSide_Short为空仓。

 

策略回测分析

分析

​ 我们选取了2017年7月至2016年9月作为回测周期,可以看出:

  • 胜率(具有盈利的平仓次数与总平仓次数之比)达到了87%。

  • 卡玛比率(年化收益率与历史最大回撤之比)是使用最大回撤率来衡量风险。采用最大回撤率来衡量风险,关注的是最极端的情况。卡玛比率越高表示策略承受每单位最大损失获得的报酬越高。在这里卡玛比率超过了9.1。

  • 夏普比率(年化收益率与波动率之比)超过1.29,也即承受1单位的风险,会有超过1.29个单位的收益回报

  • 策略收益曲线较为稳定,在无止损条件的情况下,最大回撤控制在承受范围,并成功跑赢沪深300指数。

网格交易策略源码(期货):

  1. # coding=utf-8
  2. from __future__ import print_function, absolute_import, unicode_literals
  3.  
  4. import numpy as np
  5. import pandas as pd
  6. from gm.api import *
  7.  
  8. '''
  9. 本策略首先计算了过去300个价格数据的均值和标准差
  10. 并根据均值加减1和2个标准差得到网格的区间分界线,
  11. 并分别配以0.3和0.5的仓位权重
  12. 然后根据价格所在的区间来配置仓位(+/-40为上下界,无实际意义):
  13. (-40,-3],(-3,-2],(-2,2],(2,3],(3,40](具体价格等于均值+数字倍标准差)
  14. [-0.5, -0.3, 0.0, 0.3, 0.5](资金比例,此处负号表示开空仓)
  15. 回测数据为:SHFE.rb1801的1min数据
  16. 回测时间为:2017-07-01 08:00:00到2017-10-01 16:00:00
  17. '''
  18.  
  19.  
  20. def init(context):
  21. context.symbol = 'SHFE.rb1801'
  22. # 订阅SHFE.rb1801, bar频率为1min
  23. subscribe(symbols=context.symbol, frequency='60s')
  24. # 获取过去300个价格数据
  25. timeseries = history_n(symbol=context.symbol, frequency='60s', count=300, fields='close', fill_missing='Last',
  26. end_time='2017-07-01 08:00:00', df=True)['close'].values
  27. # 获取网格区间分界线
  28. context.band = np.mean(timeseries) + np.array([-40, -3, -2, 2, 3, 40]) * np.std(timeseries)
  29. # 设置网格的仓位
  30. context.weight = [0.5, 0.3, 0.0, 0.3, 0.5]
  31.  
  32.  
  33. def on_bar(context, bars):
  34. bar = bars[0]
  35. # 根据价格落在(-40,-3],(-3,-2],(-2,2],(2,3],(3,40]的区间范围来获取最新收盘价所在的价格区间
  36. grid = pd.cut([bar.close], context.band, labels=[0, 1, 2, 3, 4])[0]
  37. # 获取多仓仓位
  38. position_long = context.account().position(symbol=context.symbol, side=PositionSide_Long)
  39. # 获取空仓仓位
  40. position_short = context.account().position(symbol=context.symbol, side=PositionSide_Short)
  41. # 若无仓位且价格突破则按照设置好的区间开仓
  42. if not position_long and not position_short and grid != 2:
  43. # 大于3为在中间网格的上方,做多
  44. if grid >= 3:
  45. order_target_percent(symbol=context.symbol, percent=context.weight[grid], order_type=OrderType_Market,
  46. position_side=PositionSide_Long)
  47. print(context.symbol, '以市价单开多仓到仓位', context.weight[grid])
  48. if grid <= 1:
  49. order_target_percent(symbol=context.symbol, percent=context.weight[grid], order_type=OrderType_Market,
  50. position_side=PositionSide_Short)
  51. print(context.symbol, '以市价单开空仓到仓位', context.weight[grid])
  52. # 持有多仓的处理
  53. elif position_long:
  54. if grid >= 3:
  55. order_target_percent(symbol=context.symbol, percent=context.weight[grid], order_type=OrderType_Market,
  56. position_side=PositionSide_Long)
  57. print(context.symbol, '以市价单调多仓到仓位', context.weight[grid])
  58. # 等于2为在中间网格,平仓
  59. elif grid == 2:
  60. order_target_percent(symbol=context.symbol, percent=0, order_type=OrderType_Market,
  61. position_side=PositionSide_Long)
  62. print(context.symbol, '以市价单全平多仓')
  63. # 小于1为在中间网格的下方,做空
  64. elif grid <= 1:
  65. order_target_percent(symbol=context.symbol, percent=0, order_type=OrderType_Market,
  66. position_side=PositionSide_Long)
  67. print(context.symbol, '以市价单全平多仓')
  68. order_target_percent(symbol=context.symbol, percent=context.weight[grid], order_type=OrderType_Market,
  69. position_side=PositionSide_Short)
  70. print(context.symbol, '以市价单开空仓到仓位', context.weight[grid])
  71. # 持有空仓的处理
  72. elif position_short:
  73. # 小于1为在中间网格的下方,做空
  74. if grid <= 1:
  75. order_target_percent(symbol=context.symbol, percent=context.weight[grid], order_type=OrderType_Market,
  76. position_side=PositionSide_Short)
  77. print(context.symbol, '以市价单调空仓到仓位', context.weight[grid])
  78. # 等于2为在中间网格,平仓
  79. elif grid == 2:
  80. order_target_percent(symbol=context.symbol, percent=0, order_type=OrderType_Market,
  81. position_side=PositionSide_Short)
  82. print(context.symbol, '以市价单全平空仓')
  83. # 大于3为在中间网格的上方,做多
  84. elif grid >= 3:
  85. order_target_percent(symbol=context.symbol, percent=0, order_type=OrderType_Market,
  86. position_side=PositionSide_Short)
  87. print(context.symbol, '以市价单全平空仓')
  88. order_target_percent(symbol=context.symbol, percent=context.weight[grid], order_type=OrderType_Market,
  89. position_side=PositionSide_Long)
  90. print(context.symbol, '以市价单开多仓到仓位', context.weight[grid])
  91.  
  92.  
  93. if __name__ == '__main__':
  94. '''
  95. strategy_id策略ID,由系统生成
  96. filename文件名,请与本文件名保持一致
  97. mode实时模式:MODE_LIVE回测模式:MODE_BACKTEST
  98. token绑定计算机的ID,可在系统设置-密钥管理中生成
  99. backtest_start_time回测开始时间
  100. backtest_end_time回测结束时间
  101. backtest_adjust股票复权方式不复权:ADJUST_NONE前复权:ADJUST_PREV后复权:ADJUST_POST
  102. backtest_initial_cash回测初始资金
  103. backtest_commission_ratio回测佣金比例
  104. backtest_slippage_ratio回测滑点比例
  105. '''
  106. run(strategy_id='strategy_id',
  107. filename='main.py',
  108. mode=MODE_BACKTEST,
  109. token='token_id',
  110. backtest_start_time='2017-07-01 08:00:00',
  111. backtest_end_time='2017-10-01 16:00:00',
  112. backtest_adjust=ADJUST_PREV,
  113. backtest_initial_cash=10000000,
  114. backtest_commission_ratio=0.0001,
  115. backtest_slippage_ratio=0.0001)

网格交易(期货)文章来源:掘金量化交易平台  ,转载请注明出处!

----------------------------------------------------------------------------------------------------------------------------------------------------------

更多经典股票/期货量化策略源码查看:

1双均线策略(期货)  量化策略源码https://www.myquant.cn/docs/python_strategyies/153
2alpha对冲(股票+期货)  量化策略源码https://www.myquant.cn/docs/python_strategyies/101
3集合竞价选股(股票) 量化策略源码https://www.myquant.cn/docs/python_strategyies/102
4多因子选股(股票)  量化策略源码https://www.myquant.cn/docs/python_strategyies/103
5网格交易(期货)  量化策略源码https://www.myquant.cn/docs/python_strategyies/104
6指数增强(股票)  量化策略源码https://www.myquant.cn/docs/python_strategyies/105
7跨品种套利(期货)量化策略源码https://www.myquant.cn/docs/python_strategyies/106
8跨期套利(期货) 量化策略源码https://www.myquant.cn/docs/python_strategyies/107
9日内回转交易(股票)量化策略源码https://www.myquant.cn/docs/python_strategyies/108
10做市商交易(期货) 量化策略源码https://www.myquant.cn/docs/python_strategyies/109
11海龟交易法(期货) 量化策略源码https://www.myquant.cn/docs/python_strategyies/110
12行业轮动(股票) 量化策略源码https://www.myquant.cn/docs/python_strategyies/111
13机器学习(股票) 量化策略源码https://www.myquant.cn/docs/python_strategyies/112

 


《算法导论 第三版英文版》_高清中文版

《深度学习入门:基于Python的理论与实现》_高清中文版

《深入浅出数据分析》_高清中文版

《Python编程:从入门到实践》_高清中文版

《Python科学计算》_高清中文版

《深度学习入门:基于Python的理论与实现》_高清中文版

《深入浅出数据分析》_高清中文版

《Python编程:从入门到实践》_高清中文版


  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

redelego@cloud

XXXXXXXXXXXXXXX

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值