fn compute_market_data_stats_fast(
trades: &[AggTrade],
) -> Result<MarketDataStats, Box<dyn std::error::Error + Send + Sync>> {
if trades.is_empty() {
return Err("No trades data provided".into());
}
let mut min_price = f64::INFINITY;
let mut max_price = f64::NEG_INFINITY;
let mut sum_price = 0.0;
let mut sum_squared = 0.0;
let mut total_volume = 0.0;
let mut total_turnover = 0.0;
for trade in trades {
let price = trade.price.to_f64();
let volume = trade.volume.to_f64();
let turnover = price * volume;
min_price = min_price.min(price);
max_price = max_price.max(price);
sum_price += price;
sum_squared += price * price;
total_volume += volume;
total_turnover += turnover;
}
let n = trades.len() as f64;
let mean_price = sum_price / n;
let variance = (sum_squared / n) - (mean_price * mean_price);
let std_dev = variance.sqrt();
let median = mean_price;
Ok(MarketDataStats {
total_trades: trades.len() as u64,
total_volume,
total_turnover,
data_span_seconds: calculate_time_span(trades),
price_stats: PriceStats {
min: min_price,
max: max_price,
mean: mean_price,
median,
std_dev,
skewness: 0.0, kurtosis: 0.0, percentiles: default_percentiles(), tick_analysis: default_tick_analysis(),
returns: default_returns(),
},
volume_stats: fast_volume_stats(trades, total_volume),
temporal_stats: fast_temporal_stats(trades),
frequency_analysis: default_frequency_analysis(),
microstructure: default_microstructure(),
})
}