iT邦幫忙

2025 iThome 鐵人賽

DAY 4
0
Rust

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

【Day4】- 如何在 NautilusTrader 運行策略(Live&Sandbox)

  • 分享至 

  • xImage
  •  

這兩者的差別在於

  • Live : 用真實數據和真實交易所

  • Sandbox : 用真實數據和虛擬交易所

底下先來介紹 Sandbox 的使用方式

Sandbox

因為需要使用真實數據,記得先去註冊Binance帳號,然後獲取相API KEY跟API_SECRET_KEY

底下說明的是 nautilus_trader/examples/sandbox/binance_spot_futures_sandbox.py

程式啟動一個 TradingNode,連上 Binance 現貨與期貨的即時資料流,在 Sandbox 執行端建立兩個模擬帳戶(Spot/Futures),但沒有撰寫策略,只有輸出tick資料而已.


TradingNode 設定

config_node = TradingNodeConfig(
  ...
  data_clients={ "BINANCE_FUTURES": BinanceDataClientConfig(...), "BINANCE_SPOT": BinanceDataClientConfig(...) },
  exec_clients={ "BINANCE_FUTURES": SandboxExecutionClientConfig(...), "BINANCE_SPOT": SandboxExecutionClientConfig(...) },
)
  • Data clients 使用 BinanceDataClientConfig(testnet=False):

    代表會連 Binance 真實網的資料端Live 行情(包含 instruments、WS ticks)。

  • Exec clients 使用 SandboxExecutionClientConfig:

    下單不會送到 Binance,而是本地模擬撮合

    • Futures 起始餘額:["10_000 USDC", "1 BTC"],並設 default_leverage=5
    • Spot 起始餘額:["1_000 USDC", "0.001 BTC"]

確認一下連接是否正常,在終端運行

uv run examples/sandbox/binance_spot_futures_sandbox.py

理論上的輸出應該會像底下這樣
首先先輸出模擬賬戶資金
https://ithelp.ithome.com.tw/upload/images/20250808/20177999XF4KThavCC.png
接者,輸出tickdata
https://ithelp.ithome.com.tw/upload/images/20250808/20177999iU0vSLX7Rp.png

都沒問題的話,就可以撰寫你的策略試看看
那其實Sandbox做的事情就是

  1. 數據接收:Sandbox客户端訂閱市場數據
  2. 訂單處理:用到昨天講的BacktestExecClient處理訂單提交
  3. 撮合執行:SimulatedExchange

詳細細節,我們在之後底層架構的時候會再提到

Live


這裡使用
nautilus_trader/examples/live/binance/binance_spot_and_futures_market_maker.py

和Sandbox不同的地方就是

Exec Clients(下單執行端)

exec_clients={
    "BINANCE_SPOT": BinanceExecClientConfig(..., testnet=False),
    "BINANCE_FUTURES": BinanceExecClientConfig(..., testnet=True),
}
  • BINANCE_SPOT
    • testnet=False → 會對真實現貨帳戶下單(需小心,真錢交易!)。
  • BINANCE_FUTURES
    • testnet=True → 對期貨測試網下單,不影響真實資金。

這裡的testnet是指交易所提供的測試網,前面的Sandbox是在我們本地端的虛擬交易所.

策略設定(VolatilityMarketMakerConfig)

spot_symbol = "ETHUSDT"
strat_config_spot = VolatilityMarketMakerConfig(
    instrument_id=InstrumentId.from_str("ETHUSDT.BINANCE_SPOT"),
    external_order_claims=[InstrumentId.from_str("ETHUSDT.BINANCE_SPOT")],
    bar_type=BarType.from_str("ETHUSDT.BINANCE_SPOT-1-MINUTE-LAST-INTERNAL"),
    atr_period=20,
    atr_multiple=6.0,
    trade_size=Decimal("0.010"),
    client_id=ClientId("BINANCE_SPOT"),
)
  • instrument_id:交易標的(這裡是 ETH/USDT 現貨)。
  • external_order_claims:策略聲明自己管理這個 instrument 的掛單。
  • bar_type:策略用的 K 線資料(這裡是 1 分鐘線)。
  • atr_period / atr_multiple:ATR 計算參數,用來決定報價距離。
  • trade_size:單次下單數量(0.01 ETH)。
  • client_id:綁定到哪個執行端。

這裡簡單說明一下,上面的策略

這個策略是一個基於波動率的市場做市商(Volatility Market Maker),主要目的是在市場中同時掛買單和賣單,利用市場的波動性(ATR指標)來決定掛單價格的距離,從而賺取買賣價差(spread)。

核心運作流程

  1. 初始化
    • 讀取配置(如交易品種、K線類型、ATR週期、下單數量等)。
    • 創建ATR(Average True Range)指標,用於衡量市場波動性。
  2. 啟動時(on_start)
    • 加載交易標的(instrument)。
    • 註冊指標,訂閱行情數據(K線、報價、成交等)。
  3. 收到新K線(on_bar)
    • 等待指標熱身(即ATR有足夠數據)。
    • 取得最新報價(QuoteTick)。
    • 撤銷現有買單/賣單(如果有)。
    • 根據當前報價和ATR值,重新掛買單和賣單
      • 買單價格 = 當前買一價 - ATR × 配置倍數
      • 賣單價格 = 當前賣一價 + ATR × 配置倍數
    • 下單數量、有效期等根據配置決定。
  4. 成交回報(on_event)
    • 如果買單/賣單成交,則在新的價格重新掛單,保持市場深度。
  5. 停止時(on_stop)
    • 撤銷所有掛單,平掉所有持倉,取消行情訂閱。

我們來實際運行看看

uv run nautilus_trader/examples/live/binance/binance_spot_and_futures_market_maker.py

可以看到終端輸出如下:
https://ithelp.ithome.com.tw/upload/images/20250808/20177999Ftx1wJy0G0.png

去Binance上查看

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

訂單確實送出了


就大概先講到這,因為我們的主軸是在系統架構上,但如果想看更多關於策略和風險監控,歡迎在底下留言.

明天開始就準備進入Rust的世界.


上一篇
【Day3】- 如何在 NautilusTrader 運行策略(Backtest)
下一篇
【Day5】- 如何結合 Python 和 Rust
系列文
NautilusTrader 架構解析:Rust 在高效能量化交易平台中的角色與優勢22
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言