pub fn momentum(prices: &[f64], period: usize) -> Vec<Option<f64>> {
if period == 0 || prices.len() <= period {
return vec![None; prices.len()];
}
let mut mom = vec![None; prices.len()];
for i in period..prices.len() {
mom[i] = Some(prices[i] - prices[i - period]);
}
mom
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_mom_basic() {
let prices = vec![
44.34, 44.09, 44.15, 43.61, 44.33, 44.83, 45.10, 45.42, 45.84, 46.08, 45.89,
];
let mom = momentum(&prices, 10);
assert!((mom[10].unwrap() - 1.55).abs() < 1e-6);
}
#[test]
fn test_mom_short_input() {
let prices = vec![1.0, 2.0, 3.0];
let mom = momentum(&prices, 10);
assert_eq!(mom, vec![None, None, None]);
}
#[test]
fn test_mom_zero_period() {
let prices = vec![1.0, 2.0, 3.0];
let mom = momentum(&prices, 0);
assert_eq!(mom, vec![None, None, None]);
}
}