Skip to content
All library documents

Why Rescaled Range Code Can Misestimate Brownian Hurst Exponents

Article Quant Q&A · Author: BillyJean

Summary

The document examines an attempt to estimate the Hurst exponent of simulated Brownian motion with rescaled range analysis. The author generates a cumulative sum of random increments and computes a range-to-standard-deviation statistic over segments of different sizes, expecting an exponent near the Brownian benchmark of 0.5. The reported plot does not show that result, prompting a question about implementation errors versus sample length.

The example illustrates that estimating a scaling exponent requires careful construction of the rescaled-range statistic and aggregation across segment sizes; the displayed routine may not implement that procedure correctly. In particular, it calculates one statistic per segment and combines those values before taking logarithms, so its output should not be taken as a reliable estimate without checking the method. The document provides code and the author’s qualitative observation, but no corrected implementation, numerical estimates, or resolution. It also does not establish whether a longer series would fix the discrepancy.

Key ideas

  • The example simulates Brownian motion by cumulatively summing random increments.
  • The author expects rescaled range analysis to recover a Hurst exponent near 0.5.
  • The routine computes range-to-standard-deviation values across segments of varying sizes.
  • Its aggregation and scaling procedure should be checked before interpreting the plotted slope.
  • The excerpt offers no corrected method or evidence that a longer series resolves the issue.

Tags

Full text
# Determining Hurst exponent of a Brownian motion


# Determining Hurst exponent of a Brownian motion












I am trying to determine the Hurst exponent of a simple Brownian motion, however, I seem to get a result that differs from 0.5. I am following the instructions given on the Wikipedia-page, and here is the code I wrote in R for determining it:

```
library(ggplot2)

#generate Brownian motion
t <- 1:1e3
sig2 <- 0.01
x <- rnorm(n = length(t) - 1, sd = sqrt(sig2))
data <- c(0, cumsum(x))

#function to find Hurst exponent
simpleHurst <- function(y){
  sd.y <- sd(y)
  m <- mean(y)
  y <- y - m
  max.y <- max(cumsum(y))
  min.y <- min(cumsum(y))
  RS <- (max.y - min.y)/sd.y
  return(RS)
}

#find Hurst exponent of Brownian motion
df.rs <- data.frame()
for(i in c(1, 2, 4, 8, 16, 32)){
  RS <- 0
  n <- floor((length(data)/i))
  for(j in 0:(i-1)){
    X <- data[(1:n) + j*n]
    RS <- RS + simpleHurst(y = X)
  }

  df.rs <- rbind(df.rs, 
                 data.frame("log.t" = log(length(X)),
                            "log.RS"= log(RS / n)))
}

ggplot(data=df.rs,  aes(x=log.t, y=log.RS)) + geom_point(size=I(2))
```

This gives me the following plot:

This doesn't converge to 0.5 obviously. Is there an error in the script, or do I simply need to analyze a (much) longer time-series?

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.