Version: 3.0 | Date: 2026-04-03 | Status: DEPLOYED
Trade mispriced Kalshi tennis contracts using Pinnacle de-vigged fair value. Coverage: ~49 Kalshi series spanning ATP, WTA, Challenger, Grand Slams. Year-round daily action.
| Market | De-vig Method | Notes |
|---|---|---|
| Match winner (2-way) | Shin | Primary market — DEPLOYED |
| Game spread / Total games | Markov chain + Kalshi alt-lines | DEPLOYED — model-priced via Markov chain, compared to Kalshi prices |
| Set winner / Exact set score | Markov chain + Kalshi alt-lines | DEPLOYED — exact set score matrix from Markov chain |
| Grand Slam outright (N-way) | Monte Carlo (100K bracket sims) | DEPLOYED — SA-Elo + fatigue through rounds |
Kalshi fee: 7% on profit. Gross edge ~4.3c needed to net 4c. Min edge: 4 cents after fee.
Scans Pinnacle ML de-vigged vs Kalshi match prices. Uses last-name fuzzy matching for player identification. Now produces edges with correct market type labels (ml, spread, total, setscore, setwinner).
Odds API Integration: Dynamic tournament key resolution deployed — automatically discovers active ATP/WTA tournaments from the Odds API sports endpoint. No more stale hardcoded keys.
| Market | Kelly Fraction | Max |
|---|---|---|
| Match winner | 1/8 | — |
| Game/set spreads | 1/8 | — |
| Total games | 1/8 | 2% bankroll on extremes |
| Set betting | 1/10 | — |
| Exact scores | 1/12 | 0.5% bankroll |
| Outrights | 1/8 | — |
| Per-match cap | — | 3% bankroll |
| Time (ET) | Data |
|---|---|
| Every 30min | Kalshi tennis prices (49 series, ~498K snapshots) |
| Adaptive | Pinnacle tennis odds (dynamic tournament discovery) |
| Weekly | Sackmann CSV ingest, SA-Elo, surface baselines, H2H, rankings, tournaments, draws, WTA calibration, TennisAbstract |
| Daily | Fatigue scores, weather (24 venues) |
| 8AM/10AM/2PM/6PM | Edge scanner (all market types) |
| Static | Integrity kill-switch config |
ATP Match: KXATPMATCH, KXATPCHALLENGERMATCH, KXATPDOUBLES WTA Match: KXWTAMATCH, KXWTACHALLENGERMATCH Alt Lines: KXATPGAMETOTAL, KXATPGSPREAD, KXATPGAMESPREAD Sets: KXATPSETWINNER, KXATPTOTALSETS, KXATPEXACTMATCH, KXATPEXACTSETS, KXATPANYSET Outrights: KXATPGRANDSLAM, KXWTAGRANDSLAM, KXATPGRANDSLAMFIELD Rankings: KXATP1RANK, KXATPRANK Table Tennis: KXTABLETENNIS, KXTTELITEGAME
| Parameter | Value |
|---|---|
| SA-Elo blend | 0.5 overall + 0.3 surface + 0.2 recent |
| Min edge | 4 cents |
| Kalshi fee | 7% on profit |
| Kelly fraction (match) | 1/8 |
| Min surface matches | 10+ for both players |
| H2H min meetings | 3 |
| Elo stabilization ATP | 30 initial, 50+ stable |
| Elo stabilization WTA | ~40 matches |
| WTA upset rate | ~38% vs ATP ~32% |
| Challenger Kelly | 50% of normal |
| Integrity kill-switch | 40c Pinnacle move on Challenger/ITF |
| Item | Reason |
|---|---|
| WTA edge scanner | Needs WTA Pinnacle data flowing; dynamic resolver deployed, waiting for data |
| Item | Reason |
|---|---|
| Kalshi WebSocket | REST polling adequate |
| Betfair exchange | Not worth integration |
| Press conference sentiment | Low-signal, council rejected |
| In-play Bayesian updating | No spec exists |
| OnCourt historical DB | $5K/yr, not building |
| Pinnacle direct feed | $1.5K/yr, not building |