- 金融科技
【免费下载链接】czsc
缠中说禅技术分析工具;缠论;股票;期货;Quant;量化交易
本篇技术指南聚焦 czsc 项目 Rust 版信号库中的byi_symmetry_zs_V221107对称中枢识别信号:从参数模板、四步判定逻辑、信号列表示例出发,结合 byi.rs 的实际实现、zs.rs 的中枢构造与 signal.rs 的 7 段信号格式,深入讲解对称中枢的数学判定(变异系数阈值)、笔切片语义与方向映射规则。读者读完可独立复现该信号的计算过程,并能在自己的策略因子中直接引用或改造这一缠论结构信号。
信号概览:白伊系 K 线结构信号
byi_symmetry_zs_V221107是 czsc 缠论技术分析工具中一个**K 线级(kline 类别)**信号,用于识别最近若干笔是否构成"对称中枢"。它归属于byi.rs(白伊系)信号族,与byi_bi_end_V230106、byi_bi_end_V230107、byi_second_bs_V230324、byi_fx_num_V230628并列存放。
从 dump_signal_catalog.py 的信号分类表看,byi.rs属于"K 线基础"分组,主题为"「白伊」系:对称中枢、笔的结束判定",因此该信号是基于缠论笔结构(BI)的形态识别因子,而非单纯依赖 MACD 等量价指标。
参数模板
"{freq}_D{di}B_对称中枢"模板由三部分组成,直接对应信号字符串的k1_k2_k3三段:
| 段 | 含义 | 取值示例 |
|---|---|---|
{freq} | K 线级别 | 60分钟、30分钟、日线等 |
D{di}B | 从倒数第di笔开始取数 | D1B(默认) |
对称中枢 | 信号主题标签 | 固定字面量 |
在 byi.rs 源码中,k1、k2、k3的构造完全与模板对应:
let k1 = c.freq.to_string(); let k2 = format!("D{}B", di); let k3 = "对称中枢";信号逻辑(四步判定)
依据 byi.rs 中的函数byi_symmetry_zs_v221107,该信号的计算流程严格按以下四步执行:
- 取倒数
di笔截止最近 10 笔:调用get_sub_elements(&c.bi_list, di, 10)截取笔序列窗口; - 依次检查最近
7/5/3笔是否构成对称中枢:按[7, 5, 3]的顺序,从大到小取窗口末尾的i笔,调用is_symmetry_zs判定; - 命中则输出
是 + {i}笔,否则否 + 任意:命中即记录命中的笔数i(优先输出 7 笔),未命中 v3 固定为任意; - 方向位按最后一笔反向映射:若窗口内最后一笔方向为向下(
Direction::Down),方向位输出向上,反之输出向下。
源码核心循环如下(节选自 byi.rs):
let mut ok = false; let mut v3 = "任意".to_string(); for i in [7usize, 5, 3] { ok = is_symmetry_zs(&bis[bis.len() - i..], 0.3); if ok { v3 = format!("{}笔", i); break; } } let v1 = if ok { "是" } else { "否" }; let v2 = if bis[bis.len() - 1].direction == Direction::Down { "向上" } else { "向下" }; make_kline_signal_v3(&k1, &k2, k3, v1, v2, &v3)注意两点边界行为:
- 若截取的笔数量不足 7 笔(
bis.len() < 7),直接输出"其他"信号(见 byi.rs),不进入对称判定; - 命中判定是从大到小取窗口末尾:即优先用最近 7 笔判定,若 7 笔不对称再退到最近 5 笔,最后退到最近 3 笔。这与 Python 版
byi_symmetry_zs_V221107的 7/5/3 笔判定序完全一致(文档"对齐说明")。
信号列表示例
文档给出的两个典型信号字符串为:
Signal('60分钟_D1B_对称中枢_是_向上_7笔_0') Signal('60分钟_D1B_对称中枢_否_向下_任意_0')拆解第一个信号的 7 段结构:
| 段 | 值 | 说明 |
|---|---|---|
| k1 | 60分钟 | 周期 |
| k2 | D1B | 倒数第 1 笔起算 |
| k3 | 对称中枢 | 信号主题 |
| v1 | 是 | 命中对称中枢 |
| v2 | 向上 | 最后一笔向下 → 反向映射为向上 |
| v3 | 7笔 | 最近 7 笔构成对称中枢 |
| score | 0 | 默认分数 |
参数说明
di:从倒数第di笔开始取数窗口,默认1。
在实现中通过params.usize("di", 1)读取(byi.rs)。参数通过 ParamView 统一读取,ParamView::usize支持 JSON 数字与数字字符串两种形式,缺省时回退到默认值 1。di的作用是跳过最近di-1笔,让信号关注"倒数第 di 笔之前"的结构,便于在笔尚未结束时延迟确认。
对称中枢的源码级数学判定
文档对"对称中枢"只给出了名称,未展开判定细节。实际判定逻辑封装在 byi.rs 的is_symmetry_zs函数中,共分四道关卡:
fn is_symmetry_zs(bis: &[BI], th: f64) -> bool { if bis.len().is_multiple_of(2) { return false; } let zs = ZS::new(bis.to_vec()); if zs.zd > zs.zg { return false; } let max_low = bis.iter().map(|x| x.get_low()).fold(f64::NEG_INFINITY, f64::max); let min_high = bis.iter().map(|x| x.get_high()).fold(f64::INFINITY, f64::min); if max_low > min_high { return false; } let zns: Vec<f64> = bis.iter().map(|x| x.get_power_price()).collect(); let m = mean(&zns); let s = std_pop(&zns); m.is_finite() && s.is_finite() && m != 0.0 && s / m <= th }关卡 1:奇数笔要求。中枢必须由奇数笔构成(上-下-上或下-上-下),偶数笔直接判否。这也是为什么判定窗口取 7/5/3 而非 6/4/2。
关卡 2:中枢区间有效性。调用ZS::new构造中枢对象,取前 3 笔高低点计算中枢上沿zg与下沿zd(见 zs.rs):
let zg = bis.iter().take(3).map(|x| x.get_high()).fold(f64::INFINITY, f64::min); let zd = bis.iter().take(3).map(|x| x.get_low()).fold(f64::NEG_INFINITY, f64::max);若zd > zg(下沿高于上沿),中枢区间不成立,直接判否。
关卡 3:笔高低点存在公共重叠区。取所有笔的最低高点min_high与最高低点max_low,若max_low > min_high,说明各笔高低点没有公共交集区间,判否。
关卡 4:价差力度变异系数阈值。取每笔的"价差力度"get_power_price()(即|结束分型值 - 开始分型值|,保留两位小数,见 bi.rs),计算其均值m与总体标准差s,要求变异系数s / m <= th,且m、s均为有限值、m != 0。调用时th = 0.3(byi.rs),即各笔价差力度的离散程度不超过均值的 30%,这正是"对称"二字的量化定义:笔与笔之间的力度(价差幅度)高度接近。
从源码结构看,该信号把"对称中枢"落地为"奇数笔 + 有效中枢区间 + 公共重叠 + 力度低离散"四个可编程条件,与传统的价格几何对称(如最高最低点关于中轴镜像)不同,它度量的是笔力度的一致性。
笔窗口切片:get_sub_elements 语义
信号第一步的取数依赖get_sub_elements,其语义对齐 Python 版(sig.rs):
di == 1时返回最后 n 个元素;di > 1时返回[-n-di+1 : -di+1]切片;- 数量不足时返回可用区间(可能为空)。
因此get_sub_elements(&c.bi_list, 1, 10)返回最近 10 笔;若di = 2,则返回跳过最后一笔后的最近 10 笔。该工具函数由 sig.rs 中的单元测试覆盖验证,包括di=1/di=2、数量不足与越界、n=0对齐 Python 切片等场景。
信号输出格式:7 段标准结构与构造器
所有 K 线信号最终都通过统一的 7 段字符串表达k1_k2_k3_v1_v2_v3_score,解析规则见 signal.rs:以_切分为 7 个部分,score 必须是 0~100 的整数,否则解析失败。
本信号使用make_kline_signal_v3(sig.rs),底层走make_signal7拼接字符串并经Signal::from_str严格校验(sig.rs),score 固定为 0。未命中且笔数不足时的"其他"信号则由make_kline_signal_v1生成,v2/v3 均为任意。
Signal 对象还提供key()(过滤掉任意段后的 k1_k2_k3)与is_match()(值匹配支持任意通配,见 signal.rs)等方法,方便策略层直接按信号字符串做事件匹配。
信号注册机制:从 #[signal] 宏到运行时注册表
byi_symmetry_zs_V221107在源码中以#[signal(...)]属性宏标注(byi.rs):
#[signal( category = "kline", name = "byi_symmetry_zs_V221107", template = "{freq}_D{di}B_对称中枢V221107", opcode = "ByiSymmetryZsV221107", param_kind = "ByiSymmetryZsV221107" )]宏展开由 czsc-signal-macros 完成:校验category必须是kline或trader、name 必须与函数名版本后缀一致(byi_symmetry_zs_v221107↔byi_symmetry_zs_V221107)、kline 信号函数签名必须为(&CZSC, &Params, &mut TaCache),并生成SignalDescriptor常量通过inventory::submit!自动收集。
运行时,registry.rs 通过inventory::iter遍历所有SignalDescriptor,按category == "kline"过滤后注册进SIGNAL_REGISTRY(LazyLock<HashMap<&'static str, SignalMeta>>)。registry.rs的测试test_tas_registry_contains_migrated_signals明确断言"byi_symmetry_zs_V221107"已在 K 线信号注册表中(registry.rs)。注册表还提供只读查询接口list_all_signals(include_kline, include_trader)(registry.rs),并校验信号名与 opcode 全局唯一。
实战使用方式
1. 作为 K 线信号直接调用
该信号是标准 K 线级函数,签名fn(&CZSC, &ParamView, &mut TaCache) -> Vec<Signal>,输入为缠论分析器CZSC对象(其bi_list存放笔序列、freq存放周期,见 mod.rs),输出为信号向量。可在策略引擎中按信号字符串60分钟_D1B_对称中枢_是_向上_7笔_0或是_*形式做事件触发。
2. 参数配置
di:默认1,传2及以上可延迟到笔确认后判定;- 阈值
0.3目前在源码中是硬编码常量(byi.rs),模板中未暴露为参数;如需更严/更松的对称要求,从源码结构看需要调整该常量。
3. 信号目录与速查
byi.rs是czsc-signalscrate 中 17 个信号源文件之一(K 线基础组),可运行 dump_signal_catalog.py 重新生成信号模块速查表:
uv run --no-sync python scripts/dump_signal_catalog.py输出按 K 线基础 / 缠论结构 / 自定义指标 / Trader 四组统计每个.rs文件的#[signal]数量与主题。
与其他 byi 系信号的协同
byi.rs内的 5 个信号共同构成"白伊"笔结构辅助体系,可组合使用:
byi_symmetry_zs_V221107:对称中枢结构确认(本文);byi_bi_end_V230106/byi_bi_end_V230107:笔结束辅助判定(停顿分型 / 验证分型);byi_second_bs_V230324:二类买卖点辅助(MACD 回抽零轴);byi_fx_num_V230628:笔内分型数量约束。
在策略中,可用"对称中枢命中 + 笔结束看多 + 二类买点"做多因子叠加,以缠论结构信号过滤量价指标的噪声;各信号输出均遵循统一的 7 段格式,可直接用Signal::is_match做组合匹配。
总结
byi_symmetry_zs_V221107是一个轻量但定义明确的缠论结构信号:通过"最近 7/5/3 笔"的递减窗口、奇数笔约束、中枢区间有效性、公共重叠与价差力度变异系数(阈值 0.3)四重关卡,把"对称中枢"量化为可编程判定,并通过#[signal]宏 + inventory 自动注册进运行时注册表。理解其判定细节与信号格式,是将其正确接入 czsc 策略体系的第一步。
- 金融科技
【免费下载链接】czsc
缠中说禅技术分析工具;缠论;股票;期货;Quant;量化交易
相关推荐
缠论一买一卖实战指南:背驰识别、czsc 信号函数与缠论信号引擎落地
缠论一买一卖实战指南:背驰识别、czsc 信号函数与缠论信号引擎落地 导读 :本文基于本仓库缠论(chanlun)Skill 包中的 一买一卖信号文档 http
金融科技示例工程Skia Canvas2D 文本扩展设计解读:fillGlyphs 与 Font 字形查询 API 剖析
Skia Canvas2D 文本扩展设计解读:fillGlyphs 与 Font 字形查询 API 剖析 导读 本文深入解析 Skia 仓库中 Canvas2D
金融科技Notepad-- 快速上手:整目录查找、文件对比、多标签编辑一次搞定
Notepad 快速上手:整目录查找、文件对比、多标签编辑一次搞定 Notepad 是一款轻量级跨平台文本编辑器,Windows、Linux、macOS 三端都
桌面应用
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考