Live: https://quantarram.github.io/weather-impacts-dashboard/
A daily-updated, self-scoring record of rare, slow climate conditions and what happens to markets after they fire. Each condition is a conditional-exceedance (CPE) row: when this climate series is in its extreme tail, how often does that market follow into its own tail over the next N days? Every condition is frozen in advance with its threshold fixed from data through 2012, logged the day it first fires, and scored only on what happens afterwards.
This is the live counterpart of Paper 17, Why Everyday Weather Does Not Move Markets, and Where Rare Extremes Might (Zenodo, Substack). The paper's result is a candidate, not a finding: rare extreme tails showed persistence only inside the CPE framework's own selection rules, on few episodes, and a simple trading rule on them lost money in the causal backtest. This dashboard collects the forward evidence. Code and research scripts: quant-regime-research (notebooks/weather_finance/).
- Climate state now: the Oceanic Nino Index and the Nino 3.4 anomaly.
- Frozen conditions: four tables, 159 conditions in all, each with where the series stands against its threshold, an event log, and a live record of resolved and pending outcomes.
- Registered decision experiment: the strong-evidence conditions turned into implied paper positions by one fixed rule, scored daily against holding the same targets and SPY.
- A backtest panel with the causal walk-forward of the same rule (admitted rows hit about 5 points above their base rate, mostly in 2020 to 2022, and the rule earns nothing).
| Table | Rows | Conditions | Series | Frozen | Role |
|---|---|---|---|---|---|
| Batch 1 | 145 | 25 | ONI, Nino 3.4, SOI, Arctic and North Atlantic oscillations | 2026-10-14 | survivors; in the decision rule |
| Batch 3 | 448 | 67 | Nino 1+2/3/4, MEI v2, tropical Atlantic, Atlantic warm pool, PNA, Southern Annular Mode | 2026-10-14 | survivors; in the decision rule |
| Batch 4 | 50 | 28 | regional drought (Delta, Southeast, Texas, northern plains, West), Trans-Nino, North Pacific Gyre Oscillation, global temperature, snow cover | 2026-10-14 | survivors; in the decision rule |
| Batch 5 | 55 | 39 | 15 non-ENSO predictor families | 2026-10-14 | watch tier, weaker evidence; condition ledger only |
Tables from weekly freezes (b6, b7, ...) are listed in data/cpe_climate/books.json. Most rows are ENSO indices that move together, so they are one ocean state restated, not independent findings; the page says so next to each table.
The first versions of the four tables (frozen 2026-10-10 to 12) counted every horizon in rows of a price calendar that has a row for every day, so a 252-day horizon was 252 calendar days (about 174 trading days) for weekday markets, and the climate states were laid on that calendar too. All four tables were rebuilt with the same engine, gates, formation split (thresholds from data through 2012) and survivor filter, but with each target's horizon in its own trading days and each climate state on Monday-to-Friday rows. Rebuilding also stopped test episodes whose last day fell on a weekend from being dropped, so more rows reach the test thresholds than before. Every survivor filter ran on data through 2026-10-12, so the ledger scores only what happens after that date; the entry events and the two scored days of the first versions are kept in data/cpe_climate/legacy_union_calendar/. The backtest panel (decision_backtest.json) was computed before the rebuild, on the first engine output, and has not been recomputed.
A condition fires on the first day its series crosses its frozen threshold (conditions already beyond it at the freeze are logged once as "ongoing"). Each firing opens an outcome for every row of that condition: did the target's forward move over the row's horizon (21 to 300 days) land beyond its frozen threshold in the stated direction? The page reports the claimed probability (formation), the realised hit rate and both base rates. Horizons are in the target's own trading days (a 252-day horizon is 252 of its bars, about 14 calendar months for a weekday market). Until 2026-10-14 they were counted in rows of the seven-day price calendar, which made a 252-day horizon 252 calendar days; no outcome had resolved by then, and the registered decision experiment's positions now run for the trading-day horizon. No significance test is used; overlapping horizons are valid samples.
Registered 2026-10-11 and re-registered unchanged on 2026-10-14, when the tables were rebuilt with horizons in trading days; scored from 2026-10-14 (weatherdash/climate_decisions.py, data/climate_decisions_daily.csv; the two days scored under the first tables are in data/cpe_climate/legacy_union_calendar/). Each firing condition votes on its target's direction until its horizon expires; opposite votes cancel; the active targets are held at equal weight, at 10 bp per unit of turnover. Benchmarks are the same targets held long, SPY, and drift-adjusted excess. Reviews come at 125, 250 and 500 trading days, and the verdict rule ("evidence of an edge" or "no evidence of an edge") is fixed in advance. Positions are paper positions, not advice. The weekly tables are outside this rule.
- Daily (08:30 UTC,
pipelines/run_daily.py): refreshes the climate indices and prices, logs new entry events, scores resolved outcomes and rebuilds the page.python pipelines/daily_summary.pyprints what changed since the previous day. - Weekly: new, distinct conditions are frozen by a fixed rule (
FREEZE_RULES.md; scriptweekly_freeze.pyin the research repo). Most weeks may freeze nothing.
- Climate indices: NOAA Climate Prediction Center and Physical Sciences Laboratory (ONI, Nino regions, SOI, AO, NAO, PDO, MEI v2, TNA, TSA, warm pool, PNA, AAO, TNI, NPGO).
- Drought: NOAA NCEI nClimDiv state Palmer Drought Severity Index. Global temperature: NASA GISS GISTEMP v4. Snow cover: Rutgers Global Snow Lab.
- Prices: Yahoo Finance public chart data (small stores in
data/cpe_climate/). - Contains ECMWF open data (CC-BY-4.0) only in the archive panels.
weatherdash/cpe_climate.py frozen-condition ledger: index parsers, watchlist, entry events, forward scoring, tables (books)
weatherdash/climate_decisions.py the registered decision experiment
weatherdash/signals_page.py the front page (data/signals.json)
weatherdash/prices.py Yahoo chart fetcher
pipelines/run_daily.py the daily job (climate stage first, then the archive stage)
pipelines/build_site.py builds docs/index.html and docs/archive.html
pipelines/daily_summary.py what changed since yesterday
data/cpe_climate/ frozen tables, price stores, event logs, index files, books.json, backtest export
data/signals.json page payload; data/climate_decisions_daily.csv paper-portfolio returns
FREEZE_RULES.md the daily and weekly routines and the freeze rule
ARCHIVE.md the earlier daily weather-forecast panels (modules, pipeline, limits)
Research record, not advice and not a trading tool. The conditions rest on few independent episodes: a rare climate state is a handful of occurrences in four decades, so forward results accrue slowly (the first outcomes resolve about 2026-12-12, most through 2027) and a few resolved outcomes cannot separate a real edge from luck. Survivor tables were selected using test-period results, so their test scores are upward-biased; only the live record is free of that. The weather-forecast archive is in ARCHIVE.md.
If you find this work useful, please cite the relevant paper(s):
Paper 17: the research behind this dashboard
RAMANATHAN S, A. (2026). Why Everyday Weather Does Not Move Markets, and
Where Rare Extremes Might. Zenodo.
https://doi.org/10.5281/zenodo.23301263
Method: the conditional exceedance (CPE) framework
RAMANATHAN S, A. (2026). A Conditional Exceedance Framework for
Interpretable Trading Decisions. Zenodo.
https://doi.org/10.5281/zenodo.20769150
This dashboard (code and data)
RAMANATHAN S, A. (2026). Climate Signals Dashboard (formerly the Weather
Impacts Dashboard) [software and data]. GitHub.
https://github.com/quantarram/weather-impacts-dashboard