Testing every finding against pure noise
Run enough tests and you will always find something. The honest move is to show what noise finds too.
Painting: Arnold Böcklin, Island of the Dead, 1880. The Metropolitan Museum of Art, CC0.
Most correlation dashboards have the same flaw. They test many pairs of numbers, and they show you the pairs that pass. If you test enough pairs, some always pass. That is not a discovery. That is arithmetic.
The Correlation Engine runs that search on purpose, and then it does one more thing. It runs the identical search on data that has no real relationships in it, and it shows both results side by side with the same visual weight. If the real result and the noise result look alike, you should trust neither.
The size of the problem
The engine watches 26 daily time series from four free sources: the Federal Register (presidential documents per day), GDELT (the share of global news coverage per topic), FRED (yields, the VIX, currencies and oil) and Wikipedia page views with bots excluded. It tests every pair of series at every lag from minus seven to plus seven days.
That is about 4,875 hypothesis tests a day. At the usual threshold of p < 0.05, about 244 of them pass by pure chance. That is not a fault in the method. It is exactly what p < 0.05 means.
Four filters
The engine calls a pattern an edge: two series of daily changes that move together, possibly with a lag, across two weeks of runs. To be published, an edge must pass four filters.
- Stationarity. Two things that both trend upward correlate strongly for no reason. So each series is differenced until an ADF test passes, the weekday cycle is removed, and the engine uses Spearman correlation on the changes, not on the levels.
- False discovery rate and effect size. The Benjamini-Hochberg procedure runs across all tests together, with q < 0.05. A surviving pair must also have |ρ| ≥ 0.20, so a tiny but "significant" effect does not count.
- Stability. The same pair, with the same sign, must appear in at least 10 of the last 14 runs. Most survivors of the first two filters are one-day flukes, and this filter removes them.
- The placebo panel. The identical pipeline runs on IAAFT surrogates 20 times a day. A surrogate keeps the values and the wiggle of each series, but it destroys any real relationship between series. Whatever the pipeline finds there, it found in noise.
Why the noise panel matters most
The first three filters are standard statistics. The fourth one keeps the tool honest. The statistics make assumptions, and real data does not always follow them. For example, the 15 lags of one pair are not independent of each other, so the q-values are only approximate.
The placebo panel does not depend on those assumptions. It measures, every day, how many edges this exact pipeline produces when there is nothing to find. The live site puts that number next to the real result. You do not have to trust my statistics. You can compare the two panels and decide.
Published edges also carry a note about a common driver. The engine computes a partial Spearman correlation with the changes in the VIX removed. If the edge holds, the note says so. If it fades, the two series were probably both reacting to the same crisis. This note is context. It is not a fifth filter.
What it will not say
An edge is never a causal claim, and the site never uses causal language. Government announcements usually respond to events, so even a clean lead and lag can point backwards. Most co-movement in this pool comes from a third thing, such as an election or a news cycle, that touches both series.
The correct reading of an edge is narrow: out of about 4,875 searches today, this pattern was one of the most persistent, and here is what pure noise produces under the same search. Nothing more.
Zero published edges is also a valid result. A new fork shows an empty graph for about two weeks, because the stability filter needs 10 runs before anything can publish. An empty graph is the correct output until the data earns a full one.
No servers
The engine runs without a server, a database or a paid API. A GitHub Actions job fetched the data each morning at 06:30 UTC, committed every observation to the repository as CSV files, ran the analysis and rebuilt a static site on GitHub Pages. Because every observation and every claim is in git, the full track record can be audited in the commit history.
I have since paused the daily job, because it used too much of my free Actions time. The static site is still online, and anyone can fork the repository and run it. A free FRED key is optional.
The work this is about
Correlation EngineA daily scan across news, market and government data. It shows every finding next to what pure noise produces, so a lucky match cannot pass as a real one. See it in the hall.


