# SignalsAgent League — Scoring Methodology **Version 1.0 — effective from first published week. Weekly rebalance.** ## The problem A signal that makes 500 points on BTC did not do the same work as a signal that makes 500 points on ES. BTC trades six figures; one percent is over a thousand points. ES trades four figures; one percent is about 65 points. Raw points are not comparable across instruments, so a raw-points league is meaningless. ## The rule **NQ is the base. 1 normalized NQ point = 1 league point.** Every other instrument gets a weekly conversion ratio: ``` R_i = P_NQ / P_i ``` where `P_NQ` and `P_i` are the **prior Friday's settlement prices** (crypto: Friday 22:00 UTC print) of NQ and instrument `i`. A signal's league points for a closed trade: ``` league_points = direction_correct_points × R_i ``` where `direction_correct_points` is signed: points gained are positive, points lost are negative. Losses count. This league does not hide drawdowns. ## Why this is fair `R_i = P_NQ / P_i` makes **equal percentage moves score equally**. A 1% move on NQ, ES, BTC, or DAX all produce the same league points. Percentage return per unit of price is the cleanest instrument-agnostic measure of a directional call. Margin is implicitly handled: exchange margin requirements scale roughly with contract notional, and notional scales with price. BTC's higher margin and higher point count cancel out under price normalization. We considered an explicit margin-ratio adjustment and rejected it: margins change midweek at the exchange's discretion, differ across brokers, and would make the league un-auditable. Price normalization is public, reproducible, and disputable by anyone with a chart. ## Rebalance cadence **Weekly.** Ratios are computed from Friday settlement and fixed for Monday 00:00 UTC through Sunday 23:59:59 UTC. Published every Monday on `/league` and in the API (`GET /api/league/ratios`) before the session opens. A trade is scored with the ratio table of the week in which it **closes**. Why weekly, not daily: daily ratios are noisier, invite disputes, and let a provider game entry timing around the daily reset. Weekly is stable, and any drift within a week is symmetric — it helps and hurts everyone equally. ## Example ratio table (seed values — recomputed weekly) | Instrument | Reference price | Ratio R_i | 100 raw pts → league pts | |-----------|----------------|-----------|--------------------------| | NQ | 23,500 | 1.0000 | 100.0 | | ES | 6,450 | 3.6434 | 364.3 | | DAX | 25,000 | 0.9400 | 94.0 | | NKD | 41,000 | 0.5732 | 57.3 | | BTC | 118,000 | 0.1992 | 19.9 | | GC (Gold) | 3,350 | 7.0149 | 701.5 | Check: a 1% move = 235 NQ pts × 1.0 = 235; = 64.5 ES pts × 3.6434 ≈ 235; = 1,180 BTC pts × 0.1992 ≈ 235. Equal work, equal score. ## League standings - Season = calendar quarter. Weekly table published, quarterly winner crowned. - Score = sum of league points over all **closed** trades in season. - Also published per signal: trade count, win rate, average league points per trade, max drawdown in league points. One number never tells the story. - Minimum 10 closed trades per week to appear in the ranked table (below the cut you're listed as "unranked — insufficient sample"). - The evaluator is agnostic about who owns the signal. Longfort's own signals are scored by the same code path as third-party signals. No exceptions, no overrides. Scoring code is published. ## Evaluation tape & the Friday rule Results are produced by Umpire, the deterministic paper executor (`docs/PAPER_EXECUTOR_SPEC.md`), judging every signal — house and third-party — on **official exchange prints** (CME/Eurex via Databento/Rithmic; Kraken WS for crypto). Broker feeds are not evaluation sources: they differ by broker and cannot be independently verified. Only whitelisted, independently checkable symbols are listed. Open-ended signals (no stop/target) stay open until the generator's own exit command; absent one, they are **force-closed at the first print at or after Friday 20:00 UTC** of their opening week (`auto_closed_eow`). Unrealized P&L never counts. No zombie positions. ## Anti-gaming provisions - Signals are scored on **published** entries/exits only (timestamped when the signal fires through the platform, not backfilled). - No retroactive edits. A published signal is immutable. - A provider may retire a signal; its history stays on the board for the season. - New signals enter mid-season with zero; no imported track records count toward the league (you can display them, clearly labeled "unverified, provider-supplied"). ## League epoch & pre-platform records (policy set 2026-07-19) The official league starts at the **league epoch: 2026-07-19**. Only trades closed on or after the epoch AND published through the platform count in official standings — for everyone, house included. At launch, the house imported its own pre-platform history (real broker fills, verified against IG execution records and QuestDB OHLC). Per the rule above, **none of it is league-scored.** It is displayed in a separate, clearly labeled "Pre-platform records" section for transparency: you can see how house signals behaved before the league existed, including the ugly ones, but the scoreboard starts at zero. Provenance is enforced in code: any result closed before the epoch is automatically classified `imported` regardless of who pushes it or what they claim. ## Governance Ratio table generation is `scripts/update_ratios.js` — deterministic from Friday settlement inputs, committed weekly. Anyone can recompute it. Disputes: recompute it. If our number is wrong we fix it and say so.