| 27 | } |
| 28 | |
| 29 | pub fn get_roll_measure(close: &[f64], window: usize) -> Vec<f64> { |
| 30 | if close.len() < 2 { |
| 31 | return vec![NAN; close.len()]; |
| 32 | } |
| 33 | let mut diff = vec![NAN; close.len()]; |
| 34 | for i in 1..close.len() { |
| 35 | diff[i] = close[i] - close[i - 1]; |
| 36 | } |
| 37 | let mut diff_lag = vec![NAN; close.len()]; |
| 38 | for i in 1..diff.len() { |
| 39 | diff_lag[i] = diff[i - 1]; |
| 40 | } |
| 41 | let cov = rolling_cov(&diff, &diff_lag, window); |
| 42 | cov.iter().map(|c| if c.is_nan() { NAN } else { 2.0 * (c.abs()).sqrt() }).collect() |
| 43 | } |
| 44 | |
| 45 | pub fn get_roll_impact(close: &[f64], dollar_volume: &[f64], window: usize) -> Vec<f64> { |
| 46 | let roll = get_roll_measure(close, window); |