Research & Methodology
The rules are fixed in advance and published in full. Lag windows, pivot definitions, scoring weights and the strength formula are never changed because recent price action did not fit them.
The core measurement
For each Full Moon we find the nearest significant swing high within
±14 calendar days; for each New Moon, the nearest significant swing low.
The signed lag is pivot date − moon date, so a positive
number means the pivot came after the moon.
| Price Source | Yahoo Finance BTC-USD daily Close (auto-adjusted) |
|---|---|
| Phase Source | PyEphem next_full_moon / next_new_moon, reduced to calendar dates |
| Pivot Detector | scipy.signal.find_peaks |
| Min Pivot Spacing Days | 30 |
| Prominence Pct Of Median Close | 15.0 |
| Max Lag Days | 14 |
| Signed Lag | pivot_date - moon_date (positive = pivot AFTER the moon) |
| Full Moon Matches | nearest significant swing HIGH within +/-14 days |
| New Moon Matches | nearest significant swing LOW within +/-14 days |
What we have found so far
The Full Moon lag
Over the recent two-year window, matched major highs came on average +4.4 days after the Full Moon (median +4, SD 4.2, n=5). Across 2017–2026, roughly 70% of matched major highs occurred after the Full Moon, mean about +3.2 days, median about +6.
Phase-shift and null controls weaken any claim that the astronomical Full Moon uniquely causes the high. Small n, and the effect is regime-dependent.
The stronger lead
The New Moon / local low correspondence is the stronger empirical lead. In 2026, 7 of the first 8 New Moons had a strict local low in T0:T+3, and all 8 were within ±7 days.
Full-history behaviour is regime-dependent. Nodal strength is not a reliable timing predictor.
Pattern Fit Score
A lunar cycle is scored out of 100, in four equal parts:
| Component | Points | What it measures |
|---|---|---|
| New-Moon low alignment | 25 | Did a local low form near the New Moon? |
| Waxing appreciation | 25 | Did price rise from New Moon to Full Moon? |
| Full-Moon high alignment | 25 | Did a local high form near the Full Moon? |
| Waning weakening | 25 | Did price fall from Full Moon to the next New Moon? |
Nodal strength and market state are stored separately and do not inflate the score.
Frozen protocols
A protocol is registered before a test begins and is never edited afterwards. A genuine methodology change is a new version with a link to what it supersedes.
Legacy website methodology (Full Moon / New Moon pivot matching)
The method the original site used to produce the published Full-Moon lag figures. Reproduced exactly by moon_engine.py and pinned by regression tests. Recorded here so any future change is a new protocol version rather than a silent edit.
The exact registered rules
{
"price_source": "Yahoo Finance BTC-USD daily Close (auto-adjusted)",
"phase_source": "PyEphem next_full_moon / next_new_moon, reduced to calendar dates",
"pivot_detector": "scipy.signal.find_peaks",
"min_pivot_spacing_days": 30,
"prominence_pct_of_median_close": 15.0,
"max_lag_days": 14,
"signed_lag": "pivot_date - moon_date (positive = pivot AFTER the moon)",
"full_moon_matches": "nearest significant swing HIGH within +/-14 days",
"new_moon_matches": "nearest significant swing LOW within +/-14 days",
"published_benchmarks": {
"recent_two_year_full_moon": {
"mean_days": 4.4,
"median_days": 4,
"sd_days": 4.2,
"n": 5,
"window_from": "2024-09-21"
},
"2017_2026_full_moon": {
"pct_high_after_full_moon": 71.0,
"mean_days": 3.2,
"median_days": 6.0,
"n": 31
}
},
"caveats": [
"Phase-shift and null controls weaken any claim that the astronomical Full Moon uniquely causes the high.",
"The New-Moon / local-low correspondence is the stronger empirical lead.",
"Nodal strength is not a reliable timing predictor."
]
}Frozen protocol: September 2026 New-Moon low test
A prospective, pre-registered test of the New-Moon / local-low lead. Registered before the window opened and not modified in response to any outcome. v1.1 corrects a TRANSCRIPTION ERROR in this repository's copy of the rule - see 'correction' below. The rule itself is unchanged from the paper and no result was ever published under v1.0.
The exact registered rules
{
"new_moon_utc": "2026-09-11T03:27:00",
"full_moon_utc": "2026-09-26T16:49:00",
"primary_test": "Does a strict local low form in the window T0:T+3 (11-14 September 2026 inclusive)?",
"strict_local_low_definition": "A strict 7-day pivot on the daily LOW: a day t qualifies when LOW[t] < LOW[t-1], LOW[t-2], LOW[t-3] AND LOW[t] < LOW[t+1], LOW[t+2], LOW[t+3]. The test is on INTRADAY LOWS, not closing prices.",
"price_basis": "Daily OHLC. The LOW column only. Closing prices are NOT used.",
"equality_handling": "Strictly less-than on both sides, as written. A low that merely ties a neighbouring low does not qualify. Applied identically on both sides, so a flat double bottom yields no pivot rather than two.",
"decidability": "A day cannot be judged until 3 subsequent daily bars exist. Until then the result is UNDETERMINED - never 'failed'.",
"invalidation": "A qualifying pivot is NOT invalidated by a lower low occurring later, inside or outside the window. The test asks whether a strict local low FORMED in T0:T+3, not whether it was the cycle's lowest price. The deepest low of the cycle is a separate, separately reported measure.",
"new_moon_strength_recorded_in_advance": 79,
"strength_caveat": "The 79/100 figure was recorded in advance as context only. It is NOT evidence that a low must occur, and it does not enter the Pattern Fit Score. The strength formula implemented in btcmoon.lunar.phases scores this same New Moon 69.2/100; the two numbers are kept separate rather than reconciled, because tuning a formula to reproduce a historical figure would breach the research constitution.",
"if_low_forms": "Measure maximum upside at exactly 7, 14 and 21 days from the pivot date.",
"secondary_tests": [
"Waxing return from the New-Moon low to the Full Moon (26 Sep).",
"Cycle-high alignment relative to the Full Moon.",
"Relationship to a website-defined major high (see website-methodology-v1)."
],
"distinct_concepts": {
"qualifying_strict_local_low": "The formal pre-registered test. LOW-based 7-day pivot in T0:T+3.",
"lowest_price_in_a_wider_window": "Descriptive only. Not the test.",
"absolute_cycle_low": "The deepest low between consecutive New Moons. Reported separately.",
"informal_nm_plus_0_4": "A private, never-pre-registered intraday timing idea. Requires hourly data. Must never stand in for, or be conflated with, the formal test.",
"legacy_website_new_moon_pivot": "CLOSE-based scipy.signal.find_peaks major pivot, spacing 30, prominence 15% of median close, matched within +/-14 days. A different measure entirely - see website-methodology-v1."
},
"final_review": "After 30 September 2026.",
"amendment_policy": "None. Lag windows, pivot definitions, scoring weights and the strength formula are fixed for the duration of this test."
}