ES
← Back to Portfolio
Geophysics & Seismic Hazard June 2026

CAOS Seismic — Honest Probabilistic Earthquake Forecasting

Earthquakes cannot be predicted, but their probability can be forecast — honestly. A daily, calibrated, conditional probability of seismic events over 1/2/7-day horizons, always shown next to its long-term baseline and scored prospectively against reality with the field-standard CSEP framework. A forecaster, never an alarm.

Operational baseline
Space–time ETAS (MLE) + smoothed-seismicity Poisson null
Challenger gain (in-loop gate)
+0.075 nats/eq vs ETAS, calibrated (prospective validation pending)
Evaluation framework
pyCSEP — N/M/S/L/CL consistency + paired-t / Wilcoxon comparison
Horizons
1 / 2 / 7 days, one inference per day (offline)
Neural speedup
~13× (vectorized expected-counts triggering field)
Publish architecture
git-as-data: gzipped JSON artifact, static viewer, no backend
CAOS Seismic — Honest Probabilistic Earthquake Forecasting — Architecture
#seismology #forecasting #probability #etas #csep #calibration #point-process #geophysics

Business Context

Seismic risk is a multi-billion-dollar concern for insurers, mining and energy operators, critical infrastructure, and civil protection — yet most "earthquake prediction" offerings are scientifically indefensible and erode trust. The value of an honest forecaster is not an alarm; it is a calibrated, auditable probability that decision-makers can combine with their own exposure models, and a public-facing artifact (a reliability diagram) that proves the numbers mean what they say. It is positioned strictly as an independent research and education tool that complements official agencies (in Chile, the CSN; civil protection, SENAPRED), never replacing them.

Strategic Value

CAOS Seismic demonstrates a complete, defensible operational-forecasting stack that most teams never reach: rigorous catalog hygiene (time-varying completeness Mc, moment-magnitude homogenization, dual declustering), a credible statistical baseline, the field-standard CSEP evaluation, calibration as a hard release blocker, and a leakage-proof forecast clock — wired into a deploy architecture where all heavy compute runs offline once per day and the public surface is a pure static viewer (git-as-data, zero processing backend, near-zero hosting cost). The same discipline transfers to any rare-event forecasting problem (failures, fraud, demand spikes): prove skill against a baseline, calibrate, and never over-claim. It is also a working example of communicating uncertainty responsibly — the single hardest part of any risk product.

The Challenge

Earthquake "prediction" is effectively impossible: whether a small rupture cascades into a great one depends on unmeasurably fine detail of the crust (Geller et al., 1997). Yet the public conversation oscillates between false alarms and false reassurance — and the lesson of L'Aquila (2009) is that over-reassurance is what causes harm. The honest, scientifically mainstream alternative is Operational Earthquake Forecasting (OEF): not a yes/no prediction, but a bounded, calibrated probability of an event in a region × magnitude band × horizon, reported with uncertainty and proven against reality.

Our Approach

CAOS Seismic ingests decades of global seismicity and complementary geophysical covariates and fits a maximum-likelihood space–time ETAS model (Ogata 1998) — the de-facto operational baseline — alongside the mandatory stationary smoothed-seismicity Poisson null any time-dependent model must beat. Every forecast is a probability strictly in (0,1) via the single public exceedance formula P = 1 − e^(−N), scoped to a horizon and magnitude threshold and shown next to its baseline ratio with P10/median/P90 bounds. A strict forecast clock hands the model only the catalog up to issue time, so temporal leakage is structurally impossible and every past forecast is byte-reproducible. Skill is established with pyCSEP: consistency tests (N/M/S/L/conditional-L) and comparison tests on information gain per earthquake (in nats) against both the null and ETAS — ROC/AUC is banned as calibration-blind. A GPU-trained, context-conditioned neural temporal point process is a gated challenger that reaches the public map only if it beats ETAS in our own prospective CSEP harness and is calibrated; until then, ETAS ships.

Key Performance Indicators

KPIBaselineResultImpact
Skill claimAsserted (accuracy / AUC)Proven in nats vs ETAS + Poisson null (CSEP)No model ships without measured skill
CalibrationUncalibrated probabilities shipReliability diagram; calibration is a release blocker"When we said 5%, it happened ~5% of the time"
Leakage & reproducibilityAd-hoc backtests, future peekingStrict forecast clock; byte-reproducible logsEvery past forecast scored as it was at issue time
Coverage & bias auditSingle high-seismicity regionGlobal; many high- AND low-seismicity countriesBias toward active zones is audited, not assumed away

Architecture

seismic-forecasting honest

seismic-forecasting honest

seismic-forecasting pipeline

seismic-forecasting pipeline

Forecasts, never predictions

CAOS Seismic reads the recent state of global seismicity and publishes bounded, calibrated, conditional probabilities of earthquakes over short horizons (1 / 2 / 7 days), for a region and a magnitude band, always shown next to the long-term baseline and evaluated prospectively against reality. It produces one inference per day, renders a continuous probability field (never alarm dots), and never issues an alarm, a countdown, a binary call, or a “safe” state.

Earthquakes cannot be predicted, but their probability can be forecast — reported honestly, with uncertainty, evaluated against reality, never as an alarm and never as a promise of safety.

Following the ICEF definition (Jordan et al., 2011), a prediction is a deterministic statement that an event will or will not occur; a forecast gives a probability strictly between 0 and 1. Short-term probabilities of a large event may vary over orders of magnitude but typically stay low in an absolute sense (< 1% per day). A single outcome neither validates nor invalidates a probabilistic forecast — a 3% forecast is not wrong when the 3% outcome occurs.

What makes a forecast honest here

  1. A defensible baseline. A maximum-likelihood space–time ETAS model (Ogata 1998), plus the mandatory stationary smoothed-seismicity Poisson null any time-dependent model must beat. A transparent Reasenberg–Jones model is the sanity-check fallback.
  2. Skill is proven, not asserted. Every model is scored with the community-standard CSEP framework via pyCSEP — consistency tests (N/M/S/L/CL) and comparison tests on information gain per earthquake (in nats) against both the null and ETAS. ROC/AUC is banned as a skill metric (it is calibration-blind). A live reliability diagram is the headline artifact.
  3. Calibration is a release blocker. An uncalibrated probability does not ship.
  4. Leakage is structurally impossible. A strict forecast clock hands the model only the catalog up to issue time; every forecast is logged immutably with its exact input state, so any past forecast is byte-reproducible and scored against the catalog as it was at issue time.
  5. A stronger model must earn the map. A GPU-trained neural temporal point process is a gated challenger: it reaches the public map only if it beats ETAS in our own prospective CSEP harness and is calibrated. Until then, ETAS is what ships.

Architecture — heavy compute offline, the web is a pure viewer

  Local GPU workstation (daily ~03:00)              Public repo (git-as-data)     Static web
  ─────────────────────────────────────             ─────────────────────────     ──────────
  fetch (ComCat + regional FDSN) → hygiene           results/forecast-             GitHub Pages
  (Mc, Mw, decluster) → fit/condition ETAS    ──▶    YYYY-MM-DD.json.gz     ──▶    SPA reads the
  (+ GPU challenger) → simulate → calibrate          + index.json + CSEP           committed JSON
  → ONE compact artifact → scoped commit → push      + manifests                   (no backend)

The mandatory data-hygiene order is load-bearing: time-varying completeness Mc(x,y,t) → moment-magnitude homogenization → dual-catalog declustering. The runtime is a Vite + React + TypeScript viewer that renders the committed artifact — no server computes anything, so hosting is near-free and the forecast is fully auditable from the git history.

Global by design, to audit bias

The model trains on global seismicity and runs inference across many countries — high-seismicity (Chile, Japan, Indonesia, Mexico, Türkiye, California, New Zealand) and low-seismicity (United Kingdom, Germany, Australia, Brazil) — precisely so the forecast can be compared and audited for bias toward active zones. The single public exceedance formula P = 1 − e^(−N) never changes; only the quality of the conditional intensity λ improves.

The honest limits

  • No deterministic prediction — the physical picture is self-organized criticality; fine-scale crustal detail is unmeasurable.
  • Absolute probabilities stay small even during an active sequence; the relative gain over background can be 1–3 orders of magnitude, but the absolute number stays low — so it is always shown next to the baseline.
  • The dangerous failure mode is communication. This product never over-reassures and never issues an alarm. Blank on the map means no forecast / out of coverage — never “safe”.

Live

seismic.fasl-work.com — the world probability field, per-country drill-down, the reliability diagram, the multi-model back-analysis, and the honest experiment journey.

Source on GitHub · Technical wiki

Technology Stack

Python NumPy SciPy ETAS pyCSEP PyTorch USGS ComCat TypeScript React Vite MapLibre GitHub Pages

Visual assets for this project are not publicly available.