CZSC / Rust 内核与迁移

czsc 的 Rust 内核:为什么要重写,以及 0.9 怎么升上来

1.0 的变化不在接口,而在实现:分型、笔、中枢这些核心算法从 Python 搬到了 Rust,Python 侧退化成透传层。这对使用者意味着两件事 —— 装上就能跑(官方发预编译轮子),但要改实现就必须懂 Rust。这一页把九个 crate 的分工、构建配置与迁移清单摊开讲。

核心:czsc-coreRust edition:2024构建:maturin + abi3迁移:0.9 与 1.0 不兼容
czsc-core缠论核心
czsc-signals信号函数
czsc-trader联立与持仓
czsc-pythonPyO3 入口
Rust workspace 主要 crate 分工示意(依据官方 README 架构概览、开发文档与 2026-09-16 实测目录,共 9 个 crate);示意非官方架构图,完整清单见正文表格。
Crates

九个 crate,各管一层

官方 README 列出九个 crate 的名称,开发文档补充了各自职责。下表按职责维度整理,并标明谁是唯一的绑定入口。

crate职责关键内容适用场景注意点
czsc-core缠论核心CZSC、FX、BI、ZS、RawBar、NewBar 与算法函数纯 Rust 用户的核心依赖1.0.1 起成笔阈值不再硬编码
czsc-signals信号函数实测 23 个 .rs 源文件(官方文档写 22)需要信号库时数量口径差异见信号函数页
czsc-trader交易器与联立CzscSignals、CzscTrader、Position、Event、策略门面、优化器多级别决策优化器在清理中迁到了工具模块
czsc-utils工具层K 线合成、重采样、交易时间、单调性、周期数据数据编排重采样与合成器共用聚合逻辑
czsc-ta技术指标算子供信号函数内部使用信号内部计算Python 顶层只保留五个算子别名
czsc-signal-macros过程宏信号注册宏新增信号函数时编译期注册,运行时靠注册表查
czsc-derive派生宏类型派生辅助扩展类型时属内部支撑 crate
czscRust 侧门面把上述能力聚合起来供 Rust 用户直接使用不用 Python 的 Rust 用户官方强调 Rust 用户与 Python 用户行为一致
czsc-pythonPyO3 绑定入口九个 crate 中唯一启用扩展模块特性的生成 Python 扩展时构建脚本会在 Python 版本过低时提前失败
Build & ABI

构建配置与 ABI 选择

这套混合架构的打包方式决定了「为什么一条 cp310-abi3 轮子能覆盖多个 Python 版本」。下表字段来自官方的包配置与 Rust 工作区配置。

配置项取值作用注意点
构建后端maturin(要求 1.7 及以上、2.0 以下)把 Rust 扩展与 Python 源码一起打成轮子源码构建前需要先装 maturin
扩展模块名czsc._nativePython 侧导入入口信号与核心类型都挂在这个模块下
ABI 策略abi3-py310 + 扩展模块特性用稳定 ABI 发布,启动时动态加载因此只需一条 cp310-abi3 轮子即可被 3.10 及以上复用
Rust edition2024语言版本需要较新的工具链
PyO3 版本0.28Rust 与 Python 的绑定层工作区统一声明,由绑定 crate 叠加扩展模块特性
发布优化链接时优化开启、优化级别 3、代码生成单元 1换取运行时性能代价是编译时间明显变长
版本来源Cargo.toml 工作区版本作为唯一版本源maturin 在动态版本模式下自动注入轮子元数据避免 Python 与 Rust 两侧版本号漂移
内部依赖锁定工作区内部 crate 用路径加精确版本双声明发布时锁定同一版本早期曾出现预发布版本被解析成更高稳定版的问题
Dependency trap

一个被写进注释的依赖死锁

官方在依赖声明处留了一段注释,说明某个常用库为什么被刻意停在旧版本。这类信息通常只存在于源码里,值得单独看。

内容影响现状
被限制的依赖数据处理库被暂停在 0.52.0 版本不能用该库更新的版本官方注释说明等待上游放宽后再生级
冲突链条该库新版本的子依赖给时间库加了上限约束,而存根生成工具要求时间库更高版本,两者不可同时满足强行升级会导致依赖解析失败因此选择停在旧版本
对使用者的影响几乎无感 —— 官方发的是预编译轮子只有从源码构建时才会遇到不要自行改动这条版本约束
同类风险Rust 生态里时间库、序列化库的版本约束经常互相打架源码构建失败常见于此遇到解析失败先看工作区注释,再动版本
Constitution

开发宪法:Rust 与 Python 必须行为一致

官方把一条规则写成了项目宪法第一条,并声明任何改动都不得违反。它直接决定了你能在哪里改代码。

条款要求对使用者的含义
行为一致需要 Rust 实现的部分,必须同时满足 Rust crate 与 Python 轮子行为一致:同样输入产生同样输出,默认参数、错误处理、边界条件、字段命名都一致不管你用 Rust 还是 Python,同一功能的结论相同
Python 只做两类事一是纯透传,二是不可避免的绑定边界处理(例如表格数据与内存格式互转、路径类型转换)Python 侧不会有额外逻辑,读源码时不必找隐藏分支
禁止适配层禁止在 Python 侧做参数归一化、默认值补齐、返回字段重命名、错误码翻译、类型多态分支想改行为只能改 Rust,或换参数
无 Python 回退官方明确核心分析统一由 Rust 实现,不存在 Python 回退路径不存在「装不上就退回纯 Python」这条路
一致性落地实例策略门面的部分方法已整体下沉到 Rust,Python 侧只剩一行透传;文件完整性校验改用规范化 JSON 的哈希,两端可逐字节一致复现这类校验结果在两种语言下可交叉验证
Review redlines

五类官方点名的违规信号

官方在同一节里列了「在代码审查中视为红线」的具体信号,并说明存在源码级测试防止适配层回流。之所以值得看,是因为它们也解释了为什么 Python 侧这么薄。

违规信号为什么算违规正确做法
Python 函数体里出现按输入类型分支的多态判断典型适配层写法,两端行为会分叉把分支逻辑下沉到 Rust,Python 只透传
返回字段顺序或命名与 Rust 侧不一致同一功能的输出形态不同,跨语言结果不可比由 Rust 定义输出结构,Python 原样暴露
Python 测试覆盖完整但 Rust 没有等价用例一致性没有被真正验证两端都要有对应测试
变更记录只写了 Python 端默认参数变化而 Rust 无对应改动说明改了适配层而不是实现实现层同步修改
适配层文件持续膨胀与「逐步搬空到 Rust」的方向相反新增逻辑默认进 Rust
防回流机制:官方说明存在源码级测试对适配层回流做拦截,例如检查策略模块不再使用某些 Python 序列化接口。也就是说这条宪法不是口号,而是有自动化检查兜底的。
Migration

0.9.X 升到 1.0.X:清单式迁移

官方 README 的第一条提醒就是两者不兼容。下表把散落在变更记录与文档里的迁移点集中起来,便于逐项核对。

迁移项0.9.X1.0.X处理方式
核心算法实现Python 实现Rust 实现,经扩展模块暴露想了解旧逻辑可查看 0.9.X 分支
信号导入路径czsc.signals 命名空间该命名空间层已删除改用扩展模块下的信号路径,或经封装接口调用
带时区时间静默转成 UTC(会导致周期桶错位)直接拒绝入参前去掉时区信息
缺失行情值成交量相加会沿桶传染显式返回错误先清洗数据或捕获异常
交易器更新遇错静默继续硬错抛 ValueError补异常处理
成笔阈值环境变量名义存在但无效真正生效,构造参数与环境变量均可控重新核对参数,结果可能与之前不同
优化器位置位于交易器模块迁至工具模块改导入路径
顶层 TA 别名可能直接调用多个算子仅保留五个别名,其余仅供信号内部使用改用保留别名或自行实现
FAQ

常见问题

架构与迁移相关的表述以官方 README、开发文档与变更记录为准。

必须装 Rust 才能用吗?

不是。官方在 PyPI 上发布预编译轮子,用普通安装命令即可,前提是 Python 版本达到 3.10 及以上。只有当你需要从源码构建(例如要改核心实现)时,才需要 Rust 工具链与 maturin。

为什么一个轮子能覆盖多个 Python 版本?

因为发布时使用了稳定 ABI 策略:扩展模块以 cp310 为基准声明稳定 ABI 并在 Python 启动时动态加载,因此同一条轮子可被 3.10 及以上版本复用。这也解释了官方包分类里为什么列出 3.10 到 3.13 四个版本。

我能在 Python 侧包装一层改行为吗?

官方明确不鼓励,并把这类做法写成了开发宪法的违规信号:Python 侧只允许纯透传与不可避免的绑定边界处理,禁止参数归一化、默认值补齐、字段重命名、错误码翻译与多态分支。而且存在源码级测试拦截这类回流。

从 0.9 升级,最小的改动是什么?

如果只是调用而不改实现,主要改三处:信号导入路径改为扩展模块下的路径;入参去掉时区信息;交易器与信号分析器的更新调用加上异常处理。若此前用环境变量调过成笔长度,升级后需要重新核对参数,因为该变量在 1.0.1 才真正生效。

为什么依赖被停在旧版本?

官方在依赖声明处写明:某个数据处理库的子依赖给时间库加了上限约束,而存根生成工具要求时间库更高版本,两者不可同时满足,因此选择暂停在旧版本等待上游放宽。使用预编译轮子的用户几乎无感,只有源码构建时会遇到。

Rust 内核这块 EasyClaw 有关系吗?

没有。EasyClaw 不提供这套 Rust 扩展的安装或运行环境,两者也没有已证实的集成关系。如果你不想接触构建工具链,可以先走 EasyClaw 技能路线完成指标与图表类研究,但缠论结构识别仍需自建。

决定要用,就先把环境准备好

三条官方安装路径的前置条件差别很大,其中源码构建还涉及 Rust 工具链与解释器版本匹配。下一页逐条说明。