第零階段:起步

模組 00:環境安裝與第一次運行從零開始,30 分鐘內跑出你的第一個回測結果

這個模組會帶你安裝所有需要的工具,然後用一個最簡單的策略跑出第一個回測。不用寫任何策略邏輯,先確保你的環境跑得通。

一、需要安裝什麼?

flowchart LR
                        subgraph os["💻 作業系統"]
                        direction TB
                        linux["Linux (推薦)"]
                        mac["macOS"]
                        wsl["Windows WSL2"]
                        end

                        subgraph tools["🔧 工具鏈"]
                        direction TB
                        python["Python 3.12-3.14"]
                        uv["uv 套件管理器"]
                        end

                        subgraph nautilus["🐚 NautilusTrader"]
                        direction TB
                        pip_install["pip install"]
                        source["或從源碼編譯"]
                        end

                        os --> tools
                        tools --> nautilus
圖 1:安裝的三層依賴關係
⚠️ Windows 用戶必讀

NautilusTrader v1.225.0 起已正式支援 Windows Server 2022+(x86_64),可直接透過 pip/uv 安裝預編譯的二進位輪子(標準精度模式,64-bit)。

若需要完整的高精度模式(128-bit)或從源碼編譯,仍建議使用 WSL2 (Windows Subsystem for Linux) 或 Linux/macOS 原生環境。

▶ 🪟 Windows (WSL2) 詳細安裝步驟
  1. 啟用 WSL

    以管理員身分打開 PowerShell,輸入:
    wsl --install
    然後重啟電腦。

  2. 安裝 Ubuntu

    重啟後,Ubuntu 安裝視窗通常會自動彈出。如果沒有,去 Microsoft Store 搜尋 “Ubuntu” 並安裝。
    裝好後打開它,設定你的使用者名稱和密碼。

  3. 安裝 VS Code 與插件

    在 Windows 下載並安裝 Visual Studio Code。
    打開 VS Code,去擴展區 (Extensions) 安裝 “WSL” 插件。

  4. 連接到 WSL

    在 Ubuntu 終端機裡輸入:
    code .
    這會打開 VS Code 並自動連接到你的 WSL 環境。左下角會顯示 WSL: Ubuntu。

  5. 開始安裝 NautilusTrader

    現在你可以在 VS Code 的終端機 (Terminal) 裡,像在 Linux 一樣執行下面的 pip install 命令了。

二、Step-by-Step 安裝

Step 1:確認 Python 版本

# 檢查 Python 版本(需要 3.12 或更高,最高支援 3.14)
python3 --version
# 輸出應為:Python 3.12.x 或 3.13.x

# 💡 為什麼需要 3.12+?
# NautilusTrader 官方支援 Python 3.12-3.14:
#   - PyO3 綁定需要 3.12+ 的穩定 ABI
#   - 更快的啟動速度(CPython 優化)
#   - 更好的錯誤訊息

# ❌ 如果用 Python 3.11 或更低版本:
#   pip install nautilus_trader
#   → ERROR: Requires-Python >=3.12

Step 2:安裝 NautilusTrader

# 方法一:用 pip(最簡單)
pip install -U nautilus_trader

# 方法二:用 uv(更快,推薦)
pip install uv
uv pip install nautilus_trader

# 💡 為什麼推薦 uv?
# uv 是 Rust 寫的 Python 套件管理器,速度比 pip 快 10-100 倍
# ❌ pip install nautilus_trader → 可能需要 2-5 分鐘
# ✅ uv pip install nautilus_trader → 通常 10-30 秒

Step 3:驗證安裝

# 在 Python 中驗證
import nautilus_trader
print(nautilus_trader.__version__)
# 應該輸出類似:1.208.0

# 驗證核心組件可用
from nautilus_trader.backtest.node import BacktestNode
from nautilus_trader.model.data import QuoteTick, Bar
from nautilus_trader.trading.strategy import Strategy
print("✅ 所有核心組件載入成功!")
🚨 常見安裝錯誤

如果遇到 ImportError: libpython3.12.so,你需要安裝 Python 開發檔案:

# Ubuntu/Debian
sudo apt install python3.12-dev

# 如果遇到 Rust 相關錯誤(從源碼編譯時)
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

三、第一個回測:Hello NautilusTrader

下面是一個最簡單的回測範例。它不做任何交易,只是證明你的環境能跑。

💡 為什麼要先跑一個「什麼都不做」的策略?

因為你需要先確認 數據載入 → 引擎初始化 → 策略運行 → 結果輸出 這整條管線是通的。
❌ 如果直接寫複雜策略:出錯時你不知道是策略邏輯有問題,還是環境配置有問題。
✅ 先跑空策略:如果失敗,100% 是環境問題。

"""
你的第一個 NautilusTrader 回測 — Hello World
把這段代碼存為 hello_nautilus.py,然後用 python hello_nautilus.py 運行
"""
from nautilus_trader.backtest.engine import BacktestEngine
from nautilus_trader.backtest.engine import BacktestEngineConfig
from nautilus_trader.model.currencies import USD
from nautilus_trader.model.data import QuoteTick
from nautilus_trader.model.enums import AccountType, OmsType
from nautilus_trader.model.identifiers import Venue
from nautilus_trader.model.objects import Money
from nautilus_trader.trading.strategy import Strategy
from nautilus_trader.config import StrategyConfig


# ── 1. 定義一個「什麼都不做」的策略 ──────────────────────────
class DoNothingConfig(StrategyConfig, frozen=True):
    """最簡單的策略配置:什麼參數都沒有"""
    pass


class DoNothingStrategy(Strategy):
    """
    這個策略什麼都不做。
    它的唯一目的是證明你的環境能正常運行。
    """
    def __init__(self, config: DoNothingConfig):
        super().__init__(config)

    def on_start(self):
        self.log.info("🚀 策略啟動了!環境正常!")

    def on_stop(self):
        self.log.info("🛑 策略停止了。恭喜,你的第一個回測成功了!")


# ── 2. 配置回測引擎 ─────────────────────────────────────────
config = BacktestEngineConfig(
    logging_level="INFO",        # 顯示日誌(方便看到發生了什麼)
    logging_level_file=None,     # 不寫日誌文件
)

engine = BacktestEngine(config=config)

# ── 3. 添加交易場所 ──────────────────────────────────────────
SIM = Venue("SIM")  # 「SIM」是一個模擬交易所
engine.add_venue(
    venue=SIM,
    oms_type=OmsType.NETTING,    # 淨額結算(後面會詳細講)
    account_type=AccountType.MARGIN,  # 保證金帳戶
    base_currency=USD,           # 帳戶基礎貨幣
    starting_balances=[Money(100_000, USD)],  # 初始資金 10 萬美元
)

# ── 4. 添加策略 ──────────────────────────────────────────────
strategy = DoNothingStrategy(config=DoNothingConfig())
engine.add_strategy(strategy)

# ── 5. 運行! ────────────────────────────────────────────────
engine.run()

# ── 6. 看結果 ────────────────────────────────────────────────
print("\n" + "="*60)
print("📊 回測結果")
print("="*60)
print(f"帳戶餘額: {engine.portfolio.balances()}")
print(f"總訂單數: {len(engine.cache.orders())}")
print(f"總成交數: {len(engine.cache.positions())}")
print("=" * 60)
print("✅ 恭喜!你的 NautilusTrader 環境正常運作!")

# 清理
engine.dispose()
✅ 預期輸出

如果一切正常,你會看到類似以下的輸出:

INFO  DoNothingStrategy: 🚀 策略啟動了!環境正常!
INFO  DoNothingStrategy: 🛑 策略停止了。恭喜,你的第一個回測成功了!

============================================================
📊 回測結果
============================================================
帳戶餘額: {USD: Money(100000.00, USD)}
總訂單數: 0
總成交數: 0
============================================================
✅ 恭喜!你的 NautilusTrader 環境正常運作!

四、代碼逐行解析

剛才的代碼雖然是「什麼都不做」的策略,但它已經展示了 NautilusTrader 的核心運作模式:

flowchart LR
                        subgraph setup["⚙️ 配置階段"]
                        direction TB
                        config_engine["1. 配置引擎"]
                        add_venue["2. 添加交易場所"]
                        add_strategy["3. 添加策略"]
                        config_engine --> add_venue --> add_strategy
                        end

                        subgraph run["▶️ 運行階段"]
                        direction TB
                        init["引擎初始化所有組件"]
                        start["調用策略的 on_start()"]
                        process["處理數據事件"]
                        stop["調用策略的 on_stop()"]
                        init --> start --> process --> stop
                        end

                        subgraph result["📊 分析階段"]
                        direction TB
                        balance["查看帳戶餘額"]
                        orders["查看訂單"]
                        tearsheet["生成績效報表"]
                        end

                        setup --> run
                        run --> result
圖 2:NautilusTrader 回測的三個階段
代碼部分做了什麼對應架構組件後續哪個模組會深入
BacktestEngine創建回測引擎系統核心 (Kernel)模組 12
add_venue()定義模擬交易所適配器 (Adapter)模組 13
OmsType.NETTING訂單管理系統類型執行引擎模組 08
Strategy策略基類策略開發模組 11
Money(100_000, USD)定義資金(定點數)領域模型模組 04
engine.portfolio查詢投資組合Portfolio模組 10
engine.cache查詢緩存Cache模組 06

五、Python 生存指南

如果你是 Python 初學者,以下是 NautilusTrader 中最常遇到的 Python 語法。你不需要先學完整個 Python,只要懂以下 7 點就夠了:

1️⃣

類和繼承 (Class & Inheritance)

你的策略需要「繼承」NautilusTrader 的 Strategy 基類,這樣你才能獲得系統賦予的能力(如 self.cache)。

class MyStrategy(Strategy):
    # 你的策略繼承自 Strategy
    # 這代表它自動擁有了 Strategy 的所有功能
2️⃣

__init__ 構造器

這是類的初始化方法。記得這句咒語:super().__init__(config)。它確保父類也被正確初始化。

def __init__(self, config):
    super().__init__(config)  # 先讓父類把該準備的都準備好
    self.my_var = 0           # 然後再定義你自己的變數
3️⃣

self 就是「自己」

在類的方法裡,變數前都要加 self.。這代表這個變數屬於這個策略實例,而不是臨時變數。

def on_start(self):
    self.log.info("...")      # 調用自己的日誌器
    self.count = 1            # 設置自己的計數器
4️⃣

Type Hints (型別提示)

變數後面的 : Bar 不是賦值,而是告訴讀代碼的人(和 IDE)這個變數是什麼類型。這對自動補全非常有幫助。

def on_bar(self, bar: Bar):
    # IDE 現在知道 bar 有 open, high, low, close 屬性了
    print(bar.close)
5️⃣

frozen=True (不可變配置)

配置類一旦建立就不應修改。frozen=True 鎖定了它,防止你在代碼運行中不小心改了配置。

class MyConfig(StrategyConfig, frozen=True):
    symbol: str = "BTC-USDT"
    # c = MyConfig(...)
    # c.symbol = "ETH"  # ❌ 報錯!無法修改
6️⃣

f-string (格式化字串)

最方便的字串拼接方式。在字串前加 f,就可以用 {變數} 直接插入值。

price = 100
self.log.info(f"當前價格是 {price}")  # 輸出: 當前價格是 100
7️⃣

Decimal (精確小數)

NautilusTrader 為了精度,有時會用 Python 的 Decimal 而不是 float。記得:字串轉 Decimal 最安全。

from decimal import Decimal
qty = Decimal("0.1")  # ✅ 精確
# qty = Decimal(0.1)  # ❌ 危險!可能有浮點誤差
💡 不需要害怕看不懂的語法

NautilusTrader 的 Python 代碼遵循一個固定模式:配置類 + 策略類 + 回調方法。99% 的情況下你只需要修改回調方法裡的邏輯,不需要理解底層的 Cython/Rust 代碼。

六、專案目錄結構

了解 NautilusTrader 的原始碼目錄結構可以幫助你在需要時找到正確的參數和邏輯。

📂 專案根目錄說明

如果你下載了整個源碼包,你會看到很多檔案。我們主要關注 nautilus_trader/ 資料夾,這是核心代碼所在。其他檔案(如 .cargo, poetry.lock, Makefile)主要是給開發者編譯和構建用的,你可以暫時忽略。

nautilus_trader/
├── model/           # 💎 領域模型(價格、訂單、持倉、金融工具)
│   ├── orders/      #     9 種訂單類型
│   ├── instruments/ #     金融工具定義(股票、期貨、期權...)
│   ├── data.pyx     #     市場數據類型(QuoteTick, Bar...)
│   └── position.pyx #     持倉計算
│
├── trading/         # 🎯 策略相關
│   ├── strategy.pyx #     Strategy 基類(你繼承這個)
│   ├── trader.py    #     Trader 管理器
│   └── controller.py#     交易控制器
│
├── data/            # 📊 數據引擎
│   ├── engine.pyx   #     DataEngine 核心
│   └── aggregation.pyx # K 線聚合
│
├── execution/       # ⚙️ 執行引擎
├── risk/            # 🛡️ 風控引擎
├── cache/           # 💾 緩存系統
├── common/          # 🔧 通用組件(Actor, MessageBus, 日誌...)
│
├── backtest/        # 🔬 回測引擎
│   ├── engine.pyx   #     BacktestEngine 核心引擎
│   └── models/      #     FillModel, FeeModel, LatencyModel
│
├── live/            # 🚀 實盤引擎
│   ├── node.py      #     TradingNode
│   ├── reconciliation.py  # 訂單對帳
│   └── retry.py     #     自動重試
│
├── adapters/        # 🔌 15 個交易所適配器
├── indicators/      # 📈 內建技術指標
├── accounting/      # 💰 會計與保證金
├── analysis/        # 📋 績效分析 & Tearsheet
├── persistence/     # 💿 數據持久化(Parquet/Catalog)
├── serialization/   # 📦 序列化(Arrow/MsgPack)
├── system/          # ⚡ 系統核心(Kernel)
└── config/          # ⚙️ 所有配置類
✅ 每個目錄都會在後續模組中詳細講解

現在你不需要記住所有目錄。這張地圖的作用是:當你未來遇到問題時,知道去哪裡找答案。

七、互動練習

🧠 練習 1:安裝診斷

執行以下代碼。如果全部輸出 ✅,代表你的環境完全正常:

checks = {
    "nautilus_trader": True,
    "BacktestEngine": True,
    "Strategy": True,
    "QuoteTick": True,
}
try:
    import nautilus_trader
    from nautilus_trader.backtest.engine import BacktestEngine
    from nautilus_trader.trading.strategy import Strategy
    from nautilus_trader.model.data import QuoteTick
except ImportError as e:
    print(f"❌ 缺少: {e}")
else:
    for name in checks:
        print(f"  ✅ {name}")
    print(f"\n版本: {nautilus_trader.__version__}")
🧠 練習 2:找出錯誤

以下代碼有 3 個錯誤,你能找到嗎?

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

engine = BacktestEngine()  # 錯誤 1: ???
engine.add_venue(
    venue="SIM",             # 錯誤 2: ???
    oms_type="NETTING",      # 錯誤 3: ???
    account_type=AccountType.MARGIN,
    base_currency=USD,
    starting_balances=[100000],
)
錯誤 1: BacktestEngine 需要 BacktestEngineConfig 參數 → 正確: engine = BacktestEngine(config=BacktestEngineConfig())錯誤 2: venue 需要 Venue 對象,不是字串 → 正確: venue=Venue(“SIM”)錯誤 3: oms_type 需要 OmsType 枚舉,不是字串 → 正確: oms_type=OmsType.NETTING💡 教訓:NautilusTrader 使用強類型設計(Fail-Fast 哲學) 它不接受「差不多」的數據,必須用正確的類型。 這是模組 03 設計哲學中 Fail-Fast 的具體體現。
🧠 練習 3:設計題

如果你想在 DoNothingStrategy 中加一個功能:策略啟動時印出系統所有可用的金融工具列表。你覺得應該在哪個方法中實現?需要調用什麼?

應該在 on_start() 中實現:def on_start(self): instruments = self.cache.instruments() self.log.info(f”📋 可用金融工具 ({len(instruments)} 個):”) for inst in instruments: self.log.info(f” → {inst.id}”)為什麼是 on_start()? – on_start() 在引擎完全初始化後調用 – 此時 Cache 已經載入了所有金融工具 – 如果在 __init__ 中查詢,Cache 可能還沒準備好為什麼用 self.cache? – 因為 Strategy 繼承了 Actor – Actor 有直接訪問 Cache 的權限 – 這就是模組 06(緩存系統)會詳細講的內容

八、本模組重點回顧

📋 你應該記住的關鍵點
  1. 環境要求:Python 3.12-3.14,支援 Linux/macOS/Windows
  2. 安裝方式:pip install nautilus_trader 或用 uv
  3. 回測三階段:配置 → 運行 → 分析
  4. 策略模式:配置類(Config) + 策略類(Strategy) + 回調方法(on_xxx)
  5. 強類型:NautilusTrader 不接受字串代替枚舉/對象
  6. 21 個子系統:每個目錄都有明確職責,後續模組會逐個深入
🎯 下一步

你的環境已經跑起來了。下一個模組會解答一個關鍵問題:在這麼多量化交易框架中,為什麼要選 NautilusTrader?