在期货市场这片浩瀚的海洋中,投资者们如同经验丰富的渔夫,时刻寻找着盈利的机遇。而网格交易策略,就像一张精心编织的“智能渔网”,帮助投资者在波动的市场中捕捉利润,实现稳健的盈利。
一、网格交易策略概述
网格交易策略是一种基于市场波动性的量化交易方法。它通过预设一系列买卖点,在价格震荡区间内形成网格,当市场价格触及这些网格时,策略将自动执行交易操作。这种策略的优势在于其客观性、自动化和适应性,能够在多种市场环境下保持稳定的盈利能力。
二、网格交易策略的优势
-
客观性:网格交易策略基于数学模型和算法,排除了人为情绪的干扰,使交易决策更加客观和理性。
-
自动化:一旦设置好参数,策略可以自动执行交易操作,无需投资者时刻盯盘,降低了交易成本和心理压力。
-
适应性:网格交易策略适用于多种市场环境,尤其在震荡市场中表现突出,能够帮助投资者在不确定的市场中捕捉利润。
三、网格交易策略的实施
实施网格交易策略主要分为以下三个步骤:
-
确定价格中枢和波动区间:基于历史价格数据,确定价格中枢,并围绕中枢设置波动区间。
-
设定网格数量和间隔:根据市场波动性和个人风险偏好,设定网格的数量和每个网格的间隔。等宽网格简单易行,但可能降低收益率;不等宽网格则能更好地捕捉市场波动,提高收益。
-
执行交易策略:当价格触及网格线时,自动执行买卖操作。如果价格上涨,触发卖出;如果价格下跌,触发买入。
网格策略完整代码如下:
# coding=utf-8from __future__ import print_function, absolute_import, unicode_literalsimport numpy as npimport pandas as pdfrom gm.api import *'''本策略标的为:SHFE.rb1901价格中枢设定为:前一交易日的收盘价从阻力位到压力位分别为:1.03 * open、1.02 * open、1.01 * open、open、0.99 * open、0.98 * open、0.97 * open每变动一个网格,交易量变化100个单位回测数据为:SHFE.rb1901的1min数据回测时间为:2017-07-01 08:00:00到2017-10-01 16:00:00'''def init(context): # 策略标的为SHFE.rb1901 context.symbol = 'SHFE.rb1901' # 订阅SHFE.rb1901, bar频率为1min subscribe(symbols = context.symbol, frequency='60s') # 设置每变动一格,增减的数量 context.volume = 1 # 储存前一个网格所处区间,用来和最新网格所处区间作比较 context.last_grid = 0 # 以前一日的收盘价为中枢价格 context.center = history_n(symbol= context.symbol,frequency='1d',end_time=context.now,count = 1,fields = 'close')[0]['close'] # 记录上一次交易时网格范围的变化情况(例如从4区到5区,记为4,5) context.grid_change_last = [0,0]def on_bar(context, bars): bar = bars[0] # 获取多仓仓位 position_long = context.account().position(symbol=context.symbol, side=PositionSide_Long) # 获取空仓仓位 position_short = context.account().position(symbol=context.symbol, side=PositionSide_Short) # 设置网格和当前价格所处的网格区域 context.band = np.array([0.97, 0.98, 0.99, 1, 1.01, 1.02, 1.03]) * context.center grid = pd.cut([bar.close], context.band, labels=[1, 2, 3, 4, 5, 6])[0] # 如果价格超出网格设置范围,则提示调节网格宽度和数量 if np.isnan(grid): print('价格波动超过网格范围,可适当调节网格宽度和数量') # 如果新的价格所处网格区间和前一个价格所处的网格区间不同,说明触碰到了网格线,需要进行交易 # 如果新网格大于前一天的网格,做空或平多 if context.last_grid < grid: # 记录新旧格子范围(按照大小排序) grid_change_new = [context.last_grid,grid] # 几种例外: # 当last_grid = 0 时是初始阶段,不构成信号 # 如果此时grid = 3,说明当前价格仅在开盘价之下的3区域中,没有突破网格线 # 如果此时grid = 4,说明当前价格仅在开盘价之上的4区域中,没有突破网格线 if context.last_grid == 0: context.last_grid = grid return if context.last_grid != 0: # 如果前一次开仓是4-5,这一次是5-4,算是没有突破,不成交 if grid_change_new != context.grid_change_last: # 更新前一次的数据 context.last_grid = grid context.grid_change_last = grid_change_new # 如果有多仓,平多 if position_long: order_volume(symbol=context.symbol, volume=context.volume, side=OrderSide_Sell, order_type=OrderType_Market, position_effect=PositionEffect_Close) print('以市价单平多仓{}手'.format(context.volume)) # 否则,做空 if not position_long: order_volume(symbol=context.symbol, volume=context.volume, side=OrderSide_Sell, order_type=OrderType_Market, position_effect=PositionEffect_Open) print('以市价单开空{}手'.format(context.volume)) # 如果新网格小于前一天的网格,做多或平空 if context.last_grid > grid: # 记录新旧格子范围(按照大小排序) grid_change_new = [grid,context.last_grid] # 几种例外: # 当last_grid = 0 时是初始阶段,不构成信号 # 如果此时grid = 3,说明当前价格仅在开盘价之下的3区域中,没有突破网格线 # 如果此时grid = 4,说明当前价格仅在开盘价之上的4区域中,没有突破网格线 if context.last_grid == 0: context.last_grid = grid return if context.last_grid != 0: # 如果前一次开仓是4-5,这一次是5-4,算是没有突破,不成交 if grid_change_new != context.grid_change_last: # 更新前一次的数据 context.last_grid = grid context.grid_change_last = grid_change_new # 如果有空仓,平空 if position_short: order_volume(symbol=context.symbol, volume=context.volume, side=OrderSide_Buy, order_type=OrderType_Market, position_effect=PositionEffect_Close) print('以市价单平空仓{}手'.format(context.volume)) # 否则,做多 if not position_short: order_volume(symbol=context.symbol, volume=context.volume, side=OrderSide_Buy, order_type=OrderType_Market, position_effect=PositionEffect_Open) print('以市价单开多{}手'.format(context.volume)) # 设计一个止损条件:当持仓量达到10手,全部平仓 if position_short == 10 or position_long == 10: order_close_all() print('触发止损,全部平仓')if __name__ == '__main__': ''' strategy_id策略ID,由系统生成 filename文件名,请与本文件名保持一致 mode实时模式:MODE_LIVE回测模式:MODE_BACKTEST token绑定计算机的ID,可在系统设置-密钥管理中生成 backtest_start_time回测开始时间 backtest_end_time回测结束时间 backtest_adjust股票复权方式不复权:ADJUST_NONE前复权:ADJUST_PREV后复权:ADJUST_POST backtest_initial_cash回测初始资金 backtest_commission_ratio回测佣金比例 backtest_slippage_ratio回测滑点比例 ''' run(strategy_id='strategy_id', filename='main.py', mode=MODE_BACKTEST, token='token_id', backtest_start_time='2018-07-01 08:00:00', backtest_end_time='2018-10-01 16:00:00', backtest_adjust=ADJUST_PREV, backtest_initial_cash=100000, backtest_commission_ratio=0.0001, backtest_slippage_ratio=0.0001)
四、策略难点与解决方案
在实施网格交易策略过程中,可能会遇到一些难点,如如何准确记录价格突破网格线、如何避免“假突破”等。针对这些难点,可以采取以下解决方案:
- 记录价格突破网格线:采用区域判断方式,利用数据处理工具(如pandas库的cut函数)将当前价格所处的网格区域表示出来。当网格区域发生变化时,即认为价格突破了一个网格线。
- 避免“假突破”:记录每次交易时网格区域的变化形态,并与前一次变化进行比较。只有当新的记录与旧的记录不同时,才认为是真正的交易信号。
五、策略回测与验证

通过回测验证,网格交易策略在特定时间段内实现了稳健的盈利表现。以2018年7月至10月的时间段为例,该策略实现了4.16%的累计收益率和16.50%的年化收益率,显著跑赢基准。同时,最大回撤仅为0.72%,胜率达到100%,显示出良好的风险控制能力。
六、结论与展望
网格交易策略以其稳健性、自动化和适应性在期货市场中展现出广阔的应用前景。它不仅能够帮助投资者有效利用市场波动捕捉利润,还能降低情绪波动对交易决策的影响。然而,成功的网格交易策略需要合理的参数设置和严格的风险管理。投资者在应用该策略时,应根据市场状况和个人风险偏好不断调整和优化策略参数。
发布者:股市刺客,转载请注明出处:https://www.95sca.cn/archives/106049
站内所有文章皆来自网络转载或读者投稿,请勿用于商业用途。如有侵权、不妥之处,请联系站长并出示版权证明以便删除。敬请谅解!