From 32e403044209d9f28e6315c23b0b1507fedcf0fd Mon Sep 17 00:00:00 2001 From: boris Date: Sat, 5 Sep 2026 02:54:53 +0800 Subject: [PATCH] perf: freeze standard rolling lookbacks --- .../fidc-core/src/platform_expr_strategy.rs | 64 ++++++++++--------- 1 file changed, 34 insertions(+), 30 deletions(-) diff --git a/crates/fidc-core/src/platform_expr_strategy.rs b/crates/fidc-core/src/platform_expr_strategy.rs index 6a41155..379cdd6 100644 --- a/crates/fidc-core/src/platform_expr_strategy.rs +++ b/crates/fidc-core/src/platform_expr_strategy.rs @@ -1055,7 +1055,8 @@ pub struct PlatformExprStrategy { stock_filter_quote_usage: StockFilterQuoteUsage, stock_filter_expr_present: bool, selection_quote_usage: StockFilterQuoteUsage, - stock_rolling_requirements: StockRollingRequirements, + stock_close_lookbacks: [usize; 7], + stock_volume_lookbacks: [usize; 5], stock_current_rolling_mean_required: bool, stock_snapshot_field_requirements: StockSnapshotFieldRequirements, stock_extra_factors_required: bool, @@ -1335,6 +1336,28 @@ impl PlatformExprStrategy { let selection_quote_usage = Self::selection_quote_usage_for_config(&config, &normalized_stock_filter_expr); let stock_rolling_requirements = Self::stock_rolling_requirements_for_config(&config); + let required_rolling = |field: &'static str, lookback: usize| { + stock_rolling_requirements + .requires(field, lookback) + .then_some(lookback) + .unwrap_or(0) + }; + let stock_close_lookbacks = [ + required_rolling("close", config.stock_short_ma_days), + required_rolling("close", config.stock_mid_ma_days), + required_rolling("close", config.stock_long_ma_days), + required_rolling("close", 5), + required_rolling("close", 10), + required_rolling("close", 20), + required_rolling("close", 30), + ]; + let stock_volume_lookbacks = [ + required_rolling("volume", 5), + required_rolling("volume", 10), + required_rolling("volume", 20), + required_rolling("volume", 60), + required_rolling("volume", 100), + ]; let stock_current_rolling_mean_required = Self::stock_current_rolling_mean_required_for_config(&config); let stock_snapshot_field_requirements = @@ -1380,7 +1403,8 @@ impl PlatformExprStrategy { stock_filter_quote_usage, stock_filter_expr_present, selection_quote_usage, - stock_rolling_requirements, + stock_close_lookbacks, + stock_volume_lookbacks, stock_current_rolling_mean_required, stock_snapshot_field_requirements, stock_extra_factors_required, @@ -4106,36 +4130,14 @@ impl PlatformExprStrategy { }) }) .flatten(); - let required_rolling = |field: &'static str, lookback: usize| { - self.stock_rolling_requirements - .requires(field, lookback) - .then_some(lookback) - .unwrap_or(0) - }; - let close_lookbacks = [ - required_rolling("close", self.config.stock_short_ma_days), - required_rolling("close", self.config.stock_mid_ma_days), - required_rolling("close", self.config.stock_long_ma_days), - required_rolling("close", 5), - required_rolling("close", 10), - required_rolling("close", 20), - required_rolling("close", 30), - ]; - let volume_lookbacks = [ - required_rolling("volume", 5), - required_rolling("volume", 10), - required_rolling("volume", 20), - required_rolling("volume", 60), - required_rolling("volume", 100), - ]; let rolling_means = ctx .data .market_standard_rolling_means_by_symbol_id_with_calendar_index( date, calendar_index, symbol_id, - &close_lookbacks, - &volume_lookbacks, + &self.stock_close_lookbacks, + &self.stock_volume_lookbacks, false, ); let close_rolling = |index: usize| rolling_means.close[index].unwrap_or(f64::NAN); @@ -14541,6 +14543,10 @@ mod tests { #[test] fn current_rolling_helpers_do_not_load_factor_maps_or_decision_rollings() { + let direct = PlatformExprStrategy::new(PlatformExprStrategyConfig::microcap_rotation()); + assert_eq!(direct.stock_close_lookbacks, [5, 10, 20, 5, 10, 20, 0]); + assert_eq!(direct.stock_volume_lookbacks, [0; 5]); + let mut cfg = PlatformExprStrategyConfig::microcap_rotation(); cfg.stock_filter_expr = concat!( "rolling_mean_current(\"close\", 5) > rolling_mean_current(\"close\", 10)", @@ -14551,10 +14557,8 @@ mod tests { let strategy = PlatformExprStrategy::new(cfg); assert!(!strategy.stock_extra_factors_required); - assert!(!strategy.stock_rolling_requirements.requires("close", 5)); - assert!(!strategy.stock_rolling_requirements.requires("close", 10)); - assert!(!strategy.stock_rolling_requirements.requires("volume", 5)); - assert!(!strategy.stock_rolling_requirements.requires("volume", 100)); + assert_eq!(strategy.stock_close_lookbacks, [0; 7]); + assert_eq!(strategy.stock_volume_lookbacks, [0; 5]); assert!(strategy.stock_current_rolling_mean_required); let mut signal_only = PlatformExprStrategyConfig::microcap_rotation();