网格交易策略–量化交易稳健代表(附Python完整代码)

在期货市场这片浩瀚的海洋中,投资者们如同经验丰富的渔夫,时刻寻找着盈利的机遇。而网格交易策略,就像一张精心编织的“智能渔网”,帮助投资者在波动的市场中捕捉利润,实现稳健的盈利。

一、网格交易策略概述

网格交易策略是一种基于市场波动性的量化交易方法。它通过预设一系列买卖点,在价格震荡区间内形成网格,当市场价格触及这些网格时,策略将自动执行交易操作。这种策略的优势在于其客观性、自动化和适应性,能够在多种市场环境下保持稳定的盈利能力。

二、网格交易策略的优势

  1. 客观性:网格交易策略基于数学模型和算法,排除了人为情绪的干扰,使交易决策更加客观和理性。

  2. 自动化:一旦设置好参数,策略可以自动执行交易操作,无需投资者时刻盯盘,降低了交易成本和心理压力。

  3. 适应性:网格交易策略适用于多种市场环境,尤其在震荡市场中表现突出,能够帮助投资者在不确定的市场中捕捉利润。

三、网格交易策略的实施

实施网格交易策略主要分为以下三个步骤:

  1. 确定价格中枢和波动区间:基于历史价格数据,确定价格中枢,并围绕中枢设置波动区间。

  2. 设定网格数量和间隔:根据市场波动性和个人风险偏好,设定网格的数量和每个网格的间隔。等宽网格简单易行,但可能降低收益率;不等宽网格则能更好地捕捉市场波动,提高收益。

  3. 执行交易策略:当价格触及网格线时,自动执行买卖操作。如果价格上涨,触发卖出;如果价格下跌,触发买入。

网格策略完整代码如下:

# 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)

四、策略难点与解决方案

在实施网格交易策略过程中,可能会遇到一些难点,如如何准确记录价格突破网格线、如何避免“假突破”等。针对这些难点,可以采取以下解决方案:

  1. 记录价格突破网格线:采用区域判断方式,利用数据处理工具(如pandas库的cut函数)将当前价格所处的网格区域表示出来。当网格区域发生变化时,即认为价格突破了一个网格线。
  2. 避免“假突破”:记录每次交易时网格区域的变化形态,并与前一次变化进行比较。只有当新的记录与旧的记录不同时,才认为是真正的交易信号。

五、策略回测与验证

图片

通过回测验证,网格交易策略在特定时间段内实现了稳健的盈利表现。以2018年7月至10月的时间段为例,该策略实现了4.16%的累计收益率和16.50%的年化收益率,显著跑赢基准。同时,最大回撤仅为0.72%,胜率达到100%,显示出良好的风险控制能力。

六、结论与展望

网格交易策略以其稳健性、自动化和适应性在期货市场中展现出广阔的应用前景。它不仅能够帮助投资者有效利用市场波动捕捉利润,还能降低情绪波动对交易决策的影响。然而,成功的网格交易策略需要合理的参数设置和严格的风险管理。投资者在应用该策略时,应根据市场状况和个人风险偏好不断调整和优化策略参数。

发布者:股市刺客,转载请注明出处:https://www.95sca.cn/archives/106049
站内所有文章皆来自网络转载或读者投稿,请勿用于商业用途。如有侵权、不妥之处,请联系站长并出示版权证明以便删除。敬请谅解!

(0)
股市刺客的头像股市刺客
上一篇 5天前
下一篇 5天前

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注