☰
czsc 缠论信号函数 cxt_bi_trend_V230824:基于 N 笔中位价格形态判断的完整指南
2026/10/10 5:47:43 网站建设 项目流程
  • 金融科技

【免费下载链接】czsc

缠中说禅技术分析工具;缠论;股票;期货;Quant;量化交易

项目地址:https://gitcode.com/gh_mirrors/cz/czsc
点击查看免费下载

本文基于仓库文档 .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 段式拆解:

段示例值含义
k160分钟周期
k2D1N4TH2参数描述
k3形态V230824版本标签
v1向上/向下/横盘/其他形态判定结果
v2任意本信号不输出
v3任意本信号不输出
score0固定分值

其中v1是信号的判定输出,只有四种取值:向上、向下、横盘、其他(数据不足时)。

三、信号逻辑与算法原理

根据文档"信号逻辑"及 cxt.rs 中的 Rust 实现,该信号的完整执行流程如下:

  1. 取样:从倒数第di笔开始,向前取最近n笔(即笔列表bi_list中的一段连续笔);
  2. 计算中位价格:对每笔取(低点 + 高点) / 2作为该笔的中位价格;
  3. 计算均值:对n笔中位价格求算术平均,得到基准avg;
  4. 计算偏离:用首笔中位价格除以均值得到比例ratio;
  5. 阈值判定:
    • ratio * 100 > 100 + th→向下(首笔明显高于均值,说明最近价格重心回落趋势);
    • ratio * 100 < 100 - th→向上(首笔明显低于均值,说明最近价格重心抬升);
    • 否则 →横盘;
  6. 数据不足防护:笔数不足、均值非法或为零时返回其他。

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 起)11及以上,常用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 参数组合的模板示例

freqdinth完整模板判定含义
60分钟14260分钟_D1N4TH2_形态V230824最近 4 笔整体形态
日线153日线_D1N5TH3_形态V230824日线最近 5 笔形态,更宽松
30分钟26130分钟_D2N6TH1_形态V230824跳过最近 1 笔,观察 6 笔更敏感趋势

五、与 cxt_bi_trend_V230913 的对比

仓库同时维护笔趋势信号的升级版本cxt_bi_trend_V230913(见 cxt_bi_trend_V230913.md),二者共同点是都基于笔(BI)序列、都用di/n参数,但算法差异显著:

维度cxt_bi_trend_V230824cxt_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_其他_任意_任意_0

6.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相关测试用于验证核心对齐性)。

八、常见问题与注意事项

  1. 为什么经常返回其他?该信号要求bi_list长度不小于di + n + 2。行情初期笔数不足时必然返回其他,属于正常行为;可通过调小n(如n = 3)或调大di起步时间提前来缓解。
  2. th的单位是什么?它是百分数(非 BP)。TH2表示允许首笔中位价格相对均值偏离 ±2% 以内仍判为横盘。
  3. di可以取 0 吗?笔级信号的取样语义从di = 1开始(get_sub_elements断言di >= 1),配置时di取1以上即可。
  4. 与均线类趋势信号的区别:本信号基于缠论笔结构(bi_list)而非原始 K 线均线,因此形态判断天然过滤了笔内噪声,且依赖于缠论分型确认的笔完成质量。
  5. 多周期使用:模板中的{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;量化交易

项目地址:https://gitcode.com/gh_mirrors/cz/czsc
点击查看免费下载

相关推荐

上一篇:如何永久保存微信聊天记录:WeChatMsg数据留痕终极指南
下一篇:3天精通鸣潮自动化:ok-ww智能助手完全攻略手册

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询