The Hidden Lie In Every Minute Bar: Why Dollar Bars Matter For Indian Equity Quants

A working note from RevDog.ai — building a dollar-bar pipeline for NIFTY 500 cash equities, inspired by López de Prado's Advances in Financial Machine Learning.

The first time most of us look at financial data, we look at it on a clock. One-minute candles. Five-minute bars. End-of-day OHLC. Decades of textbooks, charting platforms, and broker dashboards have trained us to think of price as a function of time: y = f(t). When something feels statistically wrong — returns are too kurtotic, volatility clusters, models won't fit — we reach for fancier models. ARCH-GARCH variants. Wavelet decompositions. Regime switching. Deep neural networks.

Marcos López de Prado's argument in Advances in Financial Machine Learning Chapter 2 is that we have been treating the symptom and ignoring the disease. The disease is the clock.

This post is my working note as I build a dollar-bar pipeline for the NIFTY 500 universe — and the first day of real intraday tick data is now sitting on disk. Below: the intuition for why dollar bars exist, why specifically dollar (not tick, not volume), and the actual measurements I just took on RELIANCE, PERSISTENT, and ECLERX.

The lie

When we record one-minute OHLC for RELIANCE on a Tuesday session, we are implicitly asserting that the minute from 09:15 to 09:16 is statistically comparable to the minute from 12:45 to 12:46, and to the minute from 15:25 to 15:26. They each get one row in the dataframe; they each contribute equally to whatever computation comes next.

But anyone who has watched an Indian equity tape knows this is absurd. The 09:15 minute on RELIANCE on a real session contains hundreds of trades, depth shifts every few hundred milliseconds, and several hundred crore rupees of risk transferred. The 12:45 minute on the same stock might contain twenty trades, near-zero depth movement, and a half-crore of activity. The 15:25 minute — when institutional desks square up — might look more like 09:15 than like 12:45.

You can see this in our actual capture from 2 June 2026:

StockTicks captured (session)Total LTQ-volume
RELIANCE32,1521,711,863 shares
PERSISTENT18,448158,921 shares
ECLERX6,93146,796 shares

That's 32K ticks for RELIANCE in a single 6h25m session — about 1.4 ticks per second on average, but with the same wild intraday heterogeneity I just described. If you cut that into 375 one-minute bars, each bar is supposed to be "a minute of RELIANCE." But it isn't. Some minutes are economic novellas; some are statistical white noise.

When you fit a model on those bars and assume the rows are exchangeable, you are lying to the model.

What the lie costs you

Time-sampled financial data has three pathologies that show up everywhere:

  1. Non-stationarity: the statistical properties of returns vary systematically across the session. Open and close minutes have higher variance than lunch minutes. Fed-meeting days look unlike ordinary Tuesdays. Earnings days look unlike anything.
  2. Heteroscedasticity: the variance of returns is itself a function of recent volatility — Mandelbrot's "large changes tend to be followed by large changes." Volatility clusters in time.
  3. Fat tails: empirical return distributions have far more extreme moves than a Gaussian allows. The Jarque-Bera test rejects normality on essentially every minute-bar series you'll ever see.

A great deal of modern financial econometrics is, fundamentally, a fifty-year-long effort to model around these three pathologies — to build models robust to them, or to transform the data into something behaved enough that simple models work. ARCH/GARCH families, EGARCH, realized volatility estimators, jump-diffusion processes, stable distributions — all of it.

López de Prado's question in Chapter 2 is: what if the pathologies are not properties of the market, but artefacts of how we are sampling it?

The activity clock

Here is the move. Instead of asking "how much time has passed?", ask "how much economic activity has occurred?"

A dollar bar closes when a fixed amount of money has changed hands — say, every ₹45 million of RELIANCE trading. During the 09:15 opening rush, that might take 30 seconds and 600 trades. During a 13:00 lunch lull, it might take 12 minutes and 80 trades. The clock-time of each bar varies wildly; the information content of each bar stays roughly constant.

It's a change of reference frame. We've been measuring price as a function of time, when we should have been measuring it as a function of cumulative economic activity. The same way that, when studying fluid dynamics, you reformulate in the frame of the moving fluid rather than the lab frame — the equations become simpler because they no longer have to fight the reference frame.

Operationally, the algorithm is embarrassingly simple. Maintain a running sum of price × volume across every incoming tick. When the sum crosses your threshold T, emit a bar with the OHLC of the ticks that contributed and reset the accumulator to zero. That's the whole construction:

python

ts = 0
for tick in stream:
    ts += tick.price * tick.volume
    if ts >= T:
        emit_bar(...)
        ts = 0

The threshold T is calibrated to a target bars-per-day, typically 50. For Indian equities, with sessions of 6h15m (375 minutes), 50 bars/day means roughly one bar every 7.5 minutes on average — but with enormous variance around that average, which is the entire point.

Why dollar, not tick, not volume

This is where Chapter 2 becomes subtle. If the idea is "sample by activity," why not just sample every N trades (tick bars), or every N shares (volume bars)? Both options exist in the book and both have been tried in practice. The book demonstrates that dollar bars empirically dominate them on every important statistical metric. The reason is invariance.

A "tick" is just a single trade event, regardless of size. One small algorithmic clip is a tick. One ₹50-crore institutional cross is also a tick. They have radically different information content but they both increment your tick counter by one. Tick bars over-weight high- frequency algorithmic flow and under-weight institutional intent.

A "volume" measured in shares is even worse, because the meaning of "one share" varies across stocks. Consider three NIFTY 500 names from recent sessions:

StockApproximate price10,000 shares ≈
MRF₹1,40,000₹140 crore
RELIANCE₹1,300₹1.3 crore
YES BANK₹15₹15 lakh

Ten thousand shares of MRF is a different kind of event from ten thousand shares of YES BANK. They differ by four orders of magnitude in capital committed. A "10,000-share volume bar" is meaningless as a cross-sectional construct.

Volume bars also break catastrophically under corporate actions. When NESTLE INDIA went through a 1:10 stock split in 2024, every "volume bar" definition denominated in shares had to be rewritten overnight. Anything that had been trained on pre-split share-volume buckets had to be re-trained.

Dollar bars are invariant to all of this. ₹45 million of trading is ₹45 million of risk transferred, regardless of the share price, regardless of whether it happened in 800 small algo clips or 30 institutional crosses, regardless of any corporate action in between. It is the genuinely currency-of-record measure of "how much market just happened." That's why López de Prado picks dollars: not because of any monetary mysticism, but because money is the only unit that stays the same when nothing else does.

For Indian equities specifically — where the cap-segment dispersion between MRF (₹1,40,000) and YES BANK (₹15) is comically wide — dollar bars are not a refinement. They are the only sensible cross-sectional bar construction.

What we actually measured

On the first day of real NIFTY 500 tick data captured through the KiteTicker WebSocket — Tuesday, 2 June 2026 — I built dollar bars for the three pilot stocks. The numbers are the kind of thing that makes you nod and say "yes, of course":

StockCohortTicksThreshold ₹Full barsMedian bar durationBar return std
RELIANCELarge-cap32,1524.50 cr497.0 min0.21%
PERSISTENTMid-cap18,4481.75 cr496.6 min0.31%
ECLERXSmall-cap6,93114.2 lakh497.1 min0.44%

Three things to notice.

First, all three stocks produced almost exactly the same number of bars — 49 out of a target of 50. The threshold-as-ADV/50 design hits its target with surgical precision when applied to a single session of real data. The book's threshold rule generalises cleanly to Indian equities.

Second, bar duration converges across cap segments. RELIANCE, PERSISTENT, and ECLERX have ADVs differing by more than two orders of magnitude. But their median dollar-bar durations all land within half a minute of each other (~7 minutes). That's the dollar-bar methodology doing its job: it adapts the sampling rate per stock so that each bar represents the same proportion of that stock's day. A mid-cap doesn't get penalised with starvation-level data; a large-cap doesn't drown you in over-sampled detail.

Third, bar-return standard deviation rises monotonically with falling market cap: 0.21% for RELIANCE, 0.31% for PERSISTENT, 0.44% for ECLERX. This is the cap-vol pattern that's been documented in Indian equities for decades, but it's worth pausing on it. Per unit of dollar volume, smaller stocks are roughly twice as volatile as mega-caps. That's not noise — that's the genuine information asymmetry small-caps carry relative to liquid names. Dollar bars expose it in a clean, per-bar quantity rather than hiding it behind time-of-day seasonality.

Tomorrow I'll capture day 2, then day 3, until I have five sessions. At that point the validation framework — Jarque-Bera, Ljung-Box, rolling-vol stability, monthly variance-of-variances — can run against a meaningful sample. But even from one day, the construction is qualitatively doing what the book predicted.

What dollar bars don't fix

Honesty requires acknowledging the limits. Dollar bars are not a panacea. They do not eliminate non-stationarity entirely — they reduce it. They do not produce iid samples — they produce more identically-distributed-than-time-bars samples. They do not by themselves solve the prediction problem; they only make it tractable.

There are at least three known gaps:

  1. Overnight gaps. Indian cash equities have a ~17-hour overnight break with no trading. Bars cannot span this gap meaningfully — the dollar-bar accumulator must reset at session boundaries. (Our implementation does this; it's a deliberate Indian-equity adaptation that the book's continuous-futures framing doesn't need.)
  2. Pre-open auction. The 09:00–09:15 IST pre-open call auction accumulates buy/sell quantity without continuous trading. Whether pre-open ticks should count toward a session's first dollar bar is a methodology choice with no canonical answer.
  3. Circuit breakers. NSE applies ±10% or ±20% per-stock daily bands. When a stock hits the circuit, trading halts. The bar constructor sees a tick stream that abruptly ends — a pattern that doesn't exist in the book's S&P 500 setting and that we have to handle as an Indian-market-specific edge case.

These are not arguments against dollar bars. They are arguments for treating bar construction as a design choice worth getting right, not a pre-baked utility.

Where this fits

A dollar bar by itself isn't the destination. It's the first renormalization in a longer pipeline. AFML Chapter 3 builds on top of dollar bars with CUSUM event sampling (decide which bars contain enough drift to be worth predicting) and triple-barrier labeling (decide which way each event resolves before some time horizon expires). Chapter 4 strips out sample correlation. Chapter 7 adds purged-and-embargoed cross-validation. Each layer cleans up one more form of non-stationarity, and each layer assumes the layer underneath has done its job.

If you start with time bars, you've poisoned the well at step zero. No amount of clever labeling or fancy cross-validation downstream will recover what you lost.

That's the deeper "why" of dollar bars. Not "they make ML work slightly better." But: they are the substrate on which everything else in this branch of quant finance becomes possible.

When the book argues that dollar bars produce the most stable weekly counts, the lowest serial correlation of returns, the smallest variance of monthly return variances, and the lowest Jarque-Bera statistic — it's not a side benefit. It's the bar choice doing the job that the rest of the modelling chain was previously asked to do.

I have five days of NIFTY 500 ticks to capture. After that, my validation report will tell us whether the same dominance holds for Indian equities. The prior says it should. We will see.


This is part of an ongoing series on building production-quality quant tooling for Indian equity markets, anchored in the AFML methodology. Source code, spec documents, and pre-committed pass criteria are all version-controlled — Constitution Principle I forbids me from changing the test after I've seen the result. Subsequent posts will cover CUSUM event sampling (Chapter 2.5), triple-barrier labeling (Chapter 3), and sample weights for sequential bootstrap (Chapter 4), as the corresponding modules ship.

ссс