We tested astrology against 40,000 real events. The results were too good.
S&P 500, VIX, earthquakes, wars. Dozens of features survive correction — and then the aliasing confound shows up.
The Saturn-in-Taurus hypothesis is dead. It failed replication against 966 Nobel laureates. But the methodology is alive, and today we pointed it at something better: events with indisputable dates.
The birth-date approach always had a soft link — the assumption that the moment of birth matters. Events don’t have that problem. A market crash happens on a specific day. An earthquake strikes at a specific second. A war begins at a specific hour. The date is the thing, not a proxy for it.
We loaded four datasets into the pipeline:
| Dataset | Events | Extreme | Null dates | Source |
|---|---|---|---|---|
| S&P 500 daily | 19,182 trading days | 960 (top/bottom 5% returns) | 19,200 | Yahoo Finance, 1950–2026 |
| VIX daily | 9,128 trading days | 1,022 (top 5% spikes or level > 30) | 20,440 | Yahoo Finance, 1990–2026 |
| Earthquakes M6+ | 10,424 events | 10,424 (all extreme by definition) | 104,240 | USGS catalog, 1950–2026 |
| Wars/geopolitical | 62 events | 62 (all extreme by definition) | 12,400 | Curated list |
For each event, we computed a natal chart — the planetary positions at that moment — using the same Swiss Ephemeris pipeline. For S&P 500 and VIX, “extreme” means the top and bottom 5% of daily moves. For earthquakes and wars, every event is extreme by selection. The null distribution is stratified: non-extreme trading days from the same decade and month for markets, random dates from the same decade and tectonic region for earthquakes, random dates from the same geopolitical era for wars.
Same methodology as the birth-date analysis. Fisher’s exact tests. Bonferroni and Benjamini-Hochberg correction. Permutation testing on the top hits.
The results looked incredible. Then we realized why.
The raw numbers
S&P 500 extreme days: 25 features survive FDR correction. 18 survive Bonferroni.
The top hit is Saturn-Uranus opposition at an odds ratio of 3.05 with a p-value so small it rounds to zero. Saturn in Virgo: OR 2.31. Jupiter in Pisces: OR 2.39. Jupiter-Saturn trine: OR 1.99. The permutation test on the top feature: zero out of 10,000 shuffles reached the observed count.
VIX extreme days: 63 features survive FDR correction. 46 survive Bonferroni.
Even stronger. Saturn-Uranus opposition: OR 5.08. Saturn in Virgo: OR 3.53. Jupiter-Pluto trine: OR 3.42. This is the most statistically significant result we’ve seen in the entire project.
Earthquakes M6+: 26 features survive FDR correction. 14 survive Bonferroni.
Neptune in Pisces: OR 1.42. Pluto in Capricorn: OR 1.39. Uranus-Pluto square: OR 1.41.
Wars: nothing survives correction. Ten raw hits out of 385 tests — actually fewer than the ~19 expected by chance. With only 62 events, there’s no statistical power.
If we stopped here, this would be the most significant astrological finding ever published. Dozens of features surviving the strictest correction, with massive effect sizes, across independent datasets.
We didn’t stop here.
The aliasing problem
Look at when the S&P 500 extreme days actually occur:
| Year | Extreme days |
|---|---|
| 2008 | 75 |
| 2009 | 58 |
| 2002 | 57 |
| 2022 | 49 |
| 2020 | 45 |
| 1987 | 41 |
| 2000 | 41 |
Extreme market days cluster in crisis years. Seventy-five of the 960 extreme days come from 2008 alone. During those 75 days, Saturn was in Virgo (it stays in a sign for about 2.5 years), Jupiter was moving through Capricorn, and the Saturn-Uranus opposition was active (an aspect that lasts months).
The top three hits in the S&P 500 analysis — Saturn-Uranus opposition, Saturn in Virgo, Jupiter in Pisces — are not three independent signals. They are three descriptions of the same thing: the sky during the 2008 financial crisis.
This is the same confound that killed the Saturn-in-Taurus finding, but at industrial scale. The TIME 100 subjects clustered in birth windows that happened to coincide with Saturn’s position. Market extreme days cluster in crisis periods that happen to coincide with slow-planet positions. In both cases, the “astrological signal” is really a temporal clustering artifact viewed through the lens of planetary orbital periods.
The null model samples non-extreme trading days from the same decade and month. But within a decade, extreme days bunch in 1–2 crisis years while null days spread across the other 8 non-crisis years. The strata are too coarse to capture this temporal autocorrelation.
The earthquake results tell the same story. Neptune in Pisces (2011–2026), Pluto in Capricorn (2008–2024), Uranus-Pluto square (2012–2015) — these are all slow outer-planet positions that define the most recent decades, which happen to have more detected earthquakes due to improved seismic monitoring. The “signal” is detection technology improving over time, viewed through the zodiac.
Why this matters
This is the most important methodological finding of the entire project, and it has nothing to do with astrology.
Any enrichment test on temporally clustered events will produce spurious associations with slow-moving covariates. It doesn’t matter whether those covariates are planetary positions, sunspot cycles, or the Federal Reserve chair’s shoe size. If the covariate changes slowly relative to the temporal clustering of your events, you will find “signal.”
This is a well-known problem in epidemiology (confounding by secular trends), econometrics (spurious regression with non-stationary series), and astronomy (period aliasing). But it’s rarely discussed in the context of astrological research, because most astrological research doesn’t have a null distribution at all, let alone one that could reveal the confound.
The pipeline caught it because the pipeline is designed to catch things like this. The null distribution, the multiple comparison correction, and the temporal structure of the results all point to the same conclusion: the signal is real in the data but artifactual in its cause.
The fix
There are two approaches, and we’re going to try both.
Approach 1: fast planets only. The Sun moves through the zodiac in a year. The Moon moves through it in a month. Mercury, Venus, and Mars complete their cycles in 1–3 years. Their positions are essentially decorrelated from multi-year crisis clustering. If Moon in Cancer is enriched among extreme market days, that can’t be explained by “the 2008 crisis happened” — the Moon was in Cancer for only 2–3 of those 75 days.
Restricting to fast-planet features (Sun, Moon, Mercury, Venus, Mars) eliminates the aliasing confound by construction. Any surviving signal would be genuinely interesting.
Approach 2: block-shuffle null model. Instead of sampling null dates from the whole decade, shuffle labels within temporal clusters. Group extreme days into crisis episodes (e.g., all extreme days within 60 days of each other), then for each episode, draw null dates from the same narrow time window. This preserves the temporal clustering while randomizing which days within a cluster are “extreme.”
The first approach is cleaner. The second approach lets us keep slow-planet features while controlling for the confound. We’ll report both.
What about the wars?
The war dataset (62 events) shows nothing surviving correction, which is the correct result for a dataset too small to detect anything. But one finding is worth noting: Moon in Cancer appears in 11 of 62 events (17.7%) versus 7.7% in the null, with a permutation p-value of 0.006.
The Moon moves fast enough that this isn’t an aliasing artifact. It’s also too small to be conclusive — 11 events is nothing. But the Moon is the fastest-moving body in the chart, and Cancer is the Moon’s traditional “domicile” in astrological theory. If you were going to find a genuine astrological signal anywhere, a fast-moving body in a small dataset where each event is precisely timed would be the place.
We’re not claiming this is real. We’re noting it as a pre-registered hypothesis for the fast-planet analysis: does Moon in Cancer show up in market extreme days too?
The methodology, continued
Event data. S&P 500: Yahoo Finance, daily OHLCV from 1950-01-03. VIX: Yahoo Finance, daily from 1990-01-02. Earthquakes: USGS FDSN API, M6.0+ from 1950-01-01. Wars: curated list of 62 major geopolitical events with precise dates and coordinates.
Extreme classification. S&P 500: top/bottom 5% of daily returns (absolute value). VIX: top 5% of daily increases OR absolute level > 30. Earthquakes: all events (M6+ is extreme by selection). Wars: all events.
Null models. S&P 500 and VIX: for each extreme day, sample 20 non-extreme trading days from the same decade and month. Earthquakes: for each quake, sample 10 random dates from the same decade and tectonic region (Pacific West, Pacific East, Mediterranean-Himalayan, Atlantic, Other), with random time-of-day. Wars: for each event, sample 200 random dates from the same geopolitical era (pre-WWI, WWI-interwar, WWII, Cold War, post-Cold War), same location.
Charts. Swiss Ephemeris via Kerykeion. Events with known times (earthquakes, some wars) use actual time. Daily data (S&P, VIX) uses noon UTC. S&P charts at NYSE coordinates (40.71, -74.01). VIX charts at CBOE coordinates (41.88, -87.63). Earthquake charts at epicenter. War charts at event location.
Feature encoding. Identical to birth-date pipeline: 10 sign placements, 45 aspects, 7 element/modality counts. ~400 tests per dataset after excluding zero-count features.
Database. All event data, null dates, charts, and features persisted to PostgreSQL (jlmoney schema). Total: 40,296 event charts + 158,280 null charts, all with encoded features. Zero computation errors.
Computation. Charts computed via deduplicated batch processing — 132,242 unique chart computations for 158,280 null rows (24% deduplication from shared calendar dates). Total pipeline runtime: ~5 minutes for chart computation, ~90 seconds for feature encoding.