Edge Autopsy邊際解剖

8 lines · 0 passed · $3,300 capital · 1 stale · 2026-08-27which one?

Futures · execution English

Your backtest win rate is 60%. Live is 51%. It isn't costs.

1,506 words · 約 7 分鐘

Costs explained 18% of the gap between our replay and the live account. Entry delay explained 82%, and it accumulated: 5 seconds late on the first trade, 82 on the fifth.

We ran the same signals against the same market data twice: once through an idealised replay that assumes instant fills, and once through a live bot on a prop firm evaluation account. The only difference between the two runs was execution.

RunPer tradeWin rate
Idealised model (instant fills)+$25.5860%
minus entry delay and holding overrun−$11.67 (82% of the gap)
minus spread and commissions−$2.55 (18% of the gap)
Live account, actual+$11.3651%

Two thirds of the edge disappeared. Almost all of it went to timing, not to costs.

Costs move the average. They do not move the win rate. Timing moves both.

That single sentence is what we would have wanted to read a month earlier, so this post is the version we did not have.

Why we trust the decomposition

A decomposition is only as good as its verification, so here is ours. We took the measured delays, wrote them into the replay model, and re-ran it.

The replay then reproduced the live account almost exactly: win rate 51% versus 51%, average per trade off by $2.55. Independently, the measured round-trip spread plus commissions on that instrument and session came to about $2.2.

Two numbers arrived at from opposite directions, agreeing to within a rounding error. That is the part that makes this a finding rather than a story.

All figures on this page come from a simulated evaluation account, not from a funded one. The account is real, the fills are the venue’s, but the money is not ours yet. Our real-money lines and their audited amounts are listed on the performance page.

The delay was not random. It accumulated.

Random latency would widen the distribution of outcomes and leave the mean roughly where the model put it. What we measured was different:

Trade of the sessionGap versus the model
1st5 seconds
5th82 seconds

Each round cost roughly 19 extra seconds: about 8 seconds of extra holding, plus polling interval, plus the order round trip. The gap compounds inside the session because every trade starts from where the previous one ended.

A backtest assumes each trade begins at the same relative moment in the session. By the fifth trade, ours began more than a minute late. For a mean reversion strategy on a short holding period, a minute is most of the edge.

The mechanism is not exotic. Orders go out over a REST endpoint (POST /api/Order/place in the ProjectX Gateway documentation, checked 2026-08-27), the loop polls for state between rounds, and every one of those steps has a cost that the replay charged at zero.

Why win rate is the tell

This is the practical takeaway, and it is testable on your own numbers.

Commissions and spread are a fixed subtraction from every trade. They shift the whole distribution left. Trades that were winning by more than the cost still win; the average drops, the win rate barely moves.

A timing shift is different. It resamples the trade. You are no longer taking the same trade slightly worse off, you are taking a different trade: entered at a different price, exited at a different point in the move. Some of those flip sign. That is what turns 60% into 51%.

So:

If your live win rate does not match your backtest, look at timing before you look at costs.

If costs were the culprit, you would see a lower average with a similar hit rate. A hit rate that falls by nine points is telling you the trades themselves are not the same trades.

The US Securities and Exchange Commission makes the narrower version of this point for retail stop orders: the price at which your trade executes may differ from the price you specified, especially in a fast-moving market (investor.gov, checked 2026-08-27). The same logic applies to any automated entry: the price you modelled and the price you get are two different objects.

This is implementation shortfall, and it has a literature

The framing is not new. Perold called it the implementation shortfall in 1988: the difference between the paper portfolio and the real one, decomposed into the costs of actually getting there (The Implementation Shortfall: Paper Versus Reality, Journal of Portfolio Management 14(3), Spring 1988, checked 2026-08-27).

What we would add from this measurement is a ranking. In our case the shortfall split 82% timing, 18% cost, and only the cost half is the one most retail backtests model. The half that mattered was the half nobody charges you for explicitly.

What this resolved on another line

This measurement closed an open question on a page we had already published. In 〈我以為它過了,多五天資料後沒過〉 we measured the round-trip spread on two days and found that costs could only account for about 10% of the divergence between the shadow replay and the live account. We wrote that the cause was unresolved.

It is resolved now, and the two measurements agree: costs are a small share, delay is the large one. That page has been updated rather than rewritten, with the original limitation still stated.

What we are not claiming

Fixing timing is worth doing anyway, because a strategy you cannot evaluate cleanly is a strategy you cannot judge. Right now part of that t statistic is measuring our polling loop.

What we changed, and what would count as verification

Status as of 2026-08-27: deployed, not verified. Two changes went out.

The small one: the poll interval is now 1 second. As the FAQ below says, that only attacks one of the three components of the 19 seconds, so on its own it slows the accumulation rather than removing it.

The large one: our daily-loss circuit breaker used to hold its own fixed poll against the account endpoint, running the whole session whether or not anything was pending. It now queries at the moment a trading decision is made. That takes account calls from roughly 17,000 a session down to one per decision, three orders of magnitude, and more importantly it takes the account round trip out of the path between the signal and the order. The circuit breaker was never meant to be in that path. It was there because a poll is the easiest thing to write.

The verification is a delay number, not a P&L number. On the next full session, the fifth trade of the day should start single-digit seconds late instead of 82. We are writing that down before we have the number, because the alternative is deciding afterwards which figure counted as success.

If P&L improves and the delay does not, that is not evidence of anything. One session of P&L on a line sitting at t=0.79 with n=53 is a random draw, and reading a random draw as a fix is the failure this whole site is about.

FAQ

Is 19 seconds per round really that expensive? On a multi day holding period, no. On this line, entries are time sensitive within a session and the fifth trade of the day started 82 seconds late. Whether it matters is a function of your holding period, not of the number itself.

Why not just poll faster? That reduces one of the three components. The extra holding time and the order round trip remain, so the accumulation does not go away, it only gets slower. We did cut the interval to 1 second on 2026-08-27, and we do not expect it to be the part that matters. The change we expect to matter is taking the circuit breaker’s account query out of the path between signal and order, described above. Either way, the correct fix is to make the replay charge the same delay the live system pays, so the two agree before you tune anything.

Does this apply to evaluation accounts specifically? The numbers here were measured on one. We have no first hand evidence that evaluation accounts execute differently from funded ones, so we are not claiming that either way.

What would falsify your conclusion? Rewriting the replay with the measured delays and failing to reproduce the live win rate. It reproduced it to the percentage point, which is why we stopped looking for a second explanation.