Skip to content
All library documents

Use Log Returns for Autocorrelation Analysis of Price Series

Article Quant Q&A · Author: joesyc

Summary

The document addresses whether to estimate intraday autocorrelation from prices or log returns. It explains that price levels often behave as nonstationary series with a unit root, so their apparent serial correlation can be spurious and is not a reliable measure of return predictability. Taking differences of log prices produces log returns, which are more suitable for estimating autocorrelation and autoregressive relationships when they are stationary.

The example contrasts autocorrelation calculations on a constructed price sequence with calculations on its log returns. The answer recommends generating uncorrelated returns and simulating corresponding prices to see how price-level correlations can appear significant while return correlations remain near zero. This guidance is about statistical modeling assumptions, not a guarantee that returns are stationary or uncorrelated: those properties should be assessed for the asset, sampling interval, and period under study.

Key ideas

  • Price levels can be nonstationary, making their autocorrelation misleading.
  • Log returns are generally the more appropriate series for autocorrelation analysis.
  • Apparent correlation in prices does not necessarily indicate predictable returns.
  • Simulating prices from uncorrelated returns can demonstrate spurious price-level correlation.
  • Stationarity should still be assessed for the return series being analyzed.

Tags

Full text
# When measuring autocorrelation should you use log returns or prices?


# When measuring autocorrelation should you use log returns or prices?












Let's say you want to measure intra day autocorrelation from 9:30 am to 1pm using 5-minute prices should you calculate the autocorrelation using raw prices or log returns (i.e. diff(log(prices)))? Can you explain?

Below is an example showing using price recognizes high serial autocorrelation in the price while log returns does not recognize it.

```
set.seed(12345)
###auto correlation in price
r =rep(seq(1,20,1),20)
plot(r,type='l')
acf(r, lag.max= 1)$acf #this DOES recognize the price dynamics of high serial correlation for runs of 20 at a time
arima(r, c(1,0,0))

### autocorrelation in log returns
r =diff(log(rep(seq(1,20,1),20)))
plot(r,type='l')
acf(r, lag.max= 1)$acf   #this DOES NOT recognize the price dynamics of high serial correlation for runs of 20 at a time
arima(r, c(1,0,0))
```

## Answer by Alex C (score 2)

https://quant.stackexchange.com/a/19367

The high serial correlation you are getting in the first case is a spurious correlation. The correct way to do it is with returns. The price series has a unit root. You need to take diff(log(prices))) in order to have a stationary time series, on which you can then estimate autocorrelations, auto regressive coefficients, etc. properly. This was shown by Granger and Newbold in their paper 'Spurious Regression in Econometrics' (1974).

To test this yourself, generate uncorrelated returns yourself by monte carlo and the corresponding prices. Compute the correlation both ways. The return correlations will be near zero [correctly so], the price correlations will be biased and will often appear to be significantly different from zero.

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.