> ## Content Index
> Fetch the complete content index at: https://aligrithm.com/llms.txt
> Use this file to discover other available public pages before exploring further.

# 3.41 Do Intra-Bar Timestamps Carry Alpha? OHLC + Timing Features
- URL: https://aligrithm.com/do-intra-bar-timestamps-carry-alpha-ohlc-timing-features/
- Published: 2026-09-15T15:26:56.000Z
- Updated: 2026-09-15T15:26:55.000Z
- Description: Bloomberg's intra-bar high/low timestamps cut test NLL to 0.4075 from 0.4311, but only 0.0013 is timing. Intra-bar timing is a volatility feature, not alpha, and the 72.3% is clock overlap.
- Author: ali askar
- Tags: 3. Robust Systems Lab

Bloomberg started selling the clock inside the bar. Not just the high price for the minute, but the second at which the high printed, the same for the low, the first and last trade times, condition-code tick counts, and a Bloomberg VWAP for the interval. Ruslan Tepelyan trained three neural networks on that feed across the Russell 3000 for all of 2021 and reports that the timing features improve every architecture on every metric he tracks. The claim holds. Check the size of it before you call your data vendor.

Test-set negative log-likelihood for his best Transformer runs 0.4311 with OHLC and past VWAP returns alone, 0.4088 once he adds volume, tick counts, bar-shape ratios and prior-activity statistics, and 0.4075 once he adds the timestamps. The timestamps move the number by 0.0013 out of a total improvement of 0.0236\. Directional accuracy goes 71.889%, then 72.288%, then 72.294%. Six thousandths of a percentage point of direction. The 72.3% headline is real and owes nothing to the clock.

The timestamps earn their keep in the second moment. Root mean squared error between predicted variance and realized squared error improves 4.2% on the test set when you add them, and the no-timing feature set is worse than plain OHLC on that metric (4.4752 against 4.4261). Every bit of the conditional-variance gain, and then some, comes from the two timestamps. That is a volatility feature, and calling it alpha requires a target you can trade. The target here was chosen because you cannot.

![Share of the basic-to-full test set improvement contributed by the timing features, by metric: conditional variance RMSE 135.6 percent, mean squared error 29.0 percent, coefficient of determination 28.8 percent, negative log-likelihood 5.5 percent, directional accuracy 1.5 percent, calibration error minus 2.4 percent](https://storage.ghost.io/c/27/cb/27cb0fc8-2c77-4434-af9e-d5d32a916994/content/images/2026/09/article_456-timing_share_by_metric.png)

## What the enhanced bars actually contain

The new fields are the timestamp of the first trade at the open, the first occurrence of the high, the first occurrence of the low, and the last trade at the close, each rescaled so that 0 is the start of the bar and 1 is the end. From those he derives two features: the time difference between the high and the low, and a "timing surprise" indicator.

$$ \\tau\_{H},\\ \\tau\_{L} \\in \[0,1\], \\qquad S\_{t} \\;=\\; \\mathbb{1}\\!\\left\[\\ \\operatorname{sign}\\!\\left(C\_{t}-O\_{t}\\right)\\cdot\\operatorname{sign}\\!\\left(\\tau\_{H,t}-\\tau\_{L,t}\\right) \\;<\\; 0 \\ \\right\] $$

Read the indicator as a disagreement flag. Tau-H and tau-L are the fractional times of the high and the low. A bar that closes above its open usually prints its low first and its high later, because that is what an up path looks like. Timing surprise fires when the order reverses. Worked example: a bar opens at 100.00 and closes at 100.22, prints its high at second 12 (tau-H of 0.20) and its low at second 47 (tau-L of 0.78). The close-minus-open sign is positive, the tau difference is negative, the product is negative, so the flag is 1\. The bar finished up, yet the high came 35 seconds before the low, which means the entire up move happened in the last 13 seconds.

How often should that fire? Tepelyan says up bars are "much more likely" to print the high after the low and leaves it there. I simulated 400,000 driftless 60-step random walks: the high arrives after the low on 88.2% of up bars, so timing surprise fires on 11.8% of bars under a pure random walk. A flag that fires one minute in eight has enough variation to matter and is rare enough that a model needs a large sample to learn from it. He has one.

He also does not use the open and close timestamps as features, only the high and low times. On a one-minute bar with at least 30 ticks the open and close times sit within a second or two of the bar boundaries, so they carry almost no information. Sensible omission, but it means the whole result rests on two numbers per bar.

## The target was chosen so that it cannot be arbitraged

The prediction target is the log change in Bloomberg's VWAP from one bar to the next. Tepelyan gives four reasons, and the fourth is the one to sit with: "Weaker arbitrage incentives. Predicting the direction of VWAP changes does not lend itself to straightforward arbitrage." His argument is that knowing next minute's VWAP will be higher does not help unless you already executed at the current VWAP, so the pattern can survive in an efficient market.

That is an honest statement and it settles the title question. A signal that persists because nobody can trade it is a measurement, not an edge. He reports no transaction costs, no execution model, and no strategy anywhere in the paper. Fair enough, since he is evaluating a data product rather than pitching a system. Anyone reading 72.3% directional accuracy as a trading result has stopped reading at the abstract.

Worse for the trading interpretation: the target is standardized by the training-set mean and standard deviation, and the raw standard deviation is never printed. Every MSE, every R-squared, every variance RMSE in the paper lives in units of "training-set sigma" with no bridge back to basis points. You cannot check any result in the paper against a spread, a commission, or a tick. For a paper about a commercial data feed, that is the single most useful number omitted.

## Where 72% direction and R-squared of 0.37 come from

An R-squared of 0.3744 on next-bar returns should stop you cold. Nothing forecasts one-minute equity returns to 37% of variance. The explanation sits in the overlap between the two VWAP windows.

VWAP is an average across the bar, so the return from VWAP at t-1 to VWAP at t measures a move from roughly the middle of one minute to the middle of the next. By the time you predict, you have already seen every trade in bar t-1, including its close. Under a random walk the expected price during bar t is the last observed price, so the expected VWAP-to-VWAP return is approximately the log ratio of the previous close to the previous VWAP, which is an observable you already hold. Tepelyan lists it as a feature: "Close / VWAP Log Return".

His Appendix E tests the coefficient-of-one version of that idea and it fails, with validation MSE of 0.88756 against 0.62892 for predicting zero. Take those two numbers and solve for what a shrunk version would do.

$$ \\mathrm{MSE}(b) \\;=\\; \\operatorname{Var}(y) \\;-\\; 2\\,b\\,\\operatorname{Cov}(x,y) \\;+\\; b^{2}\\operatorname{Var}(x) $$ $$ b^{\*} \\;=\\; \\frac{\\operatorname{Cov}(x,y)}{\\operatorname{Var}(x)}, \\qquad R^{2} \\;=\\; \\frac{\\operatorname{Cov}(x,y)^{2}}{\\operatorname{Var}(x)\\,\\operatorname{Var}(y)} $$

Here y is the next bar's standardized log VWAP return and x is the previous bar's close-to-VWAP log return. The first line is the mean squared error of predicting b times x; the second gives the coefficient that minimizes it and the variance share it explains. Worked example on his own table. Predicting zero gives MSE equal to the variance of y, so Var(y) = 0.62892\. Setting b to 1 gives 0.88756, so Var(x) minus twice Cov(x,y) equals 0.25864\. If the Transformer's entire explained variance came from x alone, then Cov(x,y) squared over Var(x) equals 0.62892 minus 0.39551, which is 0.23341\. Solving the pair gives Cov(x,y) = 0.572 and Var(x) = 1.403, hence an optimal coefficient of 0.41 and a correlation of 0.61, for an R-squared of 0.371\. His model posts 0.371 on that same subset.

So the paper's entire explanatory power is reproducible by one regression on one observable with a shrinkage factor of 0.41\. The martingale baseline fails only because it used a coefficient of 1\. The shrinkage is heavy for a good microstructure reason: the close is a single trade carrying half the spread, while VWAP averages hundreds of trades, so x is the noisier series (implied variance 1.403 against 0.629 for y) and the optimal loading falls well below one.

This is my arithmetic on his Appendix E, not his claim, and it does not prove his network is a one-variable regression. Covariance is not separately identified from three MSE numbers, so treat it as a consistency check rather than a decomposition. What it does establish is that the reported R-squared is reachable with no forecasting at all, from the mechanical overlap of two averaging windows plus bid-ask bounce. The decile table supports that reading: the top decile of predicted magnitude hits 88.21% direction and the bottom decile 52.85%, which is exactly the pattern you get when the signal is "how far did the last bar close from its own VWAP".

The old article ["Price-Path Convexity: A New Cross-Sectional Anomaly (−45bp per σ)"](https://aligrithm.com/price-path-convexity-a-new-cross-sectional-anomaly-45bp-per-s-2/) makes the same structural point at a monthly horizon, that the shape of the path between two endpoints carries information the endpoints do not. The difference is that convexity is measured on a target you can hold for a month. Here the extra path information is measured against a target defined by an average that overlaps the information set.

## Same OHLC, four times the volatility

Two bars can share an identical open, high, low and close and still differ in volatility by a factor of four. The separator is how long the price took to travel between the extremes, and that is what the two timestamps report.

![Two synthetic one-minute paths with identical open 100.00, high 100.20, low 99.90 and close 100.15. In bar A the low prints at second 3 and the high at second 57, implying 19.0 basis points per minute. In bar B the low prints at second 28 and the high at second 31, implying 80.5 basis points per minute](https://storage.ghost.io/c/27/cb/27cb0fc8-2c77-4434-af9e-d5d32a916994/content/images/2026/09/article_456-intrabar_timing_variance.png)

Both bars above have the same OHLC. Bar A crawls from its low to its high over 54 seconds. Bar B covers the same 30 cents in 3 seconds and then chops sideways. A range estimator that only sees high and low assigns them the same volatility. Add the timestamps and the diffusion scaling separates them.

$$ \\hat{\\sigma}^{2}\_{t} \\;=\\; \\frac{\\left(\\log H\_{t} - \\log L\_{t}\\right)^{2}}{4\\log 2 \\;\\cdot\\; \\left|\\tau\_{H,t}-\\tau\_{L,t}\\right|} $$

The numerator is the squared log range. The constant 4 log 2 is the usual correction that turns an expected squared range into a variance for a Brownian path over the full interval, so with a tau difference of 1 this is the classic range estimator. Dividing by the tau difference uses the fact that variance accumulates in proportion to elapsed time: if both extremes landed inside a window covering 5% of the bar, the bar's range was generated by 5% of the bar's clock, and the per-minute variance implied is twenty times larger.

Worked example with the figure's numbers. The log range is log(100.20/99.90) = 0.0029985, squared to 8.991e-6, and 4 log 2 = 2.7726\. With a tau difference of 1 you get 18.0 basis points per minute, the plain range estimate. Bar A has a tau difference of 54/60 = 0.90, giving 19.0 basis points. Bar B has 3/60 = 0.05, giving 80.5 basis points. Identical OHLC, a factor of 4.24 in volatility, and the only inputs that changed are two timestamps. That factor is the square root of 0.90 over 0.05, the square root of 18.

Flag the bias before anyone uses this as a level estimate. Conditioning on the window that happens to contain both extremes picks the most active stretch of the minute, so the estimator overstates variance and the overstatement grows as the tau difference shrinks. It works as a ranking device between bars that share a range. It is not a drop-in volatility number.

The paper's variance results follow the mechanics. Conditional-variance RMSE on the test set: 4.4261 for basic OHLC, 4.4752 for the no-timing set, and 4.2880 with the timestamps. The non-timing features made variance prediction worse, which Tepelyan flags as unexpected and does not resolve. The timestamps improve it by 4.2% over the no-timing set and 4.9% on validation. Relative to a 0.13% likelihood gain and a 0.008% directional gain, a 4% improvement in variance estimation is the only number in the paper large enough to survive a skeptical reading.

## The distribution choice beat the data product

All three architectures output the parameters of a Student-t distribution and train by maximum likelihood. Read the loss and its interpretation before reading any of his tables.

$$ \\mathrm{NLL} \\;=\\; -\\frac{1}{N}\\sum\_{n=1}^{N}\\log f\\!\\left(y\_{n}\\mid \\mu\_{n}, s\_{n}, \\nu\_{n}\\right), \\qquad \\frac{\\bar{f}\_{B}}{\\bar{f}\_{A}} \\;=\\; \\exp\\!\\left(\\mathrm{NLL}\_{A}-\\mathrm{NLL}\_{B}\\right) $$

The left expression is the average negative log density the model assigns to what happened. The right identity converts any NLL gap into a ratio of geometric-mean densities, which is the only way to read these numbers as sizes rather than decorations. Worked example. All of the feature engineering, basic to full, is exp(0.4311 − 0.4075) = 1.0239, so 2.4% more probability density per bar. The timestamps alone are exp(0.0013) = 1.0013, or 0.13% per bar. Against the unconditional standard normal at 1.2830, the full model is exp(0.8755) = 2.400, so it assigns 2.4 times the density of an unconditional baseline. That gap of 0.8755 is 37 times the entire feature-engineering gain, which is the right way to read the ranking: knowing the conditional scale of the next bar is the bulk of the model, and the features fight over a thin margin on top of it.

Now the distribution ablation. Replacing the Student-t with a Gaussian of matched mean and variance costs 0.0297 of test NLL, which is exp(0.0297) = 1.0301, a 3.0% density loss. Choosing the right tail shape buys 23 times what the intra-bar timestamps buy.

$$ f(y) \\;=\\; \\frac{\\Gamma\\!\\left(\\frac{\\nu+1}{2}\\right)}{\\Gamma\\!\\left(\\frac{\\nu}{2}\\right)\\sqrt{\\nu\\pi}\\,s}\\left(1+\\frac{1}{\\nu}\\left(\\frac{y-\\mu}{s}\\right)^{2}\\right)^{-\\frac{\\nu+1}{2}}, \\qquad \\operatorname{Var}(y) \\;=\\; s^{2}\\,\\frac{\\nu}{\\nu-2} $$

Mu locates the distribution, s scales it, and nu controls how slowly the tails decay, with the variance blowing up as nu approaches 2\. Worked example at nu = 4, s = 1, mu = 0, so the variance is 2 and the matched Gaussian has standard deviation 1.414\. At the centre the t density is 0.375 against the Gaussian's 0.282, so 33% more mass where most bars land. Eight units out, which is 5.66 Gaussian sigmas, the t gives 3.15e-4 and the Gaussian gives 3.18e-8, a ratio near 9,900\. His test target carries excess kurtosis of 82.7, so those tails are not hypothetical.

Calibration is where the tail choice shows up in something you can audit. Following Kuleshov, Fenner and Ermon, he scores the model by how often reality falls below each predicted quantile.

$$ \\hat{p}\_{j} \\;=\\; \\frac{1}{N}\\left|\\left\\{\\,y\_{n}\\;:\\;\\mathcal{F}\_{X\_{n}}(y\_{n}) < p\_{j}\\,\\right\\}\\right|, \\qquad \\mathrm{cal} \\;=\\; \\sum\_{j=1}^{M}\\left(p\_{j}-\\hat{p}\_{j}\\right)^{2} $$

For each nominal quantile p-j, count the fraction of observations that landed below the model's own p-j quantile, then sum the squared misses over M = 100 evenly spaced quantiles. Perfect calibration means the 30th percentile prediction is exceeded 70% of the time. Worked example. His full-feature validation calibration is 0.0330 after the paper's factor of 100, so cal = 3.30e-4\. Spread evenly over 100 quantiles that is 3.30e-6 per quantile, and the square root is 0.0018, so the typical quantile is off by 0.18 percentage points. The Gaussian ablation posts 2.0310, which works out to 1.43 points per quantile, eight times worse. The unconditional normal posts 173.77, which is 13.2 points per quantile, a model that does not know what a quantile is.

![Calibration histograms on the test set. The full and no-timing feature sets track the uniform ideal with chi-squared of 0.0262 and 0.0257, the basic set is skewed toward low CDF values at 0.3138, and the Gaussian ablation spikes at both extremes at 1.0631](https://storage.ghost.io/c/27/cb/27cb0fc8-2c77-4434-af9e-d5d32a916994/content/images/2026/09/article_456-calibration_test_set.png)

The red line is the Gaussian ablation, piling up density at CDF values of 0 and 1, which is what a model looks like when reality keeps landing outside its tails. Note the two middle curves: the no-timing set scores 0.0257 and the full set 0.0262, so the timestamps made test calibration slightly worse. Tepelyan calls the difference negligible in practice, which it is. It also means the timestamps lose on one of his six metrics out of sample after winning on it in validation, where they cut calibration error from 0.2236 to 0.0330.

## What would change my mind

Three things in the setup keep me from reading the 0.0013 as a finding.

The comparison is not architecture-matched. He tuned hyperparameters separately per feature set, which is the right protocol, and the winners differ: the no-timing Transformer took 6 attention blocks with an embedding size of 32, while the full-feature Transformer took 10 blocks with an embedding of 128 and weight decay three orders of magnitude smaller. The full model is bigger. The 0.0013 gap bundles the timestamps with roughly double the attention depth and four times the embedding width.

No dispersion is reported. Each configuration ran three random seeds and he reports the mean across them. Three seeds with no standard error, and differences of 0.0008 to 0.0013 in validation NLL. Across architectures the full-feature spread is 0.0038 (MLP 0.2480, GRU 0.2452, Transformer 0.2442), so the entire timing effect is a fifth of the architecture noise band. The monotone ordering across nine architecture-by-feature-set cells is the strongest evidence he has, and it is circumstantial.

The filters remove most of the market. He keeps only bars with at least 30 ticks and a lookback-window low above 4 dollars, which leaves 1,021 unique names over 63 validation days, about a third of the Russell 3000\. His own arithmetic: a complete panel would have been 18 times larger. If all 1,021 names appeared on all 63 days, the average stock contributes roughly 20 valid minutes per day out of 370 usable ones. The surviving sample is the busiest minutes of the busiest names, which is exactly where intra-bar timestamps are measurable and where their information content should be largest. Generalizing to a quiet mid-cap at 2pm is not supported.

Architecture barely matters here, which agrees with the old article ["State-Space Models for Price: CryptoMamba vs Transformers (Skeptical)"](https://aligrithm.com/state-space-models-for-price-cryptomamba-vs-transformers-skeptical/). Swapping an MLP for a GRU for a Transformer moves validation NLL by 0.0038 on the full feature set. Swapping the feature set inside a single architecture moves it by 0.0225, about six times more. Data beats topology, as usual.

## The verdict

Intra-bar timestamps carry information. They do not carry alpha, and the paper never claims they do. What they carry is a 4% improvement in conditional-variance estimation, which has a clean mechanical explanation: the gap between the high time and the low time tells you how much clock the range consumed, and that separates a jump from a drift at identical OHLC. If you size positions by predicted volatility, run a range-based estimator, or price short-dated intraday options, that is worth having and you can test it in an afternoon with the formula above.

If you came for direction, the numbers say no. The timestamps add 0.006 percentage points of directional accuracy out of sample, moving the win-to-loss odds from 2.6085 to 2.6093, an improvement of 0.03%. The non-timing features, volume and tick count and bar shape, add 2.00% to those odds. And the 72.3% itself is largely the arithmetic of two overlapping VWAP windows and a bid-ask bounce, not a forecast. Buy the feed for the volatility model. Do not buy it for the signal.

![](https://storage.ghost.io/c/27/cb/27cb0fc8-2c77-4434-af9e-d5d32a916994/content/images/2026/09/article_456-visual-0.png)

## KEY POINTS

- Bloomberg's enhanced one-minute bars add the timestamps of the high and low, the tick count, and a bar VWAP. On the Russell 3000 in 2021, Tepelyan's best Transformer improves test NLL from 0.4311 (OHLC only) to 0.4088 (all non-timing features) to 0.4075 (with timestamps). The timestamps supply 0.0013 of the 0.0236 total, or 5.5%.
- Decompose by metric and the timestamps are a volatility feature. They supply 136% of the conditional-variance RMSE improvement (the non-timing features made variance prediction worse), 29% of the MSE improvement, 5.5% of the likelihood improvement, 1.5% of the directional improvement, and minus 2.4% of the calibration improvement.
- The mechanism is diffusion scaling. Two bars with identical OHLC differ in volatility by the square root of the ratio of their high-to-low time gaps. A 30-cent range traversed in 54 seconds implies 19 basis points per minute; the same range in 3 seconds implies 80.5\. Divide the squared log range by 4 log 2 times the tau gap, and treat it as a ranking device, since conditioning on the window containing both extremes biases the level upward.
- The 72.3% directional accuracy and R-squared of 0.3744 are mostly mechanical. Solving Tepelyan's Appendix E baselines gives an implied coefficient of 0.41 on the previous bar's close-to-VWAP return, a correlation of 0.61, and an R-squared of 0.371, matching his model. One observable plus shrinkage reproduces the entire result with no forecasting.
- The target cannot be traded, by design. Tepelyan picked VWAP-to-VWAP return partly for "weaker arbitrage incentives", reports no transaction costs, and standardizes the target without ever publishing its raw standard deviation, so no result in the paper can be checked against a spread.
- Choosing the Student-t over a matched Gaussian buys 0.0297 of test NLL, 23 times what the timestamps buy, and cuts per-quantile calibration error from 1.43 points to 0.18\. Distribution shape beat the data product.
- Three caveats keep the timing gain provisional: the no-timing and full Transformers differ in size (6 blocks and embedding 32 against 10 blocks and embedding 128), only three seeds ran with no standard errors against effects of 0.0008 to 0.0013, and the tick and price filters keep about 1,021 names and roughly 20 valid minutes per stock-day out of 370, a sample 18 times smaller than the full panel and concentrated in the most active minutes.

## References

- A new methodology to exploit predictive power in OHLC data - Andrew D. Mann, Denise Gorse, ICANN 2017
- Machine learning for forecasting mid-price movements using limit order book data - Paraskevi Nousi et al., IEEE Access 7, 2019
- [Enhancing OHLC Data with Timing Features: A Machine Learning Evaluation - Ruslan Tepelyan (arXiv 2509.16137)](https://arxiv.org/abs/2509.16137?ref=aligrithm.com)