Polymarket 做市 判死
每天的損益表都是正的,錢包沒動
3,996 字 · 約 11 分鐘
20 天真倉、$1,295.95 本金,帳面應得 +$78.86,錢包實際 +$6.36。差額 −$72.50 全在庫存裡。60 秒 markout 在一小時成交個位數的簿子上是雜訊不是損益,整張損益表用錯了時間尺度。
在預測市場做獎勵型的雙邊掛單,2026-07-31 到 08-19 共 20 天,本金 $1,295.95,結束時 $1,302.31。淨賺 $6.36,+0.49%。2026-08-19 撤資,基礎設施留著,市場追蹤器還在跑。
這條線的問題不是虧錢。是每天的損益表都是正的,而錢包幾乎沒動。
一、帳面 +78.86,錢包 +6.36
先把帳攤開。這三項各自有各自的資料來源,不是同一份檔案裡的三個欄位。
| 項目 | 20 天合計 |
|---|---|
| 累計獎勵(平台結算) | +93.34 |
| 其中未達派發門檻被沒收 | −3.00 |
| 60 秒 markout(99 筆成交) | −11.48 |
| 帳面應得 | +78.86 |
| 錢包實際變動 | +6.36 |
| 無法解釋的差額 | −72.50 |
差額不是記帳錯誤,差額就是這篇的發現。它全部在庫存裡:在帶內買到但從來沒有回歸的部位、進場價與出場價之間的價差、以及最後買方掛單歸零的持倉。
而庫存本身還被高估了,這個有量到。 2026-08-19 全部清算那天給了一次結算精確的對照:最後一次以中價標記的庫存是 $388.93,實際賣出只拿回 $304.88 —— 中價標記高估 $84.05,也就是 21.6%。這個誤差比上面那個 −72.50 的缺口還大。兩者的會計基礎不同,不能直接相抵,但它示範了機制:帶著的庫存長期只值日報表上宣稱的八成左右,而日報表裡沒有任何一個欄位看得出來。
中價在這種簿子上本來就是錯的標價方式,因為它是兩邊的平均,而其中一邊常常是空的。19 個市場的出場深度分布裡,有 3 個的低四分位深度剛好是 $0(完全沒有買方),另有 6 個在 $50 以下,最好的一個是 $2,404 —— 這個分布不只是寬,是極端。清算那天有三個部位一路帶著非零的中價標記,賣出時拿回 $0:沒有任何買單。
錯誤的形狀很精確:部位大小本來就是照出場深度定的,錯的是拿一個深度感知的規則去進場,卻用一個深度無感的價格去標記結果。 進場問的是「我出得掉多少」,記帳問的是「中間價是多少」——兩個問題不一致,而不一致的那部分就靜靜累積。同一批部位、同一天,改用走簿子的方式估價,誤差只有 1.7%;中價是 21.6%,差了 13 倍。
我標註過這個限制,而標註不等於量化
資料集的說明檔裡我早就寫了一句:庫存以中價計價,會比真實可變現的價值樂觀「大約一個買賣價差」。那看起來像盡了披露義務 —— 限制講了,方向也對。
而它錯了一個數量級,而且錯了三個星期。
它之所以沒被抓到,正是因為它被寫下來了。一句誠實的但書會讓人覺得這件事已經處理過,於是沒有人回去量它 —— 包括寫下那句話的我自己。把它量出來的是另一個人:對方說「我認為你低估了,而且我有數據支撐」,我才去對帳。
標註一個限制不等於量化它。而在讀者眼裡,未量化的限制跟已量化的長得一模一樣。
這是〈檢查因為錯誤的理由而通過〉的一個新變體:披露做了,但披露的內容是錯的。 它比不披露更難抓,因為它會消耗掉本來會拿去查證的那份注意力。
那 99 筆成交的 markout 分布長這樣:平均 −$0.136、中位數 +$0.009、標準差 $0.763、67.7% 的成交是正的、t = −1.78(n=99)。中位數是正的,平均是負的。這個形狀有名字:大多數時候撿到幾分錢,偶爾被一筆大的吃掉。在新聞前面撿銅板就長這樣。t=−1.78 在 5% 水準下不顯著,所以嚴格講我甚至不能宣稱 markout 是負的。1
markout 的定義本來就綁在時間區間上。Databento 的微結構說明寫得很直白:markout 是「某個事件前後某段任意時間區間內的價格變化」,而且業界的標準做法是在多個時間區間各算一次、疊成一條曲線(Databento microstructure guide,查證日期 2026-08-27)。
我只算了一個點,而且挑了對這個市場最沒有意義的那個點。真實的時間尺度是「天」,因為部位真的抱了那麼久。一個 60 秒的 markout 不是損益表。它只是一個 60 秒的 markout。
二、事前模型高估了 12.8 倍
每天收盤我都留一份「模型預測今天會賺多少」跟「實際結算多少」的對照。2026-07-31 到 08-19 這 20 天的高估倍數中位數是 12.8 倍,範圍從 1.0 倍到 177.6 倍。原因只有一個:競爭者是從看得見的簿子估出來的。
獎勵計分把兩邊的掛單取最小值,再依離中價的距離二次加權。這個形狀會讓一個「看起來很薄」的簿子拿到遠高於外觀的分數。所以我以為沒人在那裡,其實有人在那裡,而且他站的位置比我好。
唯一活下來的估法是反解:拿昨天實際收到的分潤,去解出「要有多少競爭分數才會讓我只拿到這個比例」。 換成實測校準之後,預測落在 2 倍以內。2026-08-01 之後的每一個配置決定都用實測值,不用模型值。
這件事跟美股那條線的稽核是同一個病:我的回測說 13.25 倍,稽核完剩 2.26 倍 裡三個 bug 全部朝「策略看起來更好」的方向偏。這裡也是。沒有一天是低估的,2026 年 8 月那 20 天全部高估。單向偏差表示偏的不是程式,是我對「競爭有多激烈」的預期。
三、找到的 edge 都在 4 到 8 天內死掉
校準迴圈確實找到了東西。三個市場被判定為真的錯價,也真的下了錢。三個全死。
| 市場 | 進場時實測分潤 | 存活 | 怎麼結束的 |
|---|---|---|---|
| A(足球聯賽期貨) | 26% | 8 天 | 份額掉到約 1.5%,一個大做市商搬進來 |
| B(籃球名單) | 10% | 4 天 | 獎勵池從每天 $33 砍到 $7 |
| C(娛樂類) | 11% | 6 天 | 平台直接終止該市場的獎勵池 |
三種死法,沒有一種是我做錯什麼。收入 = 發現速度 × edge 壽命。 壽命只有幾天的時候,每日重新校準的那個迴圈不是輔助功能,它就是策略本身。一個靜態配置放著不動,兩週之內會歸零。
這是零和的分潤池:每一個找到同一個縫的人,都在稀釋所有已經在裡面的人。我找得到,別人也找得到,而且對方的資本比我大一個數量級。
四、「放得大」跟「池子大」在結構上互斥
我原本以為關卡是競爭分數。錯了,關卡是出得來的深度。 我每分鐘量一次「中價附近一小段價格區間內,買方總共掛了多少美元」,逐市場記錄分布。這個數字決定一個市場能不能放大,而它跟池子大小的關係是反的:
- 大池子(每天 $126 到 $186):簿子很深,但專業做市商早就住在裡面。我的實測分潤只有 0.0% 到 0.4%。要拿到有意義的份額,每一邊得放 $28,000 到 $280,000。
- 高份額市場(我能拿 2% 到 3%):沒人跟我搶,是因為沒有人要。其中好幾個的買方深度只有 $0 到 $2。進得去,出不來。
- 兩者的交集:約 280 個通過基本條件的市場裡,有 2 個。
一個有真實深度的市場會吸引專業做市商;一個沒有專業做市商的市場,它沒有深度是有原因的。交集是一個短暫的錯價,而那正是上一節會發生的理由。這條結論跟 出場規則換一下,同一批交易從 −86% 變 +3% 是同一件事的兩個版本:進得去不等於出得來,而回測與掛單簿快照都只會告訴你進得去。
五、平台層面的結構性阻礙
這幾項每一個都花掉了真實的時間或真實的錢。
派發門檻是錢包層級,不是單一市場。 有一天我在 62 個市場總共累積了 $3.00,一毛都沒拿到。另一天累積 $12.40,UTC 午夜之後 23 秒全額入帳。我當時的策略是廣度優先:很多市場、每個賺幾分錢。那個策略正在無聲地把自己的收入沒收掉,而且損益表上看起來一切正常。
成對的 YES 與 NO 在恆等式上就是 $1,但我合不起來。 Gnosis 的條件式代幣框架文件寫得很清楚,合併部位「做的正好是拆分的反向操作,它銷毀較深層部位的條件式代幣,去鑄造較淺層的部位或把擔保品送回呼叫者」(Conditional Tokens developer guide,查證日期 2026-08-27)。
問題在於這類市場走的是另一層轉接合約,它「讓使用者把互斥二元市場中的一組 NO 代幣,轉換成對應的 YES 部位與擔保品」(Polymarket neg-risk-ctf-adapter 文件,查證日期 2026-08-27)。
而我用的免手續費代發服務只放行條件式代幣合約本身,擋掉那層轉接合約。從自己的位址直接送也會被打回來:那個工廠合約有鏈上的呼叫者白名單。我用 eth_call 從我的位址跟代發服務的位址各試了一次同一個良性呼叫,只有後者會過。結論是:帳面上白撿的 $1 我拿不到,最後只能在簿子上把兩隻腳分別賣掉出場,成本 1.1%。
15 天內三次平台中斷(2026-08-05、08-13、08-19):一次進入 post-only 模式、一次直接停止交易、一次下單逾時。三次引擎都照設計把部位歸零,沒有一次造成損失。
交易所的歷史查詢對超過約 7 天的資料回空。 這件事的後果很惡毒:一個累計損益的總和會自己縮水。它不會報錯,它只是每天少給你一點。歷史收益後來改成只讀本機的每日快照。
六、我自己的程式壞了六次
下面六個缺陷都發生在 2026-07-30 到 08-19 的實盤期間,每一個都通過了所有測試,然後在正式環境被找出來。2
- 看門狗把一個複合指令丟到背景,抓到的是子 shell 的行程編號而不是行程本身。存活檢查永遠失敗,於是它一直重複啟動引擎。
- 系統服務的預設終止模式會連同子行程一起殺掉,所以每次重啟外層機器人,交易引擎跟著死。它會被發現只是因為引擎的終止處理函式會撤單,撤單紀錄露出了馬腳。
- 一個模組在被匯入時重新包裝了標準輸出。某個合併流程匯入了它,引擎於是在自己的日誌上崩潰重啟,連續 33 小時。
- 一個永遠不可能成功的合併每 10 分鐘重試一次,把代發服務的流量配額耗盡,所有錢包操作被封鎖約 10 小時。
- 跳價偵測用的是依掛單量加權的微價格,視窗以「筆數」計算。在薄簿子上,掛單量的來回變動會被讀成價格跳動,而舊的跳動又一直重新觸發。兩個市場整整一天處於暫停狀態,什麼都沒賺。改成用最佳買賣價的中價、視窗改成以時間計算之後就好了。
- 目標清單的長度截斷發生在「篩出活躍市場」那個過濾之前,所以新加入的市場被安靜地丟掉。一個已經部署的配置實際上什麼都沒有掛,而日誌上沒有任何錯誤。
七、追蹤器還開著
資金撤了,掃描沒停。2026-08-02 起每 6 小時一次,到 2026-08-27 累積 98 次掃描。
| 淡季基準 | 觀測範圍 | 中位數 |
|---|---|---|
| 全體獎勵池(每天) | $769 – $2,048 | $1,066 |
| 通過基本條件的市場數 | 192 – 314 | — |
| 同時通過深度關卡的市場數 | 1 – 5 | 3 |
重新投入的條件已經寫死在追蹤器裡,數值不公開。最近一次掃描(2026-08-27 00:05 UTC,全體獎勵池 $1,168、通過深度關卡的市場 4 個)沒有達到。
有一個變化值得記下來:美式足球在 2026-08-22 成為單一類別中最大的一塊,每天 $652。但通過深度關卡的市場數沒有跟著上升。池子在長,好市場沒有變多。市場變多不等於市場變好。
這條線的結論
系統是對的。每一項風險控制在正式環境都正確觸發過,2026 年 8 月的三次平台中斷都沒有損失資金,校準迴圈真的找到了三個真的錯價。策略是錯的:20 天,$1,296 本金,$6.36。
綁住這條線的從來不是執行品質,也不是基礎設施。是那個可利用集合大概只有兩個市場,而且每一個在一週之內就不再可利用。所以這條線標「判死」,不是「未證實」。未證實的意思是樣本不夠、還在累積;這條的樣本夠了,它告訴我的是規模上限,不是機率。逐日的權益曲線在績效頁,判死與未證實怎麼分寫在方法論。3
常見問題
+0.49% 是正的,為什麼要撤資? 因為那 0.49% 是靠每天重新校準撐出來的,而 edge 的壽命是 4 到 8 天。這不是一個「放著就會繼續賺」的部位,它是一份每天都要重做一次的工作,換算年化約 9%。以這個資本規模,工作量與報酬不成比例。撤資的原因是規模,不是虧損。
−$72.50 的差額有沒有可能只是記帳錯誤? 錢包的變動是鏈上結算的事實,起訖各一個數字,沒有詮釋空間。帳面那三項各自來自平台的收益查詢、成交紀錄與 60 秒中價快照。差額的方向也跟 markout 的形狀一致:中位數為正、平均為負,代表少數幾筆大的逆向成交。庫存吃掉獎勵,這就是它的樣子。
60 秒 markout 為什麼會錯這麼多? 因為它量的是「成交後 60 秒的中價」,而在一小時成交個位數的簿子上,那 60 秒裡通常什麼都沒發生。真正讓部位虧錢的事件發生在幾天之後:對手方消失、買方掛單歸零、市場被平台終止。這些沒有一件會出現在 2026 年 7、8 月那批成交的 60 秒視窗裡。
這條線會不會回來? 追蹤器留著就是為了這個。重啟條件已經寫好,2026-08-27 那次掃描沒達到。要注意的是,賽季旺季會讓獎勵池變大,但這篇第四節的結構問題不會因為池子變大而消失,只會讓交集的那兩個市場變成三個或四個。