当 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 集成

工程仓库:
联系信息:

Back to Blog

相关文章

阅读更多 »

在 Rust 中嵌入 JVM

Java ↔ Rust 互操作使用 jni Crate 作者:Ivan Yurchenko https://media2.dev.to/dynamic/image/width=50,height=50,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fd...