当 Indicators 不是函数时:在 Rust 中定义 Quant Operators
发布: (2026年1月14日 GMT+8 11:54)
3 min read
原文: Dev.to
Source: Dev.to
问题来源
如今大多数技术指标都被建模为函数:它们接受一个数组并返回一个值或另一个数组。
当指标需要以下特性时,这种模型就会失效:
- 持久状态(滚动、EMA)
- 对时间顺序的敏感性
- 批处理和流式处理之间的一致语义
- 组合与调度
纯函数模型无法表达这些约束。在 Rust 中,这些限制会变得显而易见:
- 所有权强制状态责任必须明确
- 隐式全局变量是不可接受的
- 性能要求明确的执行边界
核心定义:Operator(运算符)
在本文档中,Operator 被定义为:
一个可调度的执行单元,在显式的执行语义下处理输入数据。
有意避免使用“函数”一词。
一个 Operator 必须:
- 拥有明确的输入/输出语义
- 作为语义执行单元被调用
- 明确拥有其状态边界
- 以结构化、可观察的方式失败
一个 Operator 绝不能:
- 对调度做出决定
- 管理系统资源
- 执行系统级恢复
作为语义单元的执行
Execution 被定义为:
在给定输入和执行上下文下,对一个 Operator 的不可分割调用。
关键属性:
- 执行是语义性的,而非语法性的
- Operator 可能被多次执行
- 执行之间的关系超出本文范围
失败不是 panic
Operator 的失败 不是 panic。它是一等的执行结果,可以向外传播。是否因失败而停止系统,由调用者负责。
最小参考实现 (v0.1)
下面的代码用于证明上述定义可以在 Rust 中实现。
pub trait Operator {
type Error;
fn execute(&mut self, input: Input) -> Result;
}
说明:
&mut self明确允许内部状态。- 尚未包含时间、批处理或调度语义。
- 实现故意保持最小化。
一个简单的无状态示例:
pub struct Sum;
impl Operator for Sum {
type Error = ();
fn execute(&mut self, input: &[f64]) -> Result {
Ok(input.iter().sum())
}
}
其目的在于概念展示,而非功能实现。
非目标
本文特意 不 定义以下内容:
- 状态模型
- 时间语义
- 批处理一致性
- DataFrame 或 Polars 集成
工程仓库:
联系信息: