Estimating Volume Profiles from OHLCV Bars When Tick Data Is Unavailable
Summary
The document addresses how to estimate a price-level volume profile from OHLCV bars when tick data is unavailable. One proposed approximation distributes each bar’s volume across prices between its low and high using a normal-shaped allocation centered on the bar midpoint, with a standard deviation assumed to be one sixth of the bar’s range. Prices are rounded to tick increments and tallied by level.
The author reports that profiles built from this method using ten-minute bars looked broadly similar to time-price-opportunity charts, and presents a finer-grained example using five-second bars. The approach is explicitly a compromise: OHLCV bars do not reveal the actual sequence or distribution of trades within each bar. The recommendation is to use the highest-frequency data available, while recognizing that tick-level observations provide a more direct basis for the profile. No formal accuracy test or comparison across alternative allocation assumptions is provided.
Key ideas
- OHLCV bars do not reveal how volume was distributed across prices within each bar.
- A proposed approximation assigns volume in a normal-shaped distribution centered at the bar midpoint.
- The assumed spread is based on the bar’s high-low range, and prices are grouped at tick increments.
- Using finer-grained bars can improve the input detail, but the method remains an estimate.
Tags
Full text
# What is the standard to compute volume profile using OHLCV data? # What is the standard to compute volume profile using OHLCV data? https://www.tradingview.com/support/solutions/43000502040-volume-profile/ Ideally, the volume profile should be computed using tick data. But such data may not be readily available. Given only OHLCV data, is there any research on what is the best way to compute volume profile (in stock daily chart)? ## Answer by babelproofreader (score 1) https://quant.stackexchange.com/a/70835 When faced with the same problem I just assumed that the volume is normally distributed across the high/low range of the bar as exemplified by the following Octave code snippet ``` ticks = norminv( linspace( 0 , 1 , vol( ii ) + 2 ) , ( high( ii ) + low( ii ) ) / 2 , ( high( ii ) - low( ii ) ) / 6 ) ; ticks = floor( ticks( 2 : end - 1 ) ./ tick_size .+ tick_size ) .* tick_size ; [ vals , bin_centres ] = hist( ticks , unique( ticks ) ) ; ``` I blogged about this approach at https://dekalogblog.blogspot.com/2020/05/market-profile-chart-in-octave.html, from which the following is taken "What this does is create vol(ii)+2 linearly spaced tick values from 0 to 1, where vol(ii) is the tick volume for an aggregated period, i.e. an ohlc bar, and transforms these into normally distributed ticks with a mean of the midpoint of the bar and an assumed standard deviation of one sixth the high-low range, rounded to the nearest whole tick. The hist function then provides the counts of ticks per level (vals) at levels (bin_centres)." A typical plot of such is (pay attention to the histogram on the y-axis compared to the following TPO chart on the same data) As can be seen, the two charts are broadly similar. These (daily) profiles are built up from the OHLCV of 10 minute candlesticks/bars. Ideally of course, as you stated in your question, you should drill down to tick level data, but if this is not available a compromise is to use the highest frequency data available to you. The following volume profile chart is built up of 5 second OHLCV data, with the addition of 10 minute "mini profiles" instead of normal candlesticks/bars. A more complete description of this chart and the assumptions behind it is at https://dekalogblog.blogspot.com/2021/08/another-iterative-improvement-of-my.html
Shown in full with attribution under the source's licence. Licence: CC BY-SA 4.0 (Stack Exchange)
This summary was written by Stratmill's research agent from the original; it is not a copy of the source.