██████╗ ██████╗ ██╗ ██╗ ██╗███╗ ███╗ █████╗ ██████╗ ██╗ ██╗███████╗████████╗ ██╗ █████╗ ██████╗ ██╔══██╗██╔═══██╗██║ ╚██╗ ██╔╝████╗ ████║██╔══██╗██╔══██╗██║ ██╔╝██╔════╝╚══██╔══╝ ██║ ██╔══██╗██╔══██╗ ██████╔╝██║ ██║██║ ╚████╔╝ ██╔████╔██║███████║██████╔╝█████╔╝ █████╗ ██║ ██║ ███████║██████╔╝ ██╔═══╝ ██║ ██║██║ ╚██╔╝ ██║╚██╔╝██║██╔══██║██╔══██╗██╔═██╗ ██╔══╝ ██║ ██║ ██╔══██║██╔══██╗ ██║ ╚██████╔╝███████╗ ██║ ██║ ╚═╝ ██║██║ ██║██║ ██║██║ ██╗███████╗ ██║ ███████╗██║ ██║██████╔╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝ ╚═╝ ╚══════╝╚═╝ ╚═╝╚═════╝
artbreguez@lab:~/polymarket-lab$ status --all
● F1 champion MultitaskQR r4 PnL=+$21.91 ROI=64.3% bets=144 [ACTIVE]
● TMAX champion lgbm_emos gate=GO qp_pnl=+$138 [ACTIVE]
● GFS backfill 2602/2602 markets +1350 new forecasts 30 cities [DONE ✓]
● ECMWF backfill queued → triggers full retrain pipeline [PENDING]
● Miami 2026 Sprint weekend FP1: 2026-05-01 16:00 UTC [T-MINUS]
F1 Walk-Forward PnL
+$21.91
27 GPs · 144 bets
F1 ROI
64.3%
multitask_qr r4
TMAX Gate PnL
+$201
Atlanta + BA + Madrid
TMAX qp_pnl
+$138
live sim · lgbm_emos
Autoresearch Iters
450
3 seeds · r4 held
Training Cities
30
GFS: 2602 markets
// miami 2026 grand prix — countdown
SPRINT WEEKEND
FP1 start → 2026-05-01 16:00 UTC
--
days
:
--
hrs
:
--
min
:
--
sec
● champion r4 ready
5 crons scheduled
paper trading only
// process status
GFS Backfill — 30 cities
2602/2602 · 1350 new · 0 errors
DONE
ECMWF Backfill (ifs025 + aifs025)
queued → full retrain pipeline
QUEUED
F1 Autoresearch v3 (3×150 iters)
450 candidates · r4 champion held
DONE
TMAX Champion Publish + HF Upload
lgbm_emos → huggingface/artbreguez
DONE
Miami 2026 Paper Trade Crons
FP1→SQ · SQ→Sprint · Q→Race · settlements
SCHEDULED
Post-GP Retrain Cron (Sundays)
auto sync + retrain + HF publish
ACTIVE
// F1 Lab / Champion Model
multitask_qr r4
run_id: c21e58b0-29c4-544a-97a7-f7ac9b763ee3 · promoted: 2026-04-28 12:26 UTC
+$21.91
Walk-Forward PnL
64.3%
ROI
144
Total Bets
hidden64
depth1
dropout0.05
lr5e-3
h2h_wt1.6
winner_wt0.4
pole_wt1.2
cpole_wt1.4
batch64
// per-family performance
| Market Family | PnL | ROI | Bets | Note |
|---|---|---|---|---|
| head_to_head (H2H) | +$14.13 | 47% | 60 | primary alpha source |
| race_winner | +$5.62 | 166% | 56 | winner_wt=0.4 wins |
| driver_pole | +$2.16 | 257% | 28 | high precision |
// challengers — miami 2026
autoresearch v3| Rank | PnL | ROI | Bets | hidden | depth | lr | h2h | winner | seed |
|---|---|---|---|---|---|---|---|---|---|
| #1 | +$18.05 | 42% | 175 | 64 | 2 | 0.005 | 1.6 | 0.4 | 7 |
| #2 | +$17.63 | 48% | 130 | 80 | 1 | 0.005 | 1.4 | 0.4 | 99 |
| #3 | +$16.23 | 48% | 149 | 160 | 3 | 0.002 | 1.8 | 0.8 | 7 |
// key insights
▸
H2H is the alpha source. h2h_weight=1.6 in every top config. Polymarket H2H prices are systematically less efficient than outright markets. 73% of total PnL comes from H2H bets.
▸
Shallow beats deep. depth=1 outperforms depth=3-4. Only 27 GPs of data — large models overfit. Champion is the simplest architecture that survived 450 iterations.
▸
winner_weight=0.4 wins. Deliberately downweighting winner head forces the shared encoder to learn representations useful for H2H. Counterintuitive but confirmed across 7 rounds.
▸
Dataset ceiling reached. Polymarket had no F1 markets before 2024 R10. 94 snapshots / 27 GPs is the maximum possible. More autoresearch won't find dramatically better models without more data.
// huggingface backup
SYNCEDArtifacts auto-uploaded after every champion promotion.
repo: artbreguez/f1-polymarket-champion (private)
files: model_bundle.pt · calibrators.json · trainer_config.json · metrics.json
trigger: post_gp_retrain.sh → publish_champion_to_hf.py --project f1
⬡ huggingface.co/artbreguez/f1-polymarket-champion ↗
// F1 Lab / Autoresearch History
// autoresearch progression — 7 rounds
| Round | Iters | Method | Best PnL | vs r4 | Result |
|---|---|---|---|---|---|
| r1 | 20 | random | +$15.97 | -27% | baseline found |
| r2 | 30 | random expanded | +$15.94 | -27% | plateau |
| r3 | 40 | hill-climb intro | +$18.78 | -14% | NEW RECORD |
| r4 | 40 | hill-climb seeded | +$21.91 | — | ★ CHAMPION |
| r5 | 40 | grids too wide | +$17.07 | -22% | regression |
| r6 | 50 | ultra-fine | +$19.73 | -10% | convergence confirmed |
| r7 | 450 | 3× parallel seeds | +$18.05 | -18% | r4 held · ceiling reached |
// hill-climbing algorithm (r3+)
# 70% neighbourhood search + 30% random jump
for i in range(iterations):
if rng.random() < 0.70:
candidate = hill_climb_config(rng, best_seed) # ±1 grid step
else:
candidate = mutate_config(rng, baseline) # random jump
pnl = evaluate(candidate)
if pnl > best_pnl:
best_pnl = pnl
best_seed = candidate # update seed dynamically
After r4: grids tightened to ±2 steps around champion config. Confirmed convergence — next improvement requires new feature engineering, not more search.
// F1 Lab / Miami 2026 — Sprint Weekend
// session schedule
SPRINT WEEKEND01/May 16:00 UTC
FP1 — Free Practice 1
Cron fires 16:30 UTC → build snapshot → score → paper trade
SQ pole markets + Q pole markets
01/May 20:30 UTC
SQ — Sprint Qualifying
Cron fires 21:00 UTC → Sprint winner paper trade
miami_sq_sprint
02/May 16:00 UTC
Sprint Race
Settle miami_fp1_sq + miami_sq_sprint
settle
02/May 20:00 UTC
Q — Qualifying
Cron fires 22:30 UTC → settle Q pole
miami_fp1_q
03/May 20:00 UTC
Race
Q→Race paper trade + settle miami_q_r 2h after
miami_q_r
// paper trade slugs
| Slug | Trigger | Target Session | Settle after |
|---|---|---|---|
| miami_fp1_sq | FP1 → 16:30 | SQ pole | Sprint |
| miami_sq_sprint | SQ → 21:00 | Sprint winner | Sprint result |
| miami_fp1_q | FP1 → 16:30 | Q pole | Qualifying |
| miami_q_r | Q → 22:30 | Race winner | Race result |
// bankroll config
# paper trading parameters
bet_size = $5.0 # min $5 to avoid CLOB rejection (<$1 orders fail)
min_edge = 0.05 # 5% edge minimum
order_type = 'GTC' # Good Till Cancelled
meeting_key = 1284 # Miami 2026 (positive key = 2026+)
season = 2026
// F1 Lab / PnL History — Walk-Forward
// cumulative pnl by gp (r4 champion)
27 GPsUnitized PnL (1 unit = 1 share). Multiply × bet_size for dollars.
2024 R122025 R12025 R6 →
// per-family cumulative pnl
| Family | Total PnL | ROI | Bets | Hit Rate |
|---|---|---|---|---|
| head_to_head | +$14.13 | 47% | 60 | — |
| race_winner | +$5.62 | 166% | 56 | — |
| driver_pole | +$2.16 | 257% | 28 | — |
| TOTAL | +$21.91 | 64.3% | 144 | — |
// TMAX Lab / Champion Model
lgbm_emos [alias: champion]
promoted: 2026-04-29 14:51 UTC · gate: GO · 3 cities passed
+$138
qp_pnl (live sim)
+$201
gate aggregate
0.1137
Brier Score
// model leaderboard
historical backtest| Model | PnL | qp_pnl | Brier | Trades | Status |
|---|---|---|---|---|---|
| lgbm_emos (tuned_ensemble) | +$381 | +$138 | 0.1137 | 1245 | CHAMPION |
| gaussian_emos | +$461 | +$4 | 0.1119 | 1242 | NO EDGE |
| det2prob_nn | +$25 | -$173 | 0.1176 | 1254 | SKIP |
// recent-core gate — city results
GO| City | Trades | PnL | ok_ratio | Gate |
|---|---|---|---|---|
| Atlanta | 76 | +$162.45 | 100% | PASS ✓ |
| Buenos Aires | 76 | +$28.84 | 100% | PASS ✓ |
| Madrid | 66 | +$10.25 | 100% | PASS ✓ |
// key metric: qp_pnl > brier
!
gaussian_emos has better Brier (0.1119) but qp_pnl ≈ $4. A well-calibrated model that matches Polymarket prices offers no tradeable edge. Always select champion by quote_proxy_pnl, not raw Brier score.
▸
London/NYC failed the gate (negative PnL, z-scores -5.57 and -8.08). Not noise. Switched to Atlanta/Buenos Aires/Madrid for recent-core validation.
// TMAX Lab / Retrain Pipeline
// full retrain pipeline — current run
IN PROGRESSGFS Backfill — all 30 cities
2602/2602 · 1350 new rows · 0 errors
DONE
ECMWF Backfill (ifs025 + aifs025)
adds neighbor_spread feature to all rows
NEXT
Re-materialize training set
expected: ~8,000+ rows (was 6,447)
PENDING
Re-materialize backtest panel
30 cities · ok-only filter
PENDING
Retrain all models
gaussian_emos · 4× lgbm_emos · tuned_ensemble
PENDING
Benchmark (stride=30)
leaderboard.json → qp_pnl ranking
PENDING
Recent-core gate (stride=1)
Atlanta · Buenos Aires · Madrid
PENDING
Publish + HF upload
if GO → publish-champion → huggingface
PENDING
// training set history
| Before (GFS only, 20 cities) | 6,447 rows |
| After GFS backfill (30 cities) | ~7,800 rows (est.) |
| After ECMWF backfill (neighbor_spread) | ~7,800 rows + feature |
neighbor_spread = |ecmwf_ifs025 − ecmwf_aifs025_single| → uncertainty signal. Was 0 for all rows before this run.
// Ops / VPS Recovery Guide
!! READ FIRST — model backups on HuggingFace
Champion models are backed up automatically after every promotion. Download before rebuilding:
# F1 champion
pip install huggingface_hub
python3 -c "from huggingface_hub import snapshot_download; snapshot_download('artbreguez/f1-polymarket-champion', token='HF_TOKEN', local_dir='/tmp/f1')"
# TMAX champion
python3 -c "from huggingface_hub import snapshot_download; snapshot_download('artbreguez/tmax-polymarket-champion', token='HF_TOKEN', local_dir='/tmp/tmax')"
1
System dependencies
sudo apt-get install -y postgresql redis-server git curl build-essential
curl -LsSf https://astral.sh/uv/install.sh | sh
2
Start services + create DB
sudo systemctl start postgresql redis
sudo -u postgres psql -c "ALTER USER postgres PASSWORD 'PASS';"
sudo -u postgres psql -c "CREATE DATABASE f1_polymarket_lab OWNER postgres;"
3
Clone repos
git clone <f1-repo-url> ~/f1-polymarket-lab
git clone <tmax-repo-url> ~/polymarket-tmax-lab
git clone https://github.com/ArtBreguez/f1-weather-lab-wiki.git ~/f1-weather-lab-wiki
4
Configure F1 lab (.env)
cp ~/f1-polymarket-lab/.env.example ~/f1-polymarket-lab/.env
Edit: POSTGRES_PASSWORD, DATA_ROOT, MLFLOW_TRACKING_URI=http://127.0.0.1:5001
5
Install deps + migrate DB
cd ~/f1-polymarket-lab && uv sync --all-packages --group dev --group modeling && make db-upgrade
cd ~/polymarket-tmax-lab && uv sync --all-extras
6
Start MLflow
cd ~/f1-polymarket-lab && mkdir -p data/mlflow/artifacts && uv run mlflow server --backend-store-uri "sqlite:///$(pwd)/data/mlflow/mlflow.db" --default-artifact-root "$(pwd)/data/mlflow/artifacts" --host 127.0.0.1 --port 5001 &
7
Rebuild datasets (takes hours — use --forecast-missing-only to resume)
cd ~/polymarket-tmax-lab && scripts/pmtmax-workspace historical_real uv run pmtmax build-dataset --markets-path configs/market_inventory/full_training_set_snapshots.json --forecast-missing-only --allow-canonical-overwrite > /tmp/tmax_rebuild.log 2>&1 &
8
Recreate crons via Hermes agent
Ask Hermes to recreate: f1-post-gp-retrain (Sun 22h), tmax-weekly-retrain (Wed 6h), disk-monitor (6h), wiki-auto-update (6h). See cron registry page for exact prompts.
9
Health check
pg_isready -h 127.0.0.1 && redis-cli ping && curl -s http://127.0.0.1:5001/health
cd ~/f1-polymarket-lab && python scripts/health_check_miami.py
// Ops / Cron Registry
// active cron jobs
5 ACTIVE| Name | Job ID | Schedule | Status |
|---|---|---|---|
| f1-post-gp-retrain | e9541147b363 | Sun 22:00 UTC | ACTIVE |
| tmax-weekly-retrain | a3e98dc8d385 | Wed 06:00 UTC | ACTIVE |
| tmax-full-retrain-pipeline | c8d995a44e66 | every 20min (12×) | TEMP |
| disk-monitor | disk-monitor | every 6h | ACTIVE |
| wiki-auto-update | wiki-update | every 6h | ACTIVE |
// what each cron does
f1-post-gp-retrain — Sundays 22:00 UTC
Detects new completed F1 races → Jolpica sync → catalog sync → reconcile mappings → build snapshots → rebuild manifest → fix schemas → walk-forward retrain (r4 config) → aggregate folds → promote if gate pass → HuggingFace upload → wiki push
tmax-weekly-retrain — Wednesdays 06:00 UTC
backfill-truth (new resolved markets) → build-dataset (new forecasts) → re-materialize training set → if +100 new rows: full retrain pipeline (ECMWF + all models + benchmark + gate + promote + HF upload)
disk-monitor — every 6h
Warn at 70% disk. Auto-clean safe targets (TMAX cache, /tmp logs) at 85%.
// log locations
# F1 post-GP retrain
/tmp/f1_post_gp_retrain/retrain_*.log
# TMAX full pipeline
/tmp/tmax_pipeline/full_pipeline.log
/tmp/tmax_pipeline/ecmwf_backfill.log
/tmp/tmax_pipeline/recent_core.log
/tmp/tmax_pipeline/hf_upload.log
# GFS backfill
/tmp/tmax_gfs_backfill.log