Skip to content

Instantly share code, notes, and snippets.

@einblicker
Created October 29, 2011 13:19
Show Gist options
  • Save einblicker/1324435 to your computer and use it in GitHub Desktop.
Save einblicker/1324435 to your computer and use it in GitHub Desktop.
hurst exponent
import math.{pow, log, sqrt}
import java.util.Random
import org.apache.commons.math.stat.StatUtils.mean
import org.apache.commons.math.stat.regression.SimpleRegression
object HurstExponent extends App {
def hurstExponent(xs: Array[Double]): Double = {
def S(xs: Array[Double]): Double = {
val meanXs = mean(xs)
sqrt(xs.map(x => pow(x - meanXs, 2.0)).sum / xs.length.toDouble)
}
def R(xs: Array[Double]): Double = {
val meanXs = mean(xs)
val newXs = xs.map(_ - meanXs)
val Z = (1 to xs.length).map(i => newXs.slice(0, i).sum)
Z.max - Z.min
}
def Q(xs: Array[Double]): Double = R(xs) / S(xs)
val logQ = for {
t <- (1 to log(xs.length).toInt).map(pow(2.0, _).toInt).toArray
} yield {
val partXs = xs.slice(0, xs.length - xs.length % t)
val xss = partXs.grouped(t)
log(mean(xss.map(xs => Q(xs.toArray)).toArray))
}
val logT = (1 to log(xs.length).toInt).map(x => log(pow(2.0, x)))
val sr = new SimpleRegression()
for ((a, b) <- (logT zip logQ).filterNot(_._2.isNaN)) {
sr.addData(a, b)
}
sr.getSlope()
}
object Random extends Random
println(hurstExponent(1 to 10000 map(_ => Random.nextDouble() - 0.5) toArray))
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment