前言:那些回測不會告訴你的事

我們的量化交易系統在回測裡看起來很美:

  • 年化報酬:87%
  • 勝率:53%
  • 最大回撤:-12%
  • 夏普比率:2.1

然後我們把它接上真實市場。

第一個月的實際結果?年化從 87% 掉到 23%,最大回撤從 -12% 變成 -18%。

不是策略爛了。是我們低估了「現實」這個變數。

以下是我們用真金白銀學到的 5 個教訓。


教訓一:滑點不是 0.05%,是隨時可能 2%

回測的假設

回測引擎通常假設:信號觸發 → 以當時價格成交。有些比較好的回測工具讓你設定「滑點 0.05%」。

現實

2026 年 1 月,BTC 在一分鐘內跌了 3%。我們的做空信號在 $97,200 觸發,但實際成交在 $96,850 — 滑點 0.36%。聽起來不多,但乘以槓桿,這筆交易的獲利直接少了一半。

更誇張的是小幣。某個中等市值的代幣,我們的回測假設滑點 0.1%。實際上?在市場劇烈波動時,掛單簿直接變真空,滑點超過 2%。

我們怎麼解決

1
2
3
4
5
6
回測滑點設定(修正後):
  BTC/ETH 大幣:0.15%
  中型幣:0.3%
  小型幣:0.5% 或不交易

額外:極端行情自動暫停(波動率 > 歷史均值 3 倍時停止新開倉)

鐵則:回測滑點永遠設比你想的高 2-3 倍。如果加上高滑點後策略不賺錢,那它本來就不賺錢。


教訓二:API 會在你最需要它的時候掛掉

回測的假設

每個信號都能完美執行。沒有「交易所 API 回傳 429」、沒有「WebSocket 斷線」、沒有「下單後 30 秒才收到回報」。

現實

上線第二週,某天凌晨 3 點(當然是凌晨):

  1. BTC 突然大跌觸發做空信號
  2. 全世界的交易機器人同時發送請求
  3. 交易所 API 回傳 HTTP 429 Too Many Requests
  4. 我們的系統重試 3 次,都失敗
  5. 等到 API 恢復,價格已經反彈
  6. 信號失效,但系統不知道,還是下了單
  7. 結果:在反彈高點做空 → 直接虧損

我們怎麼解決

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
# 進場有效期(Order Staleness Check)
MAX_SIGNAL_AGE = 120  # 秒

if time.time() - signal_timestamp > MAX_SIGNAL_AGE:
    log("信號過期,放棄進場")
    return

# API 重試 + 退避策略
for attempt in range(3):
    try:
        order = exchange.create_order(...)
        break
    except RateLimitError:
        wait = 2 ** attempt  # 1s, 2s, 4s
        time.sleep(wait)
else:
    alert("API 連續失敗,需要人工介入")

鐵則:每個 API 呼叫都要有 timeout、重試、和「太晚就不做」的機制。信號有保鮮期。


教訓三:流動性是幻覺

回測的假設

你的訂單不會影響市場。$10,000 的買單對市場來說微不足道。

現實

對 BTC 來說確實微不足道。但你試過在凌晨 4 點對一個日交易量 $500,000 的小幣下 $10,000 的單嗎?

我們做過。結果是自己把價格推高了 1.5%,然後用很差的均價成交。回測裡這筆交易賺 3%,實際上只賺 0.8%。

更慘的是出場。你想在 $2.15 止盈,但掛賣 $10,000 後,價格直接從 $2.15 跌到 $2.08,因為你的賣單就是那個時段最大的賣壓。

我們怎麼解決

1
2
3
4
5
6
7
8
9
倉位上限規則:
  單筆交易量 ≤ 該幣 24H 交易量的 0.1%

  例:某幣 24H 交易量 = $2,000,000
  → 單筆最大 = $2,000

大額出場策略:
  冰山單(分批出場,每次只掛總量的 20%)
  或限價單 + 等待(不急著一次全出)

鐵則:你的策略最大容量 = 目標幣種最低流動性時段的交易量 × 0.1%。超過這個,回測績效就不可信。


教訓四:你以為你不會手動干預,但你會

回測的假設

系統發出信號 → 完美執行 → 沒有人類情感干預。

現實

上線第三週,系統做多 BTC,然後 BTC 連跌三天,浮虧 $800。

理性上,我知道停損設在 -2%,帳戶風險完全可控。但看著真實帳戶的數字一直在減少,你的大腦會開始做一些「聰明」的事:

  • 「再跌一點我先手動平了吧,感覺這次不一樣」
  • 「停損太近了,移遠一點應該比較安全」
  • 「暫停系統吧,等市場穩定再開」

第三週我手動干預了 4 次。其中 3 次,系統原本的信號是對的。我的「直覺」讓我多虧了 $1,200。

我們怎麼解決

  1. 物理隔離:交易系統跑在伺服器上,我沒有一鍵平倉的按鈕
  2. 干預冷卻期:想手動干預?先等 4 小時。如果 4 小時後你還想干預,再寫下原因
  3. 干預記錄:每次手動操作都自動記錄,月底回顧。數據會告訴你,你的干預到底是幫忙還是幫倒忙
  4. 小額開始:用總資金的 10% 跑實盤。虧 $80 的心理壓力遠小於虧 $800

干預回顧數據

月份手動干預次數干預結果 - 比系統好比系統差
1月113 (27%)8 (73%)
2月41 (25%)3 (75%)
3月至今10 (0%)1 (100%)

結論很清楚:你的干預大概率讓事情更糟。

鐵則:如果你做了一套系統然後不信任它,問題不在系統 — 在你的測試不夠充分。回去多做 Paper Trading,直到你真的相信它。


教訓五:黑天鵝不是理論,是早晚的事

回測的假設

歷史數據包含了所有可能發生的事。

現實

不,它沒有。每次黑天鵝發生,都是歷史上沒出現過的事:

  • 2022 年 Luna 崩盤:一天之內從 $80 到 $0.001
  • 2025 年 12 月:BTC 一天跌近 8%($91K → $83.8K),帶崩整個市場
  • 各種交易所突然暫停提幣、修改規則、出問題

我們的系統在 2025 年 12 月那天表現如何?停損全部被穿過去了。設在 $88,000 的停損,實際觸發在 $85,800。因為市場移動太快,掛單簿上的流動性瞬間消失。

我們怎麼解決

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
防黑天鵝措施:

1. 帳戶層級硬停損:
   - 單日虧損 > 3% → 暫停所有交易 24 小時
   - 單週虧損 > 6% → 暫停所有交易 + 通知管理者

2. 倉位分散:
   - 永遠不把所有資金放在同一個交易所
   - 槓桿永遠 ≤ 3x(不要讓黑天鵝直接歸零)

3. 止損不能只靠掛單:
   - 掛單止損(主要)
   - 市價止損(備用,在掛單觸發後 30 秒如果沒成交就市價出場)
   - 帳戶層級止損(終極防線)

鐵則:不要問「黑天鵝會不會來」。問「黑天鵝來的時候,我的帳戶能不能活」。


回測 vs 實盤:數據對比

經過三個月的調整,我們的實盤績效逐漸接近回測,但永遠不會完全一樣:

指標回測實盤第1月實盤第3月差距原因
年化報酬87%23%52%滑點 + 延遲 + 手動干預
勝率53%48%51%信號過期導致錯過的交易
最大回撤-12%-18%-14%黑天鵝穿過停損
夏普比率2.10.91.6綜合影響

實盤績效 = 回測績效 × 0.6 到 0.7

這是一個很粗略但實用的經驗法則。如果你的回測年化 100%,實盤大概能做到 60-70%。如果你的回測年化只有 20%,那實盤可能只有 12-14% — 這時候你要問自己,扣掉手續費和時間成本,還值得嗎?


上線前的檢查清單

在你把系統接上真金白銀之前:

  • Paper Trading 至少跑了 30 天,包含上漲和下跌行情
  • 回測加了合理的滑點(大幣 0.15%,小幣 0.3%+)
  • API 失敗的處理邏輯已測試(手動斷網測試過)
  • 信號有保鮮期(超過 N 秒自動取消)
  • 流動性篩選(不交易 24H 量太低的幣)
  • 帳戶層級硬停損已設定
  • 干預記錄機制已設定
  • 先用 10% 資金試跑,不是直接全額投入
  • 心理準備:第一個月會比回測差很多,這是正常的

這份清單是我們交易課程第 6-8 章的精華節選。想看完整框架(含可直接使用的程式碼)?查看完整課程 →


結語

從回測到實盤的差距,不是 bug — 是 feature。這個差距在告訴你:「你的模型缺少了一些現實世界的因素」。

與其追求回測績效最大化,不如追求「回測和實盤的差距最小化」。一個回測年化 40% 但實盤能做到 30% 的系統,比一個回測 200% 但實盤只有 20% 的系統好太多了。

穩定可預測,比華麗不可控,有價值得多。


這些教訓都整理進了我們的 AI×交易 完整攻略。13 章完整實戰,包含從策略開發到實盤部署的每一步。


你從回測到實盤有踩過什麼坑嗎?歡迎在下方留言分享經驗。

AI×交易 完整攻略 — 13 章實戰課程
$49 · 技術分析 + 風控管理 + Python 自動化交易
了解更多 →