Noise band −₹1.53 Cr, edge 5.7 → 1.5 bps over three periods. Intraday momentum: 0.1 bps before costs.
Academic papers are a better source of trading ideas than YouTube: the rules are exact and the tests are careful. But they’re usually tested on US markets, often on an index fund rather than single stocks. We took two well-known intraday papers and applied their rules to every NIFTY 50 stock from January 2016 to August 2026, with Indian costs.
These are our per-stock adaptations on Indian data, not reproductions of the papers’ results. Both papers studied the US market through an S&P 500 index fund.
1. The noise band (“Beat the Market”, Zarattini, Aziz and Barbon, 2024)
The idea: most intraday moves stay inside a “noise” band that can be estimated from recent days. Price leaving the band suggests real demand, so trade in that direction.
Our rules, per stock: the band is centred on the larger (or smaller) of today’s open and yesterday’s close, and is as wide as the stock’s average absolute move from the open at the same time of day over the last 14 days. Every half hour from 10:00, go long above the upper band or short below the lower band. Exit when price crosses back through the band or VWAP (or at 15:15).
Unlike most setups we test, this one has a real edge: +4.1 bps per trade before costs, and the stocks it picks beat random stocks at the same minute in all 200 of our random runs. But the edge isn’t large enough to pay for a round trip, and it has shrunk in each period:
Before costs. The edge in 2024–26 is about a quarter of what it was in 2016–20.
The losses accelerate after 2021 as the edge before costs fades.
A wider band (1.5×) trades less and loses less, −₹71 lakh. Holding to the close instead of trailing doubles the win rate to 47% but still loses ₹95 lakh. All three versions lost the most in 2024–26.
2. Intraday momentum (Gao, Han, Li and Zhou, 2018)
The idea: the market’s return in the first half hour predicts its return in the last half hour, and the authors link it to investors who rebalance or trade late in the day.
Our rules, per stock: take each stock’s return from the previous close to 09:45. Near the end of the day, enter in that direction and close at 15:15. We tried no threshold, moves above 0.5% and above 1%, and entries at 14:45 and 14:15.
Under 1 bp before costs in every version, against a 6.5 bp round trip.
On single NIFTY 50 stocks there’s almost nothing there: +0.1 to +0.6 bps per trade before costs, and in 2024–26 the edge is zero or negative in three of the four versions. A 30-minute trade can’t pay 6.5 bps of costs from a fraction of a basis point. Every version lost money in all eleven years.
| Variant | Trades | Gross / trade | Win % | Net after costs | +3 bps slippage | 2016-20 | 2021-23 | 2024-26 |
|---|---|---|---|---|---|---|---|---|
| Noise band (1x), trailing exit | 1,27,985 | 4.1 bps | 23.8% | −₹1.53 Cr | −₹5.37 Cr | −₹25.2 L | −₹48.3 L | −₹80.0 L |
| Noise band (1x), hold to 15:15 | 75,420 | 4.0 bps | 47.3% | −₹94.5 L | −₹3.20 Cr | −₹21.1 L | −₹18.6 L | −₹54.8 L |
| Noise band (1.5x), trailing exit | 78,165 | 4.7 bps | 24.7% | −₹71.2 L | −₹3.05 Cr | −₹1.7 L | −₹17.7 L | −₹51.8 L |
| Intraday momentum, any move, enter 14:45 | 1,28,299 | 0.1 bps | 41.6% | −₹4.09 Cr | −₹7.93 Cr | −₹1.86 Cr | −₹1.15 Cr | −₹1.07 Cr |
| Intraday momentum, move > 0.5%, enter 14:45 | 73,555 | 0.4 bps | 42.3% | −₹2.25 Cr | −₹4.45 Cr | −₹1.08 Cr | −₹61.5 L | −₹54.9 L |
| Intraday momentum, move > 1%, enter 14:45 | 36,831 | 0.5 bps | 42.9% | −₹1.09 Cr | −₹2.20 Cr | −₹49.9 L | −₹30.3 L | −₹29.3 L |
| Intraday momentum, move > 0.5%, enter 14:15 | 73,555 | 0.6 bps | 44.2% | −₹2.15 Cr | −₹4.35 Cr | −₹1.04 Cr | −₹52.4 L | −₹58.5 L |
₹5 lakh per trade, 5-minute bars, v2026.08 snapshot (Jan 2016 – Aug 2026), NIFTY 50 point-in-time members, discount-broker (₹20/order) and statutory charges + 1 bp slippage per fill. Generated 2026-10-07.
What to take from this
- A real edge can still be untradeable. The noise band picks better stocks than chance and still loses after costs. Always compare the edge with the cost of a round trip.
- Check whether the edge is shrinking. A strategy that earned 5.7 bps in 2016–20 and 1.5 bps in 2024–26 is telling you where it’s heading.
- An index result doesn’t carry over to single stocks automatically. Both papers studied a US index fund; on individual Indian stocks the effects are weaker or absent.
The exact code we rannoise_band() in dpx_bt · 7 variants · snapshot v2026.08
def noise_band(mult=1.0, exit='trail'):
"""Zarattini, Aziz & Barbon (2024), "Beat the Market", per stock. Noise band around max/min(today's open, previous
close): +/- mult x the average absolute move from the open at the same time of day over the last 14 days. At every
HH:00 / HH:30 from 10:00, go long above the upper band or short below the lower band. exit='trail': close when
price crosses back through max(band, VWAP); 'eod': hold to 15:15."""
def strategy(p):
move = (p.close / p.day_open - 1).abs()
sigma = move.groupby(p.tod.values).transform(lambda x: x.rolling(14, min_periods=10).mean().shift(1))
pc = p.prev_day('close')
upper = np.maximum(p.day_open, pc) * (1 + mult * sigma)
lower = np.minimum(p.day_open, pc) * (1 - mult * sigma)
end = p.tod + p.minutes
check = p.bcast((end >= bt.hm('10:00')) & (end % 30 == 0))
sig = dict(long=check & (p.close > upper), short=check & (p.close < lower))
if exit == 'trail':
sig['long_exit'] = p.close < np.maximum(upper, p.vwap)
sig['short_exit'] = p.close > np.minimum(lower, p.vwap)
return bt.Signals(**sig)
return strategyEvery variant in this post is this function with different arguments, run through dpx_bt over Jan 2016 – Aug 2026.
Have a variation in mind?
Ask runs your own idea on the same data and rules, with the same report: net after costs, +3 bps stress test, three periods.
Backtest on historical data (Jan 2016 – Aug 2026), net of discount-broker (₹20 per order) and statutory charges and 1 bp slippage per fill. Education and research only, not investment advice. Past results do not predict future returns. Disclaimer.