perf: reject selection bands before state construction

This commit is contained in:
boris
2026-09-05 12:55:11 +08:00
parent b55ac0bf81
commit e060af380e
+53 -4
View File
@@ -9878,6 +9878,31 @@ impl PlatformExprStrategy {
.unwrap_or_else(|| self.field_value_from_caps(market_cap_bn, free_float_cap_bn)) .unwrap_or_else(|| self.field_value_from_caps(market_cap_bn, free_float_cap_bn))
} }
fn selection_factor_field_value(
&self,
market_cap_bn: f64,
free_float_cap_bn: f64,
) -> Option<f64> {
match self.config.market_cap_field.as_str() {
"market_cap" | "candidate_market_cap" => {
Some(Self::market_cap_storage_to_strategy_unit(market_cap_bn))
}
"market_cap_bn" | "candidate_market_cap_bn" => Some(market_cap_bn),
"free_float_cap" | "free_float_market_cap" | "candidate_free_float_cap" => {
Some(Self::market_cap_storage_to_strategy_unit(free_float_cap_bn))
}
"free_float_cap_bn" | "candidate_free_float_cap_bn" => Some(free_float_cap_bn),
"free_float_cap_or_market_cap" => Some(Self::market_cap_storage_to_strategy_unit(
if free_float_cap_bn.is_finite() && free_float_cap_bn > 0.0 {
free_float_cap_bn
} else {
market_cap_bn
},
)),
_ => None,
}
}
fn rank_value_from_caps( fn rank_value_from_caps(
&self, &self,
ctx: &StrategyContext<'_>, ctx: &StrategyContext<'_>,
@@ -10226,6 +10251,16 @@ impl PlatformExprStrategy {
let symbol = factor.symbol.as_str(); let symbol = factor.symbol.as_str();
let market_cap_bn = decision_market_cap_bn(factor); let market_cap_bn = decision_market_cap_bn(factor);
let free_float_cap_bn = decision_free_float_cap_bn(factor); let free_float_cap_bn = decision_free_float_cap_bn(factor);
let factor_field_value =
self.selection_factor_field_value(market_cap_bn, free_float_cap_bn);
if let Some(field_value) = factor_field_value
&& (!field_value.is_finite() || field_value < band_low || field_value > band_high)
{
if !field_value.is_finite() && diagnostics.len() < 12 {
diagnostics.push(format!("{symbol} rejected by missing selection field"));
}
continue;
}
let stock = self.uncached_selection_stock_state_from_views_by_symbol_id( let stock = self.uncached_selection_stock_state_from_views_by_symbol_id(
ctx, ctx,
date, date,
@@ -10235,8 +10270,9 @@ impl PlatformExprStrategy {
&execution_day, &execution_day,
&factor_day, &factor_day,
)?; )?;
let field_value = let field_value = factor_field_value.unwrap_or_else(|| {
self.selection_field_value_from_caps(market_cap_bn, free_float_cap_bn, &stock); self.selection_field_value_from_caps(market_cap_bn, free_float_cap_bn, &stock)
});
if !field_value.is_finite() { if !field_value.is_finite() {
if diagnostics.len() < 12 { if diagnostics.len() < 12 {
diagnostics.push(format!("{symbol} rejected by missing selection field")); diagnostics.push(format!("{symbol} rejected by missing selection field"));
@@ -10968,6 +11004,18 @@ impl PlatformExprStrategy {
let symbol = factor.symbol.as_str(); let symbol = factor.symbol.as_str();
let market_cap_bn = decision_market_cap_bn(factor); let market_cap_bn = decision_market_cap_bn(factor);
let free_float_cap_bn = decision_free_float_cap_bn(factor); let free_float_cap_bn = decision_free_float_cap_bn(factor);
let factor_field_value =
self.selection_factor_field_value(market_cap_bn, free_float_cap_bn);
if let Some(field_value) = factor_field_value
&& (!field_value.is_finite() || field_value < band_low || field_value > band_high)
{
if !field_value.is_finite() && diagnostics.len() < 12 {
diagnostics.push(format!(
"{symbol} quote_plan rejected by missing selection field"
));
}
continue;
}
let stock = self.uncached_selection_stock_state_from_views_by_symbol_id( let stock = self.uncached_selection_stock_state_from_views_by_symbol_id(
ctx, ctx,
date, date,
@@ -10977,8 +11025,9 @@ impl PlatformExprStrategy {
&execution_day, &execution_day,
&factor_day, &factor_day,
)?; )?;
let field_value = let field_value = factor_field_value.unwrap_or_else(|| {
self.selection_field_value_from_caps(market_cap_bn, free_float_cap_bn, &stock); self.selection_field_value_from_caps(market_cap_bn, free_float_cap_bn, &stock)
});
if !field_value.is_finite() { if !field_value.is_finite() {
if diagnostics.len() < 12 { if diagnostics.len() < 12 {
diagnostics.push(format!( diagnostics.push(format!(