4. 市场状态识别方法
策略权重切换的前提,是先知道“现在是什么市场”。如果状态判断本身不稳定,后面的权重调整只会放大错误。市场状态识别的目标不是预测涨跌,而是把连续行情压缩为少数可操作的状态标签,并让标签在时间上具有延续性、在边界上具有可解释性。本节围绕趋势、震荡、高波动、低波动四类状态,给出一套可落地的量化判定流程。
一、核心原理:用“方向效率”和“波动水平”两个维度切分状态
多数行情可以拆成两个独立问题:第一,价格是否在朝一个方向高效推进;第二,价格整体波动是否足够大。前者用趋势效率衡量,后者用波动率衡量。把这两个维度交叉,就得到四象限状态:
- 趋势状态:方向效率高,波动中高,价格持续创出新高或新低。
- 震荡状态:方向效率低,波动中低,价格在区间内反复折返。
- 高波动状态:波动率显著抬升,但方向效率不稳定,常见于消息冲击或流动性骤变。
- 低波动状态:波动率被压缩到历史低位,方向效率也低,常出现在趋势启动前的蓄势期。
这里的关键是:趋势和震荡不是按“涨跌”划分,而是按“推进效率”划分;高波动和低波动不是按“绝对价格”划分,而是按“波动率分位”划分。只有把两者分开,才能避免把“高波动下跌”误判为“强趋势下跌”。
二、方法流程:从原始数据到状态标签
状态识别建议按固定流水线执行,避免每次凭感觉换指标。流程如下:
- 数据准备:使用同一周期的收盘价、最高价、最低价,确保复权一致。
- 计算方向效率:常用ADX、效率比率ER或净变动/总变动。ER越高,趋势越强。
- 计算波动率:用ATR/收盘价、滚动标准差或已实现波动率,并取历史分位。
- 设定阈值:效率阈值和波动分位阈值分别取历史滚动分位,如70%和30%。
- 状态映射:按四象限规则输出标签,并做最小持续期过滤。
- 平滑处理:用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个交易日后,你会更清楚哪些状态切换是有效的,哪些只是噪声。状态识别做扎实,权重切换才有稳定的输入。