From c911e79d88106ab18b1690e703ef910363580708 Mon Sep 17 00:00:00 2001 From: boris Date: Sat, 4 Jul 2026 05:51:35 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A1=A5=E9=BD=90=E5=BB=B6=E8=BF=9F=E6=92=AE?= =?UTF-8?q?=E5=90=88=E9=80=89=E8=82=A1=E9=A3=8E=E6=8E=A7=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- crates/fidc-core/src/universe.rs | 48 ++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/crates/fidc-core/src/universe.rs b/crates/fidc-core/src/universe.rs index af57370..8dbc2e0 100644 --- a/crates/fidc-core/src/universe.rs +++ b/crates/fidc-core/src/universe.rs @@ -431,4 +431,52 @@ mod tests { .starts_with("risk_decision=") ); } + + #[test] + fn selector_defers_static_execution_risk_for_lagged_execution() { + let data = DataSet::from_components( + vec![ + instrument("000001.SZ"), + instrument("688001.SH"), + instrument("000002.SZ"), + ], + vec![ + market("000001.SZ", 10.0), + market("688001.SH", 10.0), + market("000002.SZ", 10.0), + ], + vec![ + factor("000001.SZ", 8.0), + factor("688001.SH", 9.0), + factor("000002.SZ", 10.0), + ], + vec![ + candidate("000001.SZ", true, false), + candidate("688001.SH", false, true), + candidate("000002.SZ", false, false), + ], + vec![benchmark()], + ) + .unwrap(); + let selector = DynamicMarketCapBandSelector::new(2000.0, 7.0, 10.0, 0.0, 10, 0.0, 0.0, 0.0); + let (selected, diagnostics) = selector.select_with_diagnostics(&SelectionContext { + decision_date: d(), + benchmark: &benchmark(), + reference_level: 2000.0, + data: &data, + dynamic_universe: None, + risk_config: Some(&FidcRiskControlConfig::default()), + defer_selection_risk: true, + }); + + let selected_symbols = selected + .iter() + .map(|candidate| candidate.symbol.as_str()) + .collect::>(); + assert!(selected_symbols.contains("000001.SZ")); + assert!(selected_symbols.contains("688001.SH")); + assert!(selected_symbols.contains("000002.SZ")); + assert_eq!(diagnostics.not_eligible_count, 0); + assert!(diagnostics.risk_decisions.is_empty()); + } }