在期货市场这片浩瀚的海洋中,投资者们如同经验丰富的渔夫,时刻寻找着盈利的机遇。而网格交易策略,就像一张精心编织的“智能渔网”,帮助投资者在波动的市场中捕捉利润,实现稳健的盈利。
一、网格交易策略概述
网格交易策略是一种基于市场波动性的量化交易方法。它通过预设一系列买卖点,在价格震荡区间内形成网格,当市场价格触及这些网格时,策略将自动执行交易操作。这种策略的优势在于其客观性、自动化和适应性,能够在多种市场环境下保持稳定的盈利能力。
二、网格交易策略的优势
-
客观性:网格交易策略基于数学模型和算法,排除了人为情绪的干扰,使交易决策更加客观和理性。
-
自动化:一旦设置好参数,策略可以自动执行交易操作,无需投资者时刻盯盘,降低了交易成本和心理压力。
-
适应性:网格交易策略适用于多种市场环境,尤其在震荡市场中表现突出,能够帮助投资者在不确定的市场中捕捉利润。
三、网格交易策略的实施
实施网格交易策略主要分为以下三个步骤:
-
确定价格中枢和波动区间:基于历史价格数据,确定价格中枢,并围绕中枢设置波动区间。
-
设定网格数量和间隔:根据市场波动性和个人风险偏好,设定网格的数量和每个网格的间隔。等宽网格简单易行,但可能降低收益率;不等宽网格则能更好地捕捉市场波动,提高收益。
-
执行交易策略:当价格触及网格线时,自动执行买卖操作。如果价格上涨,触发卖出;如果价格下跌,触发买入。
网格策略完整代码如下:
# coding=utf-8
from __future__ import print_function, absolute_import, unicode_literals
import numpy as np
import pandas as pd
from 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
站内所有文章皆来自网络转载或读者投稿,请勿用于商业用途。如有侵权、不妥之处,请联系站长并出示版权证明以便删除。敬请谅解!