一条 10 日均线如何替代复杂的分型系统,实现无歧义的笔划分
「量化实战手记」— 记录从想法到落地的真实开发历程
引言:缠论笔的"千人千缠"困境
缠论体系里,笔是最基础的构建单元。线段由笔组成,中枢由笔界定,买卖点由笔推导。笔划对了,后面的一切才成立。
但现实中,笔的划分恰恰是争议最大的部分。
传统缠论用分型来定义笔——相邻三根 K 线构成顶分型或底分型,再用 K 线包含处理、合并规则、最少 5 根 K 线等一整套约束来判定。规则层层叠加,条件环环相扣,结果是:
不同人对同一段走势画出的笔经常不一样 遇到复杂走势时,笔的划分存在多种"合法"解 程序化实现时,边界条件多达十几种,代码复杂度极高
这就是缠论圈常说的"千人千缠"。而笔的歧义,是所有歧义的根源。
问题:能否找到一种比传统分型更简洁、更无歧义的方式来划分笔?
第一章:传统分型系统为什么复杂
先看看传统缠论画一笔需要经过哪些步骤:
完整的缠论笔判定还涉及独立 K 线(结合律)、上升/下降笔方向、笔的延伸确认等多条规则——每一步都可能产生分歧。Coding 狂人在其 MACD 系列教程中直言:
缠论的笔过于复杂,且并不合理,并不能对所有走势合理划分。缠师在笔和线段的定义上,忽略了很多东西,歧义性非常大,必定导致千人千缠。
这不是贬低缠论。恰恰相反,正是因为缠论体系本身有价值,才值得去解决它最薄弱的环节。
问题的核心在于:分型系统是几何判定,需要多步规则叠加,每一步都可能引入歧义。而我们需要的是一种一步到位的判定方式。
原则:好的判定规则应该是单条件的——一次判断直接得出结论,而不是多层规则叠加后依然存在灰色地带。
第二章:均线笔的核心思想
Coding 狂人提出了一个替代方案:用 10 周期均线替代分型系统。
他把自己定义的"浪"(本质上就是笔)与缠论的笔做了大量实盘对比,发现效果几乎一致,但规则却简单了一个数量级。他的核心定义是:
有效突破 10 周期线:连续 3 根 K 线不碰 10 周期线,即为有效突破。
这个定义同时兼顾了空间(价格确实越过了均线)和时间(不是一闪而过,而是持续了 3 根 K 线)。而且,突破 10 周期线的过程,本质上就是 MACD 金叉或死叉的过程——它和经典技术指标天然对应。
传统缠论的笔对空间力度是"无感"的——只要满足分型+间隔条件就成笔,无论这根笔的价格跨度大还是小。而均线笔天然内置了空间维度:价格穿越均线的幅度越大,确认越快。
fqchan05 的笔算法正是基于这一思想实现的。它把整个判定过程简化为一个清晰的状态机:
整个算法只有一个判定条件:K 线与均线的位置关系。不需要分型识别,不需要包含处理,不需要新旧笔规则。一条均线,三个状态,清晰无歧义。
原则:用统计指标(均线)替代几何判定(分型),将多步规则压缩为单步判定,从根源上消除歧义。
第三章:算法核心——五阶段状态机
算法从第一根 K 线开始,逐根扫描到最后一根,维护一个状态机。整个过程就像一辆列车沿着 K 线图行驶,经过五个"站"。
第 1 站:找方向(INIT)
列车刚出发时,不知道该往哪走。算法耐心等待——直到出现连续 3 根 K 线站在均线的同一侧。
如果 3 根 K 线的最低价都高于均线,认定方向为"上"。这 3 根之前的最低点标记为笔底,3 根之内的最高点开始追踪。
如果 3 根 K 线的最高价都低于均线,认定方向为"下"。对称处理。
// 核心判定:K线与均线的关系if (low > ma) → 站在均线上方(看涨)if (high < ma) → 站在均线下方(看跌)else → 穿越均线,不算任何一方这里的"站在上方"不是收盘价大于均线,而是整根 K 线的最低价都高于均线。要求更严格,过滤掉频繁穿越均线的噪声。
第 2 站:追踪上涨(IN_UP_STROKE)
方向确定为"上"之后,算法做两件事:
- 记最高点
:每出一根新高,就把笔顶的位置更新过去。端点不是固定的,而是一直跟着价格走。 - 盯着均线
:一旦某根 K 线的最高价跌到均线下方,意味着"可能有变",进入确认阶段。
第 3 站:确认向下突破(CONFIRMING_DOWN)
这是最关键的阶段。触发突破的那根 K 线算第 1 根,后续每出一根最高价低于均线的 K 线,计数 +1。
累计 3 根 → 确认成功,上一笔的笔顶锁死,转入下跌笔追踪。
如果中间某根 K 线又回到均线上方 → 确认失败,退回上涨笔追踪。而且失败的那根 K 线如果创了新高,笔顶还会随之更新——假跌破反而可能把笔顶推得更高。
第 4、5 站:追踪下跌 & 确认向上
和第 2、3 站完全镜像对称——记最低点,等突破均线,累计 3 根确认。
五个状态循环往复,一笔接一笔,直到 K 线数据走完。
原则:好的状态机应该是镜像对称的。上涨和下跌的处理逻辑完全对称,区别只在方向。如果你发现自己在写两套不同的逻辑,大概率是设计有问题。
第四章:实战中的三个关键细节
细节一:端点迁移
传统缠论里,笔的端点在分型确定后就固定了。但均线笔的端点是活的——在追踪阶段,只要出了新高或新低,端点就跟着移动。
这意味着笔的端点永远是当前这段走势的最优极值。只有当方向确认切换后,端点才被锁死。这个设计让每一笔的起止点更精确。
细节二:安全回滚
确认失败时,算法不是简单地退回上一状态。它还会检查"导致确认失败的那根 K 线"是否创造了新的极值:
// 确认失败 → 回滚,但失败K线可能创新高extreme_pos = saved_pos;extreme_val = saved_val;if (high > extreme_val) { // 失败K线创新高 extreme_pos = i; // 更新笔顶位置 extreme_val = high;}state = IN_UP_STROKE; // 退回上涨追踪这个细节很关键。一个假跌破被否定后,反弹的那根 K 线可能恰好是新的最高点。如果不处理这种情况,笔顶的位置就会偏低,后续分析会失真。
细节三:尾部补录
K 线数据总有走完的时候。算法结束时可能处于任何状态,需要正确处理:
这确保了最后一笔的端点不会因为数据结束而丢失。
原则:算法的鲁棒性体现在边界条件上。好的算法不仅在正常流程中正确,在启动阶段、异常中断、数据结束时都能给出合理结果。
第五章:效果对比与实测
Coding 狂人做了大量实盘对比测试。他用程序自动在通达信上画出了均线"浪"(即笔),与缠论手动画的笔进行逐一比对,效果几乎一致。他的结论是:
比起缠论无比复杂的笔来说,我的浪定义是极其简单的,且最后的效果跟缠论的笔误差极少。
fqchan05 的实现中,均线笔算法输出的信号值有清晰的层级:
1-1 | ||
0.5-0.5 | ||
11-11 | ||
12-12 |
这个层级设计让下游系统(线段识别、中枢计算、买卖点判定)可以根据需要选择使用确认态还是潜在态的端点——做实时预警用 0.5,做历史分析用 1。
总结:从复杂到简单的设计哲学
均线笔算法的精髓不在于"用均线",而在于用一条统计规律替代一套几何规则。
传统分型系统试图用形式化的几何规则精确描述"走势的转折",但规则越多,灰色地带越多,最终导致千人千缠。均线笔反其道而行——不追求几何上的精确,而是用一个统计上成立的代理指标(10 日均线)来判定方向。
两者的效果几乎一致,但实现复杂度差了一个数量级。
三条可复用的设计原则
1. 单条件判定优于多规则叠加一条均线判定方向,比五步分型规则更不容易产生歧义。
2. 统计指标优于几何判定均线自带平滑噪声的能力,比分型更适合处理真实市场的毛刺。
3. 对称设计消除特殊情况上涨和下跌的处理逻辑完全镜像,不需要额外的分支来处理"特殊形态"。
附录:算法流程速查
给想深入了解的技术读者,以下是算法的完整流程伪代码:
初始化: state = INIT, 端点列表 = []逐根扫描 K 线 i: INIT: 连续3根K线站在均线上方 → 找最低点标记笔底, 切换到 上涨追踪 连续3根K线站在均线下方 → 找最高点标记笔顶, 切换到 下跌追踪 上涨追踪: 出新高 → 更新笔顶位置 某根K线跌破均线 → 保存当前笔顶, 切换到 确认向下 确认向下: 累计3根K线(最高价 < 均线) → 锁死笔顶, 切换到 下跌追踪 中间回到均线上方 → 回滚到 上涨追踪(检查是否创新高) 下跌追踪: 出新低 → 更新笔底位置 某根K线突破均线 → 保存当前笔底, 切换到 确认向上 确认向上: 累计3根K线(最低价 > 均线) → 锁死笔底, 切换到 上涨追踪 中间回到均线下方 → 回滚到 下跌追踪(检查是否创新低)尾部处理: 补录未确认的端点性能特征:单次线性扫描,时间复杂度 O(n),空间复杂度 O(n)。139 页的 MACD 教程帖子里,几千只股票的日线数据在毫秒级完成计算。
参数选择:默认 10 周期 SMA。周期越短对短期波动越敏感,周期越长过滤效果越好但滞后增加。10 是经过大量实盘验证的平衡点。
量化实战手记
本系列记录作者用代码理解市场的真实历程——每个想法如何变成设计,每个设计如何变成可运行的系统。不谈理论,只聊实战。
FqChan05的公式包已经上传到纷传圈子:纷传圈子
夜雨聆风