iT邦幫忙

2025 iThome 鐵人賽

DAY 3
0
Rust

NautilusTrader 架構解析:Rust 在高效能量化交易平台中的角色與優勢系列 第 3

【Day3】- 如何在 NautilusTrader 運行策略(Backtest)

  • 分享至 

  • xImage
  •  

運行策略分為三部份

  • Backtest
  • Live
  • Sandbox

今天會先講Backtest的部分


Backtest

首先進入 doc/getting_start/quickstart.ipynb

Get sample data

這裡可以下載官方提供的資料轉換腳本並執行,在終端執行

curl https://raw.githubusercontent.com/nautechsystems/nautilus_data/main/nautilus_data/hist_data_to_catalog.py | python -

會在當前目錄下建立 ./catalog/ 資料夾(包含 EUR/USD 報價資料)

記得要先開啟虛擬環境

source .venv/bin/activate

建立資料目錄

這裡建議程式碼改為

catalog = ParquetDataCatalog("./catalog")
catalog.instruments()

實作 MACD 策略

使用 Strategy 類別,自定義 MACD 交易邏輯:

  • MACD > threshold → 做多
  • MACD < -threshold → 做空
  • MACD 趨近 0 → 平倉

這裡也簡單做個圖讓大家可以看一下它其中的函數會怎麼操作

https://ithelp.ithome.com.tw/upload/images/20250808/20177999qgBKfJfPXF.png


配置模擬交易所(Venue)

venue = BacktestVenueConfig(
    name="SIM",
    oms_type="NETTING",
    account_type="MARGIN",
    base_currency="USD",
    starting_balances=["1_000_000 USD"]
)

設定回測資料來源

from nautilus_trader.model import QuoteTick

data = BacktestDataConfig(
    catalog_path=str(catalog.path),
    data_cls=QuoteTick,
    instrument_id=instruments[0].id,
    end_time="2020-01-10",
)

設定回測引擎與策略(BacktestEngineConfig)

engine = BacktestEngineConfig(
    strategies=[
        ImportableStrategyConfig(
            strategy_path="__main__:MACDStrategy",
            config_path="__main__:MACDConfig",
            config={
                "instrument_id": instruments[0].id,
                "fast_period": 12,
                "slow_period": 26,
            },
        )
    ],
    logging=LoggingConfig(log_level="ERROR"),  # 避免 notebook log 過載
)

執行回測(BacktestNode)

BacktestNode 是 NautilusTrader 裡負責統一管理回測流程的核心類別,也是我們之後會深入了解的核心之一.

為什麼要有 BacktestNode?

因為在複雜的量化研究中,我們常常需要執行大量組合的回測,例如:

  • 不同策略參數(fast/slow EMA、MACD 門檻)
  • 不同交易對(EUR/USD、BTC/USDT)
  • 不同資料期間(2023 vs 2024)
  • 或同一策略在多種市場條件下的表現比較

如果每一次都手動寫一份回測流程,會非常麻煩、難以重複利用。

from nautilus_trader.backtest.node import BacktestRunConfig, BacktestNode

config = BacktestRunConfig(engine=engine, venues=[venue], data=[data])
node = BacktestNode(configs=[config])

results = node.run()  # 執行所有回測配置

產出回測報告(Results & Reports)

from nautilus_trader.model import Venue

engine = node.get_engine(config.id)

engine.trader.generate_order_fills_report()
engine.trader.generate_positions_report()
engine.trader.generate_account_report(Venue("SIM"))

明天繼續說明 Live & Sandbox 以及如何即時監控損益


上一篇
【Day2】如何在本地端啟動 NautilusTrader
下一篇
【Day4】- 如何在 NautilusTrader 運行策略(Live&Sandbox)
系列文
NautilusTrader 架構解析:Rust 在高效能量化交易平台中的角色與優勢22
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言