← 所有文章

投資 · 2026.09.22 · 4 min · 更新於 2026.10.26

模擬盤永遠賺錢、實盤卻在虧:誠實模擬盤與 AI 交易模型命中率驗證

把永遠顯示獲利的模擬盤改成會付 gas、會被拒單,再用 24 小時取樣驗證 AI 模型的命中率,結果量不到方向優勢,照事先寫好的放棄條件收掉專案。

閱讀設定
主題
字級
寬度

同一套 AI 交易 bot,實盤每小時虧約 $11,模擬盤卻一直是正的。

我把模擬盤改成會付 gas、會被拒單,再用 24 小時取樣驗證 Jev 模型的命中率:50.1%,比「永遠猜同一邊」的 50.8% 還低,信心值跟結果無關。

前一天小樣本看到的 53.4% 是運氣,專案照事先寫好的放棄條件收掉。

這是 jev-trader 的第二篇,把 AI 交易 bot 丟上 Monad 主網的工程問題,寫在Monad 鏈上 AI 交易 bot 的 gas 成本與保證金記帳。

模擬盤(dry run)的 gasMon 寫死 0,掛單也永遠不會被拒。一把永遠說你在賺錢的尺,沒辦法在花真錢之前幫你判斷。

另一個問題更根本:掛哪一邊完全由 Jev 決定,它要是沒有預測力,後面做什麼優化都沒有基礎。

誠實模擬盤:付 gas、會拒單

驗收條件是模擬盤的 gas 成本(鏈上交易要付的手續費)和拒單率,要跟實盤對得上。

gas limit 取實盤啟動時估出來的 438000,乘上即時的 gas price。拒單率預設 0.33,用實盤數據校準。

哪個 block 被拒,用 block 號做決定性雜湊來決定,同一段行情重跑結果完全相同。被拒的單不上簿,前一張留在場上,跟實盤 revert 的行為一致。

這段的 bug 是測試抓到的。

JavaScript 的 xor 會留下有號整數,餘數變成負的時候 < rate 永遠成立,拒單率變成 67%。補上 >>> 0 轉回無號整數才對。

成交模型我原本覺得太樂觀。回頭對數據,實盤成交率 18%、模擬盤 9% 到 11%,看不到樂觀的證據,沒證據就不改。

修完跑 245 個 block 驗證:拒單 31.8%,gas 換算每小時 $13.4,P&L 是負的。

跟實盤每小時 $11 的差距,來自實盤有 14% 的 late block 沒送單,自然不付 gas。

對照表:原本的 dry run 把 gasMon 寫死 0、掛單永遠不會被拒、P&L 一直是正的;誠實模擬盤用 gas limit 438000 乘上即時 gas price,拒單率預設 0.33、用實盤校準,修完跑 245 個 block 拒單 31.8%,P&L 跟實盤一樣是負的。

錄 state,離線評分

最直接的驗法,是記下 Jev 每次的判斷,等 100 個 block(模型的預測視野,約 30 秒)之後,看中價(買價和賣價的中間)有沒有往那邊走。

但每個 block 都問 Jev,一天要 $18。而且在這個視野下,相鄰的 block 幾乎是同一個樣本。

所以改成每 20 個 block 把模型的輸入存一筆,之後離線重放給模型評分,一天的費用降到約 $1。

評分有兩件事要做對。

第一,比的對象是「永遠猜同一邊」的基準,不是 50%。行情單邊走的時候,一直猜漲也能贏過 50%。

第二,樣本不獨立。每 20 個 block 取一次樣、視野 100 個 block,相鄰樣本的未來有八成重疊,誤差要按有效樣本數算:

TypeScript
// Calls closer together than the horizon share most of their outcome, so they are not independent samples.
const gap = n > 1 ? (finalBlock - firstBlock) / (n - 1) : config.horizonBlocks;
const effective = Math.max(1, n * Math.min(1, gap / config.horizonBlocks));
const se = Math.sqrt(0.25 / effective) * 100;

不做這個調整,誤差範圍會窄 2.2 倍,雜訊很容易被看成訊號。

示意圖:每 20 個 block 取樣一次,每筆往後看 100 個 block(約 30 秒),相鄰兩筆的視野重疊 80%,有效樣本數是 n 乘以間距除以視野;不做這個調整,誤差範圍會窄 2.2 倍。

小樣本 53.4%,先寫放棄條件

跑了幾個小時,第一次粗看是 2,420 筆、約 489 個獨立樣本:命中率 53.4%,基準 51.4%,誤差 ±4.5,分不出來。

模型說 80% 到 100% 會漲的那組,實際上漲 55.2%;說 0% 到 20% 的那組是 48.2%。差 7 個百分點,大約 1.4 個標準差。

就算 53.4% 是真的,也不夠賺。

換算成方向優勢,大約每次 0.49 bps(萬分之一),而價差(最低賣價和最高買價的差距)中位數是 3.62 bps。

用 4.1 小時的真實價格回算,就算 Jev 百分之百正確,方向獲利的上限也只有每小時 $3.15,蓋不過每小時 $11 到 13 的 gas。

直覺的解法是少送單。模型的視野是 30 秒,判斷不會每 0.3 秒就改變,只在判斷翻面時才撤單重掛,交易數可以降一到兩個數量級。

但降頻只能省 gas,沒有訊號就沒有東西可賺。

所以我沒有馬上動手,先寫好規則:24 小時驗證的命中率要贏過永遠猜同一邊,而且幅度超過誤差範圍才開工,在 50% 左右就不做。

24 小時驗證:命中率 50.1%

隔天驗證跑完,14,214 次呼叫,約 2,871 個獨立樣本,Jev 費用 $1.00:

hit rate        50.1%  (coin: 50% ± 1.9 at 95%)
always one side 50.8%  <- the number to beat
calibration: when it said buy with probability p, how often did price go up
  p 0-20%    n= 6567  went up 48.8%
  p 20-40%   n=  569  went up 51.3%
  p 40-60%   n=  545  went up 50.6%
  p 60-80%   n= 1754  went up 49.7%
  p 80-100%  n= 4779  went up 49.0%

命中率比基準還低。校準(模型說的機率,跟實際上漲的比例對不對得上)完全是平的,信心值跟結果無關。

前一天的 53.4% 和高信心組那 7 個百分點,樣本放大六倍後全部消失。

左邊比較命中率和永遠猜同一邊:粗看約 489 個獨立樣本時命中率 53.4%、基準 51.4%、誤差 ±4.5;24 小時約 2,871 個獨立樣本時命中率 50.1%、基準 50.8%、誤差 ±1.9。右邊是校準,模型說會漲的機率從 0–20% 到 80–100%,實際上漲 48.8%、51.3%、50.6%、49.7%、49.0%,幾乎是平的;粗看時兩端的 48.2% 和 55.2% 已經消失。

同一段時間,模擬盤也跑滿 24 小時(用 mock 模型):287,337 個 block,拒單 33.1%,gas $319.59,每小時 $13.3。

掛單賺到的價差,被成交後價格繼續往不利方向走吃掉了,這部分跟模型無關。

照前一天說好的規則,翻面才動單的模式不做,模擬盤停掉,server 上的東西一起刪除。實盤資金在這之前就已經全數提回。

誠實模擬盤本身留著,之後要測別的策略時,手上有一把可信的尺。

小樣本的好看數字不要寫進結論,53.4% 放大六倍就沒了。

放棄條件在看到結果之前就寫好,結果出來時照規則決定。

#模型驗證#模擬交易#Monad#量化交易

留言

載入留言中…

下一篇

工程

Design Token 全站改版:AI 評分當不了門檻,先換 token 值一支 PR 換掉九成畫面

官網、儀表板、後台和 email 一起從深色圓角卡片換成紙色底、方角墨線的工程藍圖風格。AI 評審的分數只適合當回歸清單;落地時先換 Design Token 的值,一支 PR 就換掉九成畫面。