精华内容
下载资源
问答
  • 网格交易策略

    千次阅读 2021-03-10 15:22:59
    网格交易法是一种利用行情震荡进行获利的策略。在标的价格不断震荡的过程中,对标的价格绘制网格,在市场价格触碰到某个网格线时进行加减仓操作尽可能获利。 网格交易法属于左侧交易的一种。与右侧交易不同,网格...

    1. 原理

    什么是网格交易法?

    网格交易法是一种利用行情震荡进行获利的策略。在标的价格不断震荡的过程中,对标的价格绘制网格,在市场价格触碰到某个网格线时进行加减仓操作尽可能获利。

    网格交易法属于左侧交易的一种。与右侧交易不同,网格交易法并非跟随行情,追涨杀跌,而是逆势而为,在价格下跌时买入,价格上涨时卖出。

    怎样设计网格?

    投资者可以随意设置网格的宽度和数量。既可以设置为等宽度,也可以设置为不等宽度的。设置等宽度网格可能会导致买点卖点过早,收益率较低。设置不等宽度网格能够避免这个问题,但如果行情出现不利变动,可能会错失买卖机会。

    网格交易法的盈利情况

    在行情震荡上涨时:
    在这里插入图片描述

    假设格子之间的差为1元钱,每变化一个格子相应的买入或卖出1手,则通过网格交易当前账户的净收益为5元,持空仓3手,持仓均价为13元。

    行情震荡下跌时:
    在这里插入图片描述

    同理可知,净收益为10元,持5手多仓,平均成本为8元。

    可以看到,无论行情上涨还是下跌,已平仓的部分均为正收益,未平仓的部分需要等下一个信号出现再触发交易。

    即使网格交易能够获得较为稳定的收益,但也存在一定的风险。如果行情呈现大涨或大跌趋势,会导致不断开仓,增加风险敞口。这也是为什么网格交易更适用震荡行情,不合适趋势性行情。

    核心

    网格交易主要包括以下几个核心要点:

    - 挑选的标的最好是价格变化较大,交易较为活跃
    网格交易是基于行情震荡进行获利的策略,如果标的不活跃,价格波动不大,很难触发交易。
    - 选出网格的压力位和阻力位
    确定适当的压力位和阻力位,使价格大部分时间能够在压力位和阻力位之间波动。如果压力位和阻力位设置范围过大,会导致难以触发交易;如果压力位和阻力位设置范围过小,则会频繁触发交易。
    - 设置网格的宽度和数量
    设定多少个网格以及网格的宽度可根据投资者自身喜好自行确定。

    2. 策略思路

    第一步:确定价格中枢、压力位和阻力位
    第二步:确定网格的数量和间隔
    第三步:当价格触碰到网格线时,若高于买入价,则每上升一格卖出m手;若低于买入价,则每下跌一格买入m手。

    回测标的:SHFE.rb1901
    回测时间:2018-07-01 到 2018-10-01
    回测初始资金:10万

    策略难点

    怎样记录价格是否突破网格线?

    解决方法:有些人可能会想到用当前价格与网格线对应的价格进行比较,但这样操作比较麻烦,步骤繁琐。这里采用区域判断方式。根据网格线划分网格区域为1、2、3、4、5、6.利用pandas库提供的cut函数,将当前价格所处的网格区域表示出来。当网格区域发生变化,说明价格突破了一个网格线。

    如何避免出现4区-5区开仓一次,5区-4区又平仓一次这种“假突破”?

    解决方法:4-5开仓一次和5-4平仓一次实际上突破的是一根线,此时的形态是价格沿着这根线上下波动。只有第一次穿过这条线时才是真正的交易信号,其他的并没有形成突破。因此我们需要一个变量储存每一次交易时网格区域的变化形态(按照从大到小的顺序),比如5-4可以记为[4,5],4-5记为[4,5]。当新的记录=旧的记录时,信号失效。

    3. 代码实现

    说明:本策略基于掘金量化平台。

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

    4. 回测结果

    设定初始资金10万,手续费率为0.01%,滑点比率为0.01%。回测结果如下图所示。
    在这里插入图片描述
    回测期间策略累计收益率为4.16%,年化收益率为16.50%,基准收益率为0.91%,整体跑赢指数。最大回撤为0.72%,胜率为100%。在2018年7月12日以后,标的没有交易,说明此时标的价格已经超过设置的网格范围,可以适当加宽或增加网格数量。

    5. 自动化网格交易——无需编写代码

    掘金量化终端最近新推出了一个智能策略选项,可以直接实现网格交易,不需编写代码。
    在这里插入图片描述
    只需要输入标的代码、价格区间、网格数量、变动单位等必要元素,就能直接实现网格交易,容易上手。有需要的可以参考使用说明:智能策略

    展开全文
  • 网格交易策略和交易机器人,币安交易所的网格交易-源代码 binance_grid_trader:Binance Exchange的网格交易策略和交易机器人。币安交易所的网格交易-源码 51bitquant网格交易策略 使用方法 修改配置文件,配置您的...
  • 一种简单实用的调整网格交易策略中网格大小的方法,有效改善了网格交易策略的盈利效率,降低回撤风险!
  • 什么是网格交易策略网格交易又名渔网交易,就是跌买涨卖。它适合震荡市,震荡市就是行情价围着一个数字上下浮动的,这个数字就是设置的价格中轴线。设定中枢价格后,对投资标的进行机械式操作,下跌时,进行分档买入...

    什么是网格交易策略

    网格交易又名渔网交易,就是跌买涨卖。它适合震荡市,震荡市就是行情价围着一个数字上下浮动的,这个数字就是设置的价格中轴线。

    设定中枢价格后,对投资标的进行机械式操作,下跌时,进行分档买入,上涨时,进行分档卖出。网格法不依赖人为的思考,完全是一种程序行为,像渔网一样,利用行情的波动在网格区间内低买高卖。通过反复循环差价赚取利润。

    策略优缺点

    优点: 网格交易策略适合价格在一个范围内波动的投资标的,能够在震荡市里不断积累利润,降低长线投资的成本……

    缺点: 网格策略只适合震荡市;收益率较低;资金利用率低;操作时间长;长时间的浮亏……

    网格交易实现过程

    制定网格计划

    在策略开始之前先设置中枢价格,在多头、空头方向分别建立网格系统(设置网格档位(格子)数量、每个网格的触发价格、持仓手数)。

    (注: 各参数的具体值是根据策略使用者的经验以及对应不同合约进行调整、优化;网格的价格档位等参数可手动填入也可用计算机按一定比例计算出)

    多头方向交易买入

    如果行情最新价跌过下一个网格档位(多头的档位价格依次下跌)的价格时,则买入下一个档位对应的手数。

    卖出

    如果行情最新价涨过上个网格档位的价格(因为多头希望在一定价格买入后在更高的价格卖出,所以价格跌过一格就买入那一格的手数,涨过上一格才卖出当前格买入的手数),则进行减仓操作卖出当前档位对应的手数(如果当前在网格第一个档位,价格涨过起始价才能触发减仓的卖出操作)。

    空头方向交易卖出

    如果行情最新价涨过下一个网格档位(空头的档位价格依次上涨)的价格时,卖出下一个档位对应的手数。

    买入

    如果行情最新价跌过上个网格档位的价格(因为空头希望在一定价格卖出后在更低的价格买入,所以价格涨过一格就卖出那一格的手数,跌过上一格才买入当前格卖出的手数),则进行减仓操作买入当前档位对应的手数(如果当前在网格第一个档位,价格跌过起始价才能触发减仓的买入操作)。

    实例说明(以多头方向为例)网格序号价格买入持仓手数卖出持仓手数

    04047.001

    14026.7712

    24006.6323

    33986.6034

    43966.6745

    53946.8356

    63927.1067

    73907.4678

    83887.9289

    93868.49910

    103849.1410设置网格参数:如上表。假设:总资金100万,起始价格为4047元,建立多头方向的10个档位,包含4047到14元的10个价格。

    开始策略

    如果行情最新价每跌过一个价格档位,就买入对应的手数;最新价每涨过上一个档位,就卖出当前档位的持仓手数。如果当前档位是第一档, 则最新价在涨过起始价格时才卖出第一档买入的手数。

    代码实现

    方法:递归

    设定网格计划参数网格起始价格(中枢价格);

    网格在多、空头的档位数量(即网格格子数量);

    多、空头网格每个档位的价格列表;

    多、空头每格的持仓手数列表。from functools import reduce

    from tqsdk import TqApi, TargetPosTask

    SYMBOL = "DCE.jd2001" # 合约代码

    START_PRICE = 4247 # 起始价位

    GRID_AMOUNT = 10 # 网格在多头、空头方向的格子(档位)数量

    api = TqApi()

    grid_region_long = [0.005] * GRID_AMOUNT # 多头每格价格跌幅(网格密度)

    grid_region_short = [0.005] * GRID_AMOUNT # 空头每格价格涨幅(网格密度)

    grid_volume_long = [i for i in range(GRID_AMOUNT + 1)] # 多头每格持仓手数

    grid_volume_short = [i for i in range(GRID_AMOUNT + 1)] # 空头每格持仓手数

    grid_prices_long = [reduce(lambda p, r: p*(1-r), grid_region_long[:i], START_PRICE) for i in range(GRID_AMOUNT + 1)] # 多头每格的触发价位列表

    grid_prices_short = [reduce(lambda p, r: p*(1+r), grid_region_short[:i], START_PRICE) for i in range(GRID_AMOUNT + 1)] # 空头每格的触发价位列表

    print("策略开始运行, 起始价位: %f, 多头每格持仓手数:%s, 多头每格的价位:%s, 空头每格的价位:%s" % (START_PRICE, grid_volume_long, grid_prices_long, grid_prices_short))

    (策略源码在文章最后)

    实现方法

    本策略使用递归实现,递归函数(wait_price(layer))的参数“layer”为当前所在的档位。策略初始参数为0,表示从起始价格开始进入判断最新价所在的网格方向、档位,此时持仓手数为0。

    递归函数的逻辑为:先判断当前是处于多头的网格档位还是空头的网格档位:如果价格在网格的多头方向,则进入多头的循环:获取最新行情价格,判断价格是否穿越到网格的其他档位:如果当前档位还未到达最大档位并且最新价小于等于下一个档位的价格(如果当前档位已经等于最大档位,价格再跌也不会再加仓,也就不用再判断价格是否小于下一个档位了),那么就调整持仓手数为下一个档位对应的持仓手数,并进入下一层递归函数;如果从下一层递归函数返回到当前档位层次,则将持仓手数调整回下一个档位的手数(因为可能在下一档位中持仓手数已经被修改了)。

    如果最新价大于当前档位的价格,则返回到上一档位层次,递归函数返回。def wait_price(layer):

    """等待行情最新价变动到其他档位,则进入下一档位或回退到上一档位; 如果从下一档位回退到当前档位,则设置为当前对应的持仓手数;

    layer : 当前所在第几个档位层次; layer>0 表示多头方向, layer<0 表示空头方向

    """

    if layer > 0 or quote.last_price <= grid_prices_long[1]: # 是多头方向

    while True:

    api.wait_update()

    # 如果当前档位小于最大档位,并且最新价小于等于下一个档位的价格: 则设置为下一档位对应的手数后进入下一档位层次

    if layer < GRID_AMOUNT and quote.last_price <= grid_prices_long[layer + 1]:

    target_pos.set_target_volume(grid_volume_long[layer + 1])

    print("最新价: %f, 进入: 多头第 %d 档" % (quote.last_price, layer + 1))

    wait_price(layer + 1)

    # 从下一档位回退到当前档位后, 设置回当前对应的持仓手数

    target_pos.set_target_volume(grid_volume_long[layer + 1])

    # 如果最新价大于当前档位的价格: 则回退到上一档位

    if quote.last_price > grid_prices_long[layer]:

    print("最新价: %f, 回退到: 多头第 %d 档" % (quote.last_price, layer))

    return如果价格在网格的空头方向,则进入空头的循环:获取最新行情价格,判断价格是否穿越到网格的其他档位:如果当前档位还未到达最大档位,并且最新价大于等于下一个档位的价格,则调整持仓手数为下一个档位对应的持仓手数,并进入下一层递归函数;如果从下一层递归函数返回到当前档位层次,则将持仓手数调整回下一个档位的手数

    如果最新价小于当前档位的价格,则返回到上一档位层次,递归函数返回

    回测

    回测参数设置初始账户资金:100万

    回测日期:2018.9.10——2018.11.16

    每跳动一档位手数变化:6手

    起始价位:4944.63

    多、空头每格涨跌幅(网格密度):0.005

    回测时盘口行情quote的更新频率:和K线分钟线的更新频率一致

    回测结果网格交易策略回测结果

    合约代码合约品种收益率风险度最大回撤年化夏普率

    CZCE.SR811白糖25.42%4.65%2.43%6.6779

    上表回测结果的累计收益走势图

    天勤内策略源代码:#!/usr/bin/env python

    # -*- coding: utf-8 -*-

    __author__ = 'limin'

    """

    网格交易策略

    参考: https://www.shinnytech.com/blog/grid-trading/

    注: 该示例策略仅用于功能示范, 实盘时请根据自己的策略/经验进行修改

    """

    from functools import reduce

    from tqsdk import TqApi, TargetPosTask

    SYMBOL = "DCE.jd2001" # 合约代码

    START_PRICE = 4247 # 起始价位

    GRID_AMOUNT = 10 # 网格在多头、空头方向的格子(档位)数量

    api = TqApi()

    grid_region_long = [0.005] * GRID_AMOUNT # 多头每格价格跌幅(网格密度)

    grid_region_short = [0.005] * GRID_AMOUNT # 空头每格价格涨幅(网格密度)

    grid_volume_long = [i for i in range(GRID_AMOUNT + 1)] # 多头每格持仓手数

    grid_volume_short = [i for i in range(GRID_AMOUNT + 1)] # 空头每格持仓手数

    grid_prices_long = [reduce(lambda p, r: p*(1-r), grid_region_long[:i], START_PRICE) for i in range(GRID_AMOUNT + 1)] # 多头每格的触发价位列表

    grid_prices_short = [reduce(lambda p, r: p*(1+r), grid_region_short[:i], START_PRICE) for i in range(GRID_AMOUNT + 1)] # 空头每格的触发价位列表

    print("策略开始运行, 起始价位: %f, 多头每格持仓手数:%s, 多头每格的价位:%s, 空头每格的价位:%s" % (START_PRICE, grid_volume_long, grid_prices_long, grid_prices_short))

    quote = api.get_quote(SYMBOL) # 行情数据

    target_pos = TargetPosTask(api, SYMBOL)

    position = api.get_position(SYMBOL) # 持仓信息

    def wait_price(layer):

    """等待行情最新价变动到其他档位,则进入下一档位或回退到上一档位; 如果从下一档位回退到当前档位,则设置为当前对应的持仓手数;

    layer : 当前所在第几个档位层次; layer>0 表示多头方向, layer<0 表示空头方向

    """

    if layer > 0 or quote.last_price <= grid_prices_long[1]: # 是多头方向

    while True:

    api.wait_update()

    # 如果当前档位小于最大档位,并且最新价小于等于下一个档位的价格: 则设置为下一档位对应的手数后进入下一档位层次

    if layer < GRID_AMOUNT and quote.last_price <= grid_prices_long[layer + 1]:

    target_pos.set_target_volume(grid_volume_long[layer + 1])

    print("最新价: %f, 进入: 多头第 %d 档" % (quote.last_price, layer + 1))

    wait_price(layer + 1)

    # 从下一档位回退到当前档位后, 设置回当前对应的持仓手数

    target_pos.set_target_volume(grid_volume_long[layer + 1])

    # 如果最新价大于当前档位的价格: 则回退到上一档位

    if quote.last_price > grid_prices_long[layer]:

    print("最新价: %f, 回退到: 多头第 %d 档" % (quote.last_price, layer))

    return

    elif layer < 0 or quote.last_price >= grid_prices_short[1]: # 是空头方向

    layer = -layer # 转为正数便于计算

    while True:

    api.wait_update()

    # 如果当前档位小于最大档位层次,并且最新价大于等于下一个档位的价格: 则设置为下一档位对应的持仓手数后进入下一档位层次

    if layer < GRID_AMOUNT and quote.last_price >= grid_prices_short[layer + 1]:

    target_pos.set_target_volume(-grid_volume_short[layer + 1])

    print("最新价: %f, 进入: 空头第 %d 档" % (quote.last_price, layer + 1))

    wait_price(-(layer + 1))

    # 从下一档位回退到当前档位后, 设置回当前对应的持仓手数

    target_pos.set_target_volume(-grid_volume_short[layer + 1])

    # 如果最新价小于当前档位的价格: 则回退到上一档位

    if quote.last_price < grid_prices_short[layer]:

    print("最新价: %f, 回退到: 空头第 %d 档" % (quote.last_price, layer))

    return

    while True:

    api.wait_update()

    wait_price(0) # 从第0层开始进入网格

    target_pos.set_target_volume(0)

    展开全文
  • 51bitquant网格交易策略 使用方法 修改配置文件,配置您的配置文件。 { " platform " : " binance_spot " , " symbol " : " BTCUSDT " , " api_key " : " replace your api key here " , " api_secret " : " ...
  • 网格交易法或者网格交易策略,网上有很多的介绍,这里是利用C#实现了比特币网格交易的策略及程序化交易,并利用OKex上的K线数据进行了回测验证,同时也进行可视化的K线展示。对于网格交易策略简单的说就是低买高卖...

    网格交易法或者网格交易策略,网上有很多的介绍,这里是利用C#实现了比特币网格交易的策略及程序化交易,并利用OKex上的K线数据进行了回测验证,同时也进行可视化的K线展示。对于网格交易策略简单的说就是低买高卖策略,网格的含义是指对买卖区间和买卖仓位的控制手段。比如这里我有8万的资金,总网格数定义为4格,每格的区间定义为5%,比特币的基准价为40000元人民币。那策略的每格的仓位为20000元(8万除以4),每下跌5%买入一格,也就是到比特币跌到38000时买入第一格,买入金额20000元。以此类推跌到36000元时买入第二格,仓位也是20000元,第三格、第四格以此类推。这是买入的策略。对于卖出策略也是严格按照每格设定的策略进行,策略是和买入相反,只是定义的卖出价格不是按照每上升一格就卖出的策略,这里定义每上涨三格才卖出的策略。比如最后一格的买入价为32000,每上涨3格卖出的价格为32000+32000*0.15=36800元。在程序开发中基准价和网格宽度都是灵活可调的。具体仓位及买卖点如下所示: 

    格子买入价格格宽5%仓位卖出价格
    第一格38000-5%2000043700
    第二格36000-10%2000041400
    第三格34000-15%2000039100
    第四格32000-20%2000036800

    整个程序是用C#开发的,除了实现了网格策略的实现及回测代码,为了进行策略回测还获取了OKex上的1分钟、3分钟、5分钟、1天、3天等K线数据。1天的K线数据是从2017年-10月-11日开始的。如图:

     网格定义和回测主界面是在同一个窗口中,策略定义和生成主要包括资产类型、币种选择、移动平均线(可以通过移动平均线选择基准价)选择、总仓位、买卖仓位、网格数、网格宽度及止损点(目前没有做止损控制)等参数项,这里测试我们选择的网格总数4格,宽度为0.05(即5%),点击“生成网格”按钮会生成四条网格策略数据,每条数据主要包含买点价格、卖点价格。如下图: 


    回测功能包括回测数据时间选择,包括开始时间和结束时间,还包括测的K线数据类型,如1天、30分钟等,回测结果包括成交次数、盈利总和、盈利百分比、成交列表等数据。成交列表主要包括每条成交的买点价格、买点时间、卖点价格、卖点时间、交易成本(这里是OKex的买卖各收0.02%的手续费计算的)。这里我们选择的回测数据是2017-12-17至2018-4-14时间段,日线的数据作为回测数据,总资金20万,网格4格,网格宽度3%。回测结果总成交17次,盈利47600,23.8%;当前被套3次,亏损2569,1.2%;去掉亏损回测总盈利:45030.8,22.5%。如下图: 


    K线分析,在K线上可视化的标示出了网格买点、网格卖点及实际买点和实际卖点,如: 


    展开全文
  • 股票网格交易策略

    千次阅读 2019-04-06 16:20:48
    什么是网格交易 定义 设定价值中枢,利用“底仓+档位”的模式对投资标的进行机械式操作,下跌时,进行分档买入,上涨时,进行分档卖出。网格法由于不依赖人为的思考,完全是一种程序行为,像渔网一样,利用行情的波动...

    什么是网格交易

    定义

    设定价值中枢,利用“底仓+档位”的模式对投资标的进行机械式操作,下跌时,进行分档买入,上涨时,进行分档卖出。网格法由于不依赖人为的思考,完全是一种程序行为,像渔网一样,利用行情的波动在网格区间内低买高卖,可以合理控制仓位,避免追涨杀跌,拥有较强的抗风险能力

    标的选择:

    ①选择股票: 由于网格交易法追求的是不断的行情波动,行情波动越厉害,收益率越高,哪怕股票不涨,只在一定的区间内不停波动,网格法也会获得很大的收益,按网格交易法的特性,会涨会跌,振幅较大的股票才合适网格法,所以日K线波动越大的股票越适合网格法。同时基于安全角度,首先要选择效益高,质地好的股票。  
    ②选择ETF:基金的流动性较好,同时更加贴近于整体盘面走势。所以当趋势偏向于为震荡市,则可以利用网格法,机械式操作,吃满震荡市利润。  
    

    确定区间:

    ①短线区间:比如一段时间,大盘或者股票一直处于箱体震荡,则可以设置箱体顶部为短线仓位卖出最高档,箱体底部为箱体买入最低档。  
    ②长线区间:设置股票或者大盘估值的历史平均较低位置为买入最低档、设置股票或大盘估值的的历史平均较高位置为卖出最高档。  
    

    档位设置:(5档)

    ①平均分档法:例区间为10元-20元,那么买入档位平均分配,以15元为合理估值建仓的中档,此处可投入百分之50资金,剩下的百分之50资金除以5档。从最低档至最高档之间,仓位分别为100-90-80-70-60-50-40-30-20-10-0,上涨触发网格阈值时,进行卖出10%仓位,当下跌触发网格阈值时,进行买入10%仓位,不断的低买高卖。    (PS:此方法较为适用于震荡行情或者短线箱体操作。)  
    ②指数分档法:前一种等分网格的价格区间是正确的,但每次买卖的资金量等分的话容易造成在单边趋势市中,每次的买卖量过于平均,造成太早买进或太早卖出,虽然安全性很好,但是容易导致收益率很低。而指数建仓法,就是用指数函数来指导每个等分价位的买卖量  
    

    操作要点

    • 首次投入建议不要在高位进入,否则较难有收益,最好在价值中枢附近为好。
    • 严格按照之前设定好的计划,进行机械化操作,坚决制止随手操作。
    • 每隔一段时间,重新审视计划。如果突破箱体或者跌破箱体,你必须有相应的应对策略。
    • 纯网格法 适合行情震荡且无特定规律的时候使用,适合小资金薅羊毛。
    • 指数法 适合指导长线或者中线的单边趋势性建仓和卖出

    局限

    • 趋势决定成败。股票必须集中于波动大、成长性好的中小市值股票
    • 牛市表现不佳。
    • 买卖规则呆板:对追涨杀跌的盲目排斥,会导致错过一些突破支撑阻力位置的买点和卖点
    • 忽视了时间成本
    • 获利有限

    网格举例

    例1:

     

     竖着有 8 个格子,代表股价涨跌幅度,我们假设一格为 10% 的幅度。
    横着有 6 个格子,代表时间,我们假设一格为 1 年的时间。
    按照网格交易法,我们交易是这样的:
    在一只股票准备入手的价位,第一次跌幅 10% 时(买 1),买入该股票 3000 股,在第六年,股价相对于买 1 的价位涨幅 10%,卖出 3000 股获利(卖 1),耗时 6 年;
    在一只股票相对于买 1 的价位再次跌幅 10% 时,买入该股票 3000 股(买 2),在第 5 年,股价相对于买 2 的价位涨幅 10%,卖出 3000 股获利(卖 2),耗时 5 年;
    在一只股票相对于买 2 的价位再次跌幅 10% 时,买入该股票 3000 股(买 2),在第 3 年,股价相对于买 3 的价位涨幅 10%,卖出 3000 股获利(卖 3),耗时 3 年。
    网格交易是一种永远都不预测涨跌的交易方法,如果严格按照网格交易法交易,是永远不会亏损卖出股票的。

    例2

    他人的网格策略

    地址:https://www.ricequant.com/community/topic/456
    回测表现:

    地址:https://www.ricequant.com/community/topic/1814
    回测图:

     

    地址:https://uqer.io/v3/community/share/57bcf258228e5b79a575a79e
    回测图:

     

    可见,网格整体效果并没有多好,主要问题是,对于单边行情的操作问题,持续大涨时一般都是低仓位,持续大跌时则满仓,怎么克服这种局限性呢?

    我的股票网格

    原始版思路

    标的:上证50 时间区间:201601-201812 资金:100w 网格参数: 重新计算网格:每20日 网格分档:以mean为基准,std为range的基准 各档位:Mean+std*[-0.8, -0.6, -0.4, -0.2, -0. , 0.2, 0.4, 0.6, 0.8] 对应仓位:[0.9,0.8,0.7,0.6,0.5,0.4,0.3,0,2,0.1]
    回测图:

    逆序网格

    修改点:网格上部高仓位,网格下部低仓位
    回测图:


    突破型网格

    修改点:

    超过最高,满仓,认为牛市。  
    高位缓冲地带,什么操作都不做。  
    普通波段仓位,普通网格策略。  
    低位缓冲地带,什么操作不做。  
    小于最低,认为熊市,空仓。  
    

    这个策略既考虑到了牛市的突破和熊市的突破,也考虑到普通震荡行情的高抛低吸,整体效果也最佳。

    回测图:


    参考文献:

    1. https://xueqiu.com/9651781081/62395970
    2. http://www.sohu.com/a/250751596_100250275
    3. http://www.360doc.com/content/18/0310/16/41456091_735911170.shtml
    4. https://www.douban.com/note/634683891/
    5. https://www.jianshu.com/p/d05b68832c42
    6. https://xueqiu.com/4649792187/59634344
    展开全文
  • 网格交易策略调研

    千次阅读 2020-09-02 17:38:37
    定义:网格交易,是量化交易的一种,是一种稳定的、保险的、收益率不会大起大落的交易方式。 起源:信息论之父申农:任何一个价位买进资金的50%,也就是说资金数量:股票市值=50%:50%。股票价格上涨一定幅度就卖出...
  • 51bitquant网格交易策略和实盘部署 网格交易的原理视频讲解链接: https://www.bilibili.com/video/BV1Jg4y1v7vr/ 交易所注册推荐码 OKEX 交易所注册推荐码, 手续费返佣20%    - ...
  • 针对okex平台的币币网格交易策略量化项目 nodejs版本 开始 1.将项目克隆到本地并进入项目目录 git clone https://github.com/handoing/okex-grid cd okex-grid 2.如第一次使用需执行以下命令填写账号配置数据,如已...
  • 神奇的网格交易策略

    万次阅读 2019-03-11 16:14:55
    前段时间在复现各种技术因子的类的择时,选股操作时开发过了网格策略,最终结果并不是非常好,当然震荡市不错,但是单边牛市和熊市表现都非常糟糕.(由于...网格交易其核心在于均值回归,如果价格不回归则网格交易就会失...
  • 以下是我在网上看到的一个网格交易法的源码,希望更多的人贴一些网格交易法的源码,大家一起学习提高。//+------------------------------------------------------------------+//| Grid1.1.mq4 |//| ...
  • 这里做了单品种期货网格交易策略实现。 首先按照过去的n条k线计算出简单评价价SMA基准线,然后按照标准差STD,算出最高线和最低线,然后在之间定出一组通道区间。 当bar.close在通道中时候,下个bar打到上轨开多单...
  • 网格交易策略简介 什么是网格交易策略? 网格交易是利用市场震荡行情获利的一种主动交易策略,其本质是利用投资标的在一段震荡行情中价格在网格区间内的反复运动以进行加仓减仓的操作以达到投资收益最大化的目的...
  • 网格交易法的源码//+------------------------------------------------------------------+//| Grid1.1.mq4 |//| Copy* 顺...
  • 5月份盈利:123042美金 4月份盈利:145310美金 ...Odin智能交易使用了可靠的网格交易策略,Odin能够从形态中分析当前的走势,并且找到最佳的入场点和出场点。 推荐货币对:EURUSD,EURAUD,AUDUSD,USDCA
  • 奶爸今天就给大家介绍一种适用于震荡行情的交易策略——网格交易。 1、网格交易网格交易可简单理解为:把价格的波动区间放到以一个设定好的网格里。 把资金分成多份,价格每跌一格就买一份,每涨一格就卖一份...
  • import print_function, absolute_import, unicode_literalsimport numpy as npimport pandas as pdfrom gm.api import *'''本策略首先计算了过去300个价格数据的均值和标准差并根据均值加减1和2个标准差得到网格的...
  • 原 期货网格交易策略(附源码) 网格交易策略 网格交易策略简介 什么是网格交易策略? ​ 网格交易是利用市场震荡行情获利的一种主动交易策略,其本质是利用投资标的在一段震荡行情中价格在网格区间内的反复运动以...
  • 本文利用ccxt实现简单的一个网格交易策略,只要价格一直在某一范围内波动就会有盈利产生。此外,在价格超出网格后增加了重新下单的功能,并在此基础上添加了可用余额的监控,从而在盈利足够多的情况下自动增加交易量...
  • 网格交易4.0.pdf

    2019-10-07 09:59:38
    1. 学习网格交易策略基本原理:一定要明白“基准价更新”的原理! 设置基准价和网格价 → 价格下跌:1 买入 2. 更新基准价 → 价格上涨: 1. 卖出 2. 基准价更 新… 2. 学习网格交易 App 应用: 亲手设置各类参数,...
  • 网格交易系统策略

    2018-08-28 17:36:00
    网格交易系统策略   1引言 上个世纪中叶的某一天,信息论之父克劳德 • 香农在麻省理工大学给大家演示了他的投资理论。 具体来说,在任何一个价位,买入资金的50%作为起始仓位,当价格上涨一定幅度...
  • 网格变形策略之单边网格 (注释版) 策略介绍 - 网格可以自定义方向 - 先买后卖: 网格会从首价格开始向下挂买单, 每个买单间隔 “价格间隔” 这个参数, 挂单数量为”单笔数量”, 挂够 “总数量” 个买单, 有...
  • 网格交易策略(Grid Trading) 策略介绍 网格策略本质上是一种低吸高抛的策略。标的物价格越低,吸纳的头寸越多;标的物价格越高,卖出的头寸越多。网格策略巧妙地借鉴了日常生活中渔翁撒网扑鱼的思路...
  • 高级网格交易学习笔记

    千次阅读 2019-08-25 14:03:20
    1,网格交易策略基本原理,基准价更新规则: 设置基准价和网格价->价格下跌:1,买入;2,更新基准价(更新为最新价)->价格上涨:1,卖出;2,更新基准价(更新为最新价)。 2,高级网格交易,可以实现不等...
  • 策略描述:借鉴马丁交易系统和网格交易系统的思路,采用固定仓位,分批建仓的方式进行风控。 交易品种:EURGBP 交易环境:模拟账户 初始资金:10 000.00 USD 演示账户:https://www.mql5.com/zh/signals/1001970...
  • 网格交易策略原理 假设现在OKEX的BTC/USDT行情如下: 类型 价格 数量 sell 8870 0.2 sell 8860 0.1 sell 8850 0.4 buy 8840 0.3 buy 8830 0.2 buy 8820 0.1 假设账户里面目前持有1个BTC和10000...
  • 网格交易法.pdf

    2019-05-22 12:49:08
    经典的网格交易法/网格策略详细讲解,量化交易参考
  • 量化交易日记-EURGBPUSD对冲策略-2021年04月总结
  • 网格交易法喜欢高频震荡不喜欢单边,暴涨型的单边最多卖飞后重新开网,最多少赚一点问题不大。但是特别怕暴跌型的单边,一旦被套或破网,除了割肉别的操作空间很小。 所以不是什么交易品种都适合跑网格交易法的。 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,648
精华内容 1,859
关键字:

网格交易策略