Futbol Veritabanı
8대 리그 클럽·선수·통계—Transfermarkt 데이터
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기메이커가 쓴 소개는 위의 한 줄이 전부입니다. 더 자세한 내용은 저장소 README에서 읽을 수 있습니다. 저장소 README ↗
README 전체를 불러오는 중입니다.
README 전문 보기 ↗Personal NFL betting-analysis product for Jonathan Mehalic. This README is written for a reviewer doing a check-and-balance pass: what exists, what it claims, and how to verify every claim independently. Built Sep 20–24, 2026 by Claude (Claude Code session); everything below is reproducible from this repo.
A phone-first web board that pulls FanDuel's live NFL market, strips the vig
out of every price, runs its own graded prediction model on each game, and
builds parlays four ways (safest-N, safety-target, payout-goal, and
"Build my own", where any moneyline, spread, total, alt rung, prop or TD
scorer can be tapped onto a ticket)
— every ticket opening in the user's own FanDuel app via one-tap
addToBetslip links. It tracks saved tickets for multiple users, settles
them automatically, keeps a season memory of everything it predicted, and
grades itself weekly. Nothing here is betting advice, and the board says so.
| Surface | URL | What it is |
|---|---|---|
| Full app | https://claude.ai/artifact/SuKFMDPsudMcWBdYktJ9sE | Board + tracker + crew standings + weekly read ("anyone with the link"; saving needs a Claude login) |
| Public mirror | https://nfl-parlay-inky.vercel.app | Static copy, no login, no tracker; redeploys automatically on every push to this repo (web/index.html, vercel.json). Installable to the Home Screen (web/manifest.webmanifest, icons, web/sw.js: network-first, last board offline). On open, on return to the app, and every 5 min it re-fetches itself and, if the board changed, shows what matters (finals, starters ruled Out/Doubtful, new QB docks, new upset calls, favorites flipping, prices moving 3+ pts); Refresh keeps the user's ticket. |
| Repo | github.com/pristinepoolspgh/nfl-parlay | Everything: code, ledgers, docs |
| Push alerts | Supabase project parlay-board (phxacgxbhphnvrbcrbtr), edge function parlay-push | Stores Home Screen app subscriptions and sends alerts; see "Push alerts" below |
nfl_parlay.py CLI (slate, parlays, props, FanDuel one-tap links)
board/make_snapshot.py Board generator: fetches everything, runs the model,
writes the page + prediction/closing-line logs
board/template.html The page (all UI logic; data spliced at /*__DATA__*/)
board/elo.py Elo ratings from real finals (+ nflverse EPA fetch)
board/sim.py The model ("sims"): margins, totals, win prob,
p_cover/p_over for any rung. VERSION history in header
board/backtest.py 12-season backtest vs the closing line
board/tune.py Parameter experiments on the same harness
board/residual_test.py Does the model add information beyond the close?
board/upset_test.py Do the sims' upset calls win? (Upset watch record)
board/dvp.py Defense vs position tables + stability test
board/market_model.py v7 research harness + memory/market_model.json builder
board/learn.py Grades favorites, leans, sim log (per version), crew
board/settle.py Grades saved tickets against ESPN finals
board/crew.py Folds all users' tickets into the season ledgers
board/player.py Any player's career/season numbers (ESPN APIs)
board/epa.py Team offensive EPA/game table (nflverse)
memory/ Append-only ledgers (see "Ledgers")
docs/research-playbook.md Owner-supplied research doctrine + repo mapping
docs/backtests.md Every backtest run, tables, decisions taken
web/index.html The mirror copy of the current board
FanDuel public API (board, props, alt lines, TD scorers, in-play), ESPN
public APIs (scoreboard/week, injuries, news, athlete stats), NFL.com news
page, Rotowire NFL news feed, nflverse (games.csv incl. closing lines
1999→, weekly team/player stats), Open-Meteo (stadium weather). Not
used: any paid tool (OddsJam, PFF, etc.), X/Twitter (login/paid API;
Rotowire relays the same reporters with attribution), NFL Next Gen Stats
(requires auth).
Full notes in board/sim.py's header; evidence in docs/backtests.md.
docs/backtests.md.board/market_model.py, docs/backtests.md
eighth pass.Upset watch: games where the results rating (Elo) picks the underdog outright. Backtest (249 games): the dogs won 40.2% vs 40.3% implied, so the section prints that record and calls them live dogs, not locks. Every game has a "player props" panel: all of FanDuel's main O/U props and anytime-TD prices for every player, each tagged with what the opposing defense allows to that position this year and last (context, not a model input; see docs/backtests.md seventh pass). Build-my-own allows one spread, one total, one ML side per game and one side per prop (tapping another rung swaps it); TD scorers stack.
Honest standing: the closing line beat the scores-only model (Brier .2084 vs .2175 on the backtest), and nothing tested on top of the line beat the line (eighth pass). So v7 is anchored to the market by design. It adds validated outcome shapes for pricing alt lines and flags where FanDuel's own prices disagree with each other. "Sims' calls" is now that ladder check and is often empty. Every version is graded in memory/simlog.jsonl, so any regression shows.
board/player.py lookups; roster questions
defer to the live market over anyone's memory.memory/)pregame.jsonl / close.jsonl — first-seen and latest pregame line per
game (open-vs-close movement; closing-line value for leans).simlog.jsonl — every model prediction, logged pregame, version-
tagged; learn.py grades winner accuracy / margin MAE / Brier per
version, so model upgrades must beat their predecessors on the same
scoreboard.results.jsonl + insights.json — market calibration by probability
bucket, upsets, crew section. Week 2: market said 68.8%, favorites won
66.7% (15 games).judgments.jsonl — the weekly "read": notes + at most 1–2 gradeable
leans, never edited after the fact (material news appends dated notes).
Record so far: 1–2.upsets.jsonl: every "Upset watch" call (sims ≥50% on the dog and
≥10 pts over market), first sighting, graded by learn.py.tickets.jsonl / picks.jsonl — every user's saved tickets and legs,
kept even if deleted from the board; feeds crew standings/calibration.| When (ET) | What |
|---|---|
| Tue 9:00a | Grade last week (incl. CLV review), settle, roll board to new week |
| Thu/Mon 7:00p | Refresh + optional 1-lean read (after inactives) |
| Sun 11a, 12p, 1p, 3p, 5p, 7p | Refresh, weekly read (≤2 leans), live prices, settle; the noon run exists to re-check 11:30a inactives |
Every cycle publishes the artifact and pushes web/index.html, which
redeploys the mirror. Routine prompts point at board/sim.py's header and
docs/ rather than hardcoding model claims.
The Home Screen app (Vercel mirror) pulls supabase/functions/parlay-live
on open, on return to the app, and every 15 minutes while it's on screen:
ESPN scores, FanDuel in-game ML/spread/total and live anytime-TD prices,
and current pregame moneylines for games not yet started. It updates
those in place (tickets keep their legs, repriced) and shows "Live scores
& prices updated HH:MM". The function is read-only and caches 60 seconds.
Injuries, props, sims and the read still come from the scheduled rebuilds.
Home Screen app users (iPhone: iOS 16.4+, installed from Safari) can tap Turn on alerts. Pieces:
supabase/functions/parlay-push/: webpush.ts (VAPID + aes128gcm
encryption on WebCrypto, checked against the http_ece reference
decryptor), diff.ts (what counts as alert-worthy), index.ts
(subscribe / unsubscribe / test / check).parlay-board (free plan, separate from the
business's pristine-tracker): tables push_subs, push_keys (VAPID
pair, generated server-side on first use), push_state (last board
seen), push_log (every alert sent, with counts). RLS on, no
policies: only the function's service role can read them.pg_cron job parlay-push-check posts {"action":"check"} every 10
minutes. The function fetches the public board; if its generated
stamp changed, it diffs against the last one and alerts only on:
a starting QB (one FanDuel prices passing props for) newly Out/Doubtful, another player newly Out/Doubtful whose TD
price was 30%+, a new sims QB dock, a new upset call, a flipped
favorite, a 5+ point moneyline move, or a new week's board. Each
Out/Doubtful alerts once per week. Quiet 11 PM-8 AM ET (changes wait
until 8 AM).Check it: select * from push_log order by at desc and
select count(*) from push_subs in that project.
Artifact db rules: any signed-in viewer reads everything and writes only
their own tickets (owner-tagged; each user sees "My tickets" vs "Friends'
tickets"); only the owner/automation writes the model docs (meta/*) —
verified by a simulated lower-privilege write being refused. The Vercel
mirror is public read-only by design.
python3 board/backtest.py # 12-season table vs closing line (~2 min)
python3 board/tune.py # SD/K/HFA grids, rest, QB-dock validation
python3 board/elo.py # ratings + model-vs-market edges
python3 board/sim.py # today's projections vs market
python3 board/player.py "case keenum"
git log -p memory/judgments.jsonl — leans
never edited after grading, only dated notes appended.nfl_parlay.py remains a standalone, dependency-free CLI, superseded by
the board for daily use:
python3 nfl_parlay.py slate # today's games + win probs
python3 nfl_parlay.py parlay --legs 4 # safest parlay, fair-payout math
python3 nfl_parlay.py parlay --target 0.90 # aim for 90% combined
python3 nfl_parlay.py parlay --pay 500 # most likely +500 ticket
python3 nfl_parlay.py props DEN # priced player props (--alts, --type)
python3 nfl_parlay.py slate --demo # offline sample data