V2 Framework — How the Report is Structured
Every bet candidate — regardless of market — passes through the same six-check evaluation engine before
appearing in the report. The engine produces a letter grade (A–F) and a recommendation tier.
The top of the report shows your actionable plays; the full sweep table below it shows every candidate
evaluated that day so you can audit the model's reasoning.
| Section | What it shows |
| V2 Ranked Plays | Grade A (Best Play) and Grade B (Good Add) candidates with full detail — check bar, key factors, risk flags, and contradiction flags |
| Full Candidate Sweep | Every evaluated bet in one compact table grouped by grade tier. Use this to understand why a play was filtered out. |
| Today's Slate | DraftKings reference lines for all games |
| Detail Sections | Game bets (with key factors, injury/weather notes) and NRFI — full signal detail below the V2 ranked plays |
V2 Six-Check System
Each check returns PASS ✓, WARN !, FAIL ✗, or N/A –. Checks that need unavailable data degrade to N/A
without penalising the grade. Two points for PASS, one for WARN or N/A, zero for FAIL.
| # | Check | What it evaluates | PASS condition |
| 1 | Baby Line | Line size, batter opportunity, run-line cushion | No baby-line flags, adequate PA opportunity, RL cushion ≥0.2 runs |
| 2 | Model Edge | Projection vs DK line (edge for game bets, DIFF% for props) | Edge ≥ threshold for the market type |
| 3 | Books Agree | DK implied direction + consensus lean % across all other books | DK agrees with model AND ≥55% of consensus books lean same side |
| 4 | Matchup | Park factor, weather, pitcher handedness vs lineup splits | Park/weather support the bet direction; platoon matchup neutral or favorable |
| 5 | Role / Injury | Confirmed lineup spot, injury flags, workload concerns | No injury flags; lineup confirmed in a favorable spot |
| 6 | Game Script | Combined park × weather run environment; run-line margin vs spread | Environment supports bet direction; RL margin cushion ≥0.5 runs |
Grades & Recommendations
| Grade | Score | Recommendation | When to bet |
| A | 10–12, 0 FAILs | BEST PLAY | Core play — all six checks aligned |
| B | 7–9, ≤1 FAIL | GOOD ADD | Strong play with minor caveats |
| C | 4–6 | PASS | Thin — skip unless you have a strong personal read |
| D | 2–3 or model edge FAIL | PASS | Do not bet — weak signal |
| F | 0–1 | HARD FADE | Consider betting the other side |
Hard override: a Model Edge FAIL always caps at Grade D regardless of other checks. Books Strongly Disagree caps at Grade C.
Contradiction Flags ⚡
When two recommended plays on the same game send opposing run-environment signals, a
⚡ contradiction flag is added to both plays. The bet is not removed — it is flagged
so you can decide consciously whether the conflict makes sense.
| Pattern | Why it conflicts |
| Total Over + NRFI | High-run game expectation vs no runs in the 1st inning |
| Total Under + YRFI | Low-run game expectation vs runs scoring in the 1st |
| K Prop Over + YRFI | Pitcher dominates yet run scores early |
| Batter Overs + Total Under | Player production expected but game total is low |
| Outs Over + K Under (same SP) | Long outing projected but few strikeouts — projection inconsistency |
API Quota Bar
| Element | Meaning |
| Progress bar | Visual fill of monthly Odds API usage |
| used / total | Requests consumed vs. your monthly cap — each run costs ~1 request per game (combined market fetch) |
Today's Slate
| Column | Meaning |
| Away ML / Home ML | DraftKings moneyline. −150 = bet $150 to win $100 • +130 = bet $100 to win $130 |
| Away RL / Home RL | Run line (always ±1.5) with its odds. −1.5(−110) = team must win by 2+ |
| Total | Over/Under line (e.g. O/U 8.5) |
| Con ML | Consensus moneyline direction — which side the majority of other books (FanDuel, BetMGM, Caesars, etc.) favor |
Game Bets — Column Definitions
| Column | Meaning |
| Size | FULL ≥20% edge • HALF 15–20% • QRTR at threshold. Capped at HALF if one SP missing, QRTR if both missing. |
| Type | Moneyline, Run Line, Total Over/Under |
| DK Odds | DraftKings price for that side |
| Implied | DK implied probability after vig removal |
| Model | Win probability our model calculates independently |
| Edge | Model% − Implied%. Min 15% to surface a game bet. |
| EV/$100 | Expected profit per $100 wagered: (win_prob × profit) − (loss_prob × $100) |
| Conf | HIGH full SP + offense data • MED one source missing • LOW mostly league averages |
How the Model Works — The Simple Version
The model is asking one question: does DraftKings have the wrong price on this game?
It independently calculates how likely each team is to win by grading two things:
how good is today's starting pitcher (xFIP vs league average) and
how good is the opposing lineup (wRC+ vs league average). It adds a small home-field
bonus, blends in the pitcher's last 5 starts (35% weight), then converts the result to a win probability.
That probability is compared to what DraftKings implies. If the gap is ≥15%, it surfaces as a bet.
The model caps at ~68–70% win probability even in extreme mismatches — baseball is unpredictable and
overconfident models lose money. Missing data automatically reduces confidence and bet sizing.
How the Model Works — Win Probability (Technical)
For every game the model builds a score differential from three inputs, then converts it to a
win probability using a logistic (S-curve) function. Here is each step:
| Step | What it calculates | Data source | Weight |
| 1. Pitching edge |
How much better or worse each SP is vs. the league-average xFIP of 4.20.
home_pitch = (4.20 − home_xFIP) / 4.20
pitch_edge = home_pitch − away_pitch
A positive number means the home SP is above average relative to the away SP. |
FanGraphs xFIP (direct API call) — the best early-season ERA predictor because it removes defense and luck |
50% |
| 2. Offense edge |
How much stronger or weaker each lineup is vs. the league-average wRC+ of 100.
home_bat = (home_wRC+ − 100) / 100
off_edge = home_bat − away_bat
A team with wRC+ 110 contributes +0.10; one at 90 contributes −0.10. |
MLB Stats API team batting — OPS converted to wRC+ via (OPS / 0.720) × 100 |
35% |
| 3. Home field |
Fixed constant added to the home team's side every game. |
Historical MLB average home-field effect |
+4% |
| 4. Score diff |
score_diff = 0.50 × pitch_edge + 0.35 × off_edge + 0.04 |
Combined signal driving the probability below |
| 5. Win probability |
home_win_prob = logistic(1.5 × score_diff)
The logistic scale of 1.5 keeps the model from being overconfident — even an extreme mismatch caps out around 68–70%. |
Standard logistic sigmoid: 1 / (1 + e−x) |
Recent Form Blending
Season stats are stable but slow to react. Recent form can signal a pitcher heating up or falling apart.
The model blends both:
| Source | Weight | Stats blended |
| Season-to-date (FanGraphs) | 65% | xFIP, ERA, WHIP, K%, K/9 |
| Last 5 starts (MLB Stats API game logs) | 35% | ERA, WHIP, K%, K/9 — computed from raw game log totals |
xFIP is season-only (requires full-season HR data to normalize). ERA trend from recent starts adjusts the blended ERA implicitly.
How the Model Works — Expected Run Total
For Over/Under bets the model projects a total runs scored using a similar framework:
| Step | Calculation |
| Base | 2 × 4.5 league-average runs/game = 9.0 |
| SP factor | Average of (home xFIP / 4.20) and (away xFIP / 4.20). Uses xFIP for consistency with the win-probability model — ERA includes luck and inflates totals for pitchers who got unlucky. |
| Offense factor | Average of (home wRC+ / 100) and (away wRC+ / 100). |
| Raw total | 9.0 × (0.60 × SP factor + 0.40 × off_factor) |
| Park adjustment | Raw total × venue run factor (e.g. Coors 1.32, Oracle Park 0.92). Blended at 60% weight: 0.40 × raw + 0.60 × park_adjusted |
Weather adjustments layer on top: headwind (N/NW/NE) × 0.93 on run total • tailwind (S/SW/SE) × 1.08 • cold (≤45°F) × 0.96
What IS Integrated
| Factor | Status |
| Savant pitcher quality (xwOBA, xERA) | Integrated. SP quality in NRFI blends xFIP (60%) + xwOBA allowed (40%) when Savant data available. |
| Savant whiff% / put-away% | Integrated for K props. Primary projection driver when available (65% weight). |
| Opp pitcher contact quality for batter props | Integrated. Opposing pitcher xwOBA allowed adjusts batter projections (±up to 15%). |
| Lineup order / day-of lineup | Integrated for batter props (confirmed lineup spot + projected PA). Game-level model uses full-team season wRC+. |
What IS Integrated (continued)
| Factor | Status |
| Bullpen fatigue | Integrated (Session 16). Relief appearances over past 3 days tracked per team; tired pen (>2.7 RP/game avg) raises expected total via BULLPEN_WEIGHT (15%). Surfaced in Game Script check. |
| Rest days | Integrated (Session 16). Back-to-back teams receive a −1.5% win-probability penalty; well-rested teams receive a +1.0% bonus. Applied to full-game and F5 models. |
| Umpire K-rate | Integrated (Session 15). Static table of ~70 umpires with historical K/9 values. Wide-zone umps adjust K prop projections and NRFI scores up; tight-zone umps adjust down. Dampened ±12% cap. |
| Handedness / platoon splits | Integrated (Sessions 3 & 15). Opposing lineup wRC+ vs. SP hand sourced from MLB splits API. Platoon mismatch adjusts win probability ±2% per side (capped ±4% total). Surfaced in Matchup check. |
| Projection blend (regression to mean) | Integrated (Session 17). Stats regressed toward league average early in season: blend_w = IP ÷ 80 for pitchers, games ÷ 81 for teams. Prevents 5-IP ERA outliers from driving model in April. |
What the Model Does NOT Include (yet)
| Factor | Status |
| Batter vs. pitch-type matchup | Integrated. Savant team-vs-pitch-type xwOBA adjusts K prop projections and NRFI/YRFI scores when SP's primary pitch type is known. Opponent teams that struggle vs the SP's top pitch raise K over projections and NRFI scores. |
| Individual batter vs. pitcher H2H | Planned for a future phase. |
| Pre-season projection prior (Steamer/ZiPS) | Not integrated — projection endpoints not available. Regression-to-mean (blending toward league avg by IP) used as a practical substitute. |
NRFI — No Run First Inning
| Column | Meaning |
| Away SP / Home SP | Probable starter name (or TBD if not yet announced) |
| NRFI Score | Composite score out of 10. ≥7.7 = PLAY. SP quality (40%) blends xFIP + xwOBA allowed when Savant data is available; K-rate (35%); team offense (25%) |
Sizing Guide
| Label | Edge Required | Suggested Unit Size |
| FULL | ≥20% | Full unit |
| HALF | ≥15% | Half unit |
| QRTR | ≥15% | Quarter unit (data quality cap) |
| (none) | <15% | No bet — below threshold |
Confidence Guide
| Label | What it means |
| HIGH | Both pitchers and both offenses have full stat profiles |
| MED | One or more data sources are missing or incomplete |
| LOW | Model running mostly on league averages — proceed with caution |
Model Notes
| Term | Definition |
| xFIP | Expected Fielding Independent Pitching — ERA predictor that strips out defense and luck. Lower = better pitcher. League avg ~4.20 |
| wRC+ | Weighted Runs Created Plus — offensive quality. 100 = league average. 115+ = above average. Estimated from team OPS via MLB Stats API |
| Recent form | Last 5 starts blended at 35% weight, season stats at 65% |
| Park factor | Venue run/HR factor applied to expected total. Coors Field ~1.32, Oracle Park ~0.92 |
| Edge | Model win probability minus the book's implied probability (after vig removal) |
| EV/$100 | Expected value: (win_prob × profit) − (loss_prob × stake) |
| F5 bets | First 5 innings — pitching weight raised to 65% (starters matter more), scaled to 4.5/9.0 IP |
| DK note | The "Bet on DK" button opens DraftKings' MLB section. Game-specific deep links require DK's partner event ID, not included in the free Odds API tier |
Disclaimer: For informational and research purposes only.
Bet responsibly. Always verify probable pitchers and lineups before placing any bet.
Past model performance does not guarantee future results.