What time in market is, and why it comes before the return
Time in market, or exposure, is the share of trading days in a backtest on which a position was actually held. If a run covers 252 trading days and only 60 of them had a position, exposure is 23.8 percent. The other 192 days were cash.
Why read it first? If you are only half invested, roughly half the gains and half the losses reach you. A low strategy return in a rising market may not mean the calls were wrong — it may only mean you were not there. A small loss in a falling market may not mean the strategy dodged well, for exactly the same reason. A single return number blends the two completely.
So when a backtest table arrives, force a column for exposure next to the return. That is where skill separates from absence.
What was tested — five widely taught technical setups
The subjects are five setups that appear constantly in trading education abroad. Here is what each one is.
Elder BBP wraps Alexander Elder's Bull Bear Power together with an EMA arrangement and ADX. A 20-day exponential moving average above the 50-day is read as an uptrend, ADX at 25 or higher is read as a trend strong enough to trade, and the point where buying and selling pressure trade places becomes the entry timing.
SuperTrend pullback is a four-filter setup: SuperTrend, an ATR-based trend line, sets direction; RSI screens out overheated zones; the stochastic catches the pullback; MACD confirms the larger trend. ICT IFVG treats a price gap formed across three candles — a fair value gap — as flipping into support or resistance once price breaks back through it.
The remaining two come from day-trading educator Ross Cameron. One pairs RSI oversold and a break of the lower Bollinger band with a double bottom; the other takes a divergence, where price makes a lower low while RSI makes a higher low, and adds a MACD cross as confirmation.
How it was run — the walk-forward procedure
Start by collecting daily bars. Korean names came from Naver Finance's price JSON and overseas names from Tiingo's adjusted OHLC. The series must be adjusted for dividends and splits. Unadjusted closes drop sharply on a split date and manufacture sell signals that never existed.
Next comes the part that matters most. Signals are computed only from data up to that day's close, and fills are placed at the next day's open. Filling at the same day's close means trading on information you could not yet have, and it renders the whole backtest meaningless. This is look-ahead bias.
Indicators also need warm-up. Some setups use a 50-day moving average, so at least 150 extra trading days were held ahead of the measurement window, and each signal was computed from the preceding 400 bars only.
Finally, the end date was not fixed to a single point. Measuring against today alone lets the presence or absence of a recent crash swing everything. So the end date was slid 21 trading days backward at a time, repeating the same measurement at up to 36 points.
// Signal is computed only from data up to the close of day t-1
const want = signals[t - 1]?.direction === 'LONG' ? 1 : 0
if (pos === 0 && want === 1) {
// Enter: fill at next day's open, hold to that day's close
equity *= (1 - buyCost) * (rows[t].close / rows[t].open)
} else if (pos === 1 && want === 1) {
// Hold: prior close to current close
equity *= rows[t].close / rows[t - 1].close
} else if (pos === 1 && want === 0) {
// Exit: fill at next day's open
equity *= (rows[t].open / rows[t - 1].close) * (1 - sellCost)
}
pos = wantResult 1 — none of the five beat buy-and-hold
Sixteen names multiplied by rolling end dates produce hundreds to thousands of comparison cells per horizon. Only cells with at least one trade were counted.
Every setup came in under a 50 percent win rate, and the rate falls as the holding horizon lengthens. What was 38.5 percent over one-month windows becomes 18.7 percent over one-year windows.
Removing transaction costs did not flip the result; the best case was 12 wins to 12 losses. Trade frequency is low enough that cost sensitivity is limited, which also means fees are not what explains the weak performance.
| Horizon | Cells | Strategy win rate | Median excess | Strategy median | Buy-and-hold median |
|---|---|---|---|---|---|
| 1 month | 722 | 38.5% | -2.7pp | +0.5% | +3.2% |
| 6 months | 1,061 | 27.7% | -17.6pp | +2.9% | +19.5% |
| 1 year | 1,159 | 18.7% | -39.0pp | +6.0% | +44.9% |
Result 2 — what decided the outcome was whether the asset rose
Breaking the table down by name revealed one rule. How far the asset rose over the window and the strategy's excess return sat on opposite sides of each other. The correlation is minus 0.808 at one month, minus 0.905 at six months, and minus 0.945 at one year.
Slicing by buy-and-hold return makes it starker. Where the asset fell more than 20 percent, the strategy won 89.1 percent of the time; where it rose more than 100 percent, it won 1.8 percent of the time.
In other words, the condition for the strategy winning is not the strategy but the asset. And whether an asset will rise or fall over a window is knowable only afterward. If it were knowable in advance, no setup would be needed at all.
| Buy-and-hold return over window (1 year) | Cells | Strategy win rate | Median excess |
|---|---|---|---|
| Below -20% | 256 | 89.1% | +25.1pp |
| -20 to 0% | 258 | 62.0% | +5.2pp |
| 0 to 20% | 504 | 14.9% | -13.7pp |
| 20 to 50% | 799 | 3.8% | -30.2pp |
| 50 to 100% | 555 | 3.1% | -61.9pp |
| Above 100% | 552 | 1.8% | -167.7pp |
Result 3 — the leveraged-ETF hypothesis was rejected too
In the first six-name run, the strategies won on exactly one asset: a 2x leveraged ETF. That looked like it might be about assets where long-term holding structurally breaks down, so six leveraged ETFs and four unleveraged ETFs on the same underlyings were added.
Inside the leveraged group the results split in opposite directions. Of four 3x ETFs, two won and two were routed. What the winners shared was not the multiplier but a negative buy-and-hold return over the window.
The unleveraged controls behaved the same way: the win rate spiked only on the name that rose least. Leverage turned out not to be the variable, and the rule from Result 2 ran straight through.
| Ticker | Multiple | 1-year win rate | Median excess | Buy-and-hold median |
|---|---|---|---|---|
| TSLL | 2x | 62.7% | +23.8pp | -11.7% |
| LABU | 3x | 55.5% | +5.8pp | -16.5% |
| NVDL | 2x | 18.7% | -49.1pp | +45.5% |
| SOXL | 3x | 21.0% | -78.9pp | +79.2% |
| TQQQ | 3x | 3.8% | -67.1pp | +67.5% |
| SPXL | 3x | 3.3% | -45.5pp | +40.1% |
How to compute exposure-adjusted alpha yourself
That was the diagnosis; this is the procedure to apply to your own backtest. Only three values are needed: the strategy return, the buy-and-hold return over the same window, and time in market.
First get exposure by counting the days the position was open and dividing by total trading days. Then subtract time in market times the buy-and-hold return from the strategy return. What remains is the part market exposure alone cannot explain.
With many samples, check once more by regression. Regress excess return on the buy-and-hold return and read the intercept — that intercept is the average alpha. The slope is a cross-check: if nothing but exposure is at work, it converges on time in market minus one.
For this sample the numbers were as follows. Measured slope minus 0.845 against minus 0.762 predicted from 23.8 percent average exposure — nearly overlapping. The intercept was minus 0.52 percentage points. Median exposure-adjusted excess was minus 5.73 percentage points, positive in 33.3 percent of cases.
Put plainly, what these five setups sold was not excess return but time spent out of the market. That runs in the same direction as physicist Beomjun Kim's argument that moving-average strategies lack a scientific basis, though one step further in it looks less like being wrong and more like having been a different product all along.
// 1) Time in market
const exposure = daysInMarket / totalDays
// 2) Strip out the part exposure explains; what remains is alpha
const alpha = strategyReturn - exposure * buyHoldReturn
// 3) With many samples, confirm via regression intercept
// excess = a + b * buyHold (a is alpha; b converges on -(1-exposure))
//
// Measured: b = -0.845, -(1 - 0.238) = -0.762, a = -0.52pp
// Median exposure-adjusted alpha -5.73pp, positive in 33.3% of cellsLimits of this check
The sample is sixteen names: five single stocks, seven leveraged ETFs, four unleveraged ETFs. This is a conclusion about these five setups, this sample, and this rule — not about technical analysis in general.
The rules were simplified as well. Everything was made long-only, with no stop losses, price targets, or scaled entries. Sell signals were treated as cash rather than as short positions. That design isolates the character of the signal itself, but adding execution rules can move the numbers.
Costs were set at 0.065 percent to buy and 0.215 percent to sell in Korea including securities transaction tax, and 0.12 percent per side overseas. Those figures embed a slippage assumption and will differ by broker and fill conditions. As covered in the previous piece, a single line about fill assumptions can swing results substantially, so it is safer to check the same four things — decision timing, fill price, transaction costs, data window — in anyone else's backtest too.