31. elokuu 2026 · ennustemarkkinat

Mikä menee pieleen ennustemarkkinoiden backtestauksessa: kahdeksan päivän päiväkirja

Mikä menee pieleen ennustemarkkinoiden backtestauksessa: kahdeksan päivän päiväkirja

Ennustemarkkinat näyttävät maailman helpoimmalta asialta backtestata. Hinta on välillä [0, 1]. Tuotto on dollari tai ei mitään. Ei vipua, rahoituskuluja, basis-eroa eikä perpetual-swapien kummallisuuksia kello 00:00 UTC. Meillä oli jo backtester, joka käsitteli kryptoperpejä kuluineen, rahoituskuluineen ja hintavaikutuksineen, joten suunnitelmana oli käyttää 2 päivää sen muokkaamiseen ja alkaa sitten kehittää strategioita.

Siihen meni 8 päivää. Tässä loki suunnilleen tapahtumajärjestyksessä, mukana päivä, jolloin osakekäyrä näytti uskomattomalta — ja todella olikin.

Päivä 1: adapteri, jonka olisi pitänyt olla helppo tehdä

Alkuperäinen vastaavuus oli yksi yhteen ja näytti siistiltä. Markkina on instrumentti. YES-hinta on hinta. YESin ostaminen on pitkä positio, NO:n ostaminen lyhyt. Ratkeaminen pakottaa position sulkemaan hintaan 1.00 tai 0.00. Syötetään tuntihintasarja samaan tapahtumasilmukkaan ja valmista.

Tämä vastaavuus kestää noin 90 minuuttia kosketusta oikeaan dataan. Ensimmäisenä hajosi tuottosarja. Koko riskikerroksemme — position mitoitus, volatiliteettitavoittelu ja Sharpe-raportointi — oletti, että jatkuvalla instrumentilla on log-tuotot. Markkinan hinnan putoaminen 0.04:stä 0.00:aan tarkoittaa määrittelemätöntä log-tuottoa ja määriteltyä kokonaistappiota. Lisäksi markkina, jonka hinta on 0.04 3 päivää ennen ratkeamista, on aivan eri olio kuin markkina, jonka hinta on 0.04 4 minuuttia ennen sitä, vaikka molemmilla riveillä lukee 0.04.

Päädyimme parametrisoimaan koko sarjan uudelleen jäljellä olevan ratkeamisajan, emme seinäkellonajan, mukaan sekä käsittelemään PnL:n toteutuneena lopputuloksena mark-to-market-arvon sijaan. Se oli oikea ratkaisu ja teki kaiken sen jälkeisen raportointikoodin käyttökelvottomaksi.

Päivä 2: kulukaava on strategia

Kalshilla kaupankäyntikulu ei ole korkopisteinä laskettava vähennys. Se on hinnan suhteen neliöllinen: suunnilleen 0.07 × contracts × P × (1−P), pyöristettynä ylöspäin senttiin toimeksiantotasolla. Kulua kertyy siis eniten juuri silloin, kun kolikonheittoa muistuttava markkina on kiinnostavimmillaan, ja ääripäissä kaupankäynti on lähes ilmaista.

HintaKulu sopimusta kohtiTarvittava etu (todennäköisyyspistettä)Kulu panoksesta
5¢0.33¢0.336.7%
10¢0.63¢0.636.3%
25¢1.31¢1.315.3%
50¢1.75¢1.753.5%
75¢1.31¢1.311.8%
90¢0.63¢0.630.7%
95¢0.33¢0.330.35%

Kolmas sarake kertoo olennaisen: päästäksesi omillesi, kun ostat 50¢:lla ja pidät position ratkeamiseen asti, todennäköisyysarviosi täytyy ylittää markkinan arvio 1.75 pisteellä. Ei 1.75 prosenttia suhteellisesti, vaan absoluuttisesti. Jos suljet position ennen ratkeamista pidon sijaan, maksat kulun kahdesti, spreadin lisäksi.

3.5%yksisuuntainen kulu 50¢:ssa osuutena panoksesta
1.75ppomillesi pääsemiseen vaadittava todennäköisyysetu tässä hinnassa
1ratkeaminen instrumenttia kohti koko sen elinaikana

Polymarketin CLOBissa on historiallisesti ollut hyvin erilainen kulurakenne: itse kaupasta veloitetaan vähemmän, lähes nolla, joten kustannukset siirtyvät spreadiin ja syvyyteen. Saman strategialogiikan talous on siis kahdella eri kauppapaikalla täysin erilainen, ja eri kauppapaikkojen vertailu yhdellä kulumallilla on fiktiota. Käytämme nyt kauppapaikkakohtaista kulufunktiota yksittäisen vakioarvon sijaan.

Jos luet ennustemarkkinoiden backtestiraportista vain yhden rivin, lue kulut todennäköisyyspisteinä. Strategia, jonka ennuste-edun väitetään olevan 1.2 pistettä 50¢:n markkinoilla, tuottaa Kalshilla tappiota jo ennen ainoatakaan muuta kulua. Tämän pitäisi näkyä ensimmäisellä sivulla, eikä lukijan pitäisi joutua päättelemään sitä itse.

Päivä 3: order book on porrastettu ja matala

Hintavaikutusmallimme oli BTC-perpien order bookeilla kalibroitu neliöjuurifunktio. Se on väärän muotoinen. Kun 1¢:n tikki on $1:n instrumentissa, koko order bookissa on vain 99 mahdollista hintatasoa, ja keskimääräisen likviditeetin markkinassa ylimmällä tasolla voi olla parisataa sopimusta ja sen jälkeen tyhjä väli.

Tässä on otos talousdatan markkinasta, jota seurasimme YES-puolella noin 30 tuntia ennen ratkeamista:

TasoMäärä (sopimusta)Ostojen kumulatiivinen kustannus
42¢310310 @ 42.0¢ keskihinta
43¢85395 @ 42.2¢ keskihinta
45¢140535 @ 42.9¢ keskihinta
49¢6001,135 @ 46.1¢ keskihinta

1,000 sopimuksen toimeksianto — 500 dollarin riski, kryptossa pyöristysvirhe — siirtää efektiivistä hintaa 4 senttiä. Se on yli kaksinkertainen kuluun nähden. Tässä ei ole sovitettavissa mitään tasaista funktiota; order book pitää käydä taso tasolta läpi tai luvut ovat keksittyjä. Poistimme neliöjuurimallin tästä omaisuusluokasta ja kirjoitimme kirjaimellisesti order bookia askeltavan toteutuksen, joka on hitaampi mutta oikea.

Jossain vaiheessa huomasin ärsyyntyväni siitä, että nämä markkinat ovat "liian pieniä merkitsemään mitään". Ne ovat pieniä, koska hinnoiteltavana on yksittäinen tosielämän kysymys, jolla on määräaika, eikä keskiviikkona ole kovin montaa ihmistä, joilla on mielipide Yhdysvaltain uusista työttömyyskorvaushakemuksista. Koko on markkina. Siitä valittaminen on kuin valittaisi, että pokeripöytään mahtuu vain 9 pelaajaa.

Päivä 4: päivä, jolloin osakekäyrä oli kaunis

Sharpe 4.1 1,400 markkinassa. Tasainen. Jokaisen tutkijan vatsan pitäisi pudota tätä katsoessa — omani putosi lopulta, noin 40 minuuttia sen jälkeen, kun olin jo ottanut kuvakaappauksen.

Bugi oli resamplauksessa. Epälikvidien markkinoiden hintahistoria tulee takaisin epäsäännöllisin aikaleimoin, joten indeksoimme sen uudelleen tasaväliseen tuntiruudukkoon. Jokaisen arkistoidun sarjan viimeinen piste on settlement-arvo, 1.00 tai 0.00. Uudelleenindeksoinnissa käytettiin lähimmän naapurin täyttöä ilman rajoitusta täytön suunnalle, joten markkinoissa, joiden viimeisestä kaupasta oli ratkeamishetkellä useita tunteja, settlement-arvo levisi aukon yli taaksepäin. Malli luki huomisen vastauksen tämän päivän riviltä juuri niissä epälikvideissä markkinoissa, joissa se pystyi kasvattamaan positiota syvyysrajoihin törmäämättä.

Lähimmän naapurin täyttö toimii jatkuvalla instrumentilla. Instrumentissa, jonka viimeinen havainto on totuus, se on tulevaisuuteen kurkistava kone. Varmistamme nyt assertilla, että jokainen täyttö tehdään vain eteenpäin ja että settlement-rivi merkitään ja suljetaan kaiken ominaisuuslaskennan ulkopuolelle. Assert on 9 riviä pitkä ja arvokkain koodi, jonka kirjoitimme koko viikolla.

Päivät 5–6: 1,412 markkinaa, noin 180 vetoa

Ennustemarkkinoiden otoskoko on ansa ystävällisillä kasvoilla. Ratkaiset 1,412 markkinaa, kuvittelet saaneesi 1,412 havaintoa ja lasket niiden perusteella t-tilaston. Mutta saman sunnuntain 14 NFL-ottelua jakavat sääjärjestelmän, loukkaantumisraportin julkaisun ja yhteisen vedonlyöjävirran. 51 osavaltiotason vaalimarkkinaa jakavat yhden kansallisen kannatusmuutoksen. "Tapahtuuko X 31. maaliskuuta mennessä" ja "tapahtuuko X 30. kesäkuuta mennessä" ovat sama veto eri päättymisajoilla, ja ne ratkeavat yhdessä.

Ryhmittelimme markkinat niiden taustalla olevan tapahtumalähteen ja ratkeamispäivän mukaan, jolloin riippumattomien havaintojen efektiiviseksi määräksi tuli noin 180. Se ei riitä erottamaan todellista etua kohinasta niillä vaikutuskooilla, joita tarkastelimme. Mikään markkinakohtainen bootstrap ei korjaa tätä, koska bootstrapissa pitää poimia uudelleen ryhmiä, ei rivejä. Jos tämän tekee väärin, merkitsevyys paisuu hiljaisesti 2–3-kertaiseksi.

Päivä 7: myös ratkeaminen on todennäköisyysjakauma

Asiat, joita emme olleet mallintaneet lainkaan ja jotka opimme kantapään kautta:

Lisäsimme simulaattoriin pitoajan kustannustermin ja ratkeamispäivän satunnaisvaihtelun. Kumpikaan ei ole tarkka. Molemmat ovat parempia kuin oletus, että ratkeaminen tapahtuu varmasti juuri ilmoitettuna päivänä.

Päivä 8: mitä jättäisimme väliin ja mitä tekisimme ensin

  1. Jättäisimme tuottopohjaisen rungon kokonaan tekemättä. Älä sovita volatiliteettitavoitteluun perustuvaa riskikerrosta instrumenttiin, jonka tuotto realisoituu lopussa. Kirjoita vedon mitoituskerros, joka toimii todennäköisyyksillä ja panoksilla. Käytimme 2 päivää vanhan kerroksen sovittamiseen.
  2. Rakentaisimme kulufunktion ennen strategiaa. Tulosta omillesi pääsemiseen vaadittavan edun käyrä jokaiselle kauppapaikalle, jossa aiot käydä kauppaa, ja kiinnitä se seinälle. Se karsii noin puolet ideoista ennen kuin ne ehtivät kuluttaa backtest-ajon resursseja.
  3. Kävisimme order bookin läpi ensimmäisestä päivästä lähtien. Jatkuvalta markkinalta tuotu parametrinen hintavaikutusmalli on väärässä tavalla, joka saa tuloksesi näyttämään todellista paremmilta.
  4. Ryhmittelisimme ennen laskemista. Päätä efektiivisen otoskoon ryhmittelyavain samalla kun päätät markkinajoukon, älä vasta sen jälkeen kun olet saanut mieleisesi Sharpen.
  5. Lisäisimme assertin täytön suunnalle. Yksi rivi jokaista yhdistämistä kohti. Jos sarja päättyy totuuteen, käsittele takautuva täyttö lähtökohtaisesti bugina, älä asiana, jonka ehkä huomaat koodikatselmoinnissa.

Kahdeksaan päivään kannatti käyttää aikaa, lähinnä siksi, että ennustemarkkinat riisuvat pois sen epäselvyyden, jonka ansiosta kryptobacktesteissä on niin helppo huijata itseään. Ei rahoituskorkoa, jonka voisi kuitata olankohautuksella, eikä kiistaa mark-hinnan tulkinnasta. Vain kysymys, määräaika ja vastaus. Kun backtest on täällä väärässä, virheen voi osoittaa sormella.

ennustemarkkinatbacktestauskulutmarkkinamikrorakennedata engineering
← Kaikki kirjoitukset