NHL cash DFS: research & validation
Research registered October 8, 2026 · NHL model v1.0 · separate from every football model
Cash is not one contest format
| Format | Relevant decision | Evidence and limit |
|---|---|---|
| Head-to-head | Beat one opponent after fees and tie rules. | Opponent skill/selection is unknown. A maximum-mean lineup is a surrogate, not an opponent-specific optimum. |
| 50/50 | Top-half equal prizes, with actual fees and payouts. | Not interchangeable with a 2× double-up; contest-specific ties may change the return. |
| Double-up | Nearly half of entrants receive twice the fee. | A field-derived cutoff and fee/payout archive is needed to evaluate probability of cashing and expected net return. |
Official references: H2H, 50/50, double-ups, ties and commission. Retrieved October 8, 2026. The app makes no entries or payments.
Strategy comparison
| Claim to investigate | Implementation decision |
|---|---|
| Reliable shots/blocks and playing opportunity | Model the scoring events and their bonuses. Never call shot volume guaranteed points. Current lines, PP usage and injury-driven opportunity remain material missing inputs. |
| Pay up for favorites vs save on goalie | Neither is a universal rule. Saves, goals allowed, wins, OT losses, complete-game shutouts and start uncertainty belong in one conditional goalie model. |
| Stack lines vs diversify cash exposure | No automatic cash stack or invented correlation penalty. Tournament evidence cannot establish cash benefit; field-relative variance is different from lineup variance. |
| Ownership/chalk | No fabricated ownership. Opponent-relative utility needs actual fields and their joint scoring relationship. |
| Cheap promoted players | Historical rates will miss real role changes. Source verification is shown, but the initial model does not pretend to estimate a new role without data. |
The recent DraftKings NHL guide corroborates Classic scoring and offers editorial lineup guidance, not a controlled cash-performance study. The 2020 shot-volume article uses a conflicting shot-point value: its coefficient was rejected. Other strategy viewpoints reviewed include DobberHockey, DFS Army and LineStar. Their differing advice is treated as testable expert opinion, not fitted model weights.
Why maximum mean is only a surrogate
Haugh & Singal (2019) formulate opponent-aware expected reward in double-up and top-heavy settings, with NFL empirical results. This motivates a future field-aware NHL model but does not validate this one. Hunter, Vielma & Zaman (2016) study top-heavy portfolios, including hockey. Their variance/correlation ideas are not blindly transplanted into a single cash lineup.
Current objective: sum of model means under salary/roster/eligibility constraints. No arbitrary “safety,” ownership, median or variance weight is added. The solver proves this defined optimum only if its full bounded search finishes; otherwise it reports best found with a valid relaxed upper bound. It does not claim to maximize cash probability. H2H/50/50/double-up selection currently changes the explanation, not the objective.
Projection candidates and selection status
| Candidate | Merit / risk | Status |
|---|---|---|
| Trailing points per played game | Auditable benchmark; ignores changes in opportunity. | Retained in evaluation tooling. |
| Event/bonus empirical shrinkage | Transparent means and nonlinear bonus frequencies; preserves observed goalie event dependence. Small samples/role changes remain risks. | Experimental initial baseline, not an empirically proven winner. |
| Pregame ice-time / role opportunity | Can separate expected minutes from rates. Realized test-game minutes would leak. | Blocked from honest comparison without as-of role inputs. |
| Hierarchical Poisson / negative binomial | Pool small samples and account for overdispersion. Need count fit and joint bonus calibration. | Research candidate; not silently deployed as calibrated probabilities. |
| Tree / boosted shot-event model | Can use skill/context, but future shot coordinates are not pregame features. | Noel (2025) supports research, not direct pregame DFS superiority. |
| Market-assisted inputs | Potential matchup/goalie context; as-of timing and permissions matter. | A separate NHL Vegas integration is authorized if needed. This fallback release makes no odds calls and changes no football data, caches or budgets. |
Baseline version nhl-empirical-shrink-1.0-experimental: up to 82 prior player games; shrinkage strength 10 is a registered starter parameter, not a tuned success factor. Priors use captured same-position game rows at the prediction cutoff. The event-based estimator never fills missing game stats with DraftKings FPPG. Mean points, historical median and history quantiles remain separate. History quantiles are uncalibrated and not forecast coverage claims. Rink recording-effects research motivates diagnostics; old rink coefficients are not reused.
Salary-average fallback (October 8 update)
The slate builder nhl-slate-baseline-1.0-experimental prefers the complete-stat estimator above. If a player has no usable game history, it uses the immutable salary CSV's AvgPointsPerGame unchanged and labels it DK avg baseline. This naive historical-average forecast is not a matchup-adjusted or validated cash projection. No sample size, event counts, bonus probabilities or forecast intervals are invented. Real zero and negative averages are preserved; blanks remain missing. Goalie confirmation requirements are unchanged. Classic salary imports now build a snapshot automatically. Rebuild after recording availability or importing more detailed stats. NHL Vegas lines were not needed for this fallback and no provider credits were spent.
One scoring contract, with explicit gates
Current Classic weights: goals 8.5, assists 5, shots 1.5, blocks 1.3, shorthanded points +2, shootout goals 1.5. Bonuses: 3 points for 3+ goals, 5+ shots, 3+ blocks and 3+ points. Goalies also receive offensive statistics, wins +6, saves 0.7, goals against −3.5, OT losses +2, sole-goalie complete-game shutouts +4 and 35+ saves +3. Nonlinear bonuses use historical event frequencies, not thresholds applied to average counts. Zero/negative valid results are not missing values.
Classic baseline roster: C,C,W,W,W,D,D,G,UTIL; utility excludes goalies; $50,000; skaters from three teams across multiple games. Conservative current-rule checks remain required. The dynamic official Classic and Showdown Captain rule bodies were inaccessible to the research reader. Showdown salaries can be retained, but scoring/optimization/export stay blocked. No old faceoff scoring or NFL Captain assumptions are used. Late swap also stays disabled until the specific contest contract is captured.
Data lineage and coverage
Salary inputs can come from manual CSV uploads or a connected, approved NHL salary feed. Admins can upload files without a per-file permission checkbox; source URLs and notes are optional. Manual uploads are recorded as user-supplied files without claiming a reuse attestation. No automated DraftKings or NHL collection is enabled. Public reachability is not permission: DraftKings terms and NHL terms restrict unauthorized automated collection. The optional SportsDataIO NHL salary adapter requires a licensed key and approved display/reuse rights. It checks today plus seven upcoming Eastern dates, and source delivery may lag DraftKings. It does not prove coverage beyond that window. Without a connected feed, the admin pull button only archives expired listings and reports the missing connection. Each salary import covers that file only, never all published slates. Positive NHL salaries, dated game times and provider IDs are required. Player matching uses exact normalized full name, team and position; ambiguous matches remain missing.
Raw historical exports are immutable and admin-only. Projection snapshots retain each input import ID and content hash. Public final-point revisions contain derived points, not raw historical event rows. Salary/model pointers publish atomically, and stale responses cannot replace a newer snapshot. Availability sources carry observation times; these are manual checks, not an automatic news feed. Confirmations expire after 12 hours. Provisional mode permits unknown goalies, not known nonstarters. Stats-based projections are conditional on playing/starting. Salary-average baselines have unknown averaging periods and starting-goalie usage. Unverified skater availability remains a material limitation.
The model reads at most the newest eight imports, 20,000 rows and 10 MB per run; any skipped history is disclosed. Completed games must precede the forecast cutoff, and captured imports must also precede it. Stat revisions create new snapshots, never rewrite previous forecasts. Reconstructed points are not DraftKings payout-time verification. Saved records are advised decisions, not entries, cash wins or profits.
Historical-stat import field guide
Download the blank CSV header. A qualified data export can be mapped into this template; the app does not fetch a restricted source for you. Use one row per player per completed game. CSV or a JSON array with the same keys is accepted; JSON may nest event fields under stats. Maximum 3 MB and 10,000 rows per import.
nhl_player_id: canonical numeric NHL player ID, not a DraftKings draftable ID.game_id: canonical 10-digit NHL game ID.name, team, position: full name, team abbreviation, C/W/D/G (LW/RW normalize to W). Matching is exact; a traded player or ambiguous name can remain unmatched.start_time, final_at: ISO timestamps with timezone, such as2026-10-01T23:00:00Z. The game must be final before the import.final, started: explicittrueorfalse. Final must be true. Goalies with started=false are excluded from the if-starts model.goals, assists, shots, blocks, shPoints, shootoutGoals: known nonnegative integer counts. Shots are shots on goal; shPoints is shorthanded goals plus assists. Shootout successes do not also become regulation goals. Every field is required, including genuine zeros.- Goalies also require
wins, saves, goalsAgainst, otLosses, soleGoalieComplete. Win and OT-loss are mutually exclusive 0/1. soleGoalieComplete is an explicit boolean documenting full-game sole-goalie qualification; a replacement goalie cannot inherit a shutout. These goalie-only columns may be empty for skaters. - A source page and source notes are optional. No permission confirmation is required for a manual upload. Do not include login credentials, access tokens or missing fields disguised as zero.
Frozen validation protocol
Proposed development 2023–24, tuning 2024–25 and untouched test 2025–26; rolling chronological origins and priors rebuilt at each origin. Only final games before the cutoff are allowed, with a conservative 12-hour buffer where no finalization timestamp exists. No future salaries, observed starter information, realized minutes or later line changes may enter predictors. Date-block bootstrap, MAE/RMSE/bias, within-slate ranking/top-k regret and calibrated distribution metrics are required when the respective data exists.
Backend permissions reuse existing Supabase auth/RLS/admin checks. NHL saves are private with the football-compatible three-per-slate limit. Model/data assets load on demand. No new schedule or paid source was created. Release and device acceptance evidence lives in the source-backed implementation report; unresolved live-source or browser gates must remain disclosed.