OrderVane

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:

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:

How to log it

The whole thing is two extra columns, and they are worth writing from the first run rather than the tenth:

Honest limits

Related: five gates I set before looking at a backtest result · more research