- 金融科技
【免费下载链接】czsc
缠中说禅技术分析工具;缠论;股票;期货;Quant;量化交易
本文基于仓库文档 .claude/skills/signal-functions/references/signals/cxt_bi_trend_V230824.md 编写,并结合 crates/czsc-signals/src/cxt.rs 源码展开讲解。
导读:cxt_bi_trend_V230824是 czsc(缠中说禅技术分析工具)Rust 核心中用于判断最近 N 笔整体形态(向上 / 向下 / 横盘)的 K 线级信号函数。本文以该信号为骨架,系统讲解其参数模板、判定算法、底层源码实现、在signals_config中的配置方式,以及与其他笔趋势类信号(如cxt_bi_trend_V230913)的差异,帮助你掌握在量化策略中直接引用并组合该信号的完整方法。
一、信号概述与定位
cxt_bi_trend_V230824属于 czsc 信号体系中的K 线级信号(kline),模块归属cxt(缠论:笔、分型、买卖点、形态),命名空间前缀为cxt。在 SKILL.md 的模块索引中,cxt模块共提供 41 个信号函数,本信号是其中的"笔趋势/形态"类成员。
该信号的版本后缀V230824表明其发布于 2023 年 8 月 24 日,仓库同时维护了同系列的下一个版本cxt_bi_trend_V230913(见 cxt_bi_trend_V230913.md),二者同为"笔趋势"但算法不同,本文第五节会专门对比。
从源码结构看,所有cxt_bi_trend_V230824信号函数通过#[signal(...)]宏声明,并在 registry.rs 中注册为可被运行时查询的信号,因此它既可以直接出现在策略的signals_config中,也可以通过list_all_signals等 API 被枚举。
二、参数模板与信号字符串格式
2.1 参数模板
"{freq}_D{di}N{n}TH{th}_形态V230824"模板由以下片段拼接而成:
{freq}:K 线周期,例如60分钟、日线、周线;D{di}:取样起点偏移,例如D1;N{n}:参与比较的笔数,例如N4;TH{th}:偏离阈值,例如TH2;_形态V230824:版本标签(k3字段)。
2.2 信号字符串(7 段式)
czsc 信号统一采用 7 段式字符串:
k1_k2_k3_v1_v2_v3_score本文档给出的完整信号列表示例:
Signal('60分钟_D1N4TH2_形态V230824_向上_任意_任意_0')Signal('60分钟_D1N4TH2_形态V230824_横盘_任意_任意_0')
对照 7 段式拆解:
| 段 | 示例值 | 含义 |
|---|---|---|
| k1 | 60分钟 | 周期 |
| k2 | D1N4TH2 | 参数描述 |
| k3 | 形态V230824 | 版本标签 |
| v1 | 向上/向下/横盘/其他 | 形态判定结果 |
| v2 | 任意 | 本信号不输出 |
| v3 | 任意 | 本信号不输出 |
| score | 0 | 固定分值 |
其中v1是信号的判定输出,只有四种取值:向上、向下、横盘、其他(数据不足时)。
三、信号逻辑与算法原理
根据文档"信号逻辑"及 cxt.rs 中的 Rust 实现,该信号的完整执行流程如下:
- 取样:从倒数第
di笔开始,向前取最近n笔(即笔列表bi_list中的一段连续笔); - 计算中位价格:对每笔取
(低点 + 高点) / 2作为该笔的中位价格; - 计算均值:对
n笔中位价格求算术平均,得到基准avg; - 计算偏离:用首笔中位价格除以均值得到比例
ratio; - 阈值判定:
ratio * 100 > 100 + th→向下(首笔明显高于均值,说明最近价格重心回落趋势);ratio * 100 < 100 - th→向上(首笔明显低于均值,说明最近价格重心抬升);- 否则 →
横盘;
- 数据不足防护:笔数不足、均值非法或为零时返回
其他。
3.1 关键源码解析
Rust 实现的核心代码如下(crates/czsc-signals/src/cxt.rs#L740-L769):
pub fn cxt_bi_trend_v230824(c: &CZSC, params: &ParamView, _cache: &mut TaCache) -> Vec<Signal> { let di = get_usize_param(params, "di", 1); let n = get_usize_param(params, "n", 4); let th = get_usize_param(params, "th", 2) as f64; let k1 = c.freq.to_string(); let k2 = format!("D{}N{}TH{}", di, n, th as i32); let k3 = "形态V230824"; let mut v1 = "其他"; if c.bi_list.len() < di + n + 2 { return make_kline_signal_v1(&k1, &k2, k3, v1); } let bis = get_sub_elements(&c.bi_list, di, n); if bis.len() != n { return make_kline_signal_v1(&k1, &k2, k3, v1); } let means: Vec<f64> = bis.iter().map(|bi| (bi.get_low() + bi.get_high()) / 2.0).collect(); let avg = means.iter().sum::<f64>() / n as f64; if !avg.is_finite() || avg == 0.0 { return make_kline_signal_v1(&k1, &k2, k3, v1); } let ratio = means[0] / avg; if ratio * 100.0 > 100.0 + th { v1 = "向下"; } else if ratio * 100.0 < 100.0 - th { v1 = "向上"; } else { v1 = "横盘"; } make_kline_signal_v1(&k1, &k2, k3, v1) }值得注意的细节:
- 取样语义:
get_sub_elements(&c.bi_list, di, n)对齐 Python 切片语义——di == 1时取最后n笔,di > 1时取[-n-di+1 : -di+1](见 crates/czsc-signals/src/utils/sig.rs#L18-L36),因此di允许你跳过最近的一两笔来观察更早的趋势; - 首笔含义:
means[0]是取样窗口内最早一笔的中位价格,用它相对整段均值的位置来判断形态; - 阈值方向:
th越大,越难触发向上/向下,信号越容易落在横盘;th = 0时任何微小偏离都会触发方向判定; - 数据门槛:
c.bi_list.len() < di + n + 2时直接返回其他,比di + n多出的 2 笔余量来自缠论结构(分型确认笔)的固有前置要求; - 防御检查:均值非有限值或为 0(如停牌、零价位数据)时返回
其他,避免除零。
3.2 判定方向的直觉解释
该信号用"最早一笔相对整体均值的偏离"来推断整段 N 笔的走势方向:
- 若最早一笔中位价格显著高于整体均值,说明随后各笔价格中枢不断下移,判定为
向下(下跌趋势); - 若最早一笔中位价格显著低于整体均值,说明随后各笔价格中枢不断上移,判定为
向上(上涨趋势); - 若偏离不足
th(百分数),则认为 N 笔整体横盘整理。
因此它刻画的是"N 笔窗口内价格重心单调移动"的程度,th就是允许的震荡容忍度。
四、参数说明与取值范围
文档给出了三个核心参数,均来自 cxt.rs 的默认值:
| 参数 | 含义 | 默认值 | 建议取值范围 |
|---|---|---|---|
di | 从倒数第di笔开始取样(0 表示当前,但笔级信号通常从 1 起) | 1 | 1及以上,常用1、2 |
n | 参与比较的笔数(取样窗口长度) | 4 | 常用3~8 |
th | 首笔中位价格相对均值偏离的百分比阈值 | 2 | 常用1~5,越大越保守 |
参数通过get_usize_param从ParamView读取,支持整数值或数字字符串(解析逻辑见 crates/czsc-signals/src/utils/sig.rs#L39-L51)。th在模板中被格式化为整数(TH{th}),因此传参时取整数即可。
4.1 参数组合的模板示例
| freq | di | n | th | 完整模板 | 判定含义 |
|---|---|---|---|---|---|
60分钟 | 1 | 4 | 2 | 60分钟_D1N4TH2_形态V230824 | 最近 4 笔整体形态 |
日线 | 1 | 5 | 3 | 日线_D1N5TH3_形态V230824 | 日线最近 5 笔形态,更宽松 |
30分钟 | 2 | 6 | 1 | 30分钟_D2N6TH1_形态V230824 | 跳过最近 1 笔,观察 6 笔更敏感趋势 |
五、与 cxt_bi_trend_V230913 的对比
仓库同时维护笔趋势信号的升级版本cxt_bi_trend_V230913(见 cxt_bi_trend_V230913.md),二者共同点是都基于笔(BI)序列、都用di/n参数,但算法差异显著:
| 维度 | cxt_bi_trend_V230824 | cxt_bi_trend_V230913 |
|---|---|---|
| 参数模板 | {freq}_D{di}N{n}TH{th}_形态V230824 | {freq}_D{di}N{n}笔趋势_高低点辅助判断V230913 |
| 核心思想 | N 笔中位价格均值偏离 | 向上笔高点 / 向下笔低点线性回归 |
| 判定输出 | 向上 / 向下 / 横盘 / 其他 | 上升趋势 / 下降趋势 + 强 / 超强 |
| 参数 | di(默认 1)、n(默认 4)、th(默认 2) | di(默认 4)、n(默认 1) |
| 使用 UBI | 不使用 | 使用 UBI 指定位置时间点预测区间 |
- V230824更简单直接:只看首笔相对整体均值的偏离,适合作为"最近 N 笔是否单边"的快速过滤器;
- V230913更复杂:分别对同向笔的高低点做线性回归预测区间,再把最新收盘映射到区间位置得到带强弱的趋势判断,适合需要趋势强度(强/超强)的场景。
两者都已注册在信号注册表中(registry.rs 与 registry.rs),可按策略需求选择或组合。
六、在 Python 与策略配置中的使用方法
6.1 在 signals_config 中配置
在CzscSignals/CzscTrader的策略 JSON 中,signals_config采用标准 dict 列表格式(配置格式与解析见 crates/czsc-python/src/trader/api.rs 及 czsc_signals.rs)。加入该信号的方式:
{ "signals_config": [ { "name": "cxt_bi_trend_V230824", "freq": "60分钟", "di": 1, "n": 4, "th": 2 } ] }执行后产生的 unique signal 字符串即为:
60分钟_D1N4TH2_形态V230824_向上_任意_任意_0 60分钟_D1N4TH2_形态V230824_向下_任意_任意_0 60分钟_D1N4TH2_形态V230824_横盘_任意_任意_0 60分钟_D1N4TH2_形态V230824_其他_任意_任意_06.2 从信号字符串反推配置
czsc 提供derive_signals_configAPI(Python 绑定见 crates/czsc-python/src/trader/api.rs#L1432),可从信号字符串反推配置:
from czsc._native import derive_signals_config config = derive_signals_config(["60分钟_D1N4TH2_形态V230824_向上_任意_任意_0"]) # 返回: [{"name": "cxt_bi_trend_V230824", "freq": "60分钟", "di": 1, "n": 4, "th": 2}]6.3 与其他信号组合的实战示例
cxt_bi_trend_V230824判定的是"最近 N 笔的总体形态",常与笔结束、买卖点类信号组合使用。一个组合配置示例:
signals_config = [ {"name": "cxt_bi_trend_V230824", "freq": "60分钟", "di": 1, "n": 4, "th": 2}, {"name": "cxt_bi_end_V230224", "freq": "60分钟", "di": 1}, {"name": "cxt_bi_zdf_V230601", "freq": "60分钟", "di": 1, "n": 5}, ]这样可以在 60 分钟级别同时观察"笔整体形态"(本信号)、"笔是否即将结束"(量价辅助)与"笔力度分层",形成互相印证的信号组合。
七、信号注册与底层实现支撑
7.1 注册机制
该信号通过#[signal(...)]属性宏声明(见 cxt.rs),声明内容包括:
category = "kline":K 线级信号;name = "cxt_bi_trend_V230824":注册名称;template = "{freq}_D{di}N{n}TH{th}_形态V230824":参数模板;opcode = "CxtBiTrendV230824":opcode 标识;param_kind = "CxtBiTrendV230824":参数类型标识。
所有信号在 lib.rs 中通过#[signal_module(category = "kline")]包裹cxt模块并include!("cxt.rs"),配合inventory::collect!实现编译期自动收集,最终汇入 registry.rs 的SIGNAL_REGISTRY全局注册表。
7.2 注册验证
仓库的注册表测试 registry.rs 明确断言cxt_bi_trend_V230824必须存在于SIGNAL_REGISTRY中,任何注册缺失都会导致测试失败,这保证了该信号在运行时可被可靠枚举与调用。
7.3 对 Python 的对齐
文档"对齐说明"指出本信号与 Python 版czsc.signals.cxt_bi_trend_V230824保持一致。从实现看,Rust 版在取样切片(get_sub_elements对齐 Python 切片语义)、默认参数、判定分支上均与 Python 口径对齐,可确保 Python 端与 Rust 端输出一致(仓库还维护有core_parity相关测试用于验证核心对齐性)。
八、常见问题与注意事项
- 为什么经常返回
其他?该信号要求bi_list长度不小于di + n + 2。行情初期笔数不足时必然返回其他,属于正常行为;可通过调小n(如n = 3)或调大di起步时间提前来缓解。 th的单位是什么?它是百分数(非 BP)。TH2表示允许首笔中位价格相对均值偏离 ±2% 以内仍判为横盘。di可以取 0 吗?笔级信号的取样语义从di = 1开始(get_sub_elements断言di >= 1),配置时di取1以上即可。- 与均线类趋势信号的区别:本信号基于缠论笔结构(
bi_list)而非原始 K 线均线,因此形态判断天然过滤了笔内噪声,且依赖于缠论分型确认的笔完成质量。 - 多周期使用:模板中的
{freq}支持任意周期(如30分钟、60分钟、日线、周线),可在不同周期上分别配置,观察多级别笔形态共振。
九、参考资料
- 信号详细文档:.claude/skills/signal-functions/references/signals/cxt_bi_trend_V230824.md
- 同系列升级版本:cxt_bi_trend_V230913.md
- 信号函数参考手册:SKILL.md
- Rust 源码实现:crates/czsc-signals/src/cxt.rs
- 取样与参数工具:crates/czsc-signals/src/utils/sig.rs
- 信号注册表与测试:crates/czsc-signals/src/registry.rs
- 信号模块声明:crates/czsc-signals/src/lib.rs
- Python 绑定与配置解析:crates/czsc-python/src/trader/api.rs
- 金融科技
【免费下载链接】czsc
缠中说禅技术分析工具;缠论;股票;期货;Quant;量化交易
相关推荐
czsc 信号函数 bar_window_ps_V230801 详解:基于缠论笔结构的支撑压力位窗口极值信号
czsc 信号函数 bar_window_ps_V230801 详解:基于缠论笔结构的支撑压力位窗口极值信号 本文面向在 czsc(缠中说禅技术分析工具)中构建
金融科技czsc 信号函数详解:cxt_bi_end_V230105 —— 基于 K 线形态与均线阈值的笔结束辅助判断
czsc 信号函数详解:cxt_bi_end_V230105 —— 基于 K 线形态与均线阈值的笔结束辅助判断 导读 cxt_bi_end_V230105 是
金融科技czsc 信号函数 byi_bi_end_V230106:基于分型停顿的笔结束辅助判断信号深度解析
czsc 信号函数 byi_bi_end_V230106:基于分型停顿的笔结束辅助判断信号深度解析 本篇文章以 rs_czsc(czsc 的 Rust 核心实现
金融科技
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考