☰
czsc 缠论信号解析:tas_macd_bc_ubi_V230804 未完成笔 MACD 背驰观察信号实战指南
2026/10/10 2:06:32 网站建设 项目流程
  • 金融科技

【免费下载链接】czsc

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

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

本文档以 .claude/skills/signal-functions/references/signals/tas_macd_bc_ubi_V230804.md 为骨架,结合 czsc 仓库中 crates/czsc-signals/src/tas.rs 的源码实现展开。

tas_macd_bc_ubi_V230804是 czsc(缠中说禅技术分析)信号体系中的一个K 线级(kline)MACD 背驰观察信号,它把「未完成笔(UBI)」的方向与极值位置、最近 6 笔构造的中枢,以及 MACD 的 DIF 动能三者结合起来,用于捕捉行情末端动能衰减的背驰机会。读完本文,你将掌握该信号的参数模板与信号字符串含义、三步判读逻辑的源码级实现细节,以及如何在自己的 czsc 策略或 Python 环境中查询、配置和使用它。

信号速览:模板、类别与输出

该信号归属于tas模块(技术指标类信号),源码位于 crates/czsc-signals/src/tas.rs,并通过#[signal]宏声明为category = "kline"(K 线级信号,区别于 trader 交易级信号)。

参数模板(唯一,无额外参数):

"{freq}_MACD背驰_UBI观察V230804"

其中{freq}为 K 线周期占位符,可填入1分钟、60分钟、日线、周线等周期名称。完整的信号字符串遵循 czsc 通用的 7 段式格式k1_k2_k3_v1_v2_v3_score(参见 signal-functions 技能说明):

60分钟_MACD背驰_UBI观察V230804_空头_任意_任意_0 ├─k1─────┤ ├─k2───┤ ├k3───────────┤ ├v1─┤ ├v2─┤ ├v3─┤ ├s┤

信号列表示例:

  • Signal('60分钟_MACD背驰_UBI观察V230804_空头_任意_任意_0')
  • Signal('60分钟_MACD背驰_UBI观察V230804_多头_任意_任意_0')

信号状态值v1共有三种取值:空头、多头,以及数据不足时的默认值其他。v2、v3固定为任意,score固定为0。

从源码的段构造看(tas.rs):

  • k1 = czsc.freq.to_string():当前分析周期;
  • k2 = "MACD背驰":信号大类;
  • k3 = "UBI观察V230804":版本标签;
  • v1初始为"其他",仅在满足背驰条件时被改写为"空头"或"多头"。

信号逻辑:三步判读

文档定义的核心逻辑共三步,原文如下:

  1. 使用未完成笔(UBI)方向与极值位置;
  2. 在最近 6 笔中构造中枢并比较 UBI 末段 DIF 与历史对应笔 DIF;
  3. 上行 UBI DIF 走弱判空头,下行 UBI DIF 抬升判多头。

补充背景知识:在缠论体系中,「未完成笔(UBI, Unfinished BI)」是指当前正在生长、尚未被后续走势确认结束的一笔。czsc 在 crates/czsc-core/src/analyze/mod.rs 中维护bars_ubi: Vec<NewBar>保存未完成笔对应的原始 K 线,并通过get_ubi_fxs()(analyze/mod.rs)从中提取分型。背驰(Divergence)的本质是:价格创新高/新低,但代表动能的指标(此处为 MACD 的 DIF)未能同步创出新高/新低,从而提示趋势动能衰竭。

源码实现纵深解析

下面以 crates/czsc-signals/src/tas.rs 的实现为主线,逐段拆解tas_macd_bc_ubi_v230804的完整执行流程。

前置条件与快速退出

函数首先以固定参数12 / 26 / 9更新 MACD 缓存(cache_key = "MACD12#26#9",见 tas.rs),再构建id_to_idx的 K 线索引映射,随后进入一系列数据充分性检查,任何一项不满足都会直接返回v1 = "其他"的信号:

检查项源码位置含义
ubi_fxs不存在或为空tas.rs对齐 Pythonnot ubi语义:分型为空视为 UBI 不可用
czsc.bi_list.len() < 7或 UBI 原始 K 线数< 7tas.rs已完成笔不足 7 笔时无法构造参照
最近 6 笔取数不足 6 笔tas.rsget_sub_elements(&czsc.bi_list, 1, 6)从倒数第 1 笔起取 6 笔
中枢不合法tas.rs最近 5 笔构造的中枢ZS::new(...)未通过is_valid()

可见该信号对数据量的要求相当严格:至少需要 7 笔已完成笔 + 7 根未完成笔 K 线,且最近 5 笔能构成一个有效中枢,否则一律输出其他。这一点在实盘/回测中意味着行情刚启动、笔数积累不足的阶段,该信号会自动保持静默,不会产生误导性方向判断。

UBI 数据口径:方向与极值

UBI 相关数据全部取自原始 K 线口径(RawBar):

  • ubi_raw_bars:把czsc.bars_ubi中每个NewBar的elements平铺展开(tas.rs);
  • ubi_high/ubi_low:对 UBI 全部原始 K 线的high/low取极值(tas.rs);
  • ubi_direction:未完成笔方向与最后一笔已完成笔方向相反——若czsc.bi_list.last()方向为Down,则 UBI 方向取Up,反之取Down(tas.rs)。

同时,从最近 6 笔(bis)中求出最高点gg与最低点dd,作为中枢区间的上下边界(tas.rs)。

中枢构造与 1/4 分位阈值

中枢由最近 5 笔(bis[bis.len()-5..])构造(tas.rs),并以区间高度的 1/4 作为「突破判定」阈值:

  • 上行分支(ubi_direction == Up):要求ubi_high > gg - (gg - dd) / 4.0,即 UBI 高点已深入中枢区间上方 1/4 区域(tas.rs);
  • 下行分支(ubi_direction == Down):要求ubi_low < dd + (gg - dd) / 4.0,即 UBI 低点已深入中枢区间下方 1/4 区域(tas.rs)。

这一条件可以理解为:只有 UBI 的极值明显偏离中枢核心区间时,才谈得上"创新高/新低"意义上的背驰;若 UBI 仍在区间中段震荡,则不触发观察。

DIF 比较:末段动能 vs 历史对应笔动能

这是整个信号的核心计算,分为动能取值与比较两个环节。

UBI 末段 DIF(b5_dif):取 UBI 原始 K 线最后 5 根(ubi_raw_bars[ubi_raw_bars.len()-5..]),通过snapshot_dif_values_from_raw_bars(tas.rs)逐根计算 DIF 快照值,然后:

  • 上行分支取最大值(f64::NEG_INFINITY折叠求 max,tas.rs);
  • 下行分支取最小值(f64::INFINITY折叠求 min,tas.rs)。

历史对应笔 DIF(od_dif):取最近 6 笔中倒数第 4 笔b2与倒数第 2 笔b4(tas.rs)各自的起始分型fx_b,经snapshot_dif_values_from_fx(tas.rs)展开其原始 K 线并计算 DIF 快照,同样按方向取极值合并(上行取 max,下行取 min)。

判定规则(即文档第 3 步的精确形式):

分支条件输出
上行0.0 < b5_dif && b5_dif < od_dif空头
下行0.0 > b5_dif && b5_dif > od_dif多头
  • 上行背驰:DIF 仍为正(动能尚未转负),但 UBI 末段 DIF 峰值已低于历史上涨笔的 DIF 峰值,即价格创新高而动能走弱,预示上涨衰竭 → 判空头;
  • 下行背驰:DIF 仍为负,但 UBI 末段 DIF 谷值已高于历史下跌笔的 DIF 谷值(负数抬高),即价格创新低而下跌动能衰减,预示下跌衰竭 → 判多头。

条件中同时要求 DIF 符号(正/负)未翻转,说明该信号只识别「同向动能减弱」的经典背驰,而不把 DIF 已穿越零轴的状况计入。

输出封装

最终通过make_kline_signal_v1(&k1, &k2, k3, v1)生成单条 K 线级信号(tas.rs),即上文 7 段式字符串中的形态。由于本信号只有v1一个维度,v2、v3固定为任意。

MACD 缓存与快照计算机制

值得单独说明的是 DIF 的获取方式,它体现了 czsc 信号框架的工程化设计:

  • 缓存复用:函数开头调用update_macd_cache(czsc, "MACD12#26#9", 12, 26, 9, cache)(tas.rs),MACD 序列按cache_key存入共享的TaCache,同一分析批次内多个 MACD 类信号可复用同一份序列,避免重复计算;
  • 快照回填:snapshot_dif_values_from_raw_bars内部调用macd_snapshot_field_value(tas.rs,定义于 crates/czsc-signals/src/utils/ta.rs),并通过snapshot_overrides: HashMap<i32, (f64, f64, f64)>记录已回填的 K 线 id 的(DIF, DEA, MACD)快照。由于 UBI 与已确认笔之间存在 K 线重叠,快照回填机制保证了同一根 K 线在多次取数中取到一致的 DIF 值;
  • 有限值过滤:取数后.filter(|x| x.is_finite())剔除 NaN/Inf 等无效值,防止未成熟区间的指标值污染比较结果(tas.rs)。

参数说明与对齐说明

  • 参数说明:无额外参数。信号行为完全由 K 线结构(笔、中枢、UBI)与固定 MACD 参数12 / 26 / 9决定,不需要也不接受用户传入th、di等配置项;
  • 对齐说明:UBI 原始 K 线口径与 Pythontas_macd_bc_ubi_V230804一致。Rust 实现中通过「ubi_fxs为空即视为 UBI 不可用」(tas.rs)显式对齐 Python 的not ubi语义,确保两条实现路径的边界条件行为一致。

实际使用:查询、配置与引用

从 Python 侧查询该信号

czsc 通过 PyO3 向 Python 暴露信号注册表。在安装了 Rust 扩展(rs_czsc)的环境中,可以:

from rs_czsc import list_all_signals, derive_signals_config # 列出所有注册信号,按 name 过滤 signals = list_all_signals(include_kline=True, include_trader=False) ubi_sig = [s for s in signals if s["name"] == "tas_macd_bc_ubi_V230804"] # 返回项含 {name, param_template, category, namespace} # 从信号字符串反推 signals_config(可用于 CzscTrader / CzscSignals 配置) config = derive_signals_config(["60分钟_MACD背驰_UBI观察V230804_多头_任意_任意_0"])

注册信息可对照源码 crates/czsc-signals/src/registry.rs,该信号以"tas_macd_bc_ubi_V230804"名义登记在册。

查看信号目录与明细

仓库提供两个脚本便于整体浏览信号体系:

  • scripts/dump_signal_catalog.py:导出全部信号的目录(名称、模板、类别、命名空间);
  • scripts/dump_signal_details.py:导出每个信号函数的详细说明。

信号函数参考手册的完整索引见 .claude/skills/signal-functions/SKILL.md,其中tas模块(59 个信号)的汇总页为 signals-tas.md。

同族信号对比

tas_macd_bc_ubi_V230804属于tas_macd_bc(MACD 背驰)信号家族,仓库中同目录下还收录了多个相关版本,可在选择信号时对照参考:

  • tas_macd_bc_V230803.md 与 tas_macd_bc_V230804.md:基于已完成笔的 MACD 背驰观察;
  • tas_macd_bc_V240307.md:更新版本;
  • 本文主角tas_macd_bc_ubi_V230804:唯一以未完成笔(UBI)为观察对象的变体,其优势在于能更早地在笔尚未确认结束时就捕捉背驰迹象,代价是数据充分性要求更高(至少 7 笔 + 有效中枢)。

小结:信号的使用边界

综合文档与源码,使用tas_macd_bc_ubi_V230804时需牢记三点:

  1. 它是观察型信号而非触发型信号:输出仅空头/多头/其他三态,且v2、v3、score恒为占位值,适合作为多信号组合中的动能过滤或确认因子,而非独立买卖点;
  2. 对数据长度敏感:笔数不足 7 笔或最近 5 笔无法构成有效中枢时恒定输出其他,在策略中应将其视为「条件不满足」而非「看空」;
  3. 口径与 Python 版严格对齐:UBI 取原始 K 线口径,MACD 固定12/26/9,若在 Rust / Python 双端同时使用,可预期得到一致的信号结果。
  • 金融科技

【免费下载链接】czsc

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

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

相关推荐

上一篇:终极围棋AI分析工具LizzieYzy:从零开始掌握职业棋手级复盘技巧
下一篇:React Stack Reconciler 挂载流程解析(第 6 部分):mountChildren 与初始子组件挂载全链路

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

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

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

立即咨询