夜雨聆风学习资料网

ARTICLE · 1084170

AI量化交易|30 网格交易:70% 的时间在震荡,网格帮你把差价收成租

AI量化交易|30 网格交易:70% 的时间在震荡,网格帮你把差价收成租

海龟教我们在趋势市赚钱,缠论教我们识别转折点。但你想过没有:市场大部分时间在做什么?

答案是震荡。大约 70% 的时间,价格在一个区间内来回波动,既没有明确上涨,也没有明确下跌。这时候:

  • • 海龟的突破策略会频繁假突破,反复止损亏钱;
  • • 缠论的三买信号很少出现,大部分时间空仓。

网格策略,就是专门为震荡市设计的收租模型。


一、网格是什么:把区间切成格子,撞一格收一格

先看三种策略的世界观差异:

维度
海龟交易
缠论量化
网格交易
核心哲学
突破 → 跟随趋势
结构 → 识别转折点
震荡 → 区间收租
适合行情
趋势市
趋势转折点
震荡市
信号逻辑
价格突破 N 日高/低
分型/笔/中枢
价格穿越格子线
赚钱方式
大趋势的大利润
结构性突破
每格固定小利润
风险来源
假突破止损
背驰再背驰
单边下跌满仓被套

网格策略一句话:把价格区间切成 N 个格子,每跌一格买一份,每涨一格卖一份,不预测涨跌,只要价格在区间内波动就赚差价。


二、网格的四要素

搭一个网格策略,要回答四个问题:

  1. 1. 网格区间:在什么价格范围内做网格?上限和下限怎么定?
  2. 2. 格子数量:切几格?格子越多,交易越频繁,每次赚得越少。
  3. 3. 每格仓位:每穿越一格买/卖多少?
  4. 4. 出界处理:价格跌破下界(满仓被套)或涨破上界(踏空)怎么办?

举个最简例子:区间 [100, 110],5 格,每格间距 = (110 - 100) ÷ 5 = 2 元,格子线是 [100, 102, 104, 106, 108, 110]。规则是:价格每下穿一格,买入一份;每上穿一格,卖出一份。

比如价格从 106 跌到 102,就在 104 买入、在 102 买入;价格从 102 涨到 108,就在 104 卖出(赚 2 元)、在 106 卖出(赚 2 元)。


三、网格交易引擎

核心逻辑封装成一个 GridEngine 类:

class GridEngine:    def __init__(self, upper, lower, num_grids, total_capital):        self.grid_size = (upper - lower) / num_grids        self.levels = [lower + i * self.grid_size for i in range(num_grids + 1)]        self.position_at = [0] * (num_grids + 1)   # 每格持仓状态        self.prev_cell = None                      # 上一根K线所在的格子    def update(self, price):        curr_cell = self.get_cell(price)           # 当前价格在哪一格        if self.prev_cell is None:                 # 首次,只记录不做交易            self.prev_cell = curr_cell            return []        prev_cell = self.prev_cell        self.prev_cell = curr_cell        if curr_cell < prev_cell:            # 价格下跌,穿越格子 → 买入            for cell in range(prev_cell - 1, curr_cell - 1, -1):                if self.position_at[cell] == 0:    # 该格还没买过                    self.buy(cell)                 # 买入信号        elif curr_cell > prev_cell:            # 价格上涨,穿越格子 → 卖出            for cell in range(prev_cell, curr_cell):                if self.position_at[cell] > 0:     # 该格有持仓                    self.sell(cell)                # 卖出信号(赚一格差价)

这里的关键是用 position_at 数组标记每一格有没有持仓:下跌时,只在还没买过的格子买入,避免重复买;上涨时,只在有持仓的格子卖出,锁定一格差价。


四、经典网格策略:震荡市的神,趋势市的鸡肋

我们跑一个固定网格回测,参数设为:网格区间取过去 60 日最高/最低价(加 2% 缓冲)、8 格、每格仓位 90%÷8 ≈ 11.25%、出界时不操作只等待。

多标的回测(2024-2025):

标的
网格收益
买入持有
胜率
夏普
交易次数
沪深300ETF
5.56%
46.10%
81.80%
1.86
11
贵州茅台
18.46%
-12.80%
85.70%
1.36
7
平安银行
5.65%
49.20%
87.50%
2.14
8
纳指ETF
6.31%
54.90%
64.30%
3.34
14

茅台是网格的高光时刻:买入持有亏 12%,网格赚 18.46%。因为茅台 2024-2025 是震荡市,价格在 1370 到 1650 之间反复,网格反复做差价,累计赚了 18%。而纳指 ETF 是单边上涨,网格只赚到区间内的小波动,大趋势利润全部踏空。

关键发现有三条:

  • • 网格胜率极高(65% 到 88%),但盈亏比低(每次赚固定一格);
  • • 震荡市网格稳定赚差价,优于买入持有;趋势市容易踏空,差于买入持有;
  • • 最大风险是价格单边下跌时持续加仓,满仓被套。

五、中枢网格:让区间由市场结构自己说了算

固定网格的区间用「过去 60 日高低点」来定,问题在于这是人为拍脑袋:为什么是 60 日不是 30 日或 120 日?最高/最低价真的是合理的区间吗?

缠论给了一个更好的答案:中枢的 ZG/ZD 就是市场自己「选出来」的震荡区间。 中枢是至少 3 笔价格重叠的区域,价格在此反复震荡,正是网格理想的执行环境。

中枢网格引擎继承 GridEngine,加了几个能力:

class ChanGridEngine(GridEngine):    """以缠论中枢的 ZG/ZD 作为网格边界"""    def __init__(self, zg, zd, num_grids=6, total_capital=0):        super().__init__(upper=zg, lower=zd, ...)        self.zg, self.zd = zg, zd    def switch_zhongshu(self, new_zg, new_zd):        """切换到新中枢,重建网格"""        self.zg, self.zd = new_zg, new_zd        self.levels = [new_zd + i * gs for i in range(num_grids + 1)]        self.position_at = [0] * (num_grids + 1)    def deactivate(self):        """价格突破中枢时停用网格"""        self.active = False

策略逻辑也很清晰:

class ChanGridStrategy(bt.Strategy):    def next(self):        zg = self.data.chan_zg[0]      # 当前中枢上沿        zd = self.data.chan_zd[0]      # 当前中枢下沿        price = self.data.close[0]        if zg != self.current_zg or zd != self.current_zd:            self.grid.switch_zhongshu(zg, zd)   # 中枢切换→重建网格        if zd <= price <= zg:            signals = self.grid.update(price)   # 中枢内→网格交易            for sig in signals: self.execute(sig)        if price > zg * 1.005 or price < zd * 0.995:            self.close(); self.grid.deactivate() # 突破中枢→停止网格, 清仓
维度
固定网格
中枢网格
区间来源
人为设定(60 日高低点)
市场结构(缠论中枢 ZG/ZD)
区间合理性
可能偏大或偏小
由 3 笔重叠定义,有结构基础
出界处理
停止交易等待
停止网格,中枢切换后重建
适应性
固定不变
新中枢形成自动重建

茅台(2023-2025)实测,chan.py 识别出 3 个中枢:

中枢
时间
ZG
ZD
宽度
宽度%
1
2023-03 ~ 2023-12
1631.36
1572.56
58.8
3.70%
2
2024-06 ~ 2024-08
1437.5
1338.5
99
7.10%
3
2024-10 ~ 2025-02
1591.6
1413.37
178.23
11.90%

三个中枢宽度从 3.7% 扩到 11.9%,意味着多空分歧越来越大。窄中枢每格间距小、交易频繁但赚得少;宽中枢每格间距大、交易少但赚得多。

三策略对比(茅台 2023-2025):

指标
买入持有
固定网格
中枢网格
总收益
-12.76%
13.16%
1.62%
最大回撤
无
18.42%
1.61%
夏普比率
无
0.78
-2.54
交易次数
无
4
2
胜率
无
75.00%
100.00%

中枢网格只赚 1.62%,远不如固定网格的 13.16%,它有什么优势?看最大回撤:中枢网格仅 1.61%,固定网格 18.42%。

中枢网格的核心价值是风险控制:只在中枢内交易,区间有结构支撑;出中枢即停止,不在趋势中逆势加仓。代价是收益较低,大部分时间在等待。而固定网格的问题正是价格单边下跌时持续加仓,可能满仓被套。

多标的横向对比也印证了规律:

标的
中枢数
中枢网格收益
固定网格收益
买入持有
贵州茅台
3
1.62%
13.16%
-12.76%
中芯国际
3
-0.82%
24.47%
195.69%
平安银行
4
1.27%
3.70%
-4.28%
纳指ETF
1
0.00%
5.44%
135.00%

规律很清楚:中枢越多(震荡越多),网格机会越多;中枢越少(趋势越强),网格越不适用。 纳指 ETF 只有 1 个中枢,中枢网格收益 0%;平安银行 4 个中枢,震荡较多,网格有 +1.27% 正收益。中芯国际虽然也有 3 个中枢,但 2024-2025 年它走出一波强势上涨(买入持有 +195.69%),中枢网格只在区间内小幅做差价,收益反而为负。


六、中枢网格 + 趋势联动:想两边都赚?

中枢网格出中枢后就停止交易等待,这浪费了趋势行情。能不能两边都赚?于是有了自适应策略的进化版,用缠论中枢判断趋势/震荡,切换网格/趋势跟踪:

模式
触发条件
交易逻辑
目标
GRID
价格在中枢内 [ZD, ZG]
网格低买高卖
赚震荡差价
TREND_UP
价格向上突破 ZG
ATR 跟踪止损持仓
赚趋势利润
WAIT
价格向下跌破 ZD
空仓等待新中枢
回避下跌

核心代码:

class ChanHybridStrategy(bt.Strategy):    def next(self):        if self.mode == 'GRID':            if price > zg * 1.005:          # 向上突破                self.close()                # 清网格仓位                self.buy(size=...)          # 趋势入场                self.trail_stop = price - 2.5 * ATR                self.mode = 'TREND_UP'            elif price < zd * 0.995:        # 向下跌破                self.close()                # 清仓防守                self.mode = 'WAIT'            else:                self.grid.update(price)     # 正常网格        elif self.mode == 'TREND_UP':            self.trail_stop = max(self.trail_stop, highest - 2.5 * ATR)            if price < self.trail_stop:                self.close(); self.mode = 'WAIT'

模式切换由缠论结构驱动,不是人为判断。茅台上的实测,混合策略反而在趋势跟踪部分亏了钱(总收益 -7.78%)。这说明不是每个增强都一定有效:趋势跟踪的效果取决于出中枢后趋势是否延续(很多时候是假突破)、ATR 参数是否合适、标的有没有强趋势特征。

结论很朴素:趋势明确的标的(纳指 ETF)上,趋势跟踪能捕捉大行情;震荡为主的标的(茅台)上,纯中枢网格更稳健。策略选择矩阵是:

  • • 高震荡、低趋势 → 纯中枢网格(中枢多,机会多);
  • • 有趋势、有震荡 → 混合策略(两种行情都能赚);
  • • 强趋势 → 海龟/缠论三买(网格在趋势市没优势)。

七、网格能做到什么,做不到什么

能做到:震荡市稳定收租、胜率极高(70% 到 90%)、不预测方向纪律执行、中枢网格让边界由市场结构决定、出中枢即停避免趋势市逆势加仓。

做不到:单边行情赚大钱(趋势利润必然踏空)、避免满仓被套(价格持续跌破下界持仓会越来越重)、适合所有标的(纳指 ETF 不适合)、保证绝对收益(赚的是差价这种相对收益,不是方向收益)。

说到底,网格策略的效果高度依赖标的选择:震荡股(茅台)表现好,趋势股(纳指 ETF)几乎无用。那能不能用科学的方法,从全市场选出适合做网格的标的?

这,就是下一篇要解决的:多因子选股。

关注 + 在看,别掉队。

相关学习资料