简介:一套基于缠中说禅技术分析理论的量化交易工具实现,面向股票、期货量化开发者与缠论学习者。项目覆盖理论梳理、历史数据获取、技术指标计算、策略回测与部署应用等完整流程,核心代码可直接部署使用。资源共163个文件,以142个Python脚本为主,辅以Markdown/RST文档、feather数据文件、HTML可视化页面、Jupyter Notebook策略分析、CSV样例数据及drawio架构图,压缩包约4.04MB。目前已有271人学习下载。通过该项目,读者可快速了解缠论中枢、背驰等概念如何落地为可执行指标,获得从数据清洗到策略持仓权重管理的完整实现思路;同时附带的说明文档、数据样例与可视化结果,便于对照调试和二次开发,节省从零搭建量化框架的时间。 缠论这东西,我接触了很多年,从最早的“笔、线段、中枢”到后来的第一二三买点,越到后面越有一个感觉:这本质不是玄学,而是把K线走势抽象成一套严谨的结构语法。很多做交易的朋友觉得缠论难,难在“千人千缠”——同一个盘面,每个人画出来的笔、划分的中枢都不一样,买卖点自然也就不同。后来我自己动手把缠论规则转成了代码,基于缠中说禅技术分析量化工具做了一套适合股票和期货的量化交易框架,这篇文章就把整个项目的设计思路、核心算法、回测流程和踩坑记录完整拆给大家。
这套量化工具解决的核心问题,是把主观判断变成可复现的规则。我自己不再纠结“这个位置是向上笔还是下跌中继”,机器会严格按递归定义去枚举每一笔、每一个中枢、每一次背驰,再按交易规则生成买卖信号。它适合两类人:一类是你已经学过缠论,想验证自己的理解是否站得住脚;另一类是你做量化很久了,想引入结构型走势判断来替代或增强均值回归、趋势跟踪这类统计策略。
1. 缠论量化到底在解决什么问题
1.1 缠论本质上是规则化体系
先说一个我自己的判断:缠论是目前市面上极少数适合直接转成程序的技术分析体系。传统技术指标比如MACD、均线,底层是数学公式,它本身和K线结构没关系,它只是基于收盘价做平滑计算。而缠论从入场的第一步就是规则判断:K线包含关系的处理、分型的成立条件、笔的端点确认、线段的延伸、中枢的重叠区间,每一条都是“如果……那么……”的逻辑结构。
举个例子,分型的定义:三根K线,中间那根的高点最高且低点最高,就构成顶分型;反之构成底分型。这句话读起来简单,写进代码你会发现问题比想象的多——左侧的包含关系处理到哪一层为止?前一根K线和后一根K线合并后形成的“虚拟K线”是否参与后续分型判断?很多人在这一步就放弃了,其实这些细枝末节恰恰是量化工具的价值所在:它逼你把模糊理解变成精确规则。
1.2 量化交易解决的三大痛点
我用这个工具跑了半年多,实际感受最深的三个痛点解决:
第一是判断一致性。人看盘状态总有波动,同样一个结构,周一你觉得是三买,周五就觉得是盘整背离。机器不会累、不会情绪化,它每次都用同一套参数、同一套递归规则去识别,结果永远可复现。
第二是速度。股票还行,期货一旦做到分钟级别,靠人眼逐K线去画笔和线段基本不可能。缠论量化工具核心就是把“人工画线”这个过程自动化,我实测30分钟级别,加载5000根K线再完成结构识别,大概在几百毫秒量级,完全够用。
第三是回测闭环。缠论买卖点到底有没有效,过去只能靠复盘、靠印象,现在可以在历史数据上做完整的回测。这个问题我在第4章会展开讲,反正“感觉有效”和“回测有效”完全是两回事。
2. 量化工具怎么选、怎么搭
2.1 工具选型对比
做缠论量化,前面首先卡在工具选型上。我试过直接用交易软件的自带指标,也试过一些商业量化平台,最后走的是Python开源方案。简单列个对比表:
| 方案类型 | 代表 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|
| 交易软件内置指标 | 通达信、同花顺 | 上手快、画线直观 | 逻辑封闭、回测能力弱 | 盘后人工复盘、辅助看盘 |
| 商业量化平台 | 聚宽、米筐等 | 数据齐全、回测方便 | 缠论类自定义逻辑受限、策略安全保障不明 | 数据源摸底、快速验证 |
| 自建Python框架 | pandas + 自研 | 完全可控、逻辑透明 | 开发维护成本高 | 正经做策略迭代和实盘 |
我自己的建议是:如果你只是想验证“缠论买卖点胜率怎么样”,直接用商业平台甚至Excel都能干;但你要是打算做期货日内、多品种同时盯盘这种场景,最终还是得自建,因为平台化方案在递归计算结构时容易卡性能,而且你很难把缠论特有的“K线包含关系处理”做成高效的增量更新。
2.2 模块化架构设计
量化工具按职责拆成四个模块,我个人体验下来这种分层对调试帮助最大:
- 数据层:负责K线数据加载、复权处理、周期转换。期货我用tick合成分钟线,股票直接用日线级别,源头数据要事先清洗干净。
- 结构识别层:最核心,实现K线合并、分型、笔、线段、中枢、背驰判断。这一层只输出“结构对象”,不直接参与买卖。
- 策略信号层:基于结构识别结果,按位置和层级匹配买卖点,比如一买必须有底背驰,三买必须在中枢上方回调不进入区间,信号产生后计算仓位和止损位。
- 执行与回测层:负责信号撮合、手续费滑点模拟、资金曲线绘制、绩效统计。
这四层务必保持独立,不要耦合。我最早图省事,在结构识别函数里顺手写买卖信号,后面一旦想调整信号规则,整个模块都要重跑,那叫一个痛苦。
3. 核心难点:把缠论结构翻译成程序语言
3.1 K线包含处理与分型识别
缠论第一课就是处理K线包含关系。两根相邻K线,一根的高低范围完全包含在另一根里面,就必须合并成一根新的K线。方向错了整条笔都会歪。
程序实现要注意两个关键点:
第一是“方向由前一根合并K线决定”。如果前面趋势是向上,包含的时候取高高点和高低点;向下则取低低点和低高点。这个方向判断不是看当前这根K线,而是看它前面的形态走向,很多人一开始写反,导致后续分型全乱。
第二是“合并后的新K线要继续参与后续包含判断”。这不是一次性的操作,要循环处理,直到当前序列里不存在包含关系为止。一个常见的性能优化是增量处理:新来一根K线时,只需要从末尾往前回溯几根,不需要重算全局。
代码实现大致是这样(简化版):
def merge_klines(klines): merged = [] direction = 0 # 1向上, -1向下 for k in klines: if not merged: merged.append(k) continue prev = merged[-1] if (prev.high >= k.high and prev.low <= k.low) or \ (prev.high <= k.high and prev.low >= k.low): if direction >= 0: high = max(prev.high, k.high) low = max(prev.low, k.low) else: high = min(prev.high, k.high) low = min(prev.low, k.low) merged[-1] = KLine(high=high, low=low) else: merged.append(k) direction = 1 if k.high > prev.high else -1 return merged分型判定建立在合并后的K线序列上:中间K线的高点和低点都大于左右两根,就是顶分型;都小于左右两根,就是底分型。这里有细节:分型三根K线中,左右两根不能存在包含关系,如果存在,需要先处理完再判断。
3.2 笔的划分与临界处理
有了分型,笔的划分就顺理成章:相邻的顶分型和底分型之间,必须有至少一根独立K线,且顶分型的高点必须高于底分型的低点,这样才算一笔。这个“至少一根独立K线”是很多实现版本分歧最大的地方,旧笔定义要求严格,新笔定义放松为5根均线重叠,我的经验是量化场景下优先用严格定义,因为它的信号更稳定,能过滤掉大量无效小波动。
笔划分后还有一个很关键的点:顶分型后如果价格直接创新高,那这一笔就还没走完,程序里要处理“未完成笔”和“已确认笔”的区别。回测中我建议只参与已确认笔,避免未来函数,哪怕这样信号会晚一根K线出来,也不会产生实盘和回测对不上的问题。
3.3 中枢识别与区间计算
中枢的定义是连续三个次级别走势类型有重叠区间。日线级别做量化时,我简化成“连续三笔或以上重叠”来处理,因为线段递归在程序里实现起来复杂度很高,而且二级市场的大部分场景,用笔级别中枢已经能抓到足够多的有效买卖点。
中枢区间的计算记住两个公式就够:
- 中枢区间上沿 ZG = min(组成中枢这几笔的高点中的最小值?这里要换说法)——严谨讲,取每一笔高点里最低的那个,和每一笔低点里最高的那个,这两个值之间就是重叠区间。
- 中枢波动范围:GG是本级别所有笔高点的最大值,DD是本级别所有笔低点的最小值。
我代码里用一个滑动窗口,从最近三笔开始判断是否存在重叠,存在的话就延伸窗口,直到某笔不再重叠为止,再对区间全部笔做GG、DD、ZG、ZD计算,就能得到精确的中枢对象。顺便说一句,所有价格指标都要用未复权或前复权数据保持一致,不要混用,不然中枢区间计算会出错。
3.4 背驰判断与买卖点信号组装
背驰是缠论里最难量化的概念。我的实现思路是:比较进入中枢的那一段走势(“进入段”)和离开中枢的走势段,看MACD面积。如果股价创新高,但MACD面积比进入段小,就判定为顶背驰;创新低且面积缩量,就是底背驰。
MACD面积我用了公式sum(2 * (DIF - DEA))来近似红绿柱面积,实际统计的是区间内MACD柱的累计值。这里有个经验:直接把整个笔的MACD面积比较会受数值波动影响,我建议用“段内MACD柱绝对值之和”来对比,并对比较的两段做长度归一化处理,更稳妥。
买卖点信号组装就是纯规则了:
- 第一类买点:下跌趋势中底背驰出现,且笔结构刚完成向上转折。
- 第二类买点:一买后回调的低点不跌破之前那个背驰低点。
- 第三类买点:价格突破中枢后,回踩的最低点高于中枢上沿 ZG。
每个信号生成时,我都会附加当前级别、背驰强度、距中枢位置这几个字段,方便之后做信号过滤。实际回测下来,三买的胜率通常高于一买和二买,但一买的盈亏比最好,这也是缠论里反复强调的东西。
4. 回测框架与参数调优:从能跑到可信
4.1 数据准备与周期选择
回测第一步是准备干净的历史数据。股票我用前复权日线,期货用主连合约的30分钟K线,数据质量检验就花了不少功夫。你会发现不同数据源的K线可能会差那么一两个点,在缠论结构识别上差异可能不大,但在背驰的MACD面积计算上会有误差,所以数据源要固定。
周期选择也很影响策略性质。日线级别信号少,一年可能就几十次交易机会,但单笔盈利质量高;30分钟级别信号频次多,持仓周期短,适合期货。我个人建议新手先做日线,先用股票把逻辑跑通,再逐步降到小级别。
4.2 撮合、手续费与滑点设置
回测框架里最容易“回测漂亮、实盘翻车”的地方就是撮合和数据陷阱。我做了两个强制约定:第一,信号只允许在下一根K线开盘价成交,不做盘中实时成交假设,因为这个工具定位是偏日线级和30分钟级别,盘中滑点不可控;第二,手续费按双边千分之一设置,期货再额外加一个跳的滑点成本。
回测参数里我把初始资金设100万,单笔仓位固定10%,这是为了单纯验证信号的胜率和盈亏比,不去纠结仓位管理。仓位管理是另一套体系,和缠论结构信号搅在一起会让问题没法归因。
4.3 参数调优的原则
缠论真正需要调的参数不多,主要是分型包含处理的递归深度、笔成立所需的最小独立K线数量、以及MACD面积比较的归一化窗口。我自己的调参习惯是:先固定时间周期,用小规模数据人工核对结构识别的正确率,确认程序画出的笔和中枢跟人工复盘基本一致,再谈优化买卖逻辑。
统计优化上,我坚持“一次只动一个参数”,然后观察信号数量和胜率变化曲线。如果参数略微变动信号数量剧烈变化,说明这个参数靠近过拟合区域,要主动退让。我见过有人把笔的最小K线数从5调到4,回测收益翻倍,但实盘连续亏损,原因就是策略在拼命捕捉微小波动,交易成本把它吃垮了。
5. 常见问题与排坑实录
5.1 高频问题速查表
| 现象 | 可能原因 | 排查思路 |
|---|---|---|
| 笔的划分和人工复盘对不上 | K线包含处理方向判断错误 | 先把未合并的K线可视化,逐步核对合并过程 |
| 中枢区间频繁变化 | 滑动窗口起点选错 | 打印每个窗口内GG/DD值,人工对照 |
| 回测信号严重滞后 | 使用了“未完成笔”作为信号触发 | 强制只取已确认的完整笔 |
| 背驰判断失灵 | MACD面积比较了两段长度差异过大的走势 | 做长度归一化,或改用单位时间面积 |
| 实盘成交价和信号价差大 | 信号当时使用了未来数据 | 检查是否在当根K线内提前计算了结果 |
| 多品种同策略表现差异巨大 | 没做涨跌停、停牌过滤 | 在数据层剔除连续停牌时段 |
5.2 三个关键心得
第一个心得是“结构识别永远优先于信号优化”。如果你的笔和中枢识别是错的,后面所有买卖点统计都没有意义。所以我建议把第3章里的结构层单独写一套可视化校验脚本,让程序一笔一笔画在K线图上,眼睛看准了再去调信号参数。
第二个心得是“不要追求所有买卖点都吃到”。我起初用这套量化工具,每个信号都想捕捉,结果来回折腾手续费,整体收益反而下降。后来我为信号加了过滤条件:只在当前级别出现底背驰后、且更高级别没有明显下跌时买入。牺牲了50%的交易机会,但最终年化收益反而更好。
第三个心得是“代码可行和交易可盈利是两回事”。这套工具的价值在于,它把缠论从“脑袋里的模糊直觉”变成了“屏幕上的资金曲线”,这是第一步。第二步是把资金管理、风险控制和信号逻辑结合起来。没有止损的缠论策略,在极端行情里一样会死得很惨。
老实说,把缠中说禅技术分析量化工具从想法变成能跑的代码,最耗时不是代码本身,而是每个规则边界的反复确认。对我来说最值得的收获也不是某个收益数字,而是终于能把自己认可的走势结构拿到历史数据里一遍遍检验,看到那些长期相伴的买卖点真正变成可统计的胜率和盈亏比。这种“规则透明、逻辑可验”的状态,是做量化和做主观交易之间最大的分水岭。
本文还有配套的精品资源,点击获取