What excursion distributions tell you that P&L does not
Log how far each trade went your way and against you, in R, and you can test exits without re-running entries. It is the cheapest diagnostic I know and it is the one I wish I had started with.
The two numbers
For every closed trade there are two excursions worth recording, both expressed in R — multiples of the risk you took at entry:
- MAE, maximum adverse excursion: the furthest the trade went against you before it closed.
- MFE, maximum favourable excursion: the furthest it went in your favour.
John Sweeney’s Maximum Adverse Excursion is the standard treatment. The core observation is that trades which end badly tend to start badly — they show little or no favourable excursion at any point — while trades that end badly after first going well are a different population with different behaviour.
Why aggregate P&L hides the problem
A profit-and-loss total tells you the sum of what happened. It does not tell you which half of the trade was responsible.
Two setups with identical P&L can be entirely different problems: one where entries are poor and exits are fine, one where entries are fine and exits give the move back. Aggregate numbers cannot separate them, so you end up guessing which side to work on — and if you guess wrong you can spend months improving the half that was not broken.
Excursion distributions separate them directly, because they describe what the trade could have been worth independently of what you actually took.
What it found in my own data
My measured reward-to-risk was 0.17, which implies a break-even win rate near 85.5% against an actual rate of 81.2%. The setup was negative and I assumed the entries were the problem.
They were not. The excursions said the losses were full structural size while a large share of the exits fired at small favourable excursions — small average win against full average loss. That is an exit shape, and no amount of entry filtering was going to change it.
Two consequences worth stating plainly:
- Because MAE and MFE are recorded per trade, exit rules can be re-tested against the same population without re-running entries at all. That turns “does this exit help” into a query rather than a new backtest.
- A trade that never went a single tick in favour is a different animal from one that reached 1R and came back. Treating them the same in an exit rule averages two populations that do not belong together.
How to log it
The whole thing is two extra columns, and they are worth writing from the first run rather than the tenth:
- Log in R, not ticks or currency. R normalises across instruments and across changes in your own position sizing; ticks do not.
- One row per trade. If your log writes a row per bar per snapshot, fold it before you aggregate — the wrong unit produces a believable wrong answer rather than an obviously broken one.
- Record the exit reason as a category — target, stop, time, invalidation. Combined with MFE it tells you which exit path is bleeding.
- Log it before you like your rule. Excursions collected only on setups you already believe in are a biased sample of your own attention.
Honest limits
- Excursions are descriptive. They tell you what the trade did, not what a different exit would have done in a market that would have reacted differently to it. Re-testing exits on recorded excursions ignores your own market impact, which is a fair assumption at retail size and not at every size.
- One instrument, one feed. The numbers above are CL through a single data path. The method transfers; the decimals do not.
- No claim about outcomes. Nothing here says a particular MFE threshold improves results. It says the distribution is the thing to look at before deciding.
Related: five gates I set before looking at a backtest result · more research