CZSC / 缠论结构

czsc 缠论结构:分型、笔、中枢怎么被自动识别

缠论的结构划分规则本身不复杂,难的是把它写成代码还不走样。czsc 的做法是把结构判定拆成可单独调用的算法函数,再用对象把它们串起来。这一页按官方 API 手册整理对象与函数的对应关系、成笔阈值的控制方式,以及 1.0.1 刚补齐的结构分析链 API。

核心对象:CZSC/FX/BI/ZS算法函数:6 个成笔阈值:环境变量可控实现:Rust(czsc-core)
RawBar原始 K 线
NewBar去包含
FX分型
BI
ZS中枢
缠论结构对象链路示意(依据官方 API 手册的对象定义与算法函数清单);示意非官方结构图,参数与阈值以官方文档为准。
Objects

七个核心对象,各自管一段

官方 API 手册为每个对象标注了 Rust 实现文件,下表照录,便于你直接定位源码。

对象含义实现位置内部依赖适用场景注意点
CZSC缠论分析主对象,管理原始 K 线、分型与笔列表crates/czsc-core/src/czsc.rsRawBar、NewBar、FX、BI、check_fx、check_bi、remove_include结构分析的起点1.0.1 起新增 min_bi_len 字段与 zs_list 属性,构造签名也随之扩展
RawBar原始 K 线数据结构crates/czsc-core/src/bar.rsFreq行情入参构造时拒绝带时区的时间对象,需要先做本地化处理
NewBar去包含关系后的 K 线crates/czsc-core/src/bar.rsRawBar分型判定的输入去包含会改变 K 线数量,索引不能与原始 K 线一一对应
FX分型(顶分型 / 底分型)crates/czsc-core/src/fx.rsNewBar、Mark标出结构的转折候选点分型不等于买卖点,它只是结构候选
BI笔,含力度、R²、斜率等统计量crates/czsc-core/src/bi.rsFX、NewBar、Direction、FakeBI结构的主干与力度比较除坐标外还带统计量,可用于强度筛选
FakeBI由笔内部分型连接得到的近似次级别笔crates/czsc-core/src/bi.rsFX在次级别视角观察同一段走势它是由已有分型连接出来的近似结果,不是真实的次级别数据
ZS中枢数据结构crates/czsc-core/src/zs.rsBI、Direction判断震荡区间与结构级别1.0.1 起 zs_list 基于 finished_bis 计算,与早期实现口径可能不同
Freq / Mark / Direction / Operate周期、分型标记、方向、操作四类枚举crates/czsc-core/src/enums.rs贯穿全部结构的类型约定rc.8 起四个枚举都暴露 .name 并支持哈希,可作为字典键使用
Algorithms

六个算法函数,可以单独调用

这些函数在官方 API 手册中属于「缠论核心算法函数(Rust 实现)」一组。它们可以被独立调用,便于你校验结构逻辑或实现自己的流程。

函数用途输入与依赖适用场景注意点
check_fx检查三根无包含 K 线是否构成分型NewBar / FX / Mark自定义分型判定流程输入必须是去包含后的 K 线,直接传原始 K 线结果不成立
check_fxs批量检查分型序列check_fx、FX一次性标注整段区间本质是 check_fx 的批处理封装
check_bi检查两个分型之间是否构成笔FX / BI / NewBar自定义成笔规则或校验1.0.1 起改为接收成笔长度阈值参数,不再硬编码
remove_include去除 K 线包含关系RawBar / NewBar结构分析的前置处理去除后 K 线数量会变化,后续长度计算要以 NewBar 为准
freq_end_time计算指定周期的 K 线结束时间Freq对齐多周期数据、定位桶日级以上桶的时间会被归到 00:00:00,做重采样时要注意
is_trading_time判断给定时间是否为交易时间Freq过滤非交易时段数据交易时段模板与品种相关,不能跨品种套用
Bi threshold

成笔阈值:一个曾经完全失效的参数

成笔长度直接决定结构的粗细。这个参数在 1.0.1 之前存在一个真实缺陷,官方已在 CHANGELOG 中记录并修复,值得单独说明。

1.0.0 及之前1.0.1 之后影响注意点
缺陷现象设置 CZSC_MIN_BI_LEN 后笔数量没有任何变化该变量真正作用于成笔逻辑此前用环境变量调参等于没调对应官方 issue #328
根因crates/czsc-core/src/analyze/utils.rs 的 check_bi 内硬编码了长度为 6 的阈值,且 CZSC 构造函数签名只有 bars_raw 与 max_bi_num 两个参数check_bi 改为接收阈值参数,CZSC 增加 min_bi_len 字段环境变量只影响 envs 的返回值,对笔列表毫无作用这是实现细节问题,不是设计意图
现在的取值顺序不适用构造参数显式传入且大于 0 时优先;否则读环境变量(大小写不敏感);再否则默认 6三种来源可预期地覆盖max_bi_num 同样改为 env-aware,默认 50
相关环境变量CZSC_MIN_BI_LEN 名义存在但无效CZSC_MIN_BI_LEN(默认 6)、CZSC_MAX_BI_NUM(默认 50)、CZSC_VERBOSE(默认 False)结构粗细与日志详细度可控页面上的默认值来自官方 README 表格
回归保障新增测试锁定「更大阈值产出更少更长的笔」该行为不会被后续改动悄悄破坏测试名见官方 CHANGELOG
读法建议:这类「参数看起来存在但实际无效」的问题很难从文档发现,只能靠版本变更记录。如果你的项目在 1.0.0 上通过环境变量调过成笔长度,升级到 1.0.1 后结果会变化,需要重新核对参数。
Structure API

1.0.1 新增的公开结构分析链

这一批 API 在 Python 顶层、czsc._native 类型桩与 Rust facade 三处同步暴露,属于官方定义的公开能力。

API用途适用场景注意点
create_fake_bis由分型连接生成近似次级别笔想看更细的结构层次结果是从已有分型推导的近似值,不能当真实次级别数据
get_zs_seq取得中枢序列批量分析中枢演化序列口径以官方实现为准
is_symmetry_zs判断中枢是否对称结构形态筛选对称性的判定标准由实现定义
is_bis_up判断笔序列是否向上方向确认方向判断依赖传入的笔序列范围
is_bis_down判断笔序列是否向下方向确认与 is_bis_up 成对使用
check_gap_info检查缺口信息跳空相关结构判断缺口定义以官方实现为准
CZSC.zs_list基于 finished_bis 计算的中枢列表属性直接读取中枢基于已完成的笔,未完成的笔不参与
Constraints

两处构造约束:不符合就直接报错

官方在 1.0.0-rc.8 把两类「静默出错」改成了显式报错。它们都属于破坏性变更,升级时会立刻暴露出来。

约束历史行为(问题)现在行为你该怎么做适用场景
RawBar 拒绝带时区的时间带时区的入参走时间戳转换被静默转成 UTC,例如上海时间 09:31 变成 01:31,导致下游周期桶定位全部错位抛出 ValueError先执行 df['dt'] = df['dt'].dt.tz_localize(None) 去掉时区,再做转换从数据库或带时区的行情接口取数时
K 线合成拒绝 NaN 行情值成交量相加会让 NaN 沿桶传染,与 pandas 默认跳过 NaN 求和的口径不一致,安静地产出错值显式返回错误,并沿信号与交易器调用链向上抛在入数据前清洗缺失值,或在调用处捕获异常拼接多段行情或补齐交易日时
交易器与信号更新方法改为可失败遇到 NaN 或周期不匹配时吞掉错误,用旧状态继续算,可能产出与真实情况不符的信号返回可失败结果,硬错上抛 ValueError调用方准备异常处理或允许异常冒泡多周期联立与批量回放
错误类型统一历史实现混用多种异常类型,捕获时容易漏解析失败路径统一返回 ValueError统一按 ValueError 捕获即可所有时间解析路径
Compared with indicators

和「指标类技术分析」不是一件事

很多中文资料把缠论指标和 MACD 之类的指标放在一起讲,这容易让人低估结构识别的工程量。两者输出的东西根本不同。

维度缠论结构识别(czsc 的定位)指标类技术分析对使用者的影响
输出对象分型、笔、中枢等结构对象及其统计量指标数值序列前者可直接作为策略条件,后者通常还要再加工
依赖关系笔依赖分型,中枢依赖笔,存在严格的先后顺序多数指标彼此独立结构计算不能跳步,参数会影响下游全部结果
参数敏感度成笔长度等参数会显著改变结构粒度参数影响曲线平滑度换参数等于换了一套结构,需要重新验证
数据要求对时间对齐与缺失值更敏感(时区与 NaN 都会被拒绝)一般容忍缺失值取数环节的清洗质量直接决定结构是否可用
典型误用把分型当买卖点把指标金叉当买卖点两者都不是买卖指令,都需要事件与持仓层承接
FAQ

常见问题

结构相关的口径以官方 API 手册与 CHANGELOG 为准,本文不做实现之外的推断。

分型和笔能直接当买卖信号用吗?

不建议。官方把结构层与信号、事件、持仓层分开设计:分型只是结构的转折候选,笔是结构主干,真正驱动交易的是一层信号组合出来的事件。把分型当买卖点用,等于绕过后面三层,也就失去了这套框架的主要价值。

成笔长度该怎么设?

三种来源按优先级覆盖:构造时显式传入且大于 0 的值优先;否则读环境变量 CZSC_MIN_BI_LEN(大小写不敏感);再否则用默认值 6。1.0.1 之前这个环境变量是无效的,升级后结果会变化,建议固定一种来源并把值写进配置。

为什么我的带时区数据会报错?

因为官方在 rc.8 把「静默转 UTC」改成了显式报错。历史行为下,上海时间 09:31 会被悄悄转成 01:31,导致周期桶定位全部错位,问题极难排查。现在需要在入参前去掉时区信息,官方给的写法是 df['dt'] = df['dt'].dt.tz_localize(None)。

中枢列表是怎么算出来的?

1.0.1 新增了基于已完成笔(finished_bis)计算的 zs_list 属性,同时提供 get_zs_seq 取中枢序列、is_symmetry_zs 判断中枢是否对称。注意它只使用已完成的笔,因此最新的未完成段不会体现在中枢里。

FakeBI 是真实的次级别数据吗?

不是。官方定义里 FakeBI 是「笔内部分型连接得到的近似次级别笔」,也就是从当前级别已有的分型推导出来的近似结构。想得到真实的次级别结构,需要真实导入次级别 K 线再单独分析。

结构这部分 EasyClaw 能替我做吗?

不能。EasyClaw 本机的技术分析类技能做的是指标与形态层(例如均线、MACD、K 线形态与量价关系),不提供缠论分型、笔、中枢的自动识别,也不提供信号-事件-交易体系。需要缠论结构就只能走自建路线;两者之间没有已证实的集成关系。

结构算出来了,下一步是信号

结构只是输入,真正驱动策略的是信号与事件的组合逻辑。下一页说明信号函数的组织方式与调用路径。