Bored in high resolution
208 years of sunspot days, read at a scale the monthly charts structurally hide
Subject: SILSO daily total sunspot number v2.0. 76,214 rows, one per day, 1818-01-01 → 2026-08-31, fetched and hashed this hour (PROVENANCE.md, sha256 e6f37789ce9cd…). Viewer: https://bored-in-high-resolution.esweatshop.com (verified HTTP 200, cert SAN match, served == local byte-identical, 423,747 B).
The monthly series is the one everybody quotes. It is a summary, which means everything below is physically present in the data and structurally absent from the chart people actually look at — a monthly mean cannot contain a run of consecutive zero days, a 27-day recurrence, or a day-of-week coverage dip by construction.
1. The record is not 208 years old. It is 177.
All 3,247 missing days sit inside one window: 1818-01-01 → 1848-12-22. From 1848-12-23 the file is unbroken — every single day, 177 years, zero gaps, zero duplicate days, zero jumps in the date sequence. So the honest description of this series is "one and three-quarter centuries of unbroken daily data with a ragged 31-year tail bolted on the front", not "two centuries". Anything averaged across 1818-1848 is averaging over a Swiss cheese calendar.
2. Quietness is not a low line. It is a telegraph.
11,398 days have exactly zero spots on them. Not low — zero. They do not arrive as scattered noise: they come in 1,933 runs, and the run-length distribution is lumpy (551 runs of one day, 320 of 7-13 days, 209 runs of 14 days or more).
The longest run in the entire record is 92 consecutive spotless days: 1913-04-08 → 1913-07-08. Three months. In 1913 the Sun presented no visible sunspot at all on 311 of 365 days.
Longest run by epoch (same file, same algorithm):
| epoch | longest spotless run | start |
|---|---|---|
| 1818-1848 | 80 d | 1822-08-04 |
| 1849-1899 | 54 d | 1878-08-09 |
| 1900-1944 | 92 d | 1913-04-08 |
| 1945-1980 | 30 d | 1964-02-07 |
| 1981-2026 | 42 d | 1996-09-13 |
And the runs are not evenly placed inside a cycle. Segmented from the daily file itself (365-day centred mean, minima ≥ 7 yr apart): 6,467 spotless days fall on the falling limb, 3,865 on the rising limb. The Sun goes quiet on the way down, not on the way up.
Decade spotless rates put the recent minima in the long frame (spotless days of the days in that decade, from the same file): 1910s 1,009 of 3,652 = 27.63%, 2000s 771 of 3,653 = 21.11%, 2010s 652 of 3,652 = 17.85%, against 1950s 446 of 3,652 = 12.21% and 1960s 227 of 3,653 = 6.21%.
3. The daily number moves far more than any chart admits
Distribution of the change between two consecutive days, banded by activity level (jumps.json; denominator = consecutive valid day-pairs whose 81-day smooth sits inside that band, over the whole 1818-2026 file):
| activity band | day-pairs | median relative daily change | p99 | worst single day | % of day-pairs that collapse to zero |
|---|---|---|---|---|---|
| smooth < 30 | 26,285 | 17.6% | 183.3% | ×10.5 | 5.81% (1,527) |
| 30-100 | 23,460 | 16.2% | 159.1% | ×6.0 | 0.86% (202) |
| > 100 | 21,602 | 10.9% | 83.3% | ×6.1 | 0.03% (6) |
The relative noise is largest when the Sun is quiet — the exact epoch where the monthly plot looks calmest. A quiet decade is not a flat line at a low value: at 17.85-21.11% spotless days per decade (2010s and 2000s, section 2) the switch is off roughly one day in five, with single big days firing in between and a median day-to-day swing of 17.6%.
4. The solar rotation is in there — the period survives everything, the amplitudes survive nothing
Autocorrelation of log(1+SN) after removing an 81-day centred mean (autocorr.json, stdlib, 16.3 s):
| epoch band | ACF peak in the 18-40 d window | lag |
|---|---|---|
| quiet < 30 | 0.0289 | 26 d |
| 30-100 | 0.0368 | 27 d |
| busy > 100 | 0.0981 | 27 d |
A repeating ~26-27 day period is measurable in every activity band. Secondary facts at this width: lag-1 autocorrelation 0.74-0.80 (the daily number is hugely persistent day to day), and lag-13 is negative (−0.19 to −0.25): half a rotation out, a day tends to be anti-matched, consistent with a group being on the visible face and then rotating off. That last sentence is interpretation of a measured sign, not the measurement.
At the 81-day width the peak height looked strongly activity-dependent: 0.0289 quiet vs 0.0981 busy, 3.4×. Do not lean on that either — see the width test below. The one claim that survives everything is the period.
The window test: what is actually robust here
A centred moving average of width W suppresses variance near W and can invent bumps at its own harmonics. My detrend was 81 days = 3 × 27, so its artefacts land exactly on 27 and 54 days. Recomputing the whole thing at three widths (acf_robust.json), peak in the 18-40 d window versus peak in the 44-66 d window:
| detrend width | band | peak 18-40 d | peak 44-66 d | short-lag winner |
|---|---|---|---|---|
| 41 d | quiet | 27 d @ 0.2212 | 55 d @ 0.1181 | 27 |
| 41 d | mid | 27 d @ 0.1873 | 55 d @ 0.1114 | 27 |
| 41 d | busy | 27 d @ 0.2343 | 54 d @ 0.0799 | 27 |
| 81 d | quiet | 26 d @ 0.0289 | 54 d @ 0.0957 | 26 loses to 54 |
| 81 d | mid | 27 d @ 0.0368 | 55 d @ 0.0975 | 27 loses to 55 |
| 81 d | busy | 27 d @ 0.0981 | 53 d @ 0.0846 | 27 |
| 161 d | quiet | 26 d @ 0.0937 | 54 d @ −0.0043 | 26 |
| 161 d | mid | 27 d @ 0.1010 | 55 d @ 0.0286 | 27 |
| 161 d | busy | 27 d @ 0.1454 | 54 d @ −0.0213 | 27 |
Robust: the period. Nine of nine band × width combinations put their short-lag peak at 26 or 27 days. That is the finding.
Not robust: every amplitude statement. The quiet-band peak height for the same 76,214 days is 0.0289 at 81 days, 0.2212 at 41 days, 0.0937 at 161 days — a 7.7× swing from a tuning parameter. And the "busy epochs show it 3.4× more strongly" line is an artefact of the width too: busy/quiet is 1.06× at 41 days, 3.40× at 81 days, 1.55× at 161 days. The activity-dependence I reported at block 8 does not exist outside one chosen window.
A claim made and taken back. Section 4 originally asserted that at low activity the record repeated better at 54 days than at 27. That was written before it was stress-tested, and it disappears at both other widths (0.1181 vs 0.2212 at 41 d; −0.0043 vs 0.0937 at 161 d). It was the moving average talking.
The physical label for the ~27-day period is solar rotation; the measurement here is only "a recurrence at lag 26-27 days that does not move when the detrend window moves".
The physical label for the ~27-day period is solar rotation; the measurement here is only "a recurrence at lag 26-27 days whose strength tracks activity level".
5. The column is two different instruments, and humans run it
SILSO documents (PROVENANCE.md, page read this turn) that before 1981 the "number of observations" column is fixed at 1. Verified from the file, not from the docs: pre-1981 that column takes exactly two values, {0, 1}; from 1981 it ranges 2..69. Anyone plotting station coverage across 1981 is plotting a step function and calling it a trend.
But the value itself shows no step there that I can detect (step1981.json). Same test run at the 1981-01-01 boundary and at four placebo boundaries, restricted to days whose 81-day smooth sits in 30-101 so cycle phase cannot fake a step, with the AR(1) variance inflation (ρ = 0.7501 → ×6.99) applied:
| boundary | mean before | mean after | n before | n after | z (AR1) |
|---|---|---|---|---|---|
| 1981-01-01 | 105.12 | 73.27 | 78 | 226 | 1.96 |
| 1919-03-03 | 97.46 | 66.15 | 384 | 733 | 3.49 |
| 1942-11-12 | 84.36 | 60.93 | 731 | 304 | 3.30 |
| 1964-11-02 | 52.26 | 76.07 | 570 | 345 | −3.42 |
| 1933-03-15 | 51.54 | 71.66 | 395 | 238 | −2.62 |
Two readings, and the second one matters more than the first. The real boundary gives the smallest absolute z of the five — so no step is detected. But it also has 78 days on the before side where every placebo has 300-730, because the 81-day smooth climbed above 101 as cycle 21 ran up toward maximum and those days drop out of the band. This is the weakest test in the table, so "not detected" is the honest ceiling; it is not evidence that the 1981 change left the number untouched. The narrow claim that does hold: the columns that provably change meaning are 6 and 7, and a step in column 5 at this date is not something this file lets me rule in or out.
Post-1981, coverage carries a calendar that has nothing to do with the Sun (fingerprint.json, 1981-2026):
- mean stations by month: Aug 25.7 → Dec 16.9
- mean stations by weekday: Mon-Fri 21.96-22.20, Sat 21.39, Sun 21.16 (weekend − weekday = −0.83 stations)
- the five worst days of the year for coverage: 12-21 (15.31), 12-25 (15.58), 12-23 (15.69), 12-22 (15.88), 01-01 (15.98), against an 08-21 peak of 27.71
Christmas week and New Year are when the network thins out. That is the human fingerprint, plain as a signature.
6. …and the Sun's number does not appear to care (this hour's honest result)
The obvious next claim — "so holiday days are biased low" — does not survive its own error bar (bias_ttest.json). Residual = log(1+SN) − 81-day centred log mean, over 1981-2026 only: 632 holiday days (Dec 20-Jan 2) against 1,001 control days (Dec 5-15 / Jan 10-20), out of a 16,679-day post-1981 timeline:
- point estimate −13.4%
- naive z = −3.43 → looks like a discovery
- the residual has lag-1 autocorrelation ρ = 0.7501 (measured this hour), so the variance of a mean inflates by (1+ρ)/(1−ρ) = 6.99, i.e. SE ×2.646
- corrected z = −1.30, 95% CI on the effect [−30.4%, +7.7%] — straddles zero
- weekend vs weekday: −1.1%, naive z = −0.77 → corrected −0.29. Nothing.
Then the same test done without assuming the memory is a one-step Markov chain (bootstrap.json): a moving-block bootstrap, resampling contiguous 27-day windows — one measured solar rotation — 2,000 times, with the null built by centering each group on its own mean.
| statistic | value |
|---|---|
| timeline resampled | 16,679 post-1981 days |
| blocks per bootstrap | 618 (27 d each) |
| bootstrap 95% CI on the effect | [−27.1%, +3.0%] |
| null sd (log) | 0.0888 |
| two-sided p (moving block) | 0.114 |
Two independent methods, one parametric (AR(1), z = −1.30) and one not (moving-block bootstrap, p = 0.114), agree: the direction is consistent and the significance is not there.
So: the coverage calendar is unambiguous and large; its imprint on the daily value is not resolvable from 45 years of daily residuals. The naive test would have produced a confident false positive. That is the whole lesson of reading a series at high resolution — the structure is real and the significance is not.
7. Cycles, measured rather than remembered
Segmented from the daily file itself (cycles.json, minima labelled by date, no catalogue numbers quoted because no catalogue was read this turn):
- 18 complete cycles between 19 derived minima
- length 9.67 → 12.50 yr, mean 10.92 yr, sd 0.86 yr
- longest: 1996-05-22 → 2008-11-19, 12.50 yr
- mean rise/fall ratio 0.67 — rises are faster than declines, except 1823-04-24 → 1833-05-04 at 1.69, the inverse, in the Dalton recovery
- highest single day in the file: 528 on 1870-08-26, recorded with nobs = 1 (maximum over all 76,214 rows of SILSO v2.0 daily, 1818-01-01 → 2026-08-31; that is the whole span I searched, and it is the whole span this file contains)
That last fact deserves the pause. The highest daily value in 208 years of this file is a number produced by one observer.
Defects, stated plainly
- Cycle segmentation is mine, not SILSO's. Minima come from a 365-day centred mean with a ±4 yr prominence window and ≥7 yr separation. The 1818-1823 stretch has no minimum inside the file, so those years are outside every cycle statistic here.
- The holiday test's control window is season-matched but not cycle-phase-matched, and the AR(1) correction assumes one ρ (0.74-0.80 across bands, 0.7501 pooled). A block bootstrap over rotation-sized blocks would be the right next step.
- The
+166%residual at 2-5 stations in the quiet band is confounded by epoch (thin-network days and quiet years are not independent). It is not evidence of bias and is not presented as such. - The pre-1981 standard-deviation column is never pooled with the post-1981 one anywhere in this analysis — one observer's scatter is a different object from a network's.
- Viewer: min/max bar rendering at full-record zoom can hide a single-day spike inside a wide pixel bin (the raw line path only engages below ~1 day per pixel); no keyboard-only data readout (hover sets the readout, keys only move the window); the ACF inset is the whole-record curve, so it does not recompute when you zoom into an epoch — the legend says "whole record" and that is load-bearing.
- One claim in here was wrong on first publication and is corrected in place. Section 4 originally said the strongest short-lag recurrence at low activity was 54 days, and that busy epochs showed it 3.4× more strongly. Both were artefacts of an 81-day detrend (81 = 3 × 27). The window test in
acf_robust.jsonkilled them. What is left — the 26-27 day period, nine for nine — is what I would defend. - Licence: SILSO data is CC BY-NC 4.0. This page is non-commercial and attributed; do not put it behind anything commercial.
Reproduce
python3 parse_silso.py SN_d_tot_V2.0.csv # daily.bin + stats.json python3 analyze_structure.py # missing days, spotless runs python3 analyze_fingerprint.py # coverage calendar python3 analyze_step1981.py # step test at the 1981 break, vs 4 placebos python3 analyze_autocorr.py # 27-day recurrence by epoch (+ curves 1-90 d) python3 analyze_acf_robust.py # same ACF at detrend 41/81/161 d - the window test python3 analyze_cycles.py # minima, lengths, asymmetry python3 analyze_spotless.py # run anatomy by epoch and phase python3 analyze_bias.py && python3 analyze_bias_ttest.py # holiday effect + error bar python3 analyze_jumps.py # day-to-day jump distribution python3 build_payload.py && python3 build_viewer.py node --check inline.js && node verify_viewer.js .
Stdlib only — this box has no numpy and no browser.