Skip to content

Monitoring, decay & the venue

ExpertDuration 40 minTools Python 3, pandas, numpy, A live/incubation trade log

Every live strategy will have a bad stretch. The entire skill of monitoring is answering one question honestly: is this drawdown the variance I signed up for, or is the edge gone? Get it wrong in one direction and you kill a good system on noise; get it wrong in the other and you feed a dead one until it empties the account. This lesson gives you the tools to tell them apart — rolling expectancy, a Monte Carlo envelope, kill criteria fixed in advance — plus a fourth signal most retail traders never watch: whether the venue itself has quietly turned against you.

Segment: 5:46–15:00 — the six detection methodswatch full video

Watch for: The escalating methods — drawdown rules, consecutive losers, statistical process control, Monte Carlo probability cones, metric-out-of-norm — and the thesis he repeats: decide your criteria before you need them.
Watch for: A single real, unedited equity curve from a system Davey actually retired, and the pre-registered $20,000 drawdown stop that would have avoided a second $20k drawdown had it been honoured. The low-jargon version of 'have a plan before you need it.'

Rolling expectancy is your heartbeat monitor. Expectancy — average R-multiple per trade — was a Level 1 measurement on a static log. Live, you compute it on a rolling window (say the last 30–50 trades) and watch it move. A rolling expectancy that stays near its backtested value is a healthy pulse. One that trends steadily toward and through zero is the first quantitative sign of edge decay — the slow death that most published anomalies suffer, decaying about 33.7 bps/month after publication as others crowd in. But a rolling number alone is noisy, which is why you need the next tool to give it a reference.

Drawdown against a Monte Carlo envelope. A single historical drawdown figure is just one draw from a distribution — because the order of your trades was essentially random, a different ordering would have produced a different worst drawdown. So instead of comparing live drawdown to one number, you resample your strategy’s own trade sequence thousands of times, record the worst drawdown of each shuffled run, and build an envelope: the 50th, 95th, 99th percentile of drawdowns the strategy could plausibly produce if nothing has changed. Now live drawdown has a reference. Sitting inside the 95th percentile is ordinary bad luck — painful, expected, not a kill signal. Punching past the 99th percentile is evidence that the live distribution is no longer the backtested one. Alan Clement uses exactly this to size dynamically and gate new entries: halve size (or stop new entries) when the Monte Carlo drawdown breaches his appetite, resume when it recovers. This is the retail-grade cousin of CUSUM-style drift detection — a running check of whether recent behaviour has departed from the reference distribution.

Kill criteria, written cold. The envelope tells you where you are; the kill criteria, written in advance, tell you what to do about it. Davey’s most-repeated line across every talk: decide the criterion before you trade, in writing, because decisions made mid-drawdown, under stress, are unreliable. His own real example is a pre-registered $20,000 drawdown stop that — had he honoured it — would have spared him a second identical drawdown on a system that was, in fact, finished. A kill criterion is a specific, measurable, pre-committed trigger: “stop if rolling expectancy is negative over 50 trades,” or “stop if drawdown exceeds the 99th-percentile Monte Carlo envelope,” or Davey’s blunt “stop after six consecutive losers because history never showed more than two.” Written cold, honoured warm.

Fill-quality drift as a venue detector. Here is the signal most retail traders never watch, and it points at the broker rather than the strategy. You already log expected-versus-actual fills from incubation (Lesson 3.4). Keep logging live, and watch the trend. Most retail CFD brokers run hybrid A-book/B-book models: some client flow is passed to the market (A-book), some is internalised with the broker as counterparty (B-book). A B-book/dealer broker can degrade or hide execution quality precisely for clients who become consistently profitable — a structural conflict of interest that has nothing to do with your edge. So if your fill-quality series drifts steadily worse while your signals and market conditions are unchanged, that is a first-class flag: not “my strategy broke” but “my venue may have changed how it handles me.” Reading fill-quality drift keeps you from misattributing a venue problem to an edge problem — and vice versa.

The capacity ceiling, noted. Finally, an edge can appear to decay simply because you outgrew it: as size rises, your own orders move the market and eat the margin, defining a capacity ceiling past which the strategy stops working at that size even though the edge is intact at smaller size. Lesson 3.7 models this; here, just add it to the differential diagnosis when expectancy fades — is the edge gone, has the venue turned, or did you simply get too big for it?

Four instruments, one question: real edge death, ordinary variance, a hostile venue, or your own size. Monitor all four and you rarely confuse them.

Compute rolling expectancy and place the live max-drawdown inside a Monte Carlo envelope built from the strategy’s own trades.

import numpy as np
import pandas as pd
rng = np.random.default_rng(42)
# R-multiples from a live/incubation log (each trade's profit in units of initial risk).
# Toy edge: mostly small losses, occasional larger wins; expectancy slightly positive.
r_multiples = pd.Series(rng.choice([-1, -1, -1, 2.5, 3.0], size=200, p=[.25, .25, .20, .18, .12]))
# 1. Rolling expectancy — the heartbeat.
window = 50
rolling_exp = r_multiples.rolling(window).mean()
print(f"backtest/overall expectancy: {r_multiples.mean():+.3f} R")
print(f"latest rolling ({window}-trade) expectancy: {rolling_exp.iloc[-1]:+.3f} R")
if rolling_exp.iloc[-1] < 0:
print(" -> rolling expectancy NEGATIVE: investigate edge decay")
# 2. Monte Carlo drawdown envelope — resample the trade ORDER many times.
def max_drawdown(equity):
peak = np.maximum.accumulate(equity)
return (peak - equity).max()
sims = 5000
mc_dd = np.empty(sims)
arr = r_multiples.to_numpy()
for i in range(sims):
shuffled = rng.permutation(arr) # same trades, random order
mc_dd[i] = max_drawdown(np.cumsum(shuffled))
env_50, env_95, env_99 = np.percentile(mc_dd, [50, 95, 99])
live_dd = max_drawdown(np.cumsum(arr)) # the drawdown we actually saw (this ordering)
print(f"\nMonte Carlo drawdown envelope (in R): 50th={env_50:.1f} 95th={env_95:.1f} 99th={env_99:.1f}")
print(f"live max drawdown: {live_dd:.1f} R")
if live_dd > env_99:
print(" -> BEYOND 99th percentile: the live distribution may no longer match the backtest — kill-criteria territory")
elif live_dd > env_95:
print(" -> past 95th percentile: watch closely, still plausibly variance")
else:
print(" -> within the envelope: ordinary bad luck, not a kill signal")

Wire the two verdicts to the kill criteria you wrote in your operator contract — this script is the thing that tells you, with numbers, whether today’s pain is variance or death.

Check yourself

  1. The hardest distinction this lesson teaches is between…

  2. A Monte Carlo drawdown envelope is built by…

  3. Davey's single most-repeated rule about kill criteria is…

  4. Why can worsening fill quality over time be a broker-model flag?

You can move on when you can… maintain rolling expectancy as a heartbeat, place live drawdown inside a Monte Carlo envelope built from your own trades, honour kill criteria written cold, and read a steadily-worsening fill-quality series as a possible broker-model flag rather than an edge problem — keeping edge death, variance, venue, and size distinct.