📌 项目地址:nautechsystems/nautilus_trader | ⭐ 23,719 颗星 | 🔧 Rust | 📜 未标注
这个项目到底是干什么的?
NautilusTrader 是一个多资产、多交易所的生产级交易引擎。它的特别之处在于把两个东西组合在一起:
- 核心引擎用 Rust 编写,负责所有时间敏感的任务——订单管理、市场数据接收、状态机、事件处理。Rust 的零开销抽象和内存安全让你不用担心 GC 抖动或数据竞争。
- 策略逻辑和系统编排用 Python 控制,Python 只负责“该做什么”,不负责“怎么做”。Rust 层输出确定性的事件流,Python 层订阅事件并下发指令。
这种做法让同一个代码库既能做回测(用确定性时间模型模拟历史数据),又能直接跑实盘(对接真实交易所的 WebSocket/REST),而且回测和实盘用的策略代码完全相同。不需要“回测用 A 库,实盘用 B 库”来回翻译,也不会有因为接口差异导致的逻辑泄漏。
目前支持 Linux、macOS、Windows(x86_64 和 ARM64),Python 3.12-3.14,Rust 1.96.0。内部已经集成了 Binance、Bybit、Coinbase、FTX(已关停但代码保留)等几十家交易所的适配器,同时也支持传统金融市场的 FIX 协议集成。
为什么需要这种架构?
做量化交易的人最怕两件事:延迟不可控和回测与实盘不一致。
- 延迟不可控:Python 的 GIL 和 GC 在毫秒级竞争中就是灾难。很多量化基金的做法是把核心逻辑用 C++/Rust 重写,Python 只当壳。NautilusTrader 把这个模式开源了,而且做得更彻底——整个事件循环、数据总线、状态机都是 Rust 写的,Python 只是一个“策略宿主”。
- 回测与实盘不一致:大部分回测框架为了方便,把“时间”抽象成了“第几根 K 线”,交易执行也是“收盘价成交”。实盘时面对 tick 级别的撮合顺序、部分成交、撤单延迟,回测出来的夏普率完全没有参考价值。NautilusTrader 在回测模式下也使用相同的 tick 驱动事件引擎,模拟真实撮合逻辑(包括订单簿快照重建),产生的订单簿状态和实盘一致,策略只要能过回测,实盘就不会因为执行语义不同而出错。
十分钟上手:安装与第一个策略
安装(来自 README):
pip install nautilus_trader[dev]
如果希望安装带全部特性(包括 Redis、Parquet 存储等):
pip install nautilus_trader[dev] --index-url https://packages.nautechsystems.io/simple/
第一个策略(来自官方 quickstart):
from nautilus_trader import TradingStrategy, OrderType, TimeInForce
from nautilus_trader.model.instruments import Instrument
from nautilus_trader.model.orders import MarketOrder
class MyStrategy(TradingStrategy):
def on_start(self):
instrument = self.cache.instrument(self.symbol)
if instrument is None:
return
order = MarketOrder(
instrument_id=instrument.id,
order_side=OrderSide.BUY,
quantity=instrument.min_trade_size,
time_in_force=TimeInForce.GTC,
)
self.submit_order(order)
你只需要继承 TradingStrategy,实现三个方法:on_start(策略启动时调用),on_tick(当有 tick 数据时调用),on_order_filled(订单成交时调用)。然后把它丢给 TradingNode 运行。
回测:
from nautilus_trader import TradingNode, load_catalog
node = TradingNode()
catalog = load_catalog("catalog")
data = catalog.parquet_data("BINANCE", "BTCUSDT", "2024-01")
node.add_strategy(MyStrategy(symbol="BTCUSDT"))
node.run(data=data)
实盘只需要把 data 参数换成 venue 配置:
node.add_venue(
venue="BINANCE",
api_key="xxx",
api_secret="yyy",
)
node.run() # 自动连接交易所 WebSocket
策略代码不用改一行。
和同类工具的差异
| 特性 | NautilusTrader | Backtrader / Zipline | Hummingbot |
|---|---|---|---|
| 核心语言 | Rust + Python | 纯 Python | Cython + Python |
| 执行语义 | 事件驱动,tick 级确定性模拟 | K 线驱动,Bar 级模拟 | 实盘用 Cython,回测用简化模型 |
| 回测与实盘一致性 | 代码完全复用,内部事件流一致 | 回测用不同数据模型,实盘需重写 | 基本一致,但回测定价模型与实盘有差距 |
| 延迟控制 | Rust 保证亚微秒级 | Python 受 GIL 限制 | 依赖 Cython,但整体仍在毫秒级 |
| 资产类覆盖 | 多资产,不分 CEX/DEX/传统金融 | 主要股票/期货 | 主要加密货币 DEX/CEX |
| 易用性 | 中(需理解 Rust 事件模型,但 Python 端简单) | 低(文档多,但历史包袱重) | 中(配置型为主) |
最关键的区别在于:NautilusTrader 把“确定性”刻进了架构。传统 Python 回测框架依赖 pandas 的时间索引来推进,而 NautilusTrader 内部是离散事件模拟(DES),每个 tick 的时间戳和订单簿状态都是精确的,不存在“用日线回测但实盘看分钟线”这种错位。
潜在门槛与注意事项
- 学习曲线:虽然 Python 端很简单,但如果你想定制适配器(对接新交易所)、修改事件总线、或优化性能,必须会 Rust。官方文档比较全面但偏命令式,缺少教程式的渐进引导。
- 生态系统年轻:相对于 Zipline 的二十年积累,NautilusTrader 的社区(Discord 活跃,但 GitHub Issue 回复不稳定)和第三方扩展还比较小。好在源代码规范且测试覆盖率高(从 badge 看)。
- 实盘风险:生产级不代表无 bug。作者团队(Nautech Systems)是一家商业公司,开源版是最稳定的 master 分支,nightly 和 develop 包含新特性但可能有未发现的 bug。正式实盘前必须充分测试。
- 许可证:项目使用 LGPL-3.0(较宽松的 copyleft),如果只通过 Python 调用,不受影响;但如果修改 Rust 核心并分发,需要开源你的修改。
总结
如果你正在做一个需要毫秒/微秒级延迟、资产种类多、并且希望回测和实盘用同一套代码的交易系统,NautilusTrader 是目前开源社区里最接近生产标准的选项。它不像 Backtrader 那样“玩具化”,也不像 Hummingbot 那样只聚焦做市套利——它是一个真正意义上的多资产交易 OS,把 Rust 的硬实力和 Python 的软灵活缝合在了一起。
下一步就是去官网读文档、跑一遍 quickstart 的完整示例,然后决定是否值得迁移你的策略。