去重股票状态rolling计算

This commit is contained in:
boris
2026-06-21 00:54:33 +08:00
parent a270e368c8
commit fd27429713
+21 -52
View File
@@ -2264,63 +2264,32 @@ impl PlatformExprStrategy {
let factor = ctx.data.require_factor(factor_date, symbol)?; let factor = ctx.data.require_factor(factor_date, symbol)?;
let candidate = ctx.data.require_candidate(date, symbol)?; let candidate = ctx.data.require_candidate(date, symbol)?;
let instrument = ctx.data.instrument(symbol); let instrument = ctx.data.instrument(symbol);
let stock_ma_short = self let mut rolling_values = HashMap::<(&'static str, usize), f64>::new();
.stock_decision_rolling_mean( let mut rolling = |field: &'static str, lookback: usize| -> f64 {
*rolling_values.entry((field, lookback)).or_insert_with(|| {
self.stock_decision_rolling_mean(
ctx, ctx,
date, date,
symbol, symbol,
&factor.extra_factors, &factor.extra_factors,
"close", field,
self.config.stock_short_ma_days, lookback,
) )
.unwrap_or(f64::NAN); .unwrap_or(f64::NAN)
let stock_ma_mid = self })
.stock_decision_rolling_mean( };
ctx, let stock_ma_short = rolling("close", self.config.stock_short_ma_days);
date, let stock_ma_mid = rolling("close", self.config.stock_mid_ma_days);
symbol, let stock_ma_long = rolling("close", self.config.stock_long_ma_days);
&factor.extra_factors, let stock_ma5 = rolling("close", 5);
"close", let stock_ma10 = rolling("close", 10);
self.config.stock_mid_ma_days, let stock_ma20 = rolling("close", 20);
) let stock_ma30 = rolling("close", 30);
.unwrap_or(f64::NAN); let stock_volume_ma5 = rolling("volume", 5);
let stock_ma_long = self let stock_volume_ma10 = rolling("volume", 10);
.stock_decision_rolling_mean( let stock_volume_ma20 = rolling("volume", 20);
ctx, let stock_volume_ma60 = rolling("volume", 60);
date, let stock_volume_ma100 = rolling("volume", 100);
symbol,
&factor.extra_factors,
"close",
self.config.stock_long_ma_days,
)
.unwrap_or(f64::NAN);
let stock_ma5 = self
.stock_decision_rolling_mean(ctx, date, symbol, &factor.extra_factors, "close", 5)
.unwrap_or(f64::NAN);
let stock_ma10 = self
.stock_decision_rolling_mean(ctx, date, symbol, &factor.extra_factors, "close", 10)
.unwrap_or(f64::NAN);
let stock_ma20 = self
.stock_decision_rolling_mean(ctx, date, symbol, &factor.extra_factors, "close", 20)
.unwrap_or(f64::NAN);
let stock_ma30 = self
.stock_decision_rolling_mean(ctx, date, symbol, &factor.extra_factors, "close", 30)
.unwrap_or(f64::NAN);
let stock_volume_ma5 = self
.stock_decision_rolling_mean(ctx, date, symbol, &factor.extra_factors, "volume", 5)
.unwrap_or(f64::NAN);
let stock_volume_ma10 = self
.stock_decision_rolling_mean(ctx, date, symbol, &factor.extra_factors, "volume", 10)
.unwrap_or(f64::NAN);
let stock_volume_ma20 = self
.stock_decision_rolling_mean(ctx, date, symbol, &factor.extra_factors, "volume", 20)
.unwrap_or(f64::NAN);
let stock_volume_ma60 = self
.stock_decision_rolling_mean(ctx, date, symbol, &factor.extra_factors, "volume", 60)
.unwrap_or(f64::NAN);
let stock_volume_ma100 = self
.stock_decision_rolling_mean(ctx, date, symbol, &factor.extra_factors, "volume", 100)
.unwrap_or(f64::NAN);
let touched_upper_limit = !market.paused let touched_upper_limit = !market.paused
&& (market.is_at_upper_limit_price(market.close) && (market.is_at_upper_limit_price(market.close)
|| market.is_at_upper_limit_price(market.open) || market.is_at_upper_limit_price(market.open)