Vibe-Trading 缠论技术指南:笔(BI)——连接顶底分型的基本走势单元
【免费下载链接】Vibe-Trading"Vibe-Trading: Your Personal Trading Agent"项目地址: https://gitcode.com/GitHub_Trending/vi/Vibe-Trading
本文以 Vibe-Trading 仓库内置的缠论(chanlun)形态识别技能为背景,系统讲解缠论最基础的走势单元——笔(BI):它的定义、四条构成条件、上升笔与下降笔的判定逻辑、关键属性与 czsc 数据结构,并结合仓库中的 示例信号引擎 与 SKILL.md 展示笔在完整信号链路中的消费方式。读完本文,你将掌握"原始K线 → 去包含 → 分型 → 笔 → 中枢 → 买卖点"整条链路中"笔"这一环的判定规则与编程用法,并能在自己的策略中基于笔属性(方向、长度、力度、斜率)构造可运行的缠论信号。
笔在缠论体系中的位置
缠论是一套完全基于价格结构的技术分析方法,其核心处理链路在仓库的 SKILL.md 中被明确归纳为:
原始K线 → 去包含处理 → 分型识别 → 笔检测 → 中枢构建 → 买卖点判定在这条链路中,分型(FX)是最基础的识别单元(由连续三根去包含后的 K 线构成顶分型/底分型,详见 分型.md);而笔(BI)是紧接其后的走势单元,由相邻的顶分型和底分型连接而成,是"分型"到"中枢"之间的桥梁:
- 对下:笔把离散的分型串成一段有方向的走势,是缠论中可辨识的最小波动单元;
- 对上:至少 3 笔构成价格重叠区域,即可构建中枢(ZS),进而判定趋势与买卖点(详见 中枢.md 与 一买一卖.md)。
该技能适用于任何有 OHLCV 数据的市场(A 股、加密货币、期货等),底层基于 czsc 库(v0.9.68+,纯 Python 实现、可选 Rust 加速后端),并支持增量更新,适合实时分析。仓库通过 test_skill_reference_links.py 保障references/目录下的概念文档链接(包括本文对应的 笔.md)对浏览器与read_file工具均可解析,因此这些概念文档本身就是可被 Agent 检索引用的技术资料。
笔的构成条件
笔.md 给出笔的完整定义:笔是缠论的基本走势单元,连接相邻的顶分型和底分型。构成一笔必须同时满足以下四条:
- 方向:上升笔(底→顶)或下降笔(顶→底)。笔必须有明确的单一方向,不允许横盘;
- 顶底交替:相邻两笔的端点分型必须交替出现(顶-底-顶-底…)。这意味着在合法的笔序列中,每一笔的起点分型与终点分型必然一高一低、类型相异,不会出现连续两个顶分型或两个底分型直接相连;
- 无包含:两个分型之间不能存在价格区间包含。也就是说,一笔内部经过包含处理后的相邻 K 线必须保持方向一致地推进,不能出现一根 K 线的高低点完全覆盖另一根 K 线的情况(包含关系的合并规则详见 分型.md:上升方向取较大的高点和较大的低点,下降方向取较小的高点和较小的低点);
- 最小长度:去包含后的 K 线数不少于阈值,默认7 根。这一条件用于过滤过短的波动,确保笔代表"足够成形的走势段"而非噪声级别的微小波动。
其中"最小长度 7 根"是缠论笔定义的核心过滤参数,它直接影响笔的数量与中枢、买卖点的生成频率:阈值越大,笔越"粗",信号越少越稳定;阈值越小,笔越"细",信号越多但噪声也越多。czsc 中该阈值可通过分析器参数配置,实际应用时应结合标的的波动特征与 K 线周期权衡(默认值 7 是适合大多数品种日线及以下周期的经验值)。
上升笔与下降笔
上升笔(底 → 顶)
●顶分型 / / / / ●底分型上升笔的判定条件为:
fx_a.mark = Mark.D(起点是底分型)fx_b.mark = Mark.G(终点是顶分型)- 且
fx_b.fx > fx_a.fx(终点分型值高于起点分型值)
其中Mark.D表示底分型、Mark.G表示顶分型,fx为分型值(顶分型取 high,底分型取 low,见 分型.md 中的 FX 数据结构)。价格从底分型的低点一路抬高到顶分型的高点,构成一段向上的走势。
下降笔(顶 → 底)
●顶分型 \ \ \ \ ●底分型下降笔的判定条件为:
fx_a.mark = Mark.G(起点是顶分型)fx_b.mark = Mark.D(终点是底分型)- 且
fx_b.fx < fx_a.fx(终点分型值低于起点分型值)
上升笔与下降笔的端点分型类型与高低关系完全镜像,这正对应"顶底交替"约束:一笔的终点分型,同时就是下一笔的起点分型。
笔的关键属性
笔不仅是"一段走势"的抽象,czsc 的BI对象还携带一组可直接用于量化策略的派生属性:
| 属性 | 说明 |
|---|---|
direction | Direction.Up(上升)/ Direction.Down(下降) |
high | 笔的最高价 |
low | 笔的最低价 |
length | 笔包含的去包含 K 线数 |
power_price | 笔的价格力度(高低差) |
slope | 笔的斜率 |
angle | 笔的角度 |
这些属性为基于笔的二次加工提供了丰富素材:
direction是最基础的方向标签,用于遍历时快速区分上涨段与下跌段;high/low构成笔的价格区间,也是后续中枢上沿(zg)/下沿(zd)计算的基础——中枢的 zg 取构成笔前 3 笔 high 的最小值,zd 取 low 的最大值(见 中枢.md);length对应构成条件中的"最小长度",反映该笔持续的时间/根数,可与power_price组合衡量"单位长度内走出的幅度";power_price(高低差)是笔的绝对力度,是背驰判断的重要候选度量之一(一买/一卖中"最后一段下跌/上涨力度小于前一段"的力度,即可用power_price或 MACD 面积衡量,见 一买一卖.md);slope/angle描述笔的陡峭程度,陡峭笔通常代表快速推进的强趋势段,平缓笔则可能处于震荡酝酿阶段。
czsc 的 BI 数据结构
笔.md 中给出了 czsc 的BI数据类定义:
@dataclass class BI: symbol: str fx_a: FX # 起点分型 fx_b: FX # 终点分型 fxs: List[FX] # 经过的所有分型 direction: Direction # Up / Down bars: List[NewBar] # 笔内的去包含K线各字段含义:
symbol:标的代码,如"BTC-USDT";fx_a/fx_b:笔的起点与终点分型(FX对象含mark、fx、high、low、elements等字段),是上述上升/下降笔判定的直接操作对象;fxs:笔经过的所有分型列表(用于研究笔内部的细节结构);direction:笔方向,Up/Down;bars:笔内的去包含 K 线(NewBar列表),length属性即len(bars)。
从源码结构看,BI同时保留了"端点分型"与"内部去包含 K 线"两类信息,既满足方向判定与属性计算的即时需求,也为后续中枢构建、形态分类(三笔/五笔/七笔/九笔/十一笔形态)等高级信号保留了原始素材。
使用示例:遍历笔列表
笔.md 给出的最简用法如下:
from czsc import CZSC c = CZSC(bars) for bi in c.bi_list[-5:]: d = "↑" if bi.direction.value == "Up" else "↓" print(f"{d} {bi.fx_a.dt:%m-%d} -> {bi.fx_b.dt:%m-%d} " f"H={bi.high:.0f} L={bi.low:.0f} len={bi.length}")要点说明:
CZSC(bars)一次完成去包含、分型识别与笔检测,c.bi_list存放已完成的笔,c.bars_ubi存放未完成笔中的 K 线(这两者由 SKILL.md 的快速上手示例给出);- 输入
bars为按时间正序排列的RawBar列表(字段含 symbol/id/dt/freq/open/close/high/low/vol/amount,freq 支持Freq.F1/F5/F15/F30/F60/D/W/M); - 示例中
bi.fx_a.dt为起点分型时间(取中间 K 线时间),bi.fx_b.dt为终点分型时间; bi_list[-5:]取最近 5 笔,适合只关心最新走势的场景。
源码级消费:SignalEngine 如何利用笔
仓库中的 example_signal_engine.py 给出了笔在完整信号引擎中的真实消费方式,可视为 笔.md 内容的工程落地。其核心链路为"K线 → 分型 → 笔 → 中枢 → 买卖点"。
数据准备与增量更新
c = CZSC(bars[:30], get_signals=_get_signals) for bar in bars[30:]: c.update(bar) sig = self._evaluate_signals(c)- 先用前 30 根 K 线初始化分析器(保证有足够 K 线形成有效笔);
- 之后逐根调用
c.update(bar)增量更新——这正是 SKILL.md 所述"支持增量更新,适合实时分析"的实现方式,每个新 K 线到达时只做增量重算而非全量重建; - 每次更新后调用
_evaluate_signals评估当前信号状态(1=做多,-1=做空,0=观望)。
基于笔与中枢的信号规则
_evaluate_signals中,与笔直接相关的信号判定包括:
- 一买/一卖:依据
cxt_first_buy_V221126/cxt_first_sell_V221126信号,值含"一买"返回做多、含"一卖"返回做空(底层依赖趋势末端的笔背驰与分型确认,理论见 一买一卖.md); - 三笔/五笔形态:
cxt_three_bi_V230618输出的"向上盘背/向下盘背"、cxt_five_bi_V230619输出的"类一买/类一卖"分别映射为做多/做空; - 笔基础信号 + 中枢位置辅助:当
len(c.bi_list) >= 3时,用最近三笔构建ZS(bis=bi_list[i:i+3])并检查is_valid;若笔信号为"向下_转折"且最新收盘价<= zs.zd(中枢下沿),返回做多;若为"向上_转折"且最新收盘价>= zs.zg(中枢上沿),返回做空。
def _check_zhongshu(bi_list: list) -> Optional[ZS]: if len(bi_list) < 3: return None for i in range(len(bi_list) - 3, max(len(bi_list) - 10, -1), -1): zs = ZS(bis=bi_list[i:i + 3]) if zs.is_valid: return zs return None这段代码体现了"笔 → 中枢"的直接调用关系:中枢的输入就是笔列表,ZG/ZD由构成笔的高低点算出(zg = min(bis[:3]各笔的high)、zd = max(bis[:3]各笔的low),见 中枢.md)。由此,"价格在中枢下沿附近做多、上沿附近做空"这一 SKILL.md 中的信号约定,在源码层面被实现为对最新收盘价与zs.zd/zs.zg的比较。
完整运行示例
该文件的__main__部分给出了一个可直接运行的示例:通过 OKX API 拉取 BTC-USDT 日线(300 根),转换为 OHLCV DataFrame 后交给SignalEngine(freq=Freq.D)生成信号,并统计做多/做空信号数量与最近触发时间。这展示了缠论技能如何接入真实行情数据源,并将笔/中枢分析结果落成可回测、可执行的交易信号。
与其他核心概念的关联与进一步阅读
笔是缠论概念链中承上启下的一环,与本仓库内置的其余概念文档构成完整知识体系:
- 分型 → 笔:笔由顶/底分型连接而成,分型的去包含规则(上升取大、下降取小)是笔"无包含"条件的实现前提,参见 分型.md;
- 笔 → 中枢:至少 3 笔构成价格重叠区域即中枢,中枢上移/下移/扩展决定趋势状态,参见 中枢.md;
- 笔 → 买卖点:一买/一卖建立在趋势末段笔的背驰基础上,二买/二卖/三买/三卖分别是一买确认后的回调与中枢突破后的回调确认,参见 买卖点/一买一卖.md、买卖点/二买二卖.md 与 买卖点/三买三卖.md;
- 笔 → 形态分类:czsc 提供三笔、五笔、七笔、九笔、十一笔共 5 档形态分类信号函数,直接以
bi_list为输入,用于盘整/趋势结构的模式化识别; - 整体能力:该技能支持多周期分析与形态分类,信号函数共 43 个,详见 SKILL.md。
实践要点小结
- 阈值意识:笔的最小长度默认 7 根去包含 K 线,笔的"粗细"直接决定中枢与买卖点的数量,实盘前应根据标的波动与周期调整;
- 先保证数据质量:
bars必须按时间正序、包含完整 OHLCV 字段,否则分型与笔会失真; - 区分完成笔与未完成笔:
c.bi_list只含已完成的笔,最新一笔尚在形成中时(c.bars_ubi),信号判定应结合增量更新逐步确认; - 善用派生属性:
power_price、slope、angle等属性可直接参与背驰、加速等自定义过滤逻辑,不必只依赖信号函数; - 增量更新降低成本:实时场景下优先使用
c.update(bar)而非每次全量重建,这正是仓库示例引擎的默认做法。
【免费下载链接】Vibe-Trading"Vibe-Trading: Your Personal Trading Agent"项目地址: https://gitcode.com/GitHub_Trending/vi/Vibe-Trading
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考