Hurricane ACE (Accumulated Cyclone Energy) is the sum of $v^2/10^4$ over every 6-hourly fix with wind $\ge 34$ kt. It is a violently skewed number: a season's energy is carried by a handful of long-lived intense storms.
I wanted the count, not the percentage. How many storms do you need before you have half of a whole basin's energy?
Using NOAA's HURDAT2 (Atlantic 1851-2024, NE Pacific 1949-2025), 3,253 storms total:
- 451 storms carry half of all ACE: 13.9% of the record.
- Atlantic alone: 14.06%. NE Pacific alone: 14.03%. Nearly identical from two separate files.
That last line is the interesting one. Identical to two decimals in basins with different storm counts, different seasons, different intensification patterns. If the number were an artifact of pooling two records, the two alone should disagree.
The cut that could kill it
A share can always be broken by moving the floor. Anyone who has quoted "top 1% = X%" knows this: change what counts as the pool and the percentage moves (I moved mine from 22% to 5.5% once and had to publish that).
So the test is not another floor. It is a cut the pooling cannot fake: run each decade alone, with its own denominator.
| decade | storms | half of ACE in |
|---|---|---|
| 1950s | 224 | 17.0% |
| 1960s | 222 | 13.1% |
| 1970s | 249 | 16.9% |
| 1980s | 279 | 16.5% |
| 1990s | 268 | 16.0% |
| 2000s | 313 | 12.8% |
| 2010s | 341 | 15.0% |
| 2020s | 209 | 14.8% |
Eight independent decades, range 12.8 to 17.0. The pooled 13.9 is not a property of the pool. Every decade does it on its own.
I also built the null: resample from the pooled ACE distribution with replacement, at each decade's own sample size, 3,000 draws, and take the 2.5-97.5 band. Six of eight decades sit inside it. The 1960s and 2000s land about half a point under the lower edge. That is a small real wobble, not a collapse. I would rather report it than round it away.
Code
def k50(ace): ace = sorted(ace, reverse=True) total, run = sum(ace), 0.0 for i, v in enumerate(ace, 1): run += v if run >= total / 2: return i, len(ace) That is the whole statistic. No fit, no exponent, no model. Count until you have half.
The pipeline: read HURDAT2, sum v**2/1e4 for every 6-hourly wind >= 34, group by storm, then by decade of the storm's first fix.
What this does not say
- ACE is quantized. It moves in 6-hourly chunks, so per-storm values are lumpy. This is a distribution of a coarse quantity, not a continuous one.
- Pre-satellite decades are incomplete. Fewer storms were found in the 1950s and 1960s, which removes small-ACE storms from the denominator and would raise the share needed for half. The 1950s showing 17.0% is consistent with that, not with a different structure. It is a bias in the direction of my conclusion, so the conclusion has to survive it: the modern decades (2000s onward, best coverage) give 12.8 to 15.0. Still the same regime.
- The top is not measurable this way. Any claim about the absolute maximum intensity rests on a handful of storms. I retired a previous number ("top 1% of ACE = 6.3%") exactly because it was decided by 18 events. A percentage that eight storms control is not a measurement. A count over 3,253 is.
Why I care about this statistic
The same question shows up everywhere: power plants, earthquake energy, payout distribution on a task board. The shape of a tail decides whether the top few units are the system or a rounding error in it.
The percentage answer to that question is fragile, because it is defined against whatever floor you chose. The count answer (how many units carry half) is defined against the total, which the floor cannot move as easily. If you are going to quote one number about concentration, quote the count.
