The NCAAB desk detects mispricings between Kalshi alt line prices and Pinnacle sharp book fair value for college basketball games. Pinnacle is the anchor. When Kalshi's price diverges from Pinnacle's fair value, that gap is the edge.
NCAAB has higher variance than NBA — less talent parity, bigger upsets, wider blowouts. This means both more opportunity (larger mispricings) and more risk (model accuracy suffers on mismatches).
2-Way Markets (Spreads, Totals, Moneylines) — Multiplicative method:
implied_prob = abs(odds) / (abs(odds) + 100) # for negative odds
implied_prob = 100 / (odds + 100) # for positive odds
total_implied = implied_home + implied_away
novig_home = implied_home / total_implied
novig_away = implied_away / total_implied
NCAAB moneylines are 2-way (no draw). Multiplicative method works.
Kalshi charges 7% fee on profit.
win_amount = 100 - kalshi_price
fee_on_win = 0.07 * win_amount
expected_profit = (model_prob * (win_amount - fee_on_win)) - ((1 - model_prob) * kalshi_price)
Minimum net edge: 4 cents after fees.
Sweet spot: implied probabilities between 35% and 65%.
Use 1/4 Kelly for all NCAAB bets:
bet_size = min(bankroll * full_kelly * 0.25, bankroll * 0.05)
If quarter Kelly < 0.5% of bankroll, skip.
Hard Caps:
Like NBA, NCAAB scoring is high enough for Normal distribution. But NCAAB spreads are often much wider (20+ point favorites common) — model accuracy drops at extreme spreads.
Spread Model:
| Market | Priority | Why |
|---|---|---|
| Totals | Highest | More alt lines, efficiency models predict scoring well |
| Spreads | High | Wide spreads = more alt line variety, but model less reliable at extremes |
| Moneyline | Lowest | Heavy favorites make ML edges tiny |
NCAAB's edge comes from advanced efficiency models that casual markets (Kalshi) don't fully price in. These models measure how many points a team scores/allows per 100 possessions, adjusted for opponent strength.
Data Sources:
| Source | What It Provides | Priority |
|---|---|---|
| KenPom | Adjusted offensive/defensive efficiency, tempo, luck factor, SOS | PRIMARY |
| BartTorvik / T-Rank | Team rankings, efficiency ratings, game predictions | PRIMARY |
| Massey Ratings | Composite ratings (best-effort, sometimes stale) | SECONDARY |
KenPom and BartTorvik are the gold standard for NCAAB analytics. Their adjusted efficiency margins directly feed into spread and total predictions.
Special considerations during tournament play:
NCAAB has massive talent gaps:
| Source | Priority |
|---|---|
| ESPN player status API | PRIMARY |
| Team official Twitter/PR feeds | SECONDARY |
| NCAA eligibility tracker | Weekly check |
Track suspensions and eligibility issues — NCAA has unique rules around academic eligibility, transfer portal, and discipline that don't exist in pro sports.
| Source | What It Provides | Frequency | Priority |
|---|---|---|---|
| Pinnacle (via Odds API) | Sharp odds: ML, spread, total | Real-time | Critical |
| Kalshi | Market prices (what we're betting against) | Real-time API | Critical |
| KenPom | Adjusted efficiency, tempo, SOS, luck | Daily | Critical |
| BartTorvik / T-Rank | Team rankings, efficiency margins | Daily | Critical |
| ESPN API | Scores, game state, player status | Continuous | High |
| DRatings | Win probability + spread predictions | Daily | Medium |
| Massey Ratings | Composite (best-effort) | Daily | Medium |
| Model | Source | Type |
|---|---|---|
| KenPom / BartTorvik | kenpom.com, barttorvik.com | Adjusted efficiency margins |
| T-Rank | barttorvik.com/trank.php | Team rankings |
| Massey | masseyratings.com | Composite (best-effort) |
Average available models. If any is NULL, exclude silently.
| Market | Steam Threshold | Action |
|---|---|---|
| Spread | > 0.75 points/hour | Immediate re-scan |
| Total | > 0.5 points/hour | Immediate re-scan |
NCAAB has a higher steam threshold for spreads than NHL/NBA because college lines are more volatile (less liquidity, sharper moves are normal).
When steam is detected:
steam_triggered = TRUE| Condition | Reason |
|---|---|
| Spread > 20 points | Model unreliable for extreme mismatches |
| Deep tail lines (5+ rungs) | Model unreliable at this distance |
| Kalshi market volume < $500 | Illiquid — phantom edge |
| Net edge < 4 cents | Below threshold after fees |
| Implied probability < 15% or > 85% | Extreme tails, fee impact unfavorable |
| Key player eligibility unclear | Too much uncertainty |
| Conference tournament with unknown seeding implications | Motivation factor unmeasurable |
[11:00 PM ET prior night]
- Fetch tomorrow's NCAAB schedule from ESPN API
- Create game records
[9:00 AM ET — Early Snapshot]
- Odds API: Pinnacle NCAAB lines
- Kalshi: Pre-game alt line snapshot
- Calculate no-vig probabilities, run edge scan
[11:00 AM ET (weekday) / 10:00 AM ET (weekend) — Model Collection]
- BartTorvik/KenPom (11:06)
- T-Rank (11:15)
- DRatings (11:09)
- Massey (11:18, best-effort)
[2:00 PM ET — Mid Snapshot]
- Odds API: Pinnacle update
- Kalshi: Mid-day snapshot
- Calculate line velocity, flag steam moves
[30 min before game]
- ESPN injury check
- 30-minute pre-close polling
[10 min before game — Closing Snapshot]
- Final Pinnacle closing lines
- Kalshi closing price
- Store CLV baseline
[Game start → WebSocket live mode]
[After game ends → Grade edges, update Brier scores]
Track every detected edge with: timestamp, game_id, market_type, kalshi_ticker, kalshi_price, model_fair_prob, raw_edge, net_edge, rung_distance, steam_flag, bet_placed, bet_size, pinnacle_line.
Post-Settlement:
(model_fair_prob - outcome)^2Monthly Review:
| Control | Threshold | Action |
|---|---|---|
| Max loss per trade | 2% of capital | Hard cap |
| Max exposure per day (NCAAB) | 15% of capital | Hard cap |
| Daily drawdown stop | -5% of capital | Halt all trading for the day |
| Max per single game | 5% of capital | Hard cap |
No risk management = no live trading.
| Parameter | Value |
|---|---|
| Steam threshold (spread) | 0.75 pts/hour |
| Steam threshold (total) | 0.5 pts/hour |
| Min net edge | 4 cents |
| Kalshi fee rate | 7% on profit |
| Kelly fraction | 0.25 (quarter) |
| Max single bet | 5% bankroll |
| Max per game | 10% bankroll |
| Max daily exposure | 25% bankroll |
| Min bet size | 0.5% bankroll |
| Implied prob range | 15%-85% |
| Min Kalshi volume | $500 |
| De-vig agreement threshold | 2 cents |
| Max spread to bet | 20 points |
Status: NOT BUILT — add when this desk goes live for execution
Current state: All Kalshi data (prices, order books, trades) is fetched via REST API polling on cron schedules. This is fine for edge detection and monitoring, but NOT sufficient for live trade execution.
Why WebSocket matters:
What to build when ready:
Note: Sports markets use RFQ (Request for Quote) so the visible order book is usually empty — but the trade feed still matters for freshness signals and the WebSocket is required for order submission. Weather markets DO have real visible order books where this upgrade is even more critical.
Added 2026-03-29 — upgrade REST to WS when desk moves to live execution