Polymarket Player Goal Value
This skill implements a value framework for player-goal YES markets (World Cup + league + match-level props) using real player-level scoring data.
It models fair value using:
- real historical goals/90
- expected minutes per appearance (from real minutes/games)
- role from position (F/M/D/G)
- small penalty-goal uplift (from goals vs non-penalty goals)
Then it places patient limit buy ladders only when fair value edge exceeds a threshold.
Reference inspiration: https://x.com/Predicti0r/status/2061791808158400570
What it does
- Scans active player-goal markets from Simmer imports plus Polymarket sports-page premade combo legs
- Loads single-source player data from
data/wc_players_filtered.csvgenerated byscripts/fetch_wc_stats.py - Merges
data/custom_players.jsoninto the refresh pipeline for non-Understat players such as MLS/Eredivisie players - Converts player stats into fair
P(score >= 1)with a Poisson model - Skips unknown players (no fallback guessing)
- Uses ask price for edge checks (
fair - ask_yes >= min_edge) - Applies spread/slippage quality gates + optional context safeguards
- Places laddered limit orders (
GTC) at discounted prices from fair - Enforces cooldown + daily budget controls
- Supports
--venue(sim,polymarket,kalshi) for testing and deployment
Defaults
- Dry-run by default (no real orders)
min_edge: 0.06max_position_usd: 12daily_budget_usd: 40max_trades_per_run: 3- limit ladder: 8c / 5c / 3c below fair with 25% / 35% / 40% allocation
Run
cd skills/polymarket-world-cup-player-goal-value
# refresh player stats from the free Understat connector
python scripts/fetch_understat_players.py --seasons 2026,2025,2024 --min-minutes 300
# refresh World Cup stats and rebuild filtered player data (incremental cache)
python scripts/fetch_wc_stats.py
python player_goal_value.py --config
python player_goal_value.py --venue sim # dry run in $SIM venue
python player_goal_value.py --venue sim --positions # inspect open sim positions
python player_goal_value.py --venue polymarket --live # live orders on Polymarket
Tune
python player_goal_value.py --set min_edge=0.08
python player_goal_value.py --set max_position_usd=20
python player_goal_value.py --set daily_budget_usd=75
python player_goal_value.py --set limit_offsets_cents=10,6,4
python player_goal_value.py --set limit_splits=0.2,0.3,0.5
Notes
- Uses free Understat player data (top 5 leagues) for goals, non-penalty goals, minutes, and role.
- Non-Understat players are supported through
data/custom_players.json;scripts/fetch_wc_stats.pymerges those base stats with ESPN World Cup goals/appearances before writingdata/wc_players_filtered.csv. - Latest season in
--seasonsis included only if upstream sources already expose player rows (e.g. 2026 may be empty pre-kickoff). - Unknown player markets are skipped instead of falling back to synthetic priors.
- Designed for low-liquidity conditions where market chasing is penalized.
- Start in dry-run/sim and tune
expected_tournament_matches,expected_single_market_matches,expected_season_market_matches,min_edge, and minute filters after collecting outcomes.
Bugfixes applied in v0.1.8
- Added Polymarket Gamma
/events/slug/{event}/premade-combosdiscovery so sports-page player-goal legs likefifwc-bra-jpn-2026-06-29are found even when Simmer indexed search returns zero. - Added
SIMMER_WCPGV_COMBO_EVENT_SLUGSto focus runs on specific World Cup event slugs and auto-wire active ESPN game windows to Polymarket event slugs inadaptive_game_runner.py. - Added regression coverage for Brazil/Japan premade combo player-goal import and event-slug focused discovery.
Bugfixes applied in v0.1.7
- Added game-window adaptive runner support so frequent cron ticks stay silent off-window and run only around relevant World Cup fixtures.
- Added player-data freshness gating and scan-limit controls so live/prep window runs do not repeatedly refresh slow stats or exceed scheduler timeouts.
- Added local client factory wiring for safer venue/live client construction in local dogfood runs.
- Refreshed bundled World Cup player data from the merged Understat + custom player + ESPN World Cup pipeline.
Bugfixes applied in v0.1.6
- Added fallback discovery search via
/api/sdk/markets?q=...and merged + deduped results with snapshot feed to recover missing player-goal candidates. - Added sim-only proxy quote option (
allow_proxy_price_in_sim_only) so missing asks in$SIMno longer block all execution tests. - Fixed venue-specific trade payload: only send
price+GTConpolymarket;sim/kalshinow submit supported market orders. --positionsnow queries live account context so it reflects executed sim orders without requiring a separate--liveflag.- Existing v0.1.1 fixes retained: venue plumbing, dry-run state isolation, ask-based edge checks, SDK-managed price normalization.
Deterministic spec (Skill Builder style)
Signal
- Player fair-value estimate from weighted priors:
- penalties, expected matches, minutes certainty, role centrality, mismatch upside
Entry logic
- Require
fair_yes - ask_yes >= min_edge - Build discounted limit ladder below fair value
- Enter only when spread/slippage/cooldown/budget gates pass
Exit logic
- v0.1 focuses on disciplined entry only
- Exit handling can be layered as explicit sell rules in future version
Market selection
- Active Polymarket-imported World Cup “player to score at least one goal” markets
Position sizing
- Fixed per-market cap
max_position_usd - Ladder split from
limit_splits
Risk controls
max_spread,max_slippage_pctcooldown_hoursmax_trades_per_rundaily_budget_usd- optional context safeguards (disable with
--no-safeguards)
