Corrected timing · wealth 14.41× Ledger A
Same-bar timing · wealth 6,094.94× Ledger F · unavailable information
Corrected timing · Sharpe 1.013
Same-bar timing · Sharpe 2.811
Position changes 232 in each ledger
Daily bars 3,336

Reading the result

How to read these numbers

The headline metrics answer different questions. These short definitions are the interpretation used on this page, not additional evaluation criteria.

Terminal wealth multiple

The result of compounding the modeled net daily returns from an initial wealth of 1. It is a backtest accounting output, not a realized investment gain or a claim of executable performance.

Same-bar credit

Ledger F assigns a position determined by the close of bar t to the return that begins at the open of bar t. The signal was unavailable at that earlier open.

Numerical comparison pass

Both ledgers matched the paper's rounded wealth and Sharpe figures within tolerances fixed before the reproduction run. PASSED is a numerical conformance result, not a trading-strategy verdict.

A price move earned before the decision existed

The uncomfortable number in this reproduction is 6,094.94×. It is not the performance of a strategy I would consider trading. It comes from assigning an open-to-open return to a position that could only have been decided later, once the day’s closing price was known.

Ronald Chan and Eric Lopes published Look-Ahead Bias Has No Deflator, written on 21 October 2026 and posted on SSRN on 23 October. Their deliberately simple momentum example asks what happens when a backtest gets that ordering wrong. In the paper’s main Bitcoin comparison, the incorrect same-bar accounting makes every familiar headline metric look better.

I implemented the two BTC ledgers independently from the described method and compared the results with the paper’s rounded figures. The sealed result and code are public. The paper’s reported results were known when this reproduction was designed; this was not an untouched prospective test.

Which return belongs to the signal?

The position is long or flat. It depends on 20-day close-to-close momentum, expressed as a z-score over the trailing 90 momentum observations. A z-score strictly above 0.5 selects long; otherwise the position is flat. There is no parameter search in this reproduction.

Consider the signal p[t] computed from the closing price of day t. It cannot be known at the beginning of that day.

One signal, two return intervals

Illustrative event sequence · not market prices

F (premature): open t to open t+1, although the signal is known only at close t. A (corrected): open t+1 to open t+2.

F assigns the signal to a return interval that already started before the close. A assigns it to the following open-to-open interval. Schematic only; no observed price path is plotted.

Ledger F uses p[t] against the open-to-open return starting at open t. That interval begins before the information required to calculate the position is available. Ledger A uses the prior signal on the current interval, so p[t] first receives credit from open t+1.

Moving the signal one interval is not a statistical adjustment to a reported Sharpe ratio. It changes the return series that the backtest must calculate.

The reproduction used 3,336 continuous Binance BTCUSDT daily spot bars from 17 August 2017 through 4 October 2026, UTC. Both ledgers apply a charge of 0.001 per absolute position change (10 basis points for a full flat-to-long or long-to-flat change). The implementation includes warmup zeros in the Sharpe calculation, uses the first 3,335 open-to-open returns with a zero final return, and makes no forced liquidation at the endpoint. These choices and the matching tolerances are recorded in the frozen specification.

The reproduced numbers

MeasureA: corrected timingF: same-bar credit
Terminal wealth, from 114.4119×6,094.9403×
Annualized Sharpe1.01342.8110
Maximum drawdown44.72%18.88%
Position changes232232

Ledger F ends with roughly 423 times the terminal wealth of ledger A in this historical calculation. Both make 232 position changes; the difference did not come from trying more variations or increasing the count of trades. The return interval assigned to each decision changed, along with the timing of its turnover charge.

The reproduced wealth and Sharpe figures for both ledgers fall inside the comparison tolerances set before running the reproduction: 0.5% relative error for wealth and 0.005 absolute error for Sharpe. The paper gives rounded figures of 14.41× and 6,094.94×, and 1.01 and 2.81, respectively. The exact machine-readable result records the differences.

The corrected ledger’s 14.41× is also only a modeled historical wealth multiple. A timing-corrected backtest is not automatically an executable strategy: filling an order at the next open, costs beyond the specified turnover charge, and other real trading constraints still need to be examined.

What the reproduction establishes

This work targeted two ledgers in the paper’s BTC example, not its other markets, its complete seven-ledger taxonomy, or its broader theoretical and empirical claims.

The study was frozen on 27 October 2026 at 10:41:05 UTC. The paper and four Binance API pages had already been acquired, and the published comparison numbers were known. The charter records that raw price returns were not explored before the freeze, but that the charter itself was written after acquisition. Calling this an independent implementation is fair; calling it a prospective independent validation would not be.

The recorded run 20261027T104112Z-e234b6bd8583 closed COMPLETE. Its handoff reports integrity PASS and semantic replay PASS. Semantic replay recalculates the result using the same core implementation; it is not a separate independent implementation or a scientific audit of the source paper.

The authors’ original raw data and replication package were unavailable. The exact paper and Binance response bytes used for this run were retained locally and hash-bound, not committed to the public repository. A reader can inspect the public code, method, manifest, freeze record and sealed output, but cannot fully replay this run from the public repository alone. The repository README explains the dependency and source-file limitations.

A check worth making in your own backtest

I would inspect the position series before spending time on sophisticated corrections for selection bias. For each bar, ask when the final input to the signal becomes available and when the modeled return interval starts. Then locate the code that connects those two timestamps.

A one-line shift can change the answer, but it has to be the right shift for the actual decision and fill convention. Simply moving a vector until a Sharpe ratio looks more plausible proves nothing.

The backtest review checklist includes timing alongside data completeness, costs and evaluation rules. The numerical match here supplies a concrete example of why the timing question comes before interpreting the performance headline.

Frozen numerical comparison

Both ledgers matched the paper's rounded results

The fixed reproduction rule compared terminal wealth and Sharpe for each of the two ledgers. This is numerical agreement with a known published example, not a prospective performance test.

Wealth: relative error ≤ 0.5% for A and F PASS
Sharpe: absolute error ≤ 0.005 for A and F PASS