K线形态变成可回测策略——使用EVO对威科夫理论进行策略构建
威科夫CM操作全过程策略 · 设计报告
基于 Richard Wyckoff 市场操纵理论,在 A 股中证1000 上实现完整的吸筹-上涨-派发-下跌四阶段状态机。
一、理论背景:威科夫方法论
Richard D. Wyckoff(1873–1934)是 20 世纪初最具影响力的技术分析师之一。他的核心洞见是:市场价格由"Composite Man"(合成交易者)的买卖行为驱动——大型资金在吸筹区悄悄建仓、在上涨趋势中顺势拉抬、在派发区逐步出货、最后在下跌趋势中清仓离场。
Wyckoff 将一轮完整的市场周期归纳为四个阶段:
flowchart LR
A[吸筹区] --> B[上涨趋势]
B --> C[派发区]
C --> D[下跌趋势]
D --> A
| 阶段 | 英文 | 特征 | 资金行为 |
|---|---|---|---|
| 吸筹 | Accumulation | 价格在区间内震荡,振幅收敛 | 大资金悄悄建仓 |
| 上涨 | Markup | 突破区间上沿,趋势上行 | 跟风盘涌入,价格拉升 |
| 派发 | Distribution | 高位再次形成横盘区间 | 大资金逐步出货 |
| 下跌 | Markdown | 跌破区间下沿,趋势下行 | 恐慌盘涌出 |
二、策略翻译:从理论到量化规则
2.1 核心思路
将威科夫四阶段转化为一个逐标的跨 bar 状态机——每只股票独立维护自己的状态,每天根据价格行为触发状态转移和交易信号。
flowchart LR
A["idle<br/>空闲"] -->|"检测到交易区间<br/>振幅 15%-40%"| B["acc<br/>吸筹"]
B -->|"突破区间上沿 ≥2%<br/>且区间内 ≥15 根 bar"| C["up<br/>上涨"]
C -->|"高位形成新区间<br/>且价格回撤 ≥8%"| D["dist<br/>派发"]
D -->|"跌破区间下沿 ≥2%"| E["down<br/>下跌"]
E -->|"60 根 bar 后<br/>重新检测到新区间"| B
2.2 区间检测
在任意时点,回看过去 60 根日 K 线(约 3 个月),判定价格是否处于一个有意义的交易区间:
$$
\text{振幅} = \frac{\text{区间最高价} - \text{区间最低价}}{\text{区间最低价}} \in [15%, 40%]
$$
- 下限 15%:过滤掉毫无波动的横盘(振幅太小,突破后没有利润空间)
- 上限 40%:过滤掉单边趋势(振幅太大不是横盘,是趋势本身)
同时要求区间内至少 15 根 bar(约 3 周),确保不是噪音。
2.3 各阶段行为
| 阶段 | 入场/持仓 | 出场条件 | 信号 |
|---|---|---|---|
| idle(空闲) | 无持仓,持续扫描区间 | 检测到合规交易区间 | 无信号,转入 acc |
| acc(吸筹) | 无持仓,动态跟踪区间边界 | 价格突破区间上沿 ≥2%,且区间已持续 ≥15 根 bar | 做多(score=1.0),转入 up |
| up(上涨) | 持有多头 | 高位形成新区间,且价格从区间高点回撤 ≥8% | 持续做多,转入 dist |
| dist(派发) | 平仓 | 价格跌破派发区间下沿 ≥2% | 平仓(score=0.0),转入 down |
| down(下跌) | 持空头 | 60 根 bar 后重新检测到合规吸筹区间,且价格回到区间内 | 持续做空,转入 acc |
2.4 关键参数
| 参数 | 值 | 含义 |
|---|---|---|
LOOKBACK |
60 | 回看 K 线数(约 3 个月) |
MIN_INTERVAL_BARS |
15 | 区间最少 bar 数(约 3 周) |
BREAKOUT_THRESHOLD |
2% | 突破阈值 |
BREAKDOWN_THRESHOLD |
2% | 跌破阈值 |
| 振幅下限 | 15% | 有效区间最低振幅 |
| 振幅上限 | 40% | 有效区间最高振幅 |
| 派发回撤 | 8% | 从区间高点回撤触发派发判断 |
三、实现架构
3.1 跨 bar 状态记忆
每只标的用 state_schema 维护一个轻量状态字典,跨 bar 传递:
state_schema = {"stocks": {}}
DEFAULT_STOCK_STATE = {
"stage": 0, # 0=idle 1=acc 2=up 3=dist 4=down
"acc_low": 0.0, # 吸筹区间下沿
"acc_high": 0.0, # 吸筹区间上沿
"dist_low": 0.0, # 派发区间下沿
"stage_bars": 0, # 当前阶段的 bar 计数
}
stage编码为整数(0-4),节省内存——中证1000 约 1000 只成分股,每只 5 个字段,总量约 5000 标量,远低于引擎 10000 标量上限- 每只标的独立维护自己的状态,互不干扰
- 每根 bar 结束时通过
state_delta写回,供下一根 bar 读取
3.2 股票池
- 中证1000 成分股(指数代码 000852),覆盖中小盘风格
- 回测区间:2023-01-01 至 2025-12-31
- 日频,后复权
3.3 组合构建
- 持仓数:30 只
- 总仓位:100%
- 单票权重上限:10%
- 交易成本:佣金 2.5‱ + 印花税 5‱(卖方)
四、设计考量
4.1 为什么选择中证1000
威科夫形态学捕捉的是价格行为中的供需转换——在市值较大、流动性充裕的沪深300 中,这类形态容易被大资金平滑掉;而在小盘股主导的中证1000 中,个股波动更大、形态更清晰,理论上更容易捕捉到有效的吸筹-派发信号。
4.2 为什么用跨 bar 状态机而不是滑动窗口
滑动窗口(每根 bar 独立从过去 60 根 K 线重新判定)虽然简单,但有两个致命缺陷:
- 状态断裂:今天判定为"吸筹区",明天价格稍微一动,窗口滚动后可能判定为"无信号",后天又回到"吸筹区"——状态反复横跳,实际交易无法执行
- 信号滞后:突破信号需要区间持续一段时间才能确认,滑动窗口无法追踪"这个区间已经持续了多久"
跨 bar 状态机解决了这两个问题:状态一旦进入吸筹就锁住,动态跟踪区间边界,直到突破条件满足才转移。
4.3 参数选择的原则
所有参数(60 根 bar、15 根 bar、15%-40% 振幅、2% 突破)都来自 Wyckoff 原始文献的周期对称性原则:
- 60 根 bar ≈ 3 个月,覆盖一个完整的机构建仓周期
- 15 根 bar ≈ 3 周,是"稳定区间"的最小时间窗口
- 15%-40% 振幅:低于 15% 无利润空间,高于 40% 不是横盘
- 2% 突破:日频尺度下,小于 2% 的突破可能是噪音,大于 2% 才构成"有效突破"
五、已知局限
- 纯价格形态:当前策略仅依赖收盘价判定区间和突破,未引入成交量确认(如吸筹区缩量、突破时放量)
- 无大盘环境过滤:熊市中威科夫形态的假突破概率显著上升,当前未做任何市场状态过滤
- 做空逻辑:A 股做空机制不完善,
down_trend阶段的做空信号在实际交易中可能无法有效执行 - 参数固定:振幅阈值和突破阈值对所有标的统一,未做自适应调整


评论