Soccer xlow tracker

snapshot 2026-11-11 08:32 · frozen rule since 2026-07-05 · caps $1/order both venues
Kalshi total
$0.00
cash $0.00 · pending $0.00
primary $0.00
Poly-US total
$0.01
cash $0.01 · pending $0.00
At risk
$0.00
0 open
Fwd ROI/bet
+9.4%
n=1096 · z=+1.91
WR vs implied
+2.4%
26.0% vs 23.6%
xlow paper (not real)
$1,034.89
bankroll $2,034.89 from $1,000.00
n=1096 · +9.4% · WR 26% vs 24% implied
frozen 2026-07-05
Live maker STALE (0 resting)
Last postRestingPlaced 1hLegs postedFilledStrand rateExposureBalance
61722m ago00217755116%6/380 ct$0.0022
download raw data: book dataset (analysis-ready) (882 rows, 166KB)  ·  legs offered (8.9MB — too large to embed)  ·  fills (641 rows, 92KB)
book dataset — column glossary (34 fields)
One row = ONE BOOK we quoted, with every feature taken AT OPEN — what could have been known when the decision to open it was made. Anything measured later is downstream of the outcome, because a book that fills a leg gets re-priced by the budget rule. Outcome is complete. Filter on legs_quoted==3: a book where only two legs were ever offered cannot complete, and leaving those in understates the rate.
columnmeaning
venue'kalshi' or 'polyus'. Both makers quote the same fixtures on different venues with different economics -- Kalshi CHARGES the maker 0.0175*p(1-p), Poly-US CREDITS 0.0125*p(1-p) -- so break-even completion differs and the two must never be pooled without splitting on this.
eventEvent/market identifier -- one match, one row.
leagueDivision code.
ts_openWhen the first leg of this book was first posted.
hrs_to_ko_openHours to kickoff when the book was opened. LEG fill rate climbs into kickoff (26.1% inside 30min vs 6.8% beyond 24h) but BOOK completion moves the other way: among books that took a leg, with the entry gate held fixed, strand rate is ~17% under 6h against ~9% over it. A late book fills a leg and runs out of time to finish, which is the expensive half. MIN_OPEN_H=6 exists for this.
legs_quotedHow many of the three legs were ever offered. A book with <3 CANNOT complete -- filter on ==3 for a clean completion question.
gross_c_openSum of the three asks at open, minus 1.00, in cents. The overround the book was opened on, and the variable the entry gate tests. Blank unless all three legs were quoted.
pin_sum_openSum of Pinnacle fair probabilities across the legs. Should be ~1.00; deviation flags a stale or mismatched fair.
ask_max_openHighest leg ask at open -- the favourite. Favourites fill far more often (49.7% vs 17.7% for draws), which is how a book strands short the leg most likely to win.
ask_min_openLowest leg ask at open -- the longshot.
spread_c_meanMean ask-minus-bid across the legs at open, in cents. Mostly 1c: the venue prices on a 1-cent grid.
queue_ahead_minSmallest queue ahead of us across the legs. The easiest leg to fill.
queue_ahead_maxLargest queue ahead of us. The hardest leg -- and a book completes only if its WORST leg sells.
book_volume_openContracts traded across all three legs. The strongest single completion predictor found so far (+0.091 AUC); min-leg volume was null (rho +0.095, p=0.189).
leg_volume_minVolume on the thinnest leg. Kept because the paper-era gate used it -- it did NOT replicate live, so treat a result here with suspicion.
open_interest_sumOpen interest summed across the legs.
n_posts_totalRe-posts across every leg. A proxy for how long the book was worked.
minutes_exposed_maxLongest any single leg sat on the book.
is_xlow_any1 if the frozen xlow rule fired on this fixture (either side), else 0. Blank if the fixture could not be resolved.
is_xhigh_any1 if the frozen xhigh rule fired on this fixture. xhigh overlaps xlow heavily -- not an independent feature.
legs_filledOUTCOME. How many legs filled, 0-3, per the EXCHANGE fill record -- the authority. Maker fills only (post_only, so never taker), which also excludes xlow taker buys on the same tickers.
legs_filled_logThe same count derived from the LOCAL fills log, kept for comparison. It undercounts: the log joins on (ticker, price_cents) so a re-priced leg misses, and the log only records while the maker is up. On the 2026-08-28 audit the exchange said 115 books complete and the log-derived figure said 45. A large gap here means fills are being missed locally.
fill_source'exchange' normally; 'log' if the exchange could not be read, in which case legs_filled falls back and will undercount.
completeOUTCOME. 1 if all three legs filled. This is the number the strategy lives or dies on -- break-even was 61.4% on Kalshi.
leg_sold_firstWhich OUTCOME sold first, in 1X2 terms: '1' home, '2' away, 'X' draw. Blank when no leg filled, or when the abbreviation cannot be resolved against the event code. Derived from first_fill_side, which carries the Kalshi leg abbreviation ('CAT') rather than a side -- readable only if you know which team that was. A Kalshi event ticker ends in the two team codes concatenated (26AUG17GEMCAT = GEM at home to CAT), so the abbreviation is matched against that pair: prefix means home, suffix means away, TIE means draw.
first_fill_sideLeg abbreviation of the first leg to fill, blank if none did.
first_fill_secsSeconds from that leg being posted to it filling.
sizeContracts per leg the maker was working, from the largest leg. SIZE went 1 -> 3 on 2026-08-23 and mixing the two eras is a trap: a size-1 completion pays ~+$0.05 and a size-3 one ~+$0.20, so an average across both understates a good book threefold.
shapeOUTCOME, stricter than `complete`. 'unfilled' = quoted but never touched. 'clean' = three legs at the SAME size, the only shape that is actually hedged. 'ragged' = three legs at different sizes (a leg that took a 0.01-contract fill and never finished still reads complete). 'over' = a leg exceeded size, which means two orders rested at once. 'stranded' = fewer than three legs.
has_taker1 if WE traded this event as a taker -- xlow, or a manual trade. The maker is post_only so it never takes. Books with this set have P&L that is not the maker own: it is the difference between a -$3.22 maker and a -$53.05 account. NOT the same as is_xlow_any, which only says the SIGNAL fired (169 books) rather than that a trade happened (13).
armWhich pricing arm owned the book: 'budget' (a part-filled leg prices at exactly what the book still owes) or 'latch3' (the ratchet survives the fill but sits at most 3c above that budget). Blank for books opened before the split. From mm_arm_log.csv.
settled1 once every leg has settled and pnl is final.
pnlOUTCOME. Realised dollars, from the venue settlement records (revenue - cost - fees) summed across the legs. Blank until settled. This is the column every P&L question should be answered from; reconstructing it by hand is where the errors came from.
premium_over_budget_medMedian cents a part-filled leg was offered ABOVE what the book still needed, over the book's life. 0 under the 'budget' arm by construction; the old unbounded latch ran a median +1c with a tail to +54c, and that tail is what stranded books.
Strand rate, not fill rate: books that took at least one leg and did NOT complete, over books that took at least one leg. A book nobody touched is excluded — it cost nothing, and counting it only dilutes the number. A strand costs about −$0.69 against +$0.09 for a clean book, so break-even sits near 12% and the lifetime figure is 14%. Scoped to books opened on or after 2026-09-01, when the current maker (MIN_OPEN_H=6, 5 books) took effect — earlier books measure a maker that no longer exists. The n beside the rate is the whole caveat at this sample size.
89% optimistic ceiling. Kill switch: create the STOP_MAKER file in the project root.
Signals — today & tomorrow (0)
xlow paper equity — frozen 2026-07-05 (1096 bets, $10/bet)
primary — live rulez-gate shadow — in-sample, not evidence
+1,107$1,243-$252026-07-062026-11-08+1,035
DateLgMatchAsk / CLVFairCLV otherReal tradeResult
no signals
Result is scored at the paper notional ($10.00/bet), not at whatever the ledger happened to stake — so it matches the equity curve above and the paper KPI tile exactly. A win pays (1−ask)/ask units, a loss costs one.
Ask = the quoted price on each venue at signal time; the named (cheaper) venue is bold — that is what the bet costs. Fair = devigged Pinnacle probability. Two signals at the same CLV are very different bets at 0.14 and 0.47, and price is what drives the variance that makes this rule slow to measure.
z-gate marks a signal in a league the shadow exclusion rule currently sits out — below the floor on a point-in-time read of its own history, judged on results known BEFORE that row's date. Currently: F1, I2, SP2.
These rows are not removed and not altered. The signal fired, the bet is scored, and it still counts in the frozen forward test exactly as before — the mark only says what a rule that is not switched on would have done. Hiding them would put this table in disagreement with the number the test is accruing. See the League z-gate panel.
Open positions (0)
VenueMarketQtyCostValueFees
none open
SubaccountCashLongShortResting
primary #0$0.00000
subaccount 1 #1$0.00000
total cash$0.00across all subaccounts
The Kalshi app shows the primary subaccount only, so anything held outside it is invisible there — this table is the only place it shows up.
Forward test (out-of-sample)
RulenWRImpliedROI/betz
xlow (PRIMARY · scoped)109626.0%23.6%+9.4%+1.91
xlow_f10107526.5%23.9%+11.6%+2.03
t6029224.3%22.8%-4.1%+0.63
unique42625.6%26.3%-8.1%-0.36
overlap150822.3%23.0%-6.4%-0.71
xlow_polyus (USL/PL1/CH1)21628.7%30.0%-9.7%-0.43
Scope. The primary row is 20 leagues: the 20 the backtest was measured on — a universe fixed before this test started — minus BSA and CL1, plus NWSL. Leagues outside it are still scored, separately: the pooled and out-of-scope summary rows are no longer shown here, but both series are still written daily to forward_test_unique_book_log.csv, and every out-of-scope league still appears in the by-league table below.
PL1 and USL removed 2026-08-27. Neither has any Polymarket.com market, so the rule could never fire on them directly — they entered only through a Poly-US substitution the n=286 backtest never used, and that slice ran flat (+0.8% on n=71) while the Poly.com-confirmed legs ran +34.5%. They keep scoring in the by-league table, the daily CSV and the poly-US row, so nothing stops being measured; it just stops counting toward the frozen rule.
Read the primary with care. BSA and CL1 were removed on 2026-08-23 after they showed as the two worst leagues in the scope (−40.2% on n=35 and −75.2% on n=13). That is post-hoc selection, unlike the original backtest scope, which was fixed in advance. It moves the headline from +18.75% (z+1.37) to +34.46% (z+2.55) and nearly all of that is the two removals — so the z crossing 1.96 is manufactured by the choice, not earned by the rule. Everything before 2026-08-23 is in-sample for this scope; only bets struck after it test it.
unique/overlap are diagnostics, not traded: the rule bets "unique" shapes and skips "overlap" ones, so a wide spread between them means the gate is doing real work.
Forward by league
LgScopenWRImpliedROI/betz
MLSlive12028.3%25.6%+12.8%+0.70
AR1live11324.8%22.8%+12.3%+0.51
E1live10225.5%24.9%+2.5%+0.13
E2live7926.6%25.9%+4.8%+0.13
SE1live7528.0%21.7%+27.8%+1.35
KO1live7131.0%25.3%+12.8%+1.13
NO1live5425.9%22.4%+13.3%+0.64
SP2live5219.2%26.1%-28.7%-1.15
D2live5125.5%29.6%-17.2%-0.65
SP1live5014.0%18.5%-19.6%-0.84
T1live4928.6%22.4%+32.8%+1.06
I1live4623.9%20.2%+20.7%+0.65
D1live3826.3%20.5%+12.8%+0.90
N1live3633.3%20.8%+46.7%+1.91
E0live3528.6%21.8%+27.2%+1.00
SC0live3345.5%21.9%+96.5%+3.33
P1live3318.2%22.2%-5.9%-0.57
NWSLlive2927.6%24.7%-4.3%+0.36
F1live2114.3%23.7%-58.1%-1.03
I2live90.0%25.0%-100.0%-1.79
USLtrack13025.4%29.0%-14.8%-0.94
BSAtrack9912.1%22.2%-47.8%-2.48
JP1track9022.2%26.1%-26.4%-0.86
MX1track6023.3%24.7%-13.4%-0.26
CN1track5916.9%24.1%-31.2%-1.31
PL1track5532.7%31.6%-4.4%+0.19
CO1track3531.4%22.3%+22.7%+1.34
BR2track3231.2%24.5%+11.0%+0.92
CH1live3135.5%31.4%+2.0%+0.52
PE1track2725.9%25.8%-13.1%+0.02
CZ1track2114.3%21.4%-38.6%-0.82
CL1track1811.1%22.1%-58.9%-1.13
DK1track1030.0%33.8%-11.0%-0.26
G1track10.0%8.0%-100.0%-0.29
all poly-US confirm *—21628.7%30.0%-9.7%-0.43
at these sample sizes every cell is within ~1 game of its implied count — league-level reads are noise, not signal.
Scope column: live = armed for real money at $1; track = signals and forward test only, no orders.
* poly-US confirm = USL, PL1 and CH1, which have no Polymarket.com market at all, so the same strict rule uses Polymarket-US as the confirming book. Those leagues are listed above like any other and their total is repeated here so the mix can be decomposed. The n=286 +24.7% backtest used Poly.com as the confirming book — whether Poly-US confirms Pinnacle as well is untested.
Of those three only CH1 is armed (2026-09-05): it is the one with a verified Poly-US market, and it trades WITHOUT being in the frozen primary, so its bets stay in the poly-US row and never move the headline. USL and PL1 stay on paper.
League z-gate (shadow · 3 dropped)
LgStatenROI/betz
I2dropped9-100.0%-1.79
SP2dropped52-28.7%-1.15
F1dropped21-58.1%-1.03
SP1ok50-19.6%-0.84
D2ok51-17.2%-0.65
P1ok33-5.9%-0.57
E2ok79+4.8%+0.13
E1ok102+2.5%+0.13
NWSLok29-4.3%+0.36
AR1ok113+12.3%+0.51
NO1ok54+13.3%+0.64
I1ok46+20.7%+0.65
MLSok120+12.8%+0.70
D1ok38+12.8%+0.90
E0ok35+27.2%+1.00
T1ok49+32.8%+1.06
KO1ok71+12.8%+1.13
SE1ok75+27.8%+1.35
N1ok36+46.7%+1.91
SC0ok33+96.5%+3.33
A league is dropped once it has 5+ settled bets and its z falls below -1.0. State is point-in-time: a dropped league that recovers above the floor comes back on its own, and the bets it lost while out are not replayed.
Primary scope only. The gate runs inside the frozen scope, so the track-only leagues listed in the table above (BSA, CO1, JP1, CN1 …) are absent here by design — several are far worse than anything on this list and are already outside the headline.
Since freezenWRROI/betz
gated (shadow)39723.4%-1.0%+0.22
ungated (control)45123.9%-0.0%+0.46
Before freeze — in-samplenWRROI/betz
gated100626.2%+11.0%+2.09
ungated109626.0%+9.4%+1.91
the dropped bets9023.3%-8.0%-0.30
Discovery, not validation. This gate was found by reading the by-league table above — the same sample the "before freeze" rows score — so those rows are guaranteed to flatter it and are not evidence of anything. That is the identical error to the BSA/CL1 scope edit, one level deeper. Only the since 2026-09-20 rows test it, and they start empty.
Why exclude and not select. The question asked was the opposite one — bet only leagues with z above a threshold. Walk-forward that fails: inside the primary scope it returned +8.9% on the bets it took against +17.3% on the bets it skipped, and a random draw of the same size beat it two thirds of the time. Selecting winners needs the top tail to persist and costs ~80% of the sample; excluding losers needs only the bottom tail and costs ~5%. League-level persistence is real but weak (first-half z vs second-half ROI r=+0.35, p=0.03 over 29 leagues) — enough to find the worst, not to rank the best.
Shadow only. Nothing here gates an order or changes the frozen primary, which stays unfiltered above. Both series are written daily to forward_test_unique_book_log.csv as xlow_zgate_* and its control xlow_postz_*.
xlow — last 24h (0 settled)
xlow (24h, paper)
—
no settled bets
xlow did not fire on a fixture that kicked off in the last 24 hours
All leagues, unlike the headline. This panel is a recent-activity view, so it covers everything being tracked — including the leagues added for collection, which the primary forward number excludes. It will not tie out to the Fwd ROI tile.
Paper. The real xlow ledger is the signals panel above. Prices are the ask the rule would have taken, so these are pre-fee.
A day is noise at this per-bet variance — the frozen decision point is n=1000, not a good afternoon.