hurst/
lib.rs

1use linreg::{linear_regression};
2
3pub mod utils;
4
5use utils::*;
6
7/// Simple R/S Hurst estimation
8pub fn rssimple(x: Vec<f64>) -> f64 {
9    let n: f64 = x.len() as f64;
10    let x_mean: f64 = mean(&x);
11    let y: Vec<f64> = x.iter()
12    .map(|x| x - x_mean)
13    .collect();
14    let s: Vec<f64> = cumsum(&y);
15    let (min, max) = minmax(&s);
16    let rs: f64 =  (max - min)/ standard_deviation(&x);
17    return rs.log2() / n.log2();
18}
19
20/// Corrected R over S Hurst exponent
21pub fn rs_corrected(x: Vec<f64>) -> f64 {
22  let mut cap_x: Vec<f64> = vec![x.len() as f64];
23	let mut cap_y: Vec<f64> = vec![rscalc(&x)];
24	let mut n: Vec<u64> = vec![0, x.len() as u64 / 2, x.len() as u64];
25	// compute averaged R/S for halved intervals
26	while n[1] >= 8  {
27		let mut xl: Vec<f64> = vec![];
28    let mut yl: Vec<f64> = vec![];
29		for i in 1..n.len() {
30			let rs: f64 = rscalc(&x[((n[i-1]+1) as usize)..(n[i] as usize)]);
31			xl.push((n[i]-n[i-1]) as f64);
32			yl.push(rs);
33		}
34		cap_x.push(mean(&xl));
35		cap_y.push(mean(&yl));
36		// next step
37		n = half(&n, x.len() as u64);
38	}
39	// apply linear regression
40  let cap_x_log: Vec<f64> = cap_x.iter().map(|a| a.ln()).collect();
41  let cap_y_log: Vec<f64> = cap_y.iter().map(|a| a.ln()).collect(); 
42  let (slope, _): (f64, f64) = linear_regression(&cap_x_log, &cap_y_log).unwrap();
43  return slope;
44}