chanlun — 缠论技术分析 Rust 核心库
基于缠中说禅理论的量化技术分析核心库,用 Rust 实现。支持流式数据处理,可作为独立 Rust crate 使用,也可通过 PyO3 绑定在 Python 中调用(见 chanlun-py)。
约 9,400 行 Rust 代码,覆盖缠论的完整算法体系:K线包含处理、分型识别、笔划分、线段划分、中枢识别、背驰检测、买卖点识别、多周期联立分析。
目录
核心概念
缠论是一种源自中国的技术分析理论,将价格走势分解为层级结构,从最底层K线逐渐向上构造:
原始K线 → 包含处理 → 缠论K线 → 顶底分型 → 笔 → 线段 → 中枢 → 买卖点
核心理念:
- 走势终完美:任何级别的任何走势类型终要完成
- 自同构性:不同级别的走势呈现相同的形态结构
- 完全分类:将走势分为上涨、下跌、盘整三种
项目结构
chanlun/
├── Cargo.toml # 依赖: serde, byteorder, chrono
└── src/
├── lib.rs # 模块注册
├── config.rs # 缠论配置 (60+ 参数, serde)
├── types/ # 基础类型
│ ├── mod.rs
│ ├── bsp_type.rs # 买卖点类型 (18 种)
│ ├── direction.rs # 相对方向 (9 种)
│ ├── fractal.rs # 分型结构 (5 种)
│ └── gap.rs # 缺口
├── kline/ # K线层
│ ├── mod.rs
│ ├── bar.rs # 原始K线 (OHLCV + 指标)
│ └── chan_kline.rs # 缠论K线 (包含处理 + 合并)
├── indicators/ # 技术指标
│ ├── mod.rs
│ ├── macd.rs # MACD (平滑异同移动平均线)
│ ├── rsi.rs # RSI (相对强弱指数)
│ └── kdj.rs # KDJ (随机指标)
├── algorithm/ # 核心算法
│ ├── mod.rs
│ ├── bi.rs # 笔划分算法
│ ├── segment.rs # 线段划分算法
│ ├── hub.rs # 中枢识别算法
│ └── divergence.rs # 背驰检测算法
├── structure/ # 结构体
│ ├── mod.rs
│ ├── dash_line.rs # 虚线 (笔/线段的通用抽象)
│ ├── fractal_obj.rs # 分型对象
│ ├── segment_feat.rs # 线段特征
│ └── feat_fractal.rs # 特征分型
├── business/ # 业务层
│ ├── mod.rs
│ ├── bsp.rs # 基础买卖点 + 买卖点
│ ├── observer.rs # 观察者 (单周期分析器)
│ ├── synthesizer.rs # K线合成器 (周期合成)
│ └── multi_frame.rs # 立体分析器 (多周期联立)
└── utils/ # 工具
├── mod.rs
├── datetime.rs # 时间戳转换
└── format.rs # 格式化输出
快速开始
Cargo 依赖
[dependencies]
chanlun = { path = "path/to/chanlun" }
基本用法
use chanlun::config::缠论配置;
use chanlun::kline::bar::K线;
use chanlun::business::observer::观察者;
// 1. 创建配置
let 配置 = 缠论配置::default();
// 2. 创建观察者(单周期分析器)
let mut 观察员 = 观察者::new("BTCUSD".into(), 3600, 配置);
// 3. 逐根投喂K线(流式增量分析)
for k线 in k线数据流 {
观察员.增加原始K线(k线);
}
// 4. 读取分析结果
for 笔 in 观察员.笔序列() {
println!("笔: {:?}", 笔.方向());
}
for 中枢 in 观察员.中枢序列() {
println!("中枢: 高={:?}, 低={:?}", 中枢.高(), 中枢.低());
}
多周期分析
use chanlun::business::multi_frame::立体分析器;
// 周期组: [最小输入周期, 更多显示周期...]
let mut 分析器 = 立体分析器::new(
"BTCUSD".into(),
vec![60, 300, 1800, 7200], // 1分钟 → 5分钟 → 30分钟 → 2小时
缠论配置::default(),
std::collections::HashMap::new(),
);
// 只投喂最小周期K线,大周期自动合成
for k线 in 小周期K线流 {
分析器.投喂K线(k线);
}
// 获取各周期观察者
let 观察员_1min = 分析器.获取观察员(60);
let 观察员_5min = 分析器.获取观察员(300);
数据管线
缠论分析按严格的层级顺序进行,每收到一根新K线,增量更新所有层级:
原始K线 (K线)
│
├── 指标计算: MACD / RSI / KDJ (增量更新)
│
├── 包含处理 → 缠论K线 (缠论K线)
│ │
│ ├── 顺序包含合并
│ ├── 逆序包含合并
│ └── 方向判定 (向上/向下)
│
├── 分型识别 → 分型 (分型)
│ │
│ ├── 由左中右三根缠论K线构成
│ ├── 类型: 顶分型 / 底分型 / 上 / 下 / 散
│ └── 强度: 强 / 中 / 弱
│
├── 笔划分 → 笔 (虚线, 标识="笔")
│ │
│ ├── 递归分析算法
│ ├── 支持笔弱化、次级成笔等策略
│ └── 实际高/低点选择 (first/last)
│
├── 线段划分 → 线段 (虚线, 标识="线段")
│ │
│ ├── 特征序列提取
│ ├── 缺口检测 (老阴/老阳)
│ ├── 笔破坏判断
│ ├── 缺口突破修正
│ └── 非缺口下穿刺修正
│
├── 中枢识别 → 中枢 (中枢)
│ │
│ ├── 连续三笔/段重叠构成
│ ├── 中枢延伸 (添加虚线)
│ ├── 中枢扩展 (≥9段时生成扩展中枢)
│ ├── 第三类买卖点检测
│ └── 多级中枢: 笔中枢 / 线段中枢 / 扩展线段中枢
│
└── 买卖点识别 → 买卖点 (买卖点)
│
├── 6 类买卖点: T1 / T1P / T2 / T2S / T3A / T3B
├── 指标匹配: MACD / KDJ / RSI
├── 背驰确认
└── 中枢来源: 实 / 虚 / 合
流式增量处理:观察者.__处理数据 每收到一根新K线就逐层触发所有后续分析,而非批量重算。这使得该库适合实时交易系统。
核心类型
枚举类型
| 类型 | 变体 | 说明 |
|---|---|---|
相对方向 |
向上 / 向下 / 向上缺口 / 向下缺口 / 衔接向上 / 衔接向下 / 顺 / 逆 / 同 | 两个价格区间的相对位置关系 |
分型结构 |
上 / 下 / 顶 / 底 / 散 | 三根K线构成的形态 |
买卖点类型 |
一买/一卖/二买/二卖/三买/三卖 + T1~T3B | 18 种买卖点分类 |
数据结构
| 类型 | 关键字段 | 所有权模型 |
|---|---|---|
K线 |
标识, 序号, 周期, 时间戳, 高, 低, 开盘价, 收盘价, 成交量, macd?, rsi?, kdj? | 值类型 (Clone) |
缠论K线 |
序号, 时间戳, 高, 低, 方向, 分型?, 分型特征值, 原始起始序号, 原始结束序号, 标的K线 | Rc 引用 |
分型 |
左?, 中, 右?, 结构, 时间戳, 分型特征值 | Rc 引用 |
虚线 |
标识, 序号, 级别, 文, 武, 有效性, 基础序列, 特征序列, 实/虚/合_中枢序列, 确认K线, 模式, 前一缺口 | Rc 引用 |
线段特征 |
标识, 线段方向, (list子类) | Rc 引用 |
特征分型 |
左, 中, 右, 结构 | Rc 引用 |
中枢 |
序号, 标识, 级别, 基础序列, 第三买卖线?, 本级_第三买卖线? | Rc 引用 |
基础买卖点 |
类型, 买卖点K线, 买卖点分型, 备注, 偏移, 失效偏移, 有效性, 破位值 | 值类型 |
买卖点 |
(继承基础买卖点) | 值类型 |
缺口 |
高, 低 | 值类型 |
服务类型
| 类型 | 职责 |
|---|---|
观察者 |
单周期分析器,接收K线流,维护所有层级序列 |
K线合成器 |
将小周期K线合成为大周期K线 |
立体分析器 |
多周期联立分析,内含合成器+每周期一个观察者 |
静态算法类
这些类型只包含 #[staticmethod] / classmethod,不创建实例:
| 类型 | 职责 |
|---|---|
笔 |
笔划分算法:分型→笔 (递归分析) |
线段 |
线段划分算法:笔→线段 (特征序列+缺口处理) |
中枢 |
中枢识别/管理:虚线→中枢 (重叠检测+扩展) |
背驰分析 |
背驰检测:MACD/斜率/测度三种方式 |
指标 |
K线取值工具:按计算方式取价格 |
配置体系
缠论配置 是一个 serde 驱动的结构体,62 个字段全部带默认值,支持 JSON 往返。
配置分组
let config = 缠论配置 {
// ---- 缠K ----
缠K合并替换: false, // false: 在原地合并, true: 产出新缠K
// ---- 笔 ----
笔内元素数量: 5, // 成笔最低K线数
笔弱化: false, // 放宽成笔条件(弱化后最低3根)
笔次级成笔: false, // 允许次高/次低成笔
笔内相同终点取舍: false, // false: 取first, true: 取last
// ---- 线段 ----
线段_特征序列忽视老阴老阳: false, // 缺口时不严格处理包含
线段_缺口后紧急修正: true, // 缺口后自动修正
线段_修正: false, // 短路修正(不推荐)
// ---- 分析开关 ----
分析笔: true,
分析线段: true,
分析扩展线段: true,
分析笔中枢: true,
分析线段中枢: true,
// ---- 指标参数 ----
平滑异同移动平均线_快线周期: 13, // MACD 快线 EMA 周期
平滑异同移动平均线_慢线周期: 31, // MACD 慢线 EMA 周期
平滑异同移动平均线_信号周期: 11, // MACD 信号线 EMA 周期
相对强弱指数_周期: 13,
相对强弱指数_超买阈值: 75.0,
相对强弱指数_超卖阈值: 25.0,
随机指标_RSV周期: 13,
随机指标_K值平滑周期: 5,
随机指标_D值平滑周期: 5,
随机指标_超买阈值: 80.0,
随机指标_超卖阈值: 20.0,
// ---- 买卖点 ----
买卖点偏移: 1, // 最大偏移量
买卖点_指标模式: "配置", // 配置 / 任意 / 全量 / 相对
买卖点_计算方式: "峰", // 峰 / 面
买卖点_背离率: f64::INFINITY,
买卖点_中枢来源: "合", // 实 / 虚 / 合
// ---- 背驰 ----
线段内部背驰_MACD: true,
线段内部背驰_斜率: true,
线段内部背驰_测度: true,
线段内部背驰_模式: "相对", // 全量 / 任意 / 配置 / 相对
// ---- 图表推送 ----
图表展示: true,
推送K线: true,
推送笔: true,
推送线段: true,
推送中枢: true,
// ... 还有 20+ 个图表细分开关
..Default::default()
};
配置方法
// JSON 往返
let json = config.to_json();
let config2 = 缠论配置::from_json(&json)?;
// 文件持久化
config.保存配置("/path/to/config.json")?;
let loaded = 缠论配置::加载配置("/path/to/config.json")?;
// 静默模式(关闭所有推送)
let silent = config.不推送();
// 差异对比
let diffs = config_a.对比(&config_b);
// → ["笔内元素数量", "买卖点偏移", ...]
算法模块
笔划分 (algorithm::bi)
核心递归算法 笔.分析,每次收到新分型时:
- 检查顶/底分型交替
- 验证笔内K线数量 ≥ 配置阈值
- 确定实际高/低点(考虑笔弱化、次高点/次低点)
- 检查笔内起始分型包含整笔条件
- 支持笔弱化策略:当严格条件不满足时,尝试放宽到3根
线段划分 (algorithm::segment)
最复杂的递归算法,核心方法 线段.分析:
- 特征序列提取:从笔序列中提取同向特征序列(
线段特征.静态分析) - 缺口处理:
- 有缺口(老阴/老阳):严格包含处理,等待特征分型完成
- 无缺口(小阳/少阴):允许逆序包含
- 四种修正机制(依次尝试):
_缺口突破:老阳/老阴时价格突破前线段极值_非缺口下穿刺:贯穿伤后出现方向相同的3笔_缺口后紧急修正:前一线段有缺口时自动修正_修正:配置启用的短路修正(≥9笔)
- 线段破坏判定:新线段形成后,前一线段被破坏
中枢识别 (algorithm::hub)
核心递归算法 中枢.分析:
- 基础检查:三条连续虚线,重叠且方向关系正确
- 中枢延伸:在后继虚线中找离开中枢的虚线,未离开则加入基础序列
- 第三买卖点:虚线离开中枢(向上缺口/向下缺口),记录第三买卖线
- 中枢完成:第三买卖线确立后,在中枢之上的虚线开始新中枢
- 中枢扩展:≥9段时调用线段扩展分析生成扩展中枢
- 多级中枢:笔中枢、线段中枢、扩展线段中枢、线段线段中枢等
背驰检测 (algorithm::divergence)
三种检测方式,可自由组合:
| 方式 | 原理 | 方法 |
|---|---|---|
| MACD背驰 | 进入段vs离开段的MACD柱面积对比 | MACD背驰 |
| 斜率背驰 | 价格变化速率减弱 | 斜率背驰 |
| 测度背驰 | 价格-时间向量长度缩减 | 测度背驰 |
组合模式:
- 全量:三种全满足
- 任意:任一种满足
- 配置:根据配置开关组合
- 相对:至少两种满足
技术指标
三个指标均位于 indicators/ 模块,支持增量计算(适合流式数据)。
MACD (indicators::macd)
pub struct 平滑异同移动平均线 {
// 输入
pub 时间戳: i64, pub 收盘价: f64,
pub 快线周期: i64, pub 慢线周期: i64, pub 信号周期: i64,
// 输出
pub DIF: Option<f64>, // 快线EMA - 慢线EMA
pub DEA: Option<f64>, // DIF的信号线EMA
pub MACD柱: Option<f64>, // DIF - DEA
// 计算中间值 (增量用)
pub 快线EMA: Option<f64>,
pub 慢线EMA: Option<f64>,
pub DEA_EMA: Option<f64>,
}
RSI (indicators::rsi)
pub struct 相对强弱指数 {
pub 时间戳: i64, pub 收盘价: f64,
pub 周期: i64,
pub 超买阈值: f64, pub 超卖阈值: f64,
pub RSI: Option<f64>,
pub RSI_SMA: Option<f64>, // RSI的SMA信号线
// Wilder平滑中间值
pub 平均上涨: Option<f64>,
pub 平均下跌: Option<f64>,
}
KDJ (indicators::kdj)
pub struct 随机指标 {
pub 时间戳: i64, pub 最高价: f64, pub 最低价: f64, pub 收盘价: f64,
pub RSV周期: i64, pub K值平滑周期: i64, pub D值平滑周期: i64,
pub 超买阈值: f64, pub 超卖阈值: f64,
pub K: Option<f64>, // RSV的移动平均
pub D: Option<f64>, // K的移动平均
pub J: Option<f64>, // 3*K - 2*D
}
所有三个指标都提供 首次计算 → 增量计算 的流式计算接口,以及对应的 _K线 便捷版本。
Python 绑定
Python 调用通过独立的 chanlun-py crate 提供,使用 PyO3 包装:
cd chanlun-py
cargo build --release
cp target/release/libchanlun.so ~/.local/lib/python3.14/site-packages/chanlun/_chanlun.cpython-314-x86_64-linux-gnu.so
import chanlun
# 创建配置
config = chanlun.缠论配置()
config.笔内元素数量 = 7
# 创建观察者
obs = chanlun.观察者("BTCUSD", 3600, config)
# 投喂K线
k = chanlun.K线.创建普K("bar", 1736640000, 50000, 51000, 49000, 50500, 100, 0, 3600)
obs.增加原始K线(k)
# 获取分析结果
print(f"笔数量: {len(obs.笔序列)}")
print(f"中枢数量: {len(obs.中枢序列)}")
所有类型、方法、字段名与 chan.py 完全一致,API 兼容。
数据序列化
K线二进制格式
K 线以大端字节序 struct.pack(">6d") 格式序列化,每根 48 字节:
| 偏移 | 大小 | 字段 |
|---|---|---|
| 0 | 8 | 时间戳 (Unix秒 as f64) |
| 8 | 8 | 开盘价 |
| 16 | 8 | 最高价 |
| 24 | 8 | 最低价 |
| 32 | 8 | 收盘价 |
| 40 | 8 | 成交量 |
// 序列化
let bytes = k线.to_bytes(); // Vec<u8>, 48 bytes
// 反序列化
let k线 = K线::读取大端字节数组(&bytes, 3600, "bar");
配置 JSON
{
"标识": "BTCUSD",
"笔内元素数量": 5,
"平滑异同移动平均线_快线周期": 13,
"平滑异同移动平均线_慢线周期": 31
}
使用 #[serde(default)] 实现前向/后向兼容,缺失字段自动使用默认值。
许可
MIT License. 详见 LICENSE.
相关项目
chan.py— Python 参考实现(~4200 行)chanlun-py— PyO3 绑定,将本 crate 导出为 Python 模块main.py— Python 图表程序入口