Quant Memo
Advanced

CUSUM Monitoring of Strategy PnL

A strategy's daily P&L is noisy enough that a real regime break can hide inside normal-looking daily swings for weeks. A CUSUM chart accumulates small deviations so a persistent shift trips an alarm long before any single bad day would.

Prerequisites: Standard Deviation

A strategy that normally makes an average of $4,000 a day with a daily standard deviation of $18,000 starts, on day 61, quietly earning only $500 a day on average — a real degradation. No single day in the new regime looks alarming: a −$12,000 day is well within the normal $18,000 SD and happens routinely even when healthy. A risk manager glancing at daily P&L sees noise consistent with an ordinary bad stretch, for weeks, while the mean has actually shifted. By the time a monthly report makes it obvious, six weeks of foregone risk-adjusted return have already passed.

The idea behind CUSUM

A cumulative sum (CUSUM) chart doesn't look at any single day. It accumulates the deviation of each day's P&L from the expected mean, letting small persistent shifts build into a large, unmistakable signal even while each individual day stays inside normal bounds:

St=max(0,  St1+(xtμ0)k),S_t = \max\big(0,\; S_{t-1} + (x_t - \mu_0) - k\big),

In words: today's cumulative score is yesterday's score, plus how far today's P&L came in below the expected mean μ0\mu_0, minus a small slack kk that keeps ordinary noise from accumulating — reset to zero if the sum would go negative. An alarm fires when StS_t crosses a threshold hh, chosen from the strategy's own historical volatility so false alarms are rare.

Worked example: catching the drift

Strategy: μ0=4,000\mu_0 = 4{,}000 and σ=18,000\sigma = 18{,}000, both in dollars per day. A slack tuned for a large 1σ shift, k=0.5σ=9,000k = 0.5\sigma = 9{,}000 (i.e. $9,000), fails here: the actual shortfall of $3,500 a day is smaller than that slack, so the accumulator keeps resetting to zero and never fires. Retuning to k=0.25σ=4,500k = 0.25\sigma = 4{,}500 ($4,500), each post-break day now contributes on average 4,0005004,500=1,0004{,}000-500-4{,}500=-1{,}000 net toward the accumulator, and with the threshold retuned to h=3σ=54,000h = 3\sigma = 54{,}000 ($54,000), the chart crosses the alarm threshold roughly 30–40 trading days after the break — noisy in exact timing, but reliably faster than the six-to-eight weeks a monthly report took to make the shift obvious by eye.

Worked example: tuning the tradeoff

A tighter slack (k=0.1σk=0.1\sigma) catches smaller shifts faster but false-alarms more often — simulating the healthy pre-break period 500 times shows this trips a false alarm every 25 trading days on average, unusably often. A looser slack (k=0.75σk=0.75\sigma) rarely false-alarms (once every 300+ days) but takes over 80 days to catch the same $3,500 shift — barely faster than eyeballing a monthly report. The choice of kk is a quantifiable tradeoff between detection speed and false-alarm rate, set by simulating both on the strategy's own history, not a textbook default.

regime shift daily PnL — looks like ordinary noise throughout alarm threshold h CUSUM — flat, then climbs, then trips
The raw P&L series never looks obviously broken. The CUSUM below it accumulates the shift until it's unmistakable.

Distribution · normal
-32000.004000.0040000.00μvalue →
Within ±1σ 68.3%mean μ 4000.00std σ 18000.00

Widen the standard deviation above until it swallows a mean shift of $3,500: that's exactly why no single day's P&L can reveal this regime break, and why an accumulator that ignores day-to-day noise is needed instead.

CUSUM accumulates small persistent deviations from an expected mean so a real regime shift crosses an alarm threshold well before any single day looks alarming. Tune the slack kk and threshold hh by simulating detection speed against false-alarm rate on the strategy's own history.

The classic confusion: setting kk and hh from a generic default rather than the strategy's own volatility and the shift size you care about catching. A slack tuned for a large 1σ shift, as the first example shows, can fail to accumulate at all against a smaller but economically meaningful drift.

What this means in practice

Run a CUSUM on daily P&L (and separately on realized IC, turnover, cost) for every live strategy, tuned by simulating false-alarm and detection-speed tradeoffs on historical data before launch. Treat an alarm as a trigger for investigation, not automatic shutdown — pair it with Live Information Coefficient Monitoring so a P&L-side alarm can be corroborated by the signal side before acting.

Related concepts

Practice in interviews

Further reading

  • Page, Continuous Inspection Schemes
  • Bailey & López de Prado, Balanced Baskets
ShareTwitterLinkedIn