pub struct LeadLagCrossCorrelation { /* private fields */ }Expand description
Rolling lead–lag cross-correlation between two synchronised series.
Each update receives one (a, b) pair. The indicator keeps the most
recent window + 2·max_lag samples of each series and, once full, reports
the integer offset k ∈ [−max_lag, +max_lag] that maximises the absolute
Pearson correlation between a and a copy of b shifted by k:
lag = argmax_k | corr( a[t], b[t+k] ) |This answers “does BTC lead ETH on this timescale, and by how many bars?”.
A positive lag means a leads b; a negative lag means b leads a. The
reported correlation is the signed correlation at that lag, so its sign
tells you whether the lead relationship is positive or inverse.
The comparison is fully causal: a’s window is held fixed in the centre of
the buffer and b’s window slides across it, so every lag — positive and
negative — is evaluated only against data already seen. The candidate lags
are scanned in order of increasing |k|, so ties resolve to the smallest
absolute offset (lag 0 wins an exact tie).
Each update is O(window · max_lag) — proportional to the fixed
parameters, not the series length. A flat window in either channel makes a
correlation undefined; it is reported as 0 rather than NaN.
Feed raw prices or returns depending on your convention; lead–lag on returns is the more common choice for relating two assets.
§Example
use wickra_core::{Indicator, LeadLagCrossCorrelation};
let mut ll = LeadLagCrossCorrelation::new(12, 5).unwrap();
let mut last = None;
for t in 0..60 {
let a = (f64::from(t) * 0.4).sin() + 0.4 * (f64::from(t) * 1.1).sin();
// `b` is `a` delayed by 3 samples, so `a` leads `b` by 3.
let b = (f64::from(t - 3) * 0.4).sin() + 0.4 * (f64::from(t - 3) * 1.1).sin();
last = ll.update((a, b));
}
let out = last.unwrap();
assert_eq!(out.lag, 3);
assert!(out.correlation > 0.99);Implementations§
Source§impl LeadLagCrossCorrelation
impl LeadLagCrossCorrelation
Sourcepub fn new(window: usize, max_lag: usize) -> Result<Self>
pub fn new(window: usize, max_lag: usize) -> Result<Self>
Construct a new lead–lag cross-correlation.
window is the number of overlapping points each correlation is
computed over; max_lag is the largest offset (in either direction)
that is searched.
§Errors
Returns Error::InvalidPeriod if window < 2 or max_lag == 0.
Trait Implementations§
Source§impl Clone for LeadLagCrossCorrelation
impl Clone for LeadLagCrossCorrelation
Source§fn clone(&self) -> LeadLagCrossCorrelation
fn clone(&self) -> LeadLagCrossCorrelation
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for LeadLagCrossCorrelation
impl Debug for LeadLagCrossCorrelation
Source§impl Indicator for LeadLagCrossCorrelation
impl Indicator for LeadLagCrossCorrelation
Source§type Output = LeadLagCrossCorrelationOutput
type Output = LeadLagCrossCorrelationOutput
Source§fn update(&mut self, input: (f64, f64)) -> Option<LeadLagCrossCorrelationOutput>
fn update(&mut self, input: (f64, f64)) -> Option<LeadLagCrossCorrelationOutput>
None if the indicator is still warming up.Source§fn reset(&mut self)
fn reset(&mut self)
Source§fn warmup_period(&self) -> usize
fn warmup_period(&self) -> usize
None output can be produced.Auto Trait Implementations§
impl Freeze for LeadLagCrossCorrelation
impl RefUnwindSafe for LeadLagCrossCorrelation
impl Send for LeadLagCrossCorrelation
impl Sync for LeadLagCrossCorrelation
impl Unpin for LeadLagCrossCorrelation
impl UnsafeUnpin for LeadLagCrossCorrelation
impl UnwindSafe for LeadLagCrossCorrelation
Blanket Implementations§
Source§impl<T> BatchExt for Twhere
T: Indicator,
impl<T> BatchExt for Twhere
T: Indicator,
Source§fn batch(&mut self, inputs: &[Self::Input]) -> Vec<Option<Self::Output>>
fn batch(&mut self, inputs: &[Self::Input]) -> Vec<Option<Self::Output>>
None during warmup) per input.Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more