☰
czsc 信号函数解析:jcc_ta_xing_V221124 塔形顶底(K 线形态信号)
2026/10/10 5:14:33 网站建设 项目流程
  • 金融科技

【免费下载链接】czsc

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

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

本文基于 czsc 开源仓库中.claude/skills/signal-functions/references/signals/jcc_ta_xing_V221124.md文档,并结合 czsc-signals 中jcc模块的 Rust 源码实现,完整讲解塔形顶底形态信号的参数模板、信号逻辑、输出格式与底层判定原理,帮助读者在缠论量化系统中直接使用该信号并理解其行为边界。

塔形顶底(Tower Top / Tower Bottom)是经典的 K 线反转形态:行情在连续上涨/下跌后,以一根大实体 K 线结束,中间几根小实体 K 线高低点聚集,形似塔顶或塔底。jcc_ta_xing_V221124是 czsc 信号库中专门用于识别该形态的 K 线级信号,归属于jcc.rs模块、类别kline。读完本文,你将掌握:该信号的参数模板如何拼写、信号输出的 7 段式结构如何解读、底层 5~9 根窗口扫描与实体/方差判定逻辑,以及它与 Python 旧版实现的对应关系。

一、信号概览:模块归属与类别

该信号在仓库中的官方定义为:

  • 模块:jcc.rs(源码路径 crates/czsc-signals/src/jcc.rs)
  • 类别:kline(K 线级信号,逐根 K 线计算)
  • 信号名:jcc_ta_xing_V221124
  • 说明:塔形顶底

从 jcc 模块信号索引 可以看到,jcc模块共注册 19 个 K 线形态类信号(刺透形态、反击线、分手线、平头形态、三法、三星、伞形线、十字线、吞没形态、三只乌鸦、两只乌鸦、乌云盖顶、星形线、孕线、烛火线等),塔形顶底是其中之一。这类信号统一通过#[signal(...)]过程宏声明,由czsc-signal-macros在编译期自动收集进 inventory 注册表。

在 crates/czsc-signals/src/registry.rs 中,SIGNAL_REGISTRY以HashMap<&'static str, SignalMeta>的形式维护所有kline类信号的运行时视图,每个条目记录func(信号函数引用)与param_template(参数模板)。jcc_ta_xing_V221124正是通过这种机制被注册、查询和调用的。

二、参数模板与信号命名规则

2.1 参数模板

jcc_ta_xing_V221124的参数模板为:

"{freq}_D{di}K_塔形

其中:

  • {freq}:K 线周期名称,如15分钟、60分钟、日线;
  • D{di}:定位倒数第di根 K 线;
  • K:固定后缀,表示该信号以"窗口长度"作为第二段输出维度;
  • 塔形:信号主题名。

源码中的声明(crates/czsc-signals/src/jcc.rs)确认了该模板:

#[signal( category = "kline", name = "jcc_ta_xing_V221124", template = "{freq}_D{di}K_塔形V221124", opcode = "JccTaXingV221124", param_kind = "JccTaXingV221124" )]

注意:注册表中的模板带有V221124版本后缀,而文档中的"参数模板"一节展示的是不含版本号的简化写法"{freq}_D{di}K_塔形。两者分别用于不同的场景——文档模板用于快速理解参数结构,注册模板是信号名的完整规范形式。

2.2 信号输出示例

文档给出的两个标准信号输出:

  • Signal('15分钟_D1K_塔形_顶部_6K_任意_0')
  • Signal('15分钟_D1K_塔形_底部_8K_任意_0')

这是 czsc 标准的 7 段式信号字符串,逐段含义为:

段位示例值含义
k115分钟K 线周期
k2D1K定位参数(倒数第 1 根 K 线 + K 后缀)
k3塔形信号主题
v1顶部/底部形态方向判定
v26K/8K触发窗口长度(5~9 根)
v3任意第三维度(本信号不区分,固定为任意)
score0信号分值(本信号固定为 0)

从源码实现看,信号通过 crates/czsc-signals/src/utils/sig.rs 中的make_kline_signal_v2构造,它调用底层make_signal7生成标准 7 段信号,并严格校验格式:

/// K线级:设置 v1/v2,v3 固定 `任意` pub fn make_kline_signal_v2(k1: &str, k2: &str, k3: &str, v1: &str, v2: &str) -> Vec<Signal> { make_signal7(k1, k2, k3, v1, v2, "任意", 0) }

这正是输出示例中v3 = 任意、score = 0的来源。

三、信号逻辑:5~9 根窗口的塔形扫描

文档中定义的信号逻辑为:

  1. 在 5~9 根窗口内扫描;
  2. 首尾实体最大且中间高低点聚集;
  3. 判定顶部/底部,并返回窗口长度。

3.1 窗口扫描过程

源码实现(crates/czsc-signals/src/jcc.rs)按[5, 6, 7, 8, 9]五个窗口长度依次尝试,从 5 根开始、逐次递增,第一个满足条件的窗口立即生效并跳出循环:

let mut v1 = "其他"; let mut v2 = "其他"; for n in [5usize, 6, 7, 8, 9] { let bars = get_sub_elements(&c.bars_raw, di, n); let t = check(bars); if t != "其他" { v1 = t; v2 = if n == 5 { "5K" } else if n == 6 { "6K" } else if n == 7 { "7K" } else if n == 8 { "8K" } else { "9K" }; break; } }

v2记录的就是触发时的窗口长度nK。若 5~9 根窗口内均不满足形态条件,则输出v1 = 其他、v2 = 其他。

窗口数据通过get_sub_elements(crates/czsc-signals/src/utils/sig.rs)截取:它对齐 Python 的切片语义,di == 1时返回最后n根,di > 1时返回[-n-di+1 : -di+1]区间;数据不足时返回可用区间(可能为空)。窗口内少于 5 根时直接返回其他。

3.2 塔形条件判定(check 闭包)

每个窗口内的判定逻辑(crates/czsc-signals/src/jcc.rs)分三步:

第一步:窗口长度门槛

if bars.len() < 5 { return "其他"; }

不足 5 根 K 线无法构成塔形结构,直接排除。

第二步:首尾实体最大

let rb = &bars[0]; let lb = bars.last().unwrap(); let mut solids: Vec<f64> = bars.iter().map(solid).collect(); solids.sort_by(|a, b| a.partial_cmp(b).unwrap_or(std::cmp::Ordering::Equal)); if solid(rb).min(solid(lb)) >= solids[solids.len() - 2] {

其中solid(bar)定义为(open - close).abs(),即 K 线实体长度(crates/czsc-signals/src/jcc.rs):

#[inline] fn solid(bar: &RawBar) -> f64 { (bar.open - bar.close).abs() }

判定规则是:将窗口内全部 K 线的实体长度排序后取次大值,要求首尾两根 K 线中较小的实体长度不小于该次大值——即窗口内实体最大的两根 K 线必须是首尾两根。这保证了"塔形"的两端由大实体 K 线构成。

第三步:顶部 / 底部细分

在满足实体条件后,分别检查顶部与底部两套条件:

// 顶部:首阳尾阴 + 中间高点聚集 + 中间低点高于首尾开盘高点 let g_c1 = rb.close > rb.open && lb.close < lb.open; let g_c2 = variance(&mid.iter().map(|x| x.high).collect::<Vec<_>>()) < 0.5; let g_c3 = mid.iter().all(|x| x.low > rb.open.max(lb.close)); if g_c1 && g_c2 && g_c3 { return "顶部"; } // 底部:首阴尾阳 + 中间低点聚集 + 中间高点低于首尾开盘低点 let d_c1 = rb.close < rb.open && lb.close > lb.open; let d_c2 = variance(&mid.iter().map(|x| x.low).collect::<Vec<_>>()) < 0.5; let d_c3 = mid.iter().all(|x| x.high < rb.open.min(lb.close)); if d_c1 && d_c2 && d_c3 { return "底部"; }

其中mid是去掉首尾后的中间 K 线序列,variance(crates/czsc-signals/src/jcc.rs)计算序列方差:

fn variance(values: &[f64]) -> f64 { if values.is_empty() { return f64::NAN; } let mean = values.iter().sum::<f64>() / values.len() as f64; values.iter().map(|x| (x - mean).powi(2)).sum::<f64>() / values.len() as f64 }

两套条件的语义可对照理解为:

条件顶部(塔顶)底部(塔底)
首尾方向首根阳线、尾根阴线首根阴线、尾根阳线
中间聚集中间 K 线高点方差 < 0.5中间 K 线低点方差 < 0.5
位置约束中间 K 线的低点全部高于max(首根开盘, 尾根收盘)中间 K 线的高点全部低于min(首根开盘, 尾根收盘)

也就是说:塔顶要求"中间的高点挤在一起且整体悬在高位",塔底要求"中间的低点挤在一起且整体沉在低位"——这正是塔形形态"两端大实体、中间小实体聚集"的数学刻画。

3.3 参数di说明

  • di:倒数第di根 K 线,默认1。

源码通过get_usize_param读取参数(crates/czsc-signals/src/jcc.rs):

let di = get_usize_param(params, "di", 1);

get_usize_param(crates/czsc-signals/src/utils/sig.rs)同时支持数字与字符串两种取值方式:优先读取u64,否则尝试把字符串解析为usize,失败时回退到默认值1。di = 0时切片语义会退化,因此文档默认值 1 意味着"以最新一根 K 线为窗口终点";需要观察历史 K 线上的塔形信号时,可把di设为 2、3 等以定位更早的 K 线。

四、与 Python 旧版的对齐关系

文档明确说明:与 Pythonjcc_ta_xing_V221124一致。

从源码结构看,czsc-signals 由 Python 版 czsc 迁移而来(crates/czsc-signals/src/lib.rs 注明 "Migrated from rs-czsc")。整个信号库的约定是:Rust 实现逐条对齐 Python 旧版的判定顺序与条件组合,包括:

  • get_sub_elements对齐 Python 的切片语义(di与窗口边界的换算);
  • 信号字符串的 7 段式结构与 Python 版Signal对象一一对应;
  • variance使用总体方差(除以 N 而非 N-1),保证数值口径一致。

因此,凡是能在 Python 版 czsc 中产生的jcc_ta_xing_V221124信号,在 Rust 版中应得到相同结果;这一点也通过 tests 与 Python 侧的兼容性测试共同保障。

五、在 czsc 中的实际使用方式

5.1 注册与查询

信号在编译期通过#[signal_module(category = "kline")]宏挂载到jcc模块(crates/czsc-signals/src/lib.rs),并在运行时由SIGNAL_REGISTRY统一管理。需要枚举全部已注册信号时,可调用list_all_signals(crates/czsc-signals/src/registry.rs),它会返回包含name、param_template、category、namespace的只读视图。

5.2 组合使用建议

塔形顶底属于 K 线级形态信号,通常作为反转预警因子与其他信号叠加使用:

  • 塔形顶部常与缠论一卖、MACD 顶背驰等信号组合,确认阶段顶部的有效性;
  • 塔形底部常与缠论一买、底背驰等信号组合,用于捕捉阶段底部反转;
  • v2中的窗口长度nK可用来过滤形态的"紧凑程度"——窗口越短,形态越紧凑,反转含义通常越强。

使用时需要注意两个限制:

  1. 窗口依赖:至少需要di + 4根以上的 K 线数据才能覆盖最小 5 根窗口,历史数据不足时信号返回其他;
  2. 固定阈值:variance < 0.5与位置约束均为硬编码阈值,不随标的或周期自适应,跨品种使用时应结合回测验证其适用性。

六、小结

jcc_ta_xing_V221124是一个结构清晰、判定严格的塔形顶底形态信号:

  • 参数极简:仅di一个参数(默认 1),模板"{freq}_D{di}K_塔形易于记忆;
  • 逻辑可解释:5~9 根窗口扫描 + 首尾实体最大 + 中间高低点方差聚集,三条件缺一不可;
  • 输出标准:7 段式信号,v1输出顶部/底部/其他,v2输出触发窗口长度nK;
  • 与 Python 完全对齐,可作为 Python 旧版策略平滑迁移到 Rust 版 czsc 时的直接替代。

如需进一步了解同模块的其他 K 线形态信号(吞没、乌云盖顶、刺透、孕线、十字线、三只乌鸦等),可查阅 signals-jcc.md 索引及 jcc.rs 源码;若要查看完整的信号使用流程,可参考 czsc-signals README 与 信号函数 SKILL 文档。

  • 金融科技

【免费下载链接】czsc

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

项目地址:https://gitcode.com/gh_mirrors/cz/czsc
点击查看免费下载
上一篇:开源项目 pdfcompare 亮点详解
下一篇:如何解锁微信防撤回插件WeChatIntercept的强大扩展能力:面向开发者的实用指南

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

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

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

立即咨询