4. 市场状态识别方法

策略权重切换的前提,是先知道“现在是什么市场”。如果状态判断本身不稳定,后面的权重调整只会放大错误。市场状态识别的目标不是预测涨跌,而是把连续行情压缩为少数可操作的状态标签,并让标签在时间上具有延续性、在边界上具有可解释性。本节围绕趋势、震荡、高波动、低波动四类状态,给出一套可落地的量化判定流程。

一、核心原理:用“方向效率”和“波动水平”两个维度切分状态

多数行情可以拆成两个独立问题:第一,价格是否在朝一个方向高效推进;第二,价格整体波动是否足够大。前者用趋势效率衡量,后者用波动率衡量。把这两个维度交叉,就得到四象限状态:

  • 趋势状态:方向效率高,波动中高,价格持续创出新高或新低。
  • 震荡状态:方向效率低,波动中低,价格在区间内反复折返。
  • 高波动状态:波动率显著抬升,但方向效率不稳定,常见于消息冲击或流动性骤变。
  • 低波动状态:波动率被压缩到历史低位,方向效率也低,常出现在趋势启动前的蓄势期。

这里的关键是:趋势和震荡不是按“涨跌”划分,而是按“推进效率”划分;高波动和低波动不是按“绝对价格”划分,而是按“波动率分位”划分。只有把两者分开,才能避免把“高波动下跌”误判为“强趋势下跌”。

市场状态四象限判定框架 波动率水平(低 → 高) 方向效率(低 → 高) 趋势状态 效率高 · 波动中高 顺势策略权重上调 高波动状态 效率不稳 · 波动高 降杠杆 · 收紧风控 低波动状态 效率低 · 波动低 等待突破 · 轻仓观察 震荡状态 效率低 · 波动中低 均值回归权重上调

二、方法流程:从原始数据到状态标签

状态识别建议按固定流水线执行,避免每次凭感觉换指标。流程如下:

  1. 数据准备:使用同一周期的收盘价、最高价、最低价,确保复权一致。
  2. 计算方向效率:常用ADX、效率比率ER或净变动/总变动。ER越高,趋势越强。
  3. 计算波动率:用ATR/收盘价、滚动标准差或已实现波动率,并取历史分位。
  4. 设定阈值:效率阈值和波动分位阈值分别取历史滚动分位,如70%和30%。
  5. 状态映射:按四象限规则输出标签,并做最小持续期过滤。
  6. 平滑处理:用N根K线确认或状态机去抖,减少频繁切换。

下面是一段可复用的Python伪代码,展示核心计算与映射逻辑:

import numpy as np
import pandas as pd

def efficiency_ratio(close, n=20):
    change = abs(close - close.shift(n))
    volatility = close.diff().abs().rolling(n).sum()
    return change / volatility.replace(0, np.nan)

def atr_percentile(high, low, close, n=14, lookback=252):
    tr = pd.concat([
        high - low,
        (high - close.shift()).abs(),
        (low - close.shift()).abs()
    ], axis=1).max(axis=1)
    atr = tr.rolling(n).mean() / close
    return atr.rolling(lookback).rank(pct=True)

def market_state(df, er_th=0.35, vol_hi=0.70, vol_lo=0.30):
    er = efficiency_ratio(df['close'])
    vp = atr_percentile(df['high'], df['low'], df['close'])
    state = np.select(
        [(er > er_th) & (vp >= vol_lo),
         (er <= er_th) & (vp >= vol_hi),
         (er <= er_th) & (vp < vol_lo)],
        ['trend', 'high_vol', 'low_vol'],
        default='range'
    )
    return pd.Series(state, index=df.index)
阈值不要写死。建议每季度用滚动窗口重新估计分位,并保留一份阈值变更日志,便于复盘时区分“市场变了”还是“参数变了”。

三、案例场景:同一段行情中的状态切换

假设某品种日线数据在三个月内经历三个阶段。第一阶段,ER从0.2升至0.55,ATR分位从25%升至65%,状态从低波动切到趋势,此时趋势策略权重应上调。第二阶段,ER回落至0.25,ATR分位升至85%,价格上下影线明显变长,状态进入高波动,此时应降低仓位、放宽止损或暂停开仓。第三阶段,ER继续低于0.3,ATR分位降至20%,价格窄幅横盘,状态进入低波动,适合等待突破信号而非重仓押注方向。

这个案例说明:状态切换往往不是瞬间完成,而是有过渡带。工程上可以用“候选状态+确认计数”的方式,例如连续3根K线满足新状态才正式切换,避免在边界反复横跳。

状态 方向效率 波动分位 典型策略权重倾向 风险动作
趋势 高 中高 趋势跟踪上调 正常仓位,移动止损
震荡 低 中低 均值回归上调 区间边界止盈止损
高波动 不稳定 高 整体降权 降杠杆,收紧风控
低波动 低 低 轻仓等待 观察突破,避免重仓

四、误区与复盘:状态识别最容易犯的错

  • 用单一指标定状态:只看ADX或只看波动率,容易把高波动震荡误判为趋势。
  • 阈值固定不变:不同品种、不同年份的波动中枢不同,固定阈值会系统性偏移。
  • 忽略最小持续期:状态每天切换,策略权重也会每天切换,交易成本和滑点会吃掉收益。
  • 把状态当预测:状态识别是描述当前环境,不是预测下一根K线方向。
  • 不做复盘归因:亏损时先看状态标签是否准确,再看策略权重是否匹配,最后才看单笔执行。
如果状态标签在历史上频繁跳变,优先检查数据频率、阈值分位窗口和确认根数,而不是直接换更复杂的模型。多数问题来自参数与确认机制,而非模型容量。

复盘时建议记录每日状态、效率值、波动分位和实际权重,形成状态-权重对照表。连续跟踪20个交易日后,你会更清楚哪些状态切换是有效的,哪些只是噪声。状态识别做扎实,权重切换才有稳定的输入。