今天在 GitHub Trending 上看到一个有意思的项目:NautilusTrader,它是一款完全由 Rust 编写的开源生产级多资产交易引擎,支持从研究回测到实盘执行的全流程,Python 仅作为策略控制平面,而核心计算全部由 Rust 完成。

一、项目概述

NautilusTrader 由 Nautech Systems 开发维护,定位是生产级别的多资产、多交易所交易系统,覆盖加密货币交易所(CEX 和 DEX)、传统金融市场(外汇、股票、期货、期权)以及预测市场。

核心目标:消除研究与生产之间的鸿沟。 传统的量化研究通常在 Python 中用向量化方式做回测,而生产系统则用事件驱动架构在编译型语言中单独实现,两套系统之间存在巨大的语义鸿沟。NautilusTrader 通过统一的 Rust 原生事件驱动运行时,让同一套策略代码在回测和实盘中表现完全一致,无需任何代码修改。

关键特性一览

特性说明
Rust 原生核心高性能、高安全性,由 Rust 编译器提供类型安全和线程安全保证
Python 控制平面策略逻辑、配置和编排用 Python,通过 PyO3 绑定调用 Rust
全链路一致性回测 → 模拟 → 实盘,零代码改动
多交易所支持15+ 交易所适配器,包括 Binance、Bybit、OKX、Hyperliquid、dYdX、Coinbase、Kraken、Deribit、Polymarket、Betfair、Interactive Brokers 等
高精模式128 位整数,最多支持 16 位小数精度
AI 训练支持引擎速度足够快,支持强化学习(RL)和进化策略(ES)训练
纳秒级回测支持历史行情Tick、成交Tick、K线、订单簿数据的纳秒级回放

安全承诺

NautilusTrader 是少数做出 Soundness Pledge(健全性承诺)的 Rust 项目,承诺尽力避免任何健全性缺陷,并欢迎社区协助分析修复。此外,项目在供应链安全方面非常严谨:

  • 所有发布产物携带 SLSA Build Provenance 构建溯源
  • Docker 镜像由 Sigstore 无密钥签名,附带 SPDX SBOM 证明
  • 依赖使用 cargo-vet 审计供应链来源
  • 所有 Python 工件仅从预编译 wheel 安装,不从源码构建(除非用户主动选择)

二、技术原理

架构设计

NautilusTrader 的核心设计哲学是事件驱动的确定性运行时:

┌─────────────────────────────────────────────────────────┐
│              Python 控制平面 (PyO3 绑定)                  │
│  - 策略逻辑 (Strategy)                                   │
│  - 配置 (Config)                                        │
│  - 编排 (Orchestration)                                 │
└───────────────────────┬─────────────────────────────────┘
                        │  PyO3 bindings
┌───────────────────────▼─────────────────────────────────┐
│              Rust 执行核心 (v2 Runtime)                  │
│  - 事件驱动引擎 (Actor Model)                           │
│  - 确定性时间模型 (Deterministic Time)                  │
│  - 订单管理 / 账户 / 风控                               │
│  - 数据处理 (Arrow / Parquet)                          │
└───────────────────────┬─────────────────────────────────┘
                        │
┌───────────────────────▼─────────────────────────────────┐
│              适配器层 (Adapters)                         │
│  - REST API 适配器                                       │
│  - WebSocket 实时数据适配器                              │
│  - 交易所特定协议                                        │
└─────────────────────────────────────────────────────────┘

关键设计原则:

  • 统一语义:回测引擎(BacktestEngine)和实盘执行引擎(LiveExecutionClient)实现相同的接口,策略在两者间透明切换
  • Actor 模型:Rust 核心采用 Actor 风格的消息传递,避免数据竞争
  • Arrow 数据格式:内部数据处理使用 Apache Arrow 和 Parquet,支持超大数据集的高效列式存储和分析

核心技术栈

  • Rust:核心运行时(1.97.1+ MSRV,与最新稳定版保持一致)
  • Python:3.12-3.14,通过 PyO3 提供 Python 绑定
  • Tokio:异步网络层,基于 tokio 运行时
  • PyO3:Python <-> Rust 双向绑定
  • DataFusion:高性能 SQL 查询引擎(处理历史数据)
  • Redis(可选):缓存和消息总线后端
  • aws-lc-rs:运行时密码学(TLS 及签名)

高精度模式

NautilusTrader 支持两种精度模式处理核心数值类型(Price、Quantity、Money):

# 标准精度(默认):64 位整数,最多 9 位小数
# 高精度(可选):128 位整数,最多 16 位小数
[dependencies]
nautilus_model = { version = "*", features = ["high-precision"] }

在金融交易场景中,高精度模式对于需要精确价格计算的量化策略至关重要。

事件驱动回测引擎

回测引擎支持多种数据类型的高精度回放:

from nautilus_trader.backtest.engine import BacktestEngine
from nautilus_trader.model.identifiers import InstrumentId

# 纳秒级时间精度
engine = BacktestEngine()

# 添加历史 K 线数据
engine.add_data(...)
engine.add_strategy(MyStrategy())

# 运行回测
results = engine.run()

三、安装与快速开始

环境要求

  • Python:3.12 - 3.14(推荐使用 uv 包管理器)
  • Rust:1.97.1+(仅从源码构建时需要)
  • glibc:Linux 下需要 2.35+(可用 ldd --version 检查)
  • 操作系统:Linux (x86_64/ARM64)、macOS ARM64、Windows x86_64

NautilusTrader 官方推荐使用 uv 包管理器,不官方支持 Conda 等其他 Python 发行版。

最简安装(PyPI wheel)

# 安装最新稳定版
pip install -U nautilus_trader

# 安装可视化组件(K线图、 tearsheet)
pip install -U "nautilus_trader[visualization]"

# 体验 v2 预发布版
pip install -U nautilus_trader --pre

从源码构建

# 安装 Rust 工具链
curl https://sh.rustup.rs -sSf | sh

# 安装 uv 包管理器
curl -LsSf https://astral.sh/uv/install.sh | sh

# 克隆源码(develop 分支含最新功能)
git clone --branch develop --depth 1 \
    https://github.com/nautechsystems/nautilus_trader
cd nautilus_trader

# 同步依赖
make sync

# 构建并安装
make build

验证安装

import nautilus_trader

print(nautilus_trader.__version__)
# 0.62.0

四、使用方法与实战

策略编写示例(Python)

NautilusTrader 支持全 Python 编写策略,也支持全 Rust 实现。以下是经典的 EMA 交叉策略示例:

from nautilus_trader.model.enums import OrderSide
from nautilus_trader.model.orders import LimitOrder
from nautilus_trader.config import StrategyConfig
from nautilus_trader.trading.strategy import Strategy

class EMACrossConfig(StrategyConfig, frozen=True):
    instrument_id: str = "BTCUSDT.BINANCE"
    fast_ema_period: int = 10
    slow_ema_period: int = 20
    trade_size: float = 0.1

class EMACrossStrategy(Strategy):
    def __init__(self, config: EMACrossConfig):
        super().__init__(config)
        self.fast_ema = None
        self.slow_ema = None

    def on_start(self):
        self.fast_ema = self.register_indicator(
            "fast_ema",
            ExponentialMovingAverage(self.config.fast_ema_period)
        )
        self.slow_ema = self.register_indicator(
            "slow_ema",
            ExponentialMovingAverage(self.config.slow_ema_period)
        )

    def on_indicator(self, indicator):
        if indicator.name == "fast_ema":
            if self.fast_ema.value > self.slow_ema.value:
                self.submit_order(
                    LimitOrder(
                        self.trader_id=self.trader_id,
                        strategy_id=self.strategy_id,
                        instrument_id=self.instrument_id,
                        order_side=OrderSide.BUY,
                        quantity=self.trade_size,
                        price=self.market_book.best_bid_price,
                    )
                )

加载历史数据回测

from nautilus_trader.backtest.engine import BacktestEngine
from nautilus_trader.model.currencies import USDT

engine = BacktestEngine()

# 加载 CSV 历史数据
engine.add_csv_data(
    "BTCUSDT.BINANCE",
    "/path/to/btcusdt_1min.csv"
)

engine.add_strategy(EMACrossStrategy(config=EMACrossConfig()))
engine.run()

多交易所跨市场策略

NautilusTrader 的多交易所适配器允许同时运行跨市场策略:

# 同时订阅 Binance 和 Hyperliquid 的数据
engine.add_venue(Binance())
engine.add_venue(Hyperliquid())

# 跨交易所套利策略
class CrossExchangeStrategy(Strategy):
    def on_book(self, book):
        # 计算跨交易所价差
        binance_bid = self.get_bid("BTCUSDT.BINANCE")
        hyperliquid_ask = self.get_ask("BTC-PERP.HYPERLIQUID")

        spread = hyperliquid_ask - binance_bid
        if spread > self.config.threshold:
            self.execute_spread_trade(spread)

五、常见问题与解决方案

Q1: Linux 安装报错 glibc version

# 检查 glibc 版本
ldd --version

# 如低于 2.35,需要升级 Linux 发行版(Ubuntu 22.04+ 或等效版本)
# 或使用 Docker 方式运行
docker pull ghcr.io/nautechsystems/nautilus_trader:nightly
docker run -it ghcr.io/nautechsystems/nautilus_trader:nightly bash

Q2: macOS 安装后 ImportError

# 确保使用官方支持的 Python 版本(3.12-3.14)
python --version  # 必须是 3.12.x, 3.13.x 或 3.14.x

# 推荐使用 uv 创建独立环境
uv venv --python 3.12 nautilus-env
source nautilus-env/bin/activate
pip install nautilus_trader

Q3: 回测速度慢

  • 启用数据预处理:用 DataFusion 预筛选数据窗口,减少回放数据量
  • 使用增量回测:利用 Redis 缓存中间状态,避免全量重置
  • 确认精度模式:标准精度比高精度快约 20%,非必要场景无需开启高精模式

Q4: 策略在回测和实盘表现不一致

NautilusTrader 的确定性设计确保了两端语义一致,出现差异通常是因为:

  • 回测使用了未来数据(look-ahead bias)
  • 实盘中滑点和佣金设置与回测不一致
  • 网络延迟和订单排队机制差异

Q5: Docker 镜像拉取超时

# 使用代理或选择更近的镜像源
docker pull ghcr.io/nautechsystems/nautilus_trader:latest \
    --platform linux/amd64

六、总结

NautilusTrader 代表了量化交易基础设施的一个重要方向:用 Rust 保证性能和安全性,用 Python 保证策略开发效率,同时通过统一的事件驱动运行时彻底消除了研究与生产之间的语义鸿沟。对于有意构建自己量化交易系统的开发者来说,这绝对是一个值得关注和深入研究的项目——尤其是它对 SLSA 和 Sigstore 的重视,以及 Soundness Pledge 的承诺,体现了极高的工程成熟度。

项目目前处于活跃开发中(v2 正在过渡到稳定 API),文档完善、社区 Discord 活跃,感兴趣的朋友可以从官方文档(https://nautilustrader.io/docs/)开始上手体验。