预计算策略滚动窗口依赖
This commit is contained in:
@@ -987,7 +987,8 @@ pub struct PlatformExprStrategy {
|
|||||||
prelude_declared_identifiers: BTreeSet<String>,
|
prelude_declared_identifiers: BTreeSet<String>,
|
||||||
stock_filter_quote_usage: StockFilterQuoteUsage,
|
stock_filter_quote_usage: StockFilterQuoteUsage,
|
||||||
selection_quote_usage: StockFilterQuoteUsage,
|
selection_quote_usage: StockFilterQuoteUsage,
|
||||||
stock_rolling_requirements: StockRollingRequirements,
|
stock_close_lookbacks: [usize; 7],
|
||||||
|
stock_volume_lookbacks: [usize; 5],
|
||||||
stock_extra_factors_required: bool,
|
stock_extra_factors_required: bool,
|
||||||
stock_extra_factor_identifiers: BTreeSet<String>,
|
stock_extra_factor_identifiers: BTreeSet<String>,
|
||||||
stock_extra_factor_map_required: bool,
|
stock_extra_factor_map_required: bool,
|
||||||
@@ -1265,6 +1266,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_extra_factors_required =
|
let stock_extra_factors_required =
|
||||||
Self::stock_extra_factors_required_for_config(&config, &prelude_declared_identifiers);
|
Self::stock_extra_factors_required_for_config(&config, &prelude_declared_identifiers);
|
||||||
let stock_extra_factor_identifiers =
|
let stock_extra_factor_identifiers =
|
||||||
@@ -1310,7 +1333,8 @@ impl PlatformExprStrategy {
|
|||||||
prelude_declared_identifiers,
|
prelude_declared_identifiers,
|
||||||
stock_filter_quote_usage,
|
stock_filter_quote_usage,
|
||||||
selection_quote_usage,
|
selection_quote_usage,
|
||||||
stock_rolling_requirements,
|
stock_close_lookbacks,
|
||||||
|
stock_volume_lookbacks,
|
||||||
stock_extra_factors_required,
|
stock_extra_factors_required,
|
||||||
stock_extra_factor_identifiers,
|
stock_extra_factor_identifiers,
|
||||||
stock_extra_factor_map_required,
|
stock_extra_factor_map_required,
|
||||||
@@ -4038,33 +4062,11 @@ impl PlatformExprStrategy {
|
|||||||
None
|
None
|
||||||
};
|
};
|
||||||
let instrument = ctx.data.instrument(symbol);
|
let instrument = ctx.data.instrument(symbol);
|
||||||
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(
|
let rolling_means = ctx.data.market_standard_rolling_means_by_symbol_id(
|
||||||
date,
|
date,
|
||||||
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);
|
||||||
@@ -14005,10 +14007,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));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
|||||||
Reference in New Issue
Block a user