2026年十一月2日 · 研究

你回測裡的美元其實是 USDC。3 月 11 日它只值 87 美分。

你回測裡的美元其實是 USDC。3 月 11 日它只值 87 美分。

設定寫著 starting_capital: 100000,圖表的 y 軸寫著 USD。日誌裡每一筆成交都是 USDC 數字。那次回測跑了 11 個月,這兩件事一直待在同一個格子裡,沒有人有理由把它們拆開。

接著矽谷銀行倒了,Circle 說有 $3.3 billion 的 USDC 準備金卡在那裡,USDC 成交價來到 87 美分。我們那本「美元」帳往上衝。以 USDC 計價的 BTC 狂漲。永續合約印出綠色。我們當成無風險 100,000 的那筆現金,才是真正在動的東西。

我到現在還是會抓到把 USDC、USDT 和 USD 標成同一欄的研究管線。這就是那個週末,照帳本當時看到的順序拆開來看。

寫著 $100,000 的那一行

模擬帳戶,USDC 保證金的 BTC 永續合約,小幅做多。BTC 名目 30,000 USDC,以週五接近 $20,150 的標記價約 1.5 BTC。另外 70,000 放著當 USDC 擔保品。刻意低度配置。我們在幫一套策略熱身。其餘資金都停在現金。

NAV 函式做的事跟大多數同類函式一樣。它把 USDC 現金加上 USDC 未實現損益,把總和寫進名叫 equity_usd 的序列。設定檔裡有一段我自己寫的註解:

穩定幣 = 1 美元。不要重複計算 FX。

我本來的意思是:別把一筆 USDT 資金費轉換兩次,變成第二次的美元波動。我實際做的,卻是把匯率在檔案剩下的部分全部凍在 1.0。

quote_asset = "USDC"

那個交易所是 USDC 交易所。成交、保證金、資金費、清算標記、口數、最小名目,全部都是。Hyperliquid、dYdX v3、Coinbase International,還有十幾家,結構都一樣。研究筆記本匯入了一根 BTCUSDC K 線和一根 BTCUSD K 線,交易用前者,圖上標後者,因為用美元畫圖看起來比較專業。

還有一件我三更半夜還會想起的小事、蠢事:繪圖函式庫預設的軸標題就是「USD」。我從來沒改過。有人從螢幕旁走過,讀到一個這條序列並沒有的單位。

週五晚上,Circle 的推文

2023 年 3 月 10 日。SVB 已經沒了。Circle 揭露當時約 $40 billion 的 USDC 準備金裡,有 $3.3 billion 放在這家倒閉的銀行,大約 8%。Coinbase 當天晚上就暫停 USDC 兌換。贖回,也就是真正的掛鉤機制,整個週末都關著。

回測裡沒有任何一列紀錄這些事。沒有贖回暫停旗標,沒有發行人準備金字段,沒有「星期一之前我能不能把這枚代幣換成美元」。它只有收盤價。週五的收盤在我們的匯率檔裡仍是 1.0000,因為那個匯率檔是個 stub,只要 ticker 以 USD 開頭就回傳 1.0。

我以前把 USDT 溢價當成教科書式的雜訊,那種寫在註腳裡然後就忽略的東西。我們有一次在廚房裡吵了 20 分鐘,爭論 1.03 到底「值不值得入帳」。我們兩個都在發表評論。那個交易對就是一條序列。存下來。別再對它投票。

0.8789

週六早上。CoinGecko 上 USDC 的低點是 $0.8789。其他盤面上印出 $0.87。有幾個 DEX 池穿過 $0.80。DAI 的擔保品塞滿 USDC,跟著往下掉。USDT 往另一邊走,有些螢幕上是 $1.03,Kraken 上是 $1.06。

$0.87USDC 低點,2023 年 3 月 11 日
$26kKraken 上的 BTC/USDC 成交
13%以 $1 計價的現金缺口

那個 stub 匯率檔仍然回傳 1.0。回測的時鐘知道今天是週六。它不知道這本帳的單位,此刻已是一枚陷入困境的代幣。

Kraken 印出的 26,000

Bitstamp 的 BTC/USD 在 $20,200 附近打轉。Kraken 的 BTC/USDC 印出超過 $26,000。那是同一顆比特幣。第二個數字是美元價格除以一個已經破的掛鉤,再加上週六盤口很薄時灌進來的空氣。

我們的交易所用 USDC 標記永續合約。取一條保守的盤,BTC/USDC 約 ~$23,000,也就是 $20,200 / 0.88。那 1.5 BTC 多單大約上漲 4,300 USDC。以原生單位計的帳戶:104,300 USDC。引擎報出 $104,300,一個上漲 4.3% 的週末,還有一筆資金費用同一個單位疊在上面。

以美元計,那 70,000 USDC 的閒置擔保品大約值 $61,600。整筆 104,300 USDC 大約值 $91,800。這本「賺了」4.3% 的帳,在大部分資金都停在現金裡的時候,虧掉了 8% 的美元資本。

那個週末報酬是單位變了,不是運氣變了。在 USDC 下跌的日子做多 BTC/USDC,機制上就是做多脫鉤。你可以想下這個注。你不能事後才在一條標成 USD 的序列裡發現它。

Coinbase 已經暫停 USDC 兌換。Binance 暫停了 USDC 交易對。就算有一個神模式回測在 08:00 UTC 決定把報價資產全部拋掉換成美元,它也需要一個還在兌換的交易所、一個不是脫鉤本身的價差,以及一條要等到星期一銀行開門才存在的交割路徑。

cash_usd = cash_usdc * 1.0

那一行是我留著的。它在每一根 bar 上跑,包括 USDCUSD 是 0.87 的那些 bar。乘上 1.0 感覺像空操作,所以它能通過 code review。這是一筆匯率標記。凍住的那種。

那 70,000 USDC 擔保品從來沒觸發任何交易,所以沒有滑價模型看過它,沒有手續費表,沒有資金費。現金理應是最無聊的那一欄。在這本帳上,它是最大的風險,也是我們唯一沒有定價的那一個。

那個週末 BTC 成交的 maker 回饋是 2 或 3 bps,如果你有成交的話。報價資產的波動是 1,300 bps。我們為那個 3 建了整套系統,為那個 1,300 只留了個 stub。

圖表上那個綠色的週末

星期一早上的 Slack,還沒有人打開 USDCUSD:我們隔夜印出了 4%。有人問要不要放大模擬倉位。我看了圖,再看 Kraken,再看那個 stub。

帳本項目引擎存了什麼週六,原生單位同一時刻,以美元計
閒置擔保品70,000 USDC × 1.0070,000 USDC~$61,600
BTC 永續標記BTCUSDC 最新價~23,000 USDC(Kraken 上 26,000)BTCUSD ~$20,200
1.5 BTC 的未實現損益+4,300 USDC+4,300 USDC多半是掛鉤,一點比特幣
報告的 NAV104,300「USD」104,300 USDC~$91,800

USDT 的帳是相反的漫畫。USDT 溢價成交,所以一個 USDT 保證金、空倉的帳戶也顯示出一筆它同樣沒賺到的美元收益,以及相對 BTCUSD 過低的 BTCUSDT 標記。如果你那個週末把兩個「一模一樣」的 BTC 永續合約拿來排名,一個在 USDC 交易所、一個在 USDT 交易所,你排的是報價代幣,卻稱之為 alpha。

那個模擬帳戶,真正持有 USDC 的那個,比研究儀表板更接近真相。它從來沒自稱是美元。是我們在匯出時這樣標的。

我們星期一送出的匯出

財政部、Fed 和 FDIC 表示會讓 SVB 存款人獲得全額保障,Circle 也表示會補上缺口之後,USDC 慢慢爬回 $1。到了星期一,掛鉤大致補好了。那個錯了 48 小時的 stub 匯率檔,又對了。

但日線 bar 把它藏起來了。3 月 11 日 00:00 UTC 的取樣抓到的 USDC 要麼已經偏離,要麼已經在反彈,取決於資料商;3 月 12 日的取樣則是另一部電影。如果你只存 NAV、不存報價標記,你就無法還原是哪一種。那個難看的週末被壓平成一個小到可以忽略的毛刺,而我們也確實忽略了,因為我們用日頻率取樣。

我們現在帳上永遠留三條序列,即使它們重疊好幾個月也一樣:

  1. 以交易所報價資產計的 NAV,也就是你真正能提領的單位。
  2. 報價資產對 USD,一條真正的盤,包括週六、包括 0.87、包括 Coinbase 沒有在兌換的那幾個小時。
  3. 以美元計的 NAV,作為衍生序列,這樣圖上標 USD 才有父項。

如果是 agent 寫回測,檢查方式一樣。問它每一個部位和現金的報價資產。如果在 USDC 交易所上它回答 USD,這次回測就不是美元回測。有人跟我說這個區別不會動到 Sharpe 的時候,我重播的就是 2023 年 3 月那一週。它對這次回測的影響比策略本身還大,而策略才是我們有模型的那一部分。

穩定幣報價貨幣回測加密貨幣模擬交易
← 所有文章