- 金融科技
【免费下载链接】czsc
缠中说禅技术分析工具;缠论;股票;期货;Quant;量化交易
本文围绕 czsc 信号体系中的 K 线级信号
bar_volatility_V241013展开,讲解"波动率三层分类"(低/中/高波动)的信号逻辑、参数模板、Rust 底层实现原理,以及如何将其接入CzscSignals/CzscTrader的signals_config用于实盘与研究工作流。
bar_volatility_V241013是 czsc(缠中说禅技术分析工具)信号体系bar模块(K 线形态、动量、突破、统计类)下的一员,负责把"最近 n 根 K 线的收盘价极差"这一波动率度量,通过三分位完全分类(完全分类)映射为低波动 / 中波动 / 高波动三档状态。阅读本文后,你将掌握:该信号的参数模板与取值语义、在 crates/czsc-signals/src/bar.rs 中的增量缓存与qcut退化对齐实现细节,以及如何在 Python 侧(CzscSignals/generate_czsc_signals)配置与反推该信号。
一、信号定位:bar 模块与完全分类体系
在 czsc 的信号体系中,信号函数由 Rust 实现并经 PyO3 暴露给 Python,共约 232 个信号函数,分为两大类:
- K 线级信号(kline):基于 CZSC 分析结果与 K 线数据计算,
bar模块共 46 个,见 .claude/skills/signal-functions/references/signals-bar.md; - 交易级信号(trader):基于持仓/策略状态计算。
bar_volatility_V241013属于bar模块(类别kline),名称中的V241013是版本标签,完全分类表明其输出采用"互斥且完备"的分层语义——任何时刻的波动率必然落入且仅落入一档。与之同批次的还有bar_zfzd_V241013(窄幅震荡全重叠)、bar_zfzd_V241014(窄幅震荡最大实体重叠)等形态类信号,共同构成 2024-10 版本的波动/形态信号族。
二、信号逻辑:从极差到三分位
依据官方文档(bar_volatility_V241013.md)与源码注释(crates/czsc-signals/src/bar.rs),信号逻辑分三步:
- 定义波动率度量:
volatility_n = 最近 n 根 K 线收盘价的最大值 - 最小值(即收盘价极差,Range of Close); - 三分位分层:对最近
w根 K 线各自的volatility_n缓存值做三分位(tertile)分层,得到低、中、高三个分箱; - 末根分类输出:将最后一根 K 线的波动率值映射到对应分箱,输出
低波动 / 中波动 / 高波动;数据不足或分层失败时输出其他。
参数模板
"{freq}_波动率分层W{w}N{n}_完全分类V241013"| 参数 | 含义 | 默认值 | 说明 |
|---|---|---|---|
{freq} | K 线周期 | 必填 | 如60分钟、日线、周线 |
{w} | 分层窗口 | 200 | 参与三分位分层的波动率缓存样本数 |
{n} | 波动率窗口 | 10 | 计算收盘价极差所用的 K 线根数 |
信号列表示例
按 7 段式k1_k2_k3_v1_v2_v3_score拼接(SKILL.md):
Signal('60分钟_波动率分层W200N10_完全分类V241013_低波动_任意_任意_0')Signal('60分钟_波动率分层W200N10_完全分类V241013_高波动_任意_任意_0')
其中k1=60分钟(周期)、k2=波动率分层W200N10(参数描述)、k3=完全分类V241013(版本标签),v1为分层结果,v2/v3固定为任意,score固定为0。该信号在 crates/czsc-signals/src/utils/sig.rs 中通过make_kline_signal_v1生成,即仅设置v1,v2/v3恒为任意。
三、Rust 底层实现:增量缓存与流式更新
在 crates/czsc-signals/src/bar.rs 中,bar_volatility_v241013函数体给出了完整的工程化实现,核心要点如下。
3.1 波动率序列的增量缓存
let key = format!("bar_volatility_V241013#volatility_{}", n);信号以n为粒度把波动率序列缓存在TaCache中(key = "bar_volatility_V241013#volatility_{n}")。TaCache(定义于 crates/czsc-signals/src/types.rs)是纯 Rust 计算的 TA 指标增量缓存,其中:
series: HashMap<String, Vec<f64>>:存放单点序列值;series_ids: HashMap<String, Vec<i32>>:存放与series对齐的 bar id 序列,用于bars_raw截断后重新对齐。
每次计算时,先按 bar id 将缓存值映射回当前 K 线序列;缺失的槽位以f64::NAN占位,避免错位。
3.2 只补"当前最后 n 根"的写入策略
// 对齐 Python:仅检查“当前最后 n 根”是否缺 cache, // 若缺失则统一写入“当前最后 n 根 close 极差”。 let last = c.bars_raw.len() - 1; let start = (last + 1).saturating_sub(n); let window = &c.bars_raw[start..=last]; let n_max = window.iter().map(|x| x.close).fold(f64::NEG_INFINITY, f64::max); let n_min = window.iter().map(|x| x.close).fold(f64::INFINITY, f64::min); let current_vol = n_max - n_min;从源码可以推断三点行为:
- 不回填历史:仅当"当前最后 n 根"的缓存缺失时才写入
current_vol,更早历史不会被回填,未初始化值保持NaN(后续按0参与分层); - 末值每次覆盖:最后一根未完成的高周期 bar 在流式更新时会被重建,因此
series[last]每次强制覆盖为current_vol; - 流式友好:该策略使信号天然支持
CzscSignals的逐根update_signals(bar)增量计算。
3.3 样本充足性门槛
if c.bars_raw.len() < w + n + 100 { return make_kline_signal_v1(&k1, &k2, &k3, "其他"); }为规避冷启动噪声,Rust 实现在历史 K 线数不足w + n + 100时直接输出其他;随后取get_sub_elements(series, 1, w)(即最近w根缓存值,crates/czsc-signals/src/utils/sig.rs),并把其中的NaN按0.0参与分层。
3.4 三分位分层的 qcut 退化对齐
分层核心是qcut_three_label_last(crates/czsc-signals/src/bar.rs):
// 对齐 pandas.qcut(labels=["低波动","中波动","高波动"], duplicates="drop"): // 当重复边界导致箱数 < 3 时,会因为 labels 数量不匹配抛异常,外层返回“其他”。 if edges.len() != 4 { return None; } let x = *values.last()?; if x < edges[0] || x > edges[3] { return None; } if x >= edges[0] && x <= edges[1] { return Some("低波动"); } if x > edges[1] && x <= edges[2] { return Some("中波动"); } if x > edges[2] && x <= edges[3] { return Some("高波动"); }实现要点:
- 分位边界采用线性插值分位数(
h = (len-1) * p的双线性插值),对p = 0 / 1/3 / 2/3 / 1计算四个边界; edges.dedup_by去除重复边界;当去重后边界数不足 4(即出现退化分箱)时返回None,外层以unwrap_or("其他")兜底——这正是对 pandasqcut(..., duplicates="drop")抛异常行为的对齐(对齐说明:缓存写入与qcut退化行为对齐 Pythonbar_volatility_V241013,见 crates/czsc-signals/src/bar.rs);- 判定区间为左闭右开(
[e0,e1]低波动、(e1,e2]中波动、(e2,e3]高波动),位于边界区间之外的值同样返回None→其他。
四、Python 侧接入:在 signals_config 中使用
信号函数通过#[signal]属性宏自动注册(见 crates/czsc-signals/src/bar.rs,opcode = "BarVolatilityV241013"、param_kind = "BarVolatilityV241013"),Python 侧可直接按注册名配置。
4.1 在 CzscSignals / CzscTrader 中配置
参照 docs/examples/05_signals.py 的SIGNALS_CONFIG写法,将波动率分层信号加入配置列表:
from czsc import BarGenerator, CzscSignals SIGNALS_CONFIG = [ # 60 分钟:默认 W200 N10,波动率三层分类 {"name": "bar_volatility_V241013", "freq": "60分钟"}, # 日线:自定义分层窗口 100、波动率窗口 5 {"name": "bar_volatility_V241013", "freq": "日线", "w": 100, "n": 5}, # 可与其他 bar 模块信号组合 {"name": "bar_zfzd_V241013", "freq": "60分钟", "n": 5}, ] bg = BarGenerator(base_freq="30分钟", freqs=["30分钟", "60分钟", "日线"], max_count=5000) cs = CzscSignals(bg, signals_config=SIGNALS_CONFIG) for bar in bars: cs.update_signals(bar) # 输出形如 "k1_k2_k3" 的信号键,取值如 低波动/中波动/高波动/其他 sig_items = {k: v for k, v in cs.s.items() if len(k.split("_")) == 3}其中w、n均可在signals_config中覆盖默认值(w=200、n=10),底层通过params.usize("w", 200)/params.usize("n", 10)读取(crates/czsc-signals/src/bar.rs)。
4.2 批量生成信号 DataFrame(研究/特征工程)
from czsc import generate_czsc_signals df = generate_czsc_signals( bars, signals_config=SIGNALS_CONFIG, df=True, sdt="2023-01-01", ) # 信号列形如 "60分钟_波动率分层W200N10_完全分类V241013",取值为 低波动/中波动/高波动/其他4.3 从信号字符串反推配置
from czsc import get_signals_config, get_signals_freqs target_signals = [ "60分钟_波动率分层W200N10_完全分类V241013_低波动_任意_任意_0", "日线_波动率分层W100N5_完全分类V241013_高波动_任意_任意_0", ] cfgs = get_signals_config(target_signals) freqs = get_signals_freqs(target_signals) print(freqs) # ['60分钟', '日线'] print(cfgs) # [{'name': 'bar_volatility_V241013', 'freq': '60分钟', 'w': 200, 'n': 10}, # {'name': 'bar_volatility_V241013', 'freq': '日线', 'w': 100, 'n': 5}]get_signals_config/get_signals_freqs由 crates/czsc-python/src/trader/api.rs 的derive_signals_config实现,输出为 params 平铺到顶层的标准signals_config格式;也可用list_all_signals()枚举全部注册信号(含param_template),确认模板后加入配置。
4.4 信号字符串格式速览
7 段式格式k1_k2_k3_v1_v2_v3_score(见 .claude/skills/signal-functions/SKILL.md):
60分钟_波动率分层W200N10_完全分类V241013_低波动_任意_任意_0 ├─k1──┤ ├────k2────┤ ├────k3─────┤ ├─v1─┤ ├v2┤ ├v3┤ ├s┤k1, k2, k3:键字段(周期、参数描述、版本标签);v1, v2, v3:值字段(信号状态);score:整数 0-100,本信号固定为0。
五、实战建议与注意事项
- 数据量门槛:Rust 实现要求
bars_raw.len() >= w + n + 100才输出有效分层,因此回测起点应预留至少w + n根热身数据,否则前期信号均为其他; - 参数语义:
n决定"多快"的波动(收盘极差跨度),w决定"在多大历史范围内比较"(分位基准)。n越小波动越敏感、w越大分位基准越稳定;默认W200 N10适合分钟级周期,日线等低频周期可考虑W100 N5或更短的分层窗口; - 完全分类特性:信号值互斥完备(低/中/高波动三分箱),不存在"未分类"的中间态(冷启动与退化场景除外,此时输出
其他),可直接用于事件驱动的条件组合; - 与同族信号组合:可搭配
bar_zfzd_V241013(窄幅震荡)、bar_window_std_V230731(窗口波动分层)、tas_dif_layer_V241010(DIF 分层)等,构成"波动率状态 + 形态特征"的多维过滤,再交由pos_*交易级信号驱动持仓管理(交易级信号索引见 .claude/skills/signal-functions/references/signals-pos.md)。
六、相关资源
- 信号单文档:.claude/skills/signal-functions/references/signals/bar_volatility_V241013.md
- bar 模块索引:.claude/skills/signal-functions/references/signals-bar.md
- Rust 实现:crates/czsc-signals/src/bar.rs,三分位分层核心 crates/czsc-signals/src/bar.rs
- 信号缓存结构:crates/czsc-signals/src/types.rs
- Python 调用示例:docs/examples/05_signals.py
- 信号字符串反推实现:crates/czsc-python/src/trader/api.rs
- 金融科技
【免费下载链接】czsc
缠中说禅技术分析工具;缠论;股票;期货;Quant;量化交易
相关推荐
czsc 的 tas_atr_V230630:ATR 波动率 qcut 分层信号完全指南
czsc 的 tas_atr_V230630:ATR 波动率 qcut 分层信号完全指南 本文基于仓库文档 .claude/skills/signal func
金融科技czsc 信号函数 bar_bpm_V230227 完全解析:绝对动量分层(BP 阈值四分类)的 Rust 实现与实战用法
czsc 信号函数 bar_bpm_V230227 完全解析:绝对动量分层(BP 阈值四分类)的 Rust 实现与实战用法 导读: bar_bpm_V23022
金融科技czsc 信号函数解析:bar_window_std_V230731 窗口波动分层特征(Rust 实现与 Python 对齐)
czsc 信号函数解析:bar_window_std_V230731 窗口波动分层特征(Rust 实现与 Python 对齐) 本文是 rs_czsc 信号函数
金融科技
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考