perf: freeze standard rolling lookbacks

This commit is contained in:
boris
2026-09-05 02:54:53 +08:00
parent be2f624e3c
commit 32e4030442
+34 -30
View File
@@ -1055,7 +1055,8 @@ pub struct PlatformExprStrategy {
stock_filter_quote_usage: StockFilterQuoteUsage, stock_filter_quote_usage: StockFilterQuoteUsage,
stock_filter_expr_present: bool, stock_filter_expr_present: bool,
selection_quote_usage: StockFilterQuoteUsage, 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_current_rolling_mean_required: bool,
stock_snapshot_field_requirements: StockSnapshotFieldRequirements, stock_snapshot_field_requirements: StockSnapshotFieldRequirements,
stock_extra_factors_required: bool, stock_extra_factors_required: bool,
@@ -1335,6 +1336,28 @@ impl PlatformExprStrategy {
let selection_quote_usage = let selection_quote_usage =
Self::selection_quote_usage_for_config(&config, &normalized_stock_filter_expr); Self::selection_quote_usage_for_config(&config, &normalized_stock_filter_expr);
let stock_rolling_requirements = Self::stock_rolling_requirements_for_config(&config); 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 = let stock_current_rolling_mean_required =
Self::stock_current_rolling_mean_required_for_config(&config); Self::stock_current_rolling_mean_required_for_config(&config);
let stock_snapshot_field_requirements = let stock_snapshot_field_requirements =
@@ -1380,7 +1403,8 @@ impl PlatformExprStrategy {
stock_filter_quote_usage, stock_filter_quote_usage,
stock_filter_expr_present, stock_filter_expr_present,
selection_quote_usage, selection_quote_usage,
stock_rolling_requirements, stock_close_lookbacks,
stock_volume_lookbacks,
stock_current_rolling_mean_required, stock_current_rolling_mean_required,
stock_snapshot_field_requirements, stock_snapshot_field_requirements,
stock_extra_factors_required, stock_extra_factors_required,
@@ -4106,36 +4130,14 @@ impl PlatformExprStrategy {
}) })
}) })
.flatten(); .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 let rolling_means = ctx
.data .data
.market_standard_rolling_means_by_symbol_id_with_calendar_index( .market_standard_rolling_means_by_symbol_id_with_calendar_index(
date, date,
calendar_index, calendar_index,
symbol_id, symbol_id,
&close_lookbacks, &self.stock_close_lookbacks,
&volume_lookbacks, &self.stock_volume_lookbacks,
false, false,
); );
let close_rolling = |index: usize| rolling_means.close[index].unwrap_or(f64::NAN); let close_rolling = |index: usize| rolling_means.close[index].unwrap_or(f64::NAN);
@@ -14541,6 +14543,10 @@ mod tests {
#[test] #[test]
fn current_rolling_helpers_do_not_load_factor_maps_or_decision_rollings() { 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(); let mut cfg = PlatformExprStrategyConfig::microcap_rotation();
cfg.stock_filter_expr = concat!( cfg.stock_filter_expr = concat!(
"rolling_mean_current(\"close\", 5) > rolling_mean_current(\"close\", 10)", "rolling_mean_current(\"close\", 5) > rolling_mean_current(\"close\", 10)",
@@ -14551,10 +14557,8 @@ mod tests {
let strategy = PlatformExprStrategy::new(cfg); let strategy = PlatformExprStrategy::new(cfg);
assert!(!strategy.stock_extra_factors_required); assert!(!strategy.stock_extra_factors_required);
assert!(!strategy.stock_rolling_requirements.requires("close", 5)); assert_eq!(strategy.stock_close_lookbacks, [0; 7]);
assert!(!strategy.stock_rolling_requirements.requires("close", 10)); assert_eq!(strategy.stock_volume_lookbacks, [0; 5]);
assert!(!strategy.stock_rolling_requirements.requires("volume", 5));
assert!(!strategy.stock_rolling_requirements.requires("volume", 100));
assert!(strategy.stock_current_rolling_mean_required); assert!(strategy.stock_current_rolling_mean_required);
let mut signal_only = PlatformExprStrategyConfig::microcap_rotation(); let mut signal_only = PlatformExprStrategyConfig::microcap_rotation();