quantverse.
Quantverse Research · updated 2026-09-22

Dollar bars vs time bars vs volume bars

Time bars sample on the clock, volume bars on shares traded, dollar bars on dollars traded. How each rule changes the number of bars and the shape of the returns.

A bar is one row of price data: the open, high, low, close and volume over some slice of trading. The slice can be defined three ways. Time bars close on a clock, every minute or every day. Volume bars close after a fixed number of shares has traded. Dollar bars close after a fixed dollar value has traded. Clock-based bars carry returns whose variance changes through the day and whose consecutive values are correlated. Activity-based bars, volume and dollar, tend to pull the returns closer to a normal distribution, which many statistical tools assume. For US equities, dollar bars are often the more convenient default, because a dollar threshold does not need adjusting after a split. Time bars remain the right choice when the signal itself is defined on the calendar.

Why the clock distorts returns

A time bar closes on a schedule, so the amount of trading inside it is an outcome, not a design choice. Two consequences follow.

Unequal variance. Intraday volume and volatility follow a U-shape: the open and the close are busy, midday is quiet. A one-minute bar at 09:31 contains far more trading than one at 12:01, so the collection of one-minute returns mixes high-variance and low-variance observations. A mixture of normal distributions with different variances and the same mean has fatter tails than a single normal with the same overall variance. Kurtosis, which equals 3 for a normal distribution and rises with fat tails, comes out above 3.

Stale-price correlation. Clock sampling records a return every minute whether or not anything traded. In quiet periods the same stale price repeats, which adds spurious structure between consecutive returns. Separately, a trade at the bid followed by one at the ask produces a small reversal, the bid-ask bounce; that lives in the price process and survives any sampling rule. Clock sampling adds the stale-price effect on top, most visibly in thinly traded names.

One rule, three thresholds

All three schemes are special cases of one loop: accumulate trades until a threshold is reached, then close the bar. Tick bars close after N trades, volume bars when cumulative shares reach V, dollar bars when cumulative price times shares reaches D. The loop below is illustrative.

D   = 2_000_000        dollars per bar
cum = 0
bar = []
for trade in trades_in_availability_order:
    cum = cum + trade.price * trade.size
    bar.append(trade)
    if cum >= D:
        emit(bar)
        cum = 0
        bar = []

Two details matter. First, overshoot: the last trade usually carries the bar past D. This loop accepts the overshoot and starts the next bar from zero, so bars hold whole trades and their dollar volume is at least D. The alternative splits that trade so the bar closes at exactly D and the remainder opens the next bar. Both count every share once; they differ in where boundaries fall, so pick one and keep it fixed. Second, the close: in this loop the trade that crosses the threshold is the bar's last trade and therefore its close. Under the splitting rule the close is the price of the split trade, and the implementation must say so.

The threshold sets the bar count

Bar count is roughly total activity divided by the threshold. Dollar volume varies enormously across stocks and years, so a fixed dollar threshold produces a bar count that drifts with the market. Practice inverts the relation: decide how many bars per session you want, then derive the threshold from a trailing estimate of that stock's dollar volume. Deriving it from the full sample instead lets future activity shape the sampling grid, one of the channels described under look-ahead bias.

The table compares the three rules on a hypothetical stock trading about $400 million a session at around $40 a share, so roughly 10 million shares. The statistics are invented to show the direction the mechanism predicts; they are not measurements and cannot rank the schemes.

RuleThresholdBars per sessionExcess kurtosis (0 = normal tails)Lag-1 autocorrelation (0 = no carry-over)
Time1 minute3906.8-0.06
Volume20,000 shares5002.1-0.02
Dollar$800,0005001.40.00

The $800,000 dollar threshold is $400 million divided by 500; the 20,000-share threshold is the same arithmetic on shares.

What activity-based sampling buys

Tails closer to normal. Each activity-based bar carries a similar amount of trading, which can reduce the variation in activity per observation and may reduce excess kurtosis; how much depends on the instrument, the period and the sampling rule. Mandelbrot and Taylor (1967, Operations Research 15) proposed that price changes over a fixed number of transactions are closer to normal than changes over a fixed time. Clark (1973, Econometrica 41) modelled prices as driven by a random activity clock and tested it on futures data. Ané and Geman (2000, Journal of Finance 55) found that stock returns measured on a transaction-count clock were close to normal. None of these shows that dollar bars beat time bars on every statistic for every stock, and none ranks stocks by how much they gain; they establish the mechanism. Continuous trading does not mean constant activity, since a liquid stock can still have a strong intraday pattern, so the size of the effect for a given stock is an empirical question.

Less stale-price autocorrelation. Sampling on activity removes the stale-price component, because quiet intervals no longer generate repeated observations. The bid-ask bounce survives, since it lives in the price process rather than the sampling grid.

A more natural clock. Markets do not process information at a constant rate. Sampling on dollars traded is a practical proxy for an activity clock, and the number of bars becomes a function of how much happened.

Implementation traps

Time stamps. A trade has an exchange time, when it happened, and an availability time, when your feed delivered it. Bars for a backtest must be built in availability order, and a bar is usable only once its last trade had arrived. Cancellations and corrections arrive later still; a historical decision must see the trade as it stood at decision time, so the correction policy and the feed latency are part of the data.

Session boundaries. Decide what happens to a partly filled bar at the close: flush it, carry it overnight, or drop it. Carrying merges an overnight gap into a stale partial bar. The opening and closing auctions are single large trades that can fill several bars at once, so many implementations treat them separately.

Alignment with daily data. A bar whose last trade was at 15:59:59 was available shortly after that, subject to feed latency. A bar that includes the closing auction is available only after the auction. Mapping both to the same trading date puts the second bar's information ahead of a decision made at the close. Features must be built only from bars that were available before the decision time, the discipline described in point-in-time data.

Threshold tuning. The threshold is a free parameter. Tuning it against the strategy's results reintroduces leakage through the search. Fix it from trailing data, or count it among the choices that walk-forward validation has to pay for.

Choosing a scheme

Time bars fit signals defined on the calendar, or any daily-horizon work. Volume bars fit cases where share count is the natural unit, such as order-flow imbalance, with the threshold adjusted across splits. Dollar bars fit intraday and microstructure work, where dollar value is comparable across stocks and across time. The catalog lists dollar bars and volume bars for US equities, both marked coming soon; the served API today provides daily bars only. Data and compute are metered, as described on the pricing page.

← back to learn