A faithful, keyless re-implementation of the Royal Trader “FX Asset Screener” spreadsheet: forecast-surprise + long-term scoring across 9 heatmaps and 28 pairs, with COT, central-bank probabilities, retail sentiment and seasonality — now running as a live daily pipeline with a forward test.
The scoring engine exactly reproduces the original spreadsheet (US heatmap FSS −6 / LTS −9, FRED blocks, CFTC COT row, seasonality tables), and the full pipeline is live with 4 daily/weekly cron jobs feeding Obsidian + Notion.
The forward test (2,847 signal outcomes, 44.8% win rate) is the honest measure of whether the screener predicts anything — the site shows it live. The screener is a decision-support tool, not a mechanical entry: it ranks currencies by macro surprise + positioning, which the user then layers with their own trade plan.
Compares actual economic releases (FRED) against forecasts (ForexFactory): positive surprise = score for the currency. US block validated: GDP 1.50/2.10, UR 4.10/4.20, NFP −23k.
Trend/level-based scoring over longer windows — US LTS −9 (bearish) reproduces the ODS exactly.
CFTC COT (large-spec net positions, EUR −72,447 validated), CB rate probabilities (rateprobability.com), retail sentiment (Myfxbook), 10Y seasonality (frankfurter/ECB).
Currency strength per pair → pair-level Total Score (additive component subset implemented; the remaining spreadsheet component awaits its source data per FORMULA_NOTES §4).
| Component | Status | Evidence |
|---|---|---|
| Scoring engine | Validated | US heatmap FSS −6 (Bearish), LTS −9 (Bearish) matches ODS |
| FRED collector | Live | keyless fredgraph.csv; GDP/UR/NFP match ODS |
| ForexFactory calendar | Live | actual/forecast/previous per release, country-filtered |
| CFTC COT | Live | EUR FX net −72,447 on 2026-07-28 matches ODS COT History |
| CB probabilities / retail sentiment | Live | web_extract → markdown → parse (06:00 / 06:05 cron) |
| History + forward test | Live | 52 dated entries · 2,847 outcomes · 44.8% WR |
| Pipeline | Live | 9 heatmaps + 28 pairs + COT + history + forward test daily (06:20 Sydney) |
The spreadsheet formulas were reconstructed into engine/heatmap_scorer.py + currency_strength.py, then validated cell-by-cell against the ODS (FORMULA_NOTES.md).
FRED (keyless), ForexFactory (scrape), CFTC PRE Socrata API (keyless), rateprobability.com + Myfxbook (rendered fetch → markdown parse), frankfurter.app (ECB).
Dated JSON/MD per day in data/, static SPA in site/ (Cloudflare Pages-ready), Obsidian vault push, Notion 'FX Screener Log' DB (15 rows/day), 4 cron jobs.
The forward test is published as it runs — WON/LOST/OPEN per signal, no cherry-picking. Currently 44.8% WR over 2,847 outcomes.
pip install -r requirements.txt
python3 pipeline/run_daily.py # full daily run, no API keys
cd site && python3 -m http.server 8799 # preview dashboard
# optional web_extract inputs (CB probs / retail sentiment)
python3 pipeline/run_daily.py --cb-file data/raw/rateprobability_2026-09-03.md \
--retail-file data/raw/myfxbook_2026-09-03.md