- 金融科技
【免费下载链接】czsc
缠中说禅技术分析工具;缠论;股票;期货;Quant;量化交易
本文基于 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 段式信号字符串,逐段含义为:
| 段位 | 示例值 | 含义 |
|---|---|---|
| k1 | 15分钟 | K 线周期 |
| k2 | D1K | 定位参数(倒数第 1 根 K 线 + K 后缀) |
| k3 | 塔形 | 信号主题 |
| v1 | 顶部/底部 | 形态方向判定 |
| v2 | 6K/8K | 触发窗口长度(5~9 根) |
| v3 | 任意 | 第三维度(本信号不区分,固定为任意) |
| score | 0 | 信号分值(本信号固定为 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 根窗口的塔形扫描
文档中定义的信号逻辑为:
- 在 5~9 根窗口内扫描;
- 首尾实体最大且中间高低点聚集;
- 判定
顶部/底部,并返回窗口长度。
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可用来过滤形态的"紧凑程度"——窗口越短,形态越紧凑,反转含义通常越强。
使用时需要注意两个限制:
- 窗口依赖:至少需要
di + 4根以上的 K 线数据才能覆盖最小 5 根窗口,历史数据不足时信号返回其他; - 固定阈值:
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;量化交易
相关推荐
czsc 信号函数详解:bar_triple_V230506 三K加速形态(裸K形态)识别与信号配置实战
czsc 信号函数详解:bar_triple_V230506 三K加速形态(裸K形态)识别与信号配置实战 导读 bar_triple_V230506 是 czs
金融科技GitBook 卡片视图空字段隐藏:hide-empty-card-fields 补丁的实现原理与逐类型判定
GitBook 卡片视图空字段隐藏:hide empty card fields 补丁的实现原理与逐类型判定 在 GitBook 文档站点的表格卡片视图(Car
金融科技czsc 乌云盖顶信号 `jcc_wu_yun_gai_ding_V221101`:K线形态识别原理与配置实战
czsc 乌云盖顶信号 jcc_wu_yun_gai_ding_V221101 :K线形态识别原理与配置实战 本文基于 rs_czsc / czsc 仓库的 j
金融科技
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考