bet.knuths.dev Metod & backtest

← tillbaka till labbet

Därför "ingen mätbar kant"

Innan en enda pappers-signal loggades testades strategin mot historiken: 24 643 matcher (6 säsonger × 12 ligor, fria data). Slutsatsen är ett nej — ingen kant som överlever ärlig granskning — och det är själva poängen. Det här experimentet mäter och visar Closing Line Value (CLV) ärligt, i förväntan att den ligger runt noll. Att ta reda på det kostade en eftermiddag i stället för ett år av live-papper. Endast på papper, inga vinstlöften.

Vad som testades

För varje match: räkna bort marknadens marginal (vig) från förmatch-oddset → rättvisa sannolikheter; ta det enskilt bästa EV-utfallet (max ett spel per match) och avgör på resultatet. CLV mättes mot marknadens skarpaste stängningslinje — den lågmarginal-referensbok som proffs använder som facit (aldrig namngiven här). Urvalet använder bara förmatch-data — verifierat utan look-ahead. Samma rena eval.mjs-kärna som live-motorn kör.

Det ärliga resultatet

MåttUtfallBetydelse
Yield (obiaserat vinstmått)varje 95 % KI spänner nollIngen signifikant vinst. De iögonfallande punktvärdena är longshot-varians.
Renare adjSharpΔ−1,4 % till −2,5 %Den skarpa linjen rör sig svagt bort från våra val → mild anti-kant, inte en kant.
fairCLV (off-pris)−0,3 % till +6,6 %Övre, uppåt-biaserade parentesen. Tillsammans med adjSharpΔ ringar de in ~0.
Kontrollerhemma/favorit svagt neg., adjSharpΔ ≈ 0Avgörings-motorn + de-marginal-baslinjen validerade.

Parenteslogik: två CLV-mått med motsatt bias ringar in det sanna. Den rena undre parentesen ligger svagt negativt, den övre svagt positivt; intervallet omsluter noll. Ihop med det obiaserade yield-KI:t som spänner noll → kant ≈ 0, troligen svagt negativ före kostnader. Efter marginal, gränser och möda: negativ.

Vad den adversariella granskningen fångade

En multi-agent-granskning hittade en winner's-curse-fälla i det första "de-vig-fria" måttet: att välja på ett pris och sedan poängsätta mot samma pris biaserar måttet negativt även på en noll-kant-marknad. Det första körningens självsäkra "−2 % till −4,6 %" var överdrivet. Rättningen: välj på den de-viggade marknads-konsensusen (mestadels skild från priset som poängsätter) → fällan bryts, och den visas sida vid sida med den kontaminerade versionen så artefakten syns. Det här är experimentets kärna: publicera även det som talar emot en själv.

Tre oberoende bevislinjer

  1. Värde-backtesten — ingen CLV som överlever (ovan).
  2. 13 förregistrerade nisch-strategier — fixerade i förväg (favorit–longshot, hemma/oavgjort/borta, stora vs mjukare ligor, starka favoriter, Over/Under 2.5), en fast EV-tröskel, Bonferroni-korrektion, separat upptäckts- och hålldata. Ingen av de 13 passerar. Ogatade kontroller (spela biasen på varje match): alltid-favorit −4,3 %, alltid-hemma −6,1 %, alltid-over −4,9 %, alltid-under −6,1 % — alla förlorar mot marginalen.
  3. En walk-forward Poisson-modell (lagstyrka, Dixon-Coles-stil) — en sämre förutsägare än marknaden i varje liga:
Förutsägarelog-loss (lägre = bättre)
Poisson-modell (bara mål)1,004
Marknad förmatch (de-viggad)0,978
Marknad stängning (de-viggad)0,975
Ingen skicklighet (1/3)1,099

Modellen lär sig (slår ingen-skicklighet med 0,095) men är en stabilt sämre förutsägare än marknaden (+0,026 till +0,029 i alla 12 ligor). Marknaden prisar redan in lagstyrka och det ingen publik modell ser — laguppställningar (~1 h före), skador, skarpa pengar. Slutsats: ingen odds-härledd signal slår stängningslinjen, i vare sig 1X2 eller O/U 2.5 — precis vad en effektiv marknad förutsäger.

De-vig-kalibrering

Vigen kan tas bort på flera sätt; de skiljer sig i hur de behandlar favorit–longshot-biasen. Varje metods stängnings-sannolikheter poängsattes mot faktiskt resultat över hela urvalet (24 682 matcher, snitt-överrunda 3,02 %) — lägre log-loss = bättre kalibrerad = ärligare CLV-ankare.

Metodlog-lossBrier
power0,975240,58041
shin0,975300,58044
oddsratio0,975320,58045
proportional (standard)0,975580,58059

Alla bias-korrigerande metoder slår standard-proportional, och power är bäst — men glappet är pyttelitet (~0,03 % relativ log-loss). Med en lågmarginal skarp bok (3 % överrunda) finns knappt någon vig att fördela om. Standard är därför kvar proportional (transparent, oförändrad); power finns via BET_DEVIG=power. Ingen kant antyds — det här är mät-rigor för CLV.

Så väljer live-motorn signaler

  1. De-vig — marginalen räknas bort från flera bookmakers odds (aldrig namngivna).
  2. Konsensus — ett de-vig-snitt av böckerna blir det skarpa, kontolösa ankaret; en leave-one-out-variant används vid urval så en enskild avvikande bok inte driver valet. (Valfritt marginal-viktat läge BET_CONSENSUS_WEIGHT=margin: skarpare böcker med lägre marginal väger mer — på båda ankarna, annars uppstår open/close-skevhet.)
  3. Z-grind — signalen måste avvika signifikant från konsensus (spridning i stdev), inte bara ha positivt EV. (Valfritt BET_Z_MODE=fair: mät ren fair-mot-fair-oenighet i stället för vig-laddad EV-signifikans.)
  4. EV-tröskel — förväntat värde mot ankaret måste överstiga en fast tröskel.
  5. Bråkdels-Kelly — en konservativ Kelly-formel (kvarts-Kelly, tak 2 % av pappers-kassan) räknar den hypotetiska insatsen.
  6. CLV mäts — nära avspark fångas stängningslinjen och CLV bokförs (resultat-oberoende). Det är det enda ärliga kant-testet, och det pendlar runt noll.

CLV-formeln: fairClvBps = round(10000 × (pFair_close / pFair_open − 1)) — hur mycket den de-viggade fair-sannolikheten för vårt val rörde sig öppning→stängning. > 0 = den skarpa linjen rörde sig mot oss. Samma estimator (full konsensus) på båda sidor (#152), så CLV≈0 visas med 95 % konfidensintervall — en prövad hypotes, inte ett antagande.

Inga spelbolag namnges eller länkas; inga riktiga pengar; ingen mätbar kant. Live-CLV:n på startsidan är samma sak fast framåt i tiden.

Reproducera

Allt är kontolöst och beroendefritt (Node ≥ 18):

cd infra/bet && node backtest.mjs      # laddar + cachar CSV:er, skriver rapporten
node infra/bet/devig-compare.mjs        # de-vig-kalibrering (cachad data)
node infra/bet/backfill.mjs             # CLV på 24 686 matcher (1X2 + O/U 2.5)

Den sista raden bygger den historiska backfillen (#166) som visas på startsidan: samma de-vig + CLV-motor körd över hela den fria korpusen — CLV pendlar runt noll även där, på en andra oberoende marknad (Över/Under 2.5). 0 API-krediter.

Rå-rapporten med kolumn-semantik: infra/bet/RESULTS.md i repot. Kända begränsningar (KI:n antar i.i.d. men fotboll klustrar; longshot-yield är tjocksvansad; tröskelskanet är okorrigerad multipeltestning) pekar alla mot mer försiktighet om ett positivt påstående — så "ingen kant"-slutsatsen är konservativt säker.

← tillbaka till det levande CLV-labbet