Bonferroni and Holm Corrections
Two ways to spend a fixed budget of false-alarm risk across many hypothesis tests at once, so that testing more things does not automatically mean finding more (fake) significant results.
Prerequisites: Family-Wise Error Rate, p-values and Multiple Testing
Test one strategy at the standard 5% significance threshold and you accept a 5% chance of calling noise a discovery. Test a hundred strategies at that same threshold and, even if every single one is worthless, you expect about five of them to look "significant" purely by luck. Bonferroni and Holm corrections are two different ways to fix the threshold itself so that the overall chance of any false alarm across all your tests stays at 5%, not the chance for each test individually.
An analogy: splitting a fire alarm budget across many rooms
A building has a fixed tolerance for false fire alarms — say, no more than a 5% chance of any alarm going off with no actual fire, across the whole building, all rooms combined. Install one super-sensitive detector per room, each individually tuned to a 5% false-alarm rate, and with a hundred rooms you will get several false alarms most nights — the individual budgets add up. Bonferroni's fix is blunt but safe: give each of the hundred detectors only of the false-alarm budget, so the sum across all rooms stays capped at 5%. Holm's fix is smarter: don't split the budget evenly upfront — check the least suspicious rooms with a generous budget first, and only tighten the screws for the rooms that already look most alarming.
Bonferroni, one symbol at a time
Testing hypotheses, each normally judged against a per-test significance level (commonly ), Bonferroni replaces with a stricter threshold for every single test:
In plain English: divide your total tolerance for a false alarm evenly across all tests, and only call a result significant if its -value beats this much smaller bar. Testing strategies at overall means each individual strategy needs to count, not . This guarantees the family-wise error rate — the chance of at least one false positive anywhere in the batch — stays at or below , no matter how the tests are correlated.
Holm's step-down improvement, one symbol at a time
Bonferroni treats every test identically and is unnecessarily strict on the tests with the smallest -values. Holm's procedure sorts the -values from smallest to largest, , and compares each one to a different, gradually loosening threshold:
In plain English: the most significant result faces the strictest bar (same as Bonferroni's), but each subsequent result, in order, gets an easier bar, because fewer tests remain "in play" once earlier ones have already been confirmed. You walk down the sorted list and stop rejecting the instant one test fails its threshold — every test after that point is declared not significant automatically, regardless of its own -value.
Picture the curve above as the null distribution every one of your test statistics would follow if nothing real were going on. Bonferroni pushes the rejection cutoff far into the tail for every test simultaneously; Holm pushes it just as far for the single most extreme test, then relaxes it step by step as it works inward.
Worked example 1: Bonferroni on five backtested strategies
Five strategies are backtested, giving -values . At the raw , four of five look "significant." Apply Bonferroni with : the adjusted threshold is . Comparing: (significant), (not), (not), (not), (not). Only one of the five survives — the other three "wins" evaporate once you account for having tried five things.
Worked example 2: Holm on the same five strategies
Sort the -values: , with . Compare each in turn:
- : threshold . Is ? Yes — reject, continue.
- : threshold . Is ? Yes — reject, continue.
- : threshold . Is ? No — stop here.
Tests 3, 4, and 5 are automatically declared not significant, regardless of their own -values. Net result: Holm finds two significant strategies where Bonferroni found only one, because it did not force the second-best result to clear the full bar — it only had to clear .
Both procedures control the family-wise error rate at . Holm is uniformly at least as powerful as Bonferroni — it will never find fewer significant results — because it spends the error budget unevenly, saving the strictest scrutiny for the single most extreme result and easing off for the rest. There is essentially no reason to use plain Bonferroni over Holm in practice.
What this means in practice
Anywhere a researcher tests many signals, parameter combinations, or strategy variants against history, some correction is mandatory before trusting a "significant" backtest — this is the statistical core of why multiple-testing hurdles exist in quant research. A firm that backtests a thousand variants of a strategy and reports the single best Sharpe ratio without correction is, in effect, running the fire-alarm-budget problem with a thousand rooms and no correction at all — false "discoveries" are not just likely, they are close to guaranteed.
The number must be the number of tests you actually tried, not the number you're reporting. Running a thousand backtests, discarding the 995 that failed, and presenting the remaining five as if only five tests were ever run is exactly the abuse that Bonferroni and Holm are designed to catch — and silently omitting the failed 995 from defeats the correction completely. The correction only works if it is applied to the true search size, including every variant that was tried and discarded.
Related concepts
Practice in interviews
Further reading
- Holm (1979), A Simple Sequentially Rejective Multiple Test Procedure
- Bonferroni (1936), Teoria statistica delle classi e calcolo delle probabilita