diff --git a/crates/fidc-core/src/data.rs b/crates/fidc-core/src/data.rs index 4269569..cf978ae 100644 --- a/crates/fidc-core/src/data.rs +++ b/crates/fidc-core/src/data.rs @@ -14,7 +14,7 @@ use crate::futures::FuturesTradingParameter; use crate::instrument::Instrument; use crate::risk_control::{ChinaAShareRiskControl, FidcRiskControlConfig}; -const BACKWARD_ADJUSTMENT_FACTOR_FIELD: &str = "adjustment_factor_backward1"; +pub(crate) const BACKWARD_ADJUSTMENT_FACTOR_FIELD: &str = "adjustment_factor_backward1"; mod date_format { use chrono::NaiveDate; @@ -96,6 +96,18 @@ pub enum DataSetError { row_count: usize, symbol_id_count: usize, }, + #[error("factor field {field} must use its typed column on {date} / {symbol}")] + ReservedTypedFactorInExtraMap { + date: NaiveDate, + symbol: String, + field: &'static str, + }, + #[error("invalid backward adjustment factor {value} on {date} / {symbol}")] + InvalidBackwardAdjustmentFactor { + date: NaiveDate, + symbol: String, + value: f64, + }, } #[derive(Debug, Clone, Copy, PartialEq, Eq)] @@ -200,6 +212,8 @@ pub struct DailyFactorSnapshot { pub turnover_ratio: Option, pub effective_turnover_ratio: Option, #[serde(default)] + pub adjustment_factor_backward1: Option, + #[serde(default)] pub extra_factors: NumericFactorMap, } @@ -659,12 +673,7 @@ impl AdjustedCloseSeries { let factor = factor_rows .get(factor_index) .filter(|snapshot| snapshot.date == *date) - .and_then(|snapshot| { - snapshot - .extra_factors - .get(BACKWARD_ADJUSTMENT_FACTOR_FIELD) - .copied() - }) + .and_then(|snapshot| snapshot.adjustment_factor_backward1) .filter(|factor| factor.is_finite() && *factor > 0.0); let back_adjusted_close = factor .filter(|_| close.is_finite() && *close > 0.0) @@ -1602,7 +1611,7 @@ impl DataSet { |row| row.symbol.as_str(), )?; sort_rows_by_symbol_if_needed(&mut bundle.market, |row| row.symbol.as_str()); - bundle.factors = normalize_factor_snapshots(bundle.factors); + bundle.factors = normalize_factor_snapshots(bundle.factors)?; sort_rows_by_symbol_if_needed(&mut bundle.factors, |row| row.symbol.as_str()); sort_rows_by_symbol_if_needed(&mut bundle.candidates, |row| row.symbol.as_str()); if !bundle.market.is_empty() { @@ -1764,7 +1773,7 @@ impl DataSet { } else { let mut market_by_date = group_by_date(market, |item| item.date); sort_groups_by_symbol(&mut market_by_date, |item| item.symbol.as_str()); - let factors = normalize_factor_snapshots(factors); + let factors = normalize_factor_snapshots(factors)?; let mut factor_by_date = group_by_date(factors, |item| item.date); sort_groups_by_symbol(&mut factor_by_date, |item| item.symbol.as_str()); let mut candidate_by_date = group_by_date(candidates, |item| item.date); @@ -4230,6 +4239,7 @@ fn factor_numeric_value(snapshot: &DailyFactorSnapshot, field: &str) -> Option Some(snapshot.pe_ttm), "turnover_ratio" => snapshot.turnover_ratio, "effective_turnover_ratio" => snapshot.effective_turnover_ratio, + BACKWARD_ADJUSTMENT_FACTOR_FIELD => snapshot.adjustment_factor_backward1, "ths_market_value_stock" | "ths_market_value_stock_bn" => snapshot .extra_factors .get(field.as_ref()) @@ -4342,10 +4352,31 @@ fn normalized_field(field: &str) -> Cow<'_, str> { } } -fn normalize_factor_snapshots(factors: Vec) -> Vec { +fn normalize_factor_snapshots( + factors: Vec, +) -> Result, DataSetError> { factors .into_iter() .map(|mut snapshot| { + if snapshot + .extra_factors + .contains_key(BACKWARD_ADJUSTMENT_FACTOR_FIELD) + { + return Err(DataSetError::ReservedTypedFactorInExtraMap { + date: snapshot.date, + symbol: snapshot.symbol, + field: BACKWARD_ADJUSTMENT_FACTOR_FIELD, + }); + } + if let Some(value) = snapshot.adjustment_factor_backward1 + && (!value.is_finite() || value <= 0.0) + { + return Err(DataSetError::InvalidBackwardAdjustmentFactor { + date: snapshot.date, + symbol: snapshot.symbol, + value, + }); + } let already_normalized = snapshot.extra_factors.iter().all(|(field, value)| { let trimmed = field.as_ref().trim().trim_matches('"').trim_matches('\''); !trimmed.is_empty() @@ -4354,7 +4385,7 @@ fn normalize_factor_snapshots(factors: Vec) -> Vec) -> Vec>(); @@ -6240,11 +6272,16 @@ mod tests { pe_ttm: 10.0, turnover_ratio: None, effective_turnover_ratio: None, + adjustment_factor_backward1: Some(1.25), extra_factors: BTreeMap::from([("custom_factor".into(), 3.5)]), }; assert_eq!(factor_numeric_value(&snapshot, " MARKET_CAP "), Some(12.5)); assert_eq!(factor_numeric_value(&snapshot, "CUSTOM_FACTOR"), Some(3.5)); + assert_eq!( + factor_numeric_value(&snapshot, "ADJUSTMENT_FACTOR_BACKWARD1"), + Some(1.25) + ); } #[test] @@ -6258,8 +6295,10 @@ mod tests { pe_ttm: 1.0, turnover_ratio: None, effective_turnover_ratio: None, + adjustment_factor_backward1: None, extra_factors: BTreeMap::from([(Cow::Borrowed("amount"), 10.0)]), - }]); + }]) + .expect("normalize clean factor snapshot"); assert!(matches!( clean[0].extra_factors.keys().next(), Some(Cow::Borrowed("amount")) @@ -6273,15 +6312,45 @@ mod tests { pe_ttm: 1.0, turnover_ratio: None, effective_turnover_ratio: None, + adjustment_factor_backward1: None, extra_factors: BTreeMap::from([ (Cow::Owned(" CUSTOM_FACTOR ".to_string()), 2.0), (Cow::Borrowed("bad_nan"), f64::NAN), ]), - }]); + }]) + .expect("normalize dirty factor snapshot"); assert_eq!(dirty[0].extra_factors.get("custom_factor"), Some(&2.0)); assert!(!dirty[0].extra_factors.contains_key("bad_nan")); } + #[test] + fn factor_snapshot_rejects_legacy_or_invalid_adjustment_storage() { + let date = NaiveDate::parse_from_str("2025-01-02", "%Y-%m-%d").unwrap(); + let snapshot = |adjustment_factor_backward1, extra_factors| DailyFactorSnapshot { + date, + symbol: "000001.SZ".to_string(), + market_cap_bn: 1.0, + free_float_cap_bn: 1.0, + pe_ttm: 1.0, + turnover_ratio: None, + effective_turnover_ratio: None, + adjustment_factor_backward1, + extra_factors, + }; + + assert!(matches!( + normalize_factor_snapshots(vec![snapshot( + Some(1.0), + BTreeMap::from([(Cow::Borrowed(BACKWARD_ADJUSTMENT_FACTOR_FIELD), 1.0)]), + )]), + Err(DataSetError::ReservedTypedFactorInExtraMap { .. }) + )); + assert!(matches!( + normalize_factor_snapshots(vec![snapshot(Some(0.0), BTreeMap::new())]), + Err(DataSetError::InvalidBackwardAdjustmentFactor { .. }) + )); + } + #[test] fn symbol_price_series_test_constructor_sorts_unsorted_rows() { let series = SymbolPriceSeries::new( @@ -6374,6 +6443,7 @@ mod tests { pe_ttm: 10.0, turnover_ratio: None, effective_turnover_ratio: None, + adjustment_factor_backward1: None, extra_factors, } }) @@ -6432,10 +6502,8 @@ mod tests { pe_ttm: 10.0, turnover_ratio: None, effective_turnover_ratio: None, - extra_factors: BTreeMap::from([( - Cow::Borrowed(BACKWARD_ADJUSTMENT_FACTOR_FIELD), - 1.0, - )]), + adjustment_factor_backward1: Some(1.0), + extra_factors: BTreeMap::new(), }) .collect(), Vec::new(), @@ -6728,7 +6796,8 @@ mod tests { pe_ttm: 10.0, turnover_ratio: None, effective_turnover_ratio: None, - extra_factors: BTreeMap::from([("adjustment_factor_backward1".into(), factor)]), + adjustment_factor_backward1: Some(factor), + extra_factors: BTreeMap::new(), }) .collect(), Vec::new(), @@ -6825,11 +6894,8 @@ mod tests { pe_ttm: 10.0, turnover_ratio: None, effective_turnover_ratio: None, - extra_factors: if *date == dates[3] { - BTreeMap::new() - } else { - BTreeMap::from([("adjustment_factor_backward1".into(), 1.0)]) - }, + adjustment_factor_backward1: (*date != dates[3]).then_some(1.0), + extra_factors: BTreeMap::new(), }) .collect(), Vec::new(), @@ -6931,6 +6997,7 @@ mod tests { pe_ttm: 10.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }; let candidate = |symbol: &str| CandidateEligibility { @@ -7029,6 +7096,7 @@ mod tests { pe_ttm: 10.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }], Vec::new(), @@ -7113,6 +7181,7 @@ mod tests { pe_ttm: 10.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }], vec![CandidateEligibility { @@ -7164,6 +7233,7 @@ mod tests { pe_ttm: 10.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }; diff --git a/crates/fidc-core/src/engine.rs b/crates/fidc-core/src/engine.rs index 3a6e6c5..5cd3cd1 100644 --- a/crates/fidc-core/src/engine.rs +++ b/crates/fidc-core/src/engine.rs @@ -5354,6 +5354,7 @@ mod tests { pe_ttm: 12.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), } } diff --git a/crates/fidc-core/src/platform_expr_strategy.rs b/crates/fidc-core/src/platform_expr_strategy.rs index 591b8ce..2b389c2 100644 --- a/crates/fidc-core/src/platform_expr_strategy.rs +++ b/crates/fidc-core/src/platform_expr_strategy.rs @@ -11,8 +11,9 @@ use crate::cost::ChinaAShareCostModel; #[cfg(test)] use crate::data::EligibleUniverseSnapshot; use crate::data::{ - CandidateEligibility, DailyFactorSnapshot, DailyMarketSnapshot, DailySnapshotView, DataSet, - PriceField, decision_free_float_cap_bn, decision_market_cap_bn, + BACKWARD_ADJUSTMENT_FACTOR_FIELD, CandidateEligibility, DailyFactorSnapshot, + DailyMarketSnapshot, DailySnapshotView, DataSet, PriceField, decision_free_float_cap_bn, + decision_market_cap_bn, }; use crate::engine::BacktestError; use crate::events::OrderSide; @@ -4189,7 +4190,15 @@ impl PlatformExprStrategy { ctx.data .factor_snapshot_rows_on(date) .iter() - .flat_map(|row| row.extra_factors.keys().map(|key| key.to_string())) + .flat_map(|row| { + row.extra_factors + .keys() + .map(|key| key.to_string()) + .chain( + row.adjustment_factor_backward1 + .map(|_| BACKWARD_ADJUSTMENT_FACTOR_FIELD.to_string()), + ) + }) .collect() } else { BTreeSet::new() @@ -4683,7 +4692,7 @@ impl PlatformExprStrategy { feature_market.volume as f64 }; - let extra_factors = if self.stock_extra_factors_required { + let mut extra_factors = if self.stock_extra_factors_required { factor .extra_factors .iter() @@ -4696,6 +4705,15 @@ impl PlatformExprStrategy { } else { BTreeMap::new() }; + if self.stock_extra_factors_required + && (self.stock_extra_factor_map_required + || self + .stock_extra_factor_identifiers + .contains(BACKWARD_ADJUSTMENT_FACTOR_FIELD)) + && let Some(value) = factor.adjustment_factor_backward1 + { + extra_factors.insert(BACKWARD_ADJUSTMENT_FACTOR_FIELD.to_string(), value); + } let state = StockExpressionState { symbol: shared_symbol, @@ -14099,6 +14117,7 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }) .collect(), @@ -14170,7 +14189,8 @@ mod tests { pe_ttm: 12.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), - extra_factors: BTreeMap::from([("adjustment_factor_backward1".into(), 1.0)]), + adjustment_factor_backward1: Some(1.0), + extra_factors: BTreeMap::new(), }; let candidate = |date: NaiveDate| CandidateEligibility { date, @@ -14516,6 +14536,7 @@ mod tests { pe_ttm: 12.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }) .collect(), @@ -15018,6 +15039,7 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }], vec![CandidateEligibility { @@ -15134,6 +15156,7 @@ mod tests { pe_ttm: 12.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }], vec![CandidateEligibility { @@ -15241,6 +15264,7 @@ mod tests { pe_ttm: 12.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }], vec![CandidateEligibility { @@ -15407,6 +15431,7 @@ mod tests { pe_ttm: 12.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }], Vec::::new(), @@ -15553,6 +15578,7 @@ mod tests { pe_ttm: 12.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }) .collect::>(); @@ -15760,6 +15786,7 @@ mod tests { pe_ttm: 12.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }) .collect::>(); @@ -15915,6 +15942,7 @@ mod tests { pe_ttm: 12.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }], vec![CandidateEligibility { @@ -16079,6 +16107,7 @@ mod tests { pe_ttm: 10.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }) .collect(), @@ -16238,6 +16267,7 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }, DailyFactorSnapshot { @@ -16248,6 +16278,7 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::from([ ("model_score".into(), 2.0), ("unused_factor".into(), 9.0), @@ -16613,6 +16644,7 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }], vec![CandidateEligibility { @@ -16755,6 +16787,7 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }], vec![CandidateEligibility { @@ -16972,6 +17005,7 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }], vec![CandidateEligibility { @@ -17118,6 +17152,7 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }], vec![CandidateEligibility { @@ -17215,6 +17250,7 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }], vec![CandidateEligibility { @@ -17330,6 +17366,7 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(35.77), effective_turnover_ratio: Some(35.77), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }], vec![CandidateEligibility { @@ -17449,6 +17486,7 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(35.77), effective_turnover_ratio: Some(35.77), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }], vec![CandidateEligibility { @@ -17591,6 +17629,7 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(35.77), effective_turnover_ratio: Some(35.77), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }, DailyFactorSnapshot { @@ -17601,6 +17640,7 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(20.0), effective_turnover_ratio: Some(20.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }, ], @@ -17877,6 +17917,7 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(20.0), effective_turnover_ratio: Some(20.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }, DailyFactorSnapshot { @@ -17887,6 +17928,7 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(20.0), effective_turnover_ratio: Some(20.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }, ], @@ -18176,6 +18218,7 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(20.0), effective_turnover_ratio: Some(20.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }, DailyFactorSnapshot { @@ -18186,6 +18229,7 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(20.0), effective_turnover_ratio: Some(20.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }, ], @@ -18413,6 +18457,7 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(20.0), effective_turnover_ratio: Some(20.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }, DailyFactorSnapshot { @@ -18423,6 +18468,7 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(20.0), effective_turnover_ratio: Some(20.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }, ], @@ -18636,6 +18682,7 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(3.0), effective_turnover_ratio: Some(3.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }], vec![CandidateEligibility { @@ -18775,7 +18822,8 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(3.0), effective_turnover_ratio: Some(3.0), - extra_factors: BTreeMap::from([("adjustment_factor_backward1".into(), 1.0)]), + adjustment_factor_backward1: Some(1.0), + extra_factors: BTreeMap::new(), }) .collect(), vec![CandidateEligibility { @@ -18944,6 +18992,7 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(3.0), effective_turnover_ratio: Some(3.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }], vec![CandidateEligibility { @@ -19102,6 +19151,7 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(3.0), effective_turnover_ratio: Some(3.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }], vec![CandidateEligibility { @@ -19217,6 +19267,7 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }; let candidate = CandidateEligibility { @@ -19418,6 +19469,7 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }; let candidate = |date: NaiveDate| CandidateEligibility { @@ -19584,6 +19636,7 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(3.0), effective_turnover_ratio: Some(3.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }], vec![CandidateEligibility { @@ -19693,6 +19746,7 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(3.0), effective_turnover_ratio: Some(3.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }], vec![CandidateEligibility { @@ -19799,6 +19853,7 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(3.0), effective_turnover_ratio: Some(3.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }], vec![CandidateEligibility { @@ -19926,6 +19981,7 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(1.2), effective_turnover_ratio: Some(1.2), + adjustment_factor_backward1: None, extra_factors: BTreeMap::from([("touched_upper_limit".into(), 1.0)]), }, DailyFactorSnapshot { @@ -19936,6 +19992,7 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(2.4), effective_turnover_ratio: Some(2.4), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }, ], @@ -20042,6 +20099,7 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::from([("touched_upper_limit".into(), 1.0)]), }], vec![CandidateEligibility { @@ -20174,6 +20232,7 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }, DailyFactorSnapshot { @@ -20184,6 +20243,7 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }, ], @@ -20341,6 +20401,7 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }) .collect(), @@ -20529,6 +20590,7 @@ mod tests { pe_ttm: 10.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }], vec![CandidateEligibility { @@ -20666,6 +20728,7 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }) .collect(), @@ -20779,7 +20842,8 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), - extra_factors: BTreeMap::from([("adjustment_factor_backward1".into(), 1.0)]), + adjustment_factor_backward1: Some(1.0), + extra_factors: BTreeMap::new(), }) .collect(); let benchmark_rows: Vec = market_rows @@ -20906,6 +20970,7 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }], vec![CandidateEligibility { @@ -21016,6 +21081,7 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }], vec![CandidateEligibility { @@ -21153,6 +21219,7 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }], vec![CandidateEligibility { @@ -21266,6 +21333,7 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }], vec![CandidateEligibility { @@ -21397,6 +21465,7 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }], vec![CandidateEligibility { @@ -21520,6 +21589,7 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }; let benchmark = |date: NaiveDate| BenchmarkSnapshot { @@ -21654,6 +21724,7 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }) .collect(), @@ -21812,6 +21883,7 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }], vec![CandidateEligibility { @@ -21968,6 +22040,7 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }], vec![CandidateEligibility { @@ -22124,6 +22197,7 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }], vec![CandidateEligibility { @@ -22288,6 +22362,7 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }) .collect(), @@ -22451,6 +22526,7 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }) .collect(), @@ -22606,6 +22682,7 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }], vec![CandidateEligibility { @@ -22755,6 +22832,7 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }) .collect(), @@ -22929,6 +23007,7 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }], vec![CandidateEligibility { @@ -23086,6 +23165,7 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }], vec![CandidateEligibility { @@ -23206,6 +23286,7 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }], vec![CandidateEligibility { @@ -23356,6 +23437,7 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }], vec![CandidateEligibility { @@ -23454,6 +23536,7 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }], vec![CandidateEligibility { @@ -23623,6 +23706,7 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }, DailyFactorSnapshot { @@ -23633,6 +23717,7 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }, DailyFactorSnapshot { @@ -23643,6 +23728,7 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::from([("amount".into(), 30_000_000.0)]), }, DailyFactorSnapshot { @@ -23653,6 +23739,7 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }, DailyFactorSnapshot { @@ -23663,6 +23750,7 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }, DailyFactorSnapshot { @@ -23673,6 +23761,7 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }, ], @@ -23915,6 +24004,7 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }, DailyFactorSnapshot { @@ -23925,6 +24015,7 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }, DailyFactorSnapshot { @@ -23935,6 +24026,7 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }, ], @@ -24085,6 +24177,7 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(2.0), effective_turnover_ratio: Some(2.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }], vec![CandidateEligibility { @@ -24185,6 +24278,7 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(2.0), effective_turnover_ratio: Some(2.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }], vec![CandidateEligibility { @@ -24287,6 +24381,7 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(2.0), effective_turnover_ratio: Some(2.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }], vec![CandidateEligibility { @@ -24390,6 +24485,7 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(2.0), effective_turnover_ratio: Some(2.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }], vec![CandidateEligibility { @@ -24490,6 +24586,7 @@ mod tests { pe_ttm: 10.0, turnover_ratio: Some(0.0), effective_turnover_ratio: Some(0.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }], vec![CandidateEligibility { @@ -24874,6 +24971,7 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(22.0), effective_turnover_ratio: Some(18.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }], vec![CandidateEligibility { @@ -25073,6 +25171,7 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(22.0), effective_turnover_ratio: Some(18.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::from([ ("custom_alpha".into(), 7.0), ("margin_all".into(), 1.0), @@ -25256,6 +25355,7 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(22.0), effective_turnover_ratio: Some(18.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }], vec![CandidateEligibility { @@ -25400,6 +25500,7 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(22.0), effective_turnover_ratio: Some(18.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }], vec![CandidateEligibility { @@ -25548,6 +25649,7 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }, DailyFactorSnapshot { @@ -25558,6 +25660,7 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }, ], @@ -25705,6 +25808,7 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }, DailyFactorSnapshot { @@ -25715,6 +25819,7 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }, ], @@ -25856,10 +25961,8 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), - extra_factors: BTreeMap::from([ - ("Mixed_Factor".into(), index as f64 + 5.0), - ("adjustment_factor_backward1".into(), 1.0), - ]), + adjustment_factor_backward1: Some(1.0), + extra_factors: BTreeMap::from([("Mixed_Factor".into(), index as f64 + 5.0)]), }) .collect::>(); let candidate_rows = dates @@ -26012,7 +26115,8 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), - extra_factors: BTreeMap::from([("adjustment_factor_backward1".into(), 1.0)]), + adjustment_factor_backward1: Some(1.0), + extra_factors: BTreeMap::new(), }) .collect::>(); let candidate_rows = dates @@ -26164,6 +26268,7 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }) .collect(), @@ -26300,6 +26405,7 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }) .collect(), @@ -26437,6 +26543,7 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }) .collect(), @@ -26595,6 +26702,7 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }) .collect(), @@ -26756,6 +26864,7 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }) .collect(), @@ -26913,6 +27022,7 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }) .collect(), @@ -27085,6 +27195,7 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }) .collect(), @@ -27240,6 +27351,7 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }) .collect(), @@ -27417,6 +27529,7 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }) }) @@ -27691,6 +27804,7 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }) }) @@ -27854,6 +27968,7 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }) .collect(), @@ -28000,6 +28115,7 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }) .collect(), @@ -28182,6 +28298,7 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }) .collect(), @@ -28375,7 +28492,8 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), - extra_factors: BTreeMap::from([("adjustment_factor_backward1".into(), 1.0)]), + adjustment_factor_backward1: Some(1.0), + extra_factors: BTreeMap::new(), }) .chain(symbols.iter().map(|symbol| DailyFactorSnapshot { date, @@ -28391,7 +28509,8 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), - extra_factors: BTreeMap::from([("adjustment_factor_backward1".into(), 1.0)]), + adjustment_factor_backward1: Some(1.0), + extra_factors: BTreeMap::new(), })) .collect(), symbols @@ -28641,6 +28760,7 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }) .collect(), @@ -28856,6 +28976,7 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }) .collect(), @@ -29051,7 +29172,8 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), - extra_factors: BTreeMap::from([("adjustment_factor_backward1".into(), 1.0)]), + adjustment_factor_backward1: Some(1.0), + extra_factors: BTreeMap::new(), }; let data = DataSet::from_components( vec![Instrument { @@ -29221,6 +29343,7 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }) .collect(), @@ -29400,6 +29523,7 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }) .collect(), @@ -29627,6 +29751,7 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }) .collect(), @@ -29859,6 +29984,7 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }) .collect(), @@ -30098,6 +30224,7 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }) .collect(), @@ -30311,6 +30438,7 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }) .collect(), @@ -30463,6 +30591,7 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }) .collect(), @@ -30626,6 +30755,7 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }) .collect(), @@ -30780,6 +30910,7 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }) .collect(), @@ -31068,6 +31199,7 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }) .collect(), @@ -31278,6 +31410,7 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }) .collect(), @@ -31484,6 +31617,7 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }) .collect(), @@ -31632,6 +31766,7 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }], vec![CandidateEligibility { @@ -31854,6 +31989,7 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }], vec![CandidateEligibility { @@ -31986,6 +32122,7 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }) .collect(), @@ -32126,6 +32263,7 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }) .collect(), @@ -32267,6 +32405,7 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }], vec![CandidateEligibility { @@ -32382,6 +32521,7 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(0.0), effective_turnover_ratio: Some(0.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }], vec![CandidateEligibility { @@ -32485,6 +32625,7 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }], vec![CandidateEligibility { @@ -32602,6 +32743,7 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }, DailyFactorSnapshot { @@ -32612,6 +32754,7 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }, DailyFactorSnapshot { @@ -32622,6 +32765,7 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }, DailyFactorSnapshot { @@ -32632,6 +32776,7 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }, ], @@ -32775,6 +32920,7 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }, DailyFactorSnapshot { @@ -32785,6 +32931,7 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }, DailyFactorSnapshot { @@ -32795,6 +32942,7 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }, DailyFactorSnapshot { @@ -32805,6 +32953,7 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }, ], @@ -32941,8 +33090,6 @@ mod tests { ]; let date = dates[5]; let symbol = "300001.SZ"; - let mut extra_factors = BTreeMap::new(); - extra_factors.insert("adjustment_factor_backward1".into(), 1.0); let data = DataSet::from_components( vec![Instrument { symbol: symbol.to_string(), @@ -32989,11 +33136,8 @@ mod tests { pe_ttm: 0.0, turnover_ratio: None, effective_turnover_ratio: None, - extra_factors: if factor_date == date { - extra_factors.clone() - } else { - BTreeMap::from([("adjustment_factor_backward1".into(), 1.0)]) - }, + adjustment_factor_backward1: Some(1.0), + extra_factors: BTreeMap::new(), }) .collect(), vec![CandidateEligibility { @@ -33145,8 +33289,8 @@ mod tests { pe_ttm: 0.0, turnover_ratio: None, effective_turnover_ratio: None, + adjustment_factor_backward1: Some(1.0), extra_factors: BTreeMap::from([ - ("adjustment_factor_backward1".into(), 1.0), ("ma5_current_back_adjusted_close".into(), current_close), ("avg_volume5_current".into(), current_volume), ]), @@ -33297,6 +33441,7 @@ mod tests { pe_ttm: 0.0, turnover_ratio: None, effective_turnover_ratio: None, + adjustment_factor_backward1: None, extra_factors: BTreeMap::from([("ma5_prev_close".into(), 10.0)]), }], vec![CandidateEligibility { @@ -33412,6 +33557,7 @@ mod tests { pe_ttm: 10.0, turnover_ratio: Some(1.2), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }], vec![CandidateEligibility { @@ -33540,6 +33686,7 @@ mod tests { pe_ttm: 10.0, turnover_ratio: Some(1.2), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }], vec![CandidateEligibility { @@ -33814,6 +33961,7 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }) .collect(), @@ -34444,6 +34592,7 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(22.0), effective_turnover_ratio: Some(18.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }], vec![CandidateEligibility { @@ -34588,6 +34737,7 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(22.0), effective_turnover_ratio: Some(18.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }], vec![CandidateEligibility { @@ -34722,6 +34872,7 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(22.0), effective_turnover_ratio: Some(18.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }], vec![CandidateEligibility { @@ -34868,6 +35019,7 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(22.0), effective_turnover_ratio: Some(18.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }], vec![CandidateEligibility { @@ -35010,6 +35162,7 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(22.0), effective_turnover_ratio: Some(18.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }], vec![CandidateEligibility { @@ -35139,6 +35292,7 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(22.0), effective_turnover_ratio: Some(18.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }], vec![CandidateEligibility { @@ -35263,6 +35417,7 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(22.0), effective_turnover_ratio: Some(18.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }], vec![CandidateEligibility { @@ -35382,6 +35537,7 @@ mod tests { pe_ttm: 8.0, turnover_ratio: Some(22.0), effective_turnover_ratio: Some(18.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }], vec![CandidateEligibility { @@ -35774,7 +35930,8 @@ let target_exposure = csi_ready ? dynamic_exposure : 0.0; pe_ttm: 8.0, turnover_ratio: Some(22.0), effective_turnover_ratio: Some(18.0), - extra_factors: BTreeMap::from([("adjustment_factor_backward1".into(), 1.0)]), + adjustment_factor_backward1: Some(1.0), + extra_factors: BTreeMap::new(), }) .collect(), dates @@ -35985,6 +36142,7 @@ let target_exposure = csi_ready ? dynamic_exposure : 0.0; pe_ttm: 8.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: if *symbol == "000002.SZ" { BTreeMap::new() } else { @@ -36155,6 +36313,7 @@ let target_exposure = csi_ready ? dynamic_exposure : 0.0; pe_ttm: 8.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }) .collect(), @@ -36395,6 +36554,7 @@ let target_exposure = csi_ready ? dynamic_exposure : 0.0; pe_ttm: 8.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::from([("reduce_signal".into(), 1.0)]), }], vec![CandidateEligibility { diff --git a/crates/fidc-core/src/portfolio.rs b/crates/fidc-core/src/portfolio.rs index e5a1659..8072324 100644 --- a/crates/fidc-core/src/portfolio.rs +++ b/crates/fidc-core/src/portfolio.rs @@ -1648,6 +1648,7 @@ mod tests { pe_ttm: 10.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }], vec![CandidateEligibility { @@ -1736,6 +1737,7 @@ mod tests { pe_ttm: 10.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }], vec![CandidateEligibility { diff --git a/crates/fidc-core/src/strategy.rs b/crates/fidc-core/src/strategy.rs index 74cb752..6744815 100644 --- a/crates/fidc-core/src/strategy.rs +++ b/crates/fidc-core/src/strategy.rs @@ -3154,6 +3154,7 @@ mod tests { pe_ttm: 12.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }) .collect::>(); diff --git a/crates/fidc-core/src/universe.rs b/crates/fidc-core/src/universe.rs index 8c6d959..13a0ed2 100644 --- a/crates/fidc-core/src/universe.rs +++ b/crates/fidc-core/src/universe.rs @@ -339,6 +339,7 @@ mod tests { pe_ttm: 10.0, turnover_ratio: Some(0.01), effective_turnover_ratio: Some(0.01), + adjustment_factor_backward1: None, extra_factors: Default::default(), } } diff --git a/crates/fidc-core/tests/corporate_actions.rs b/crates/fidc-core/tests/corporate_actions.rs index 88673a7..f72351d 100644 --- a/crates/fidc-core/tests/corporate_actions.rs +++ b/crates/fidc-core/tests/corporate_actions.rs @@ -144,6 +144,7 @@ fn stock_factor_snapshot(date: NaiveDate) -> DailyFactorSnapshot { pe_ttm: 10.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), } } @@ -270,6 +271,7 @@ fn engine_reinvests_dividend_receivable_in_round_lots() { pe_ttm: 10.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }, DailyFactorSnapshot { @@ -280,6 +282,7 @@ fn engine_reinvests_dividend_receivable_in_round_lots() { pe_ttm: 10.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }, DailyFactorSnapshot { @@ -290,6 +293,7 @@ fn engine_reinvests_dividend_receivable_in_round_lots() { pe_ttm: 10.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }, ], diff --git a/crates/fidc-core/tests/decision_quote_preload.rs b/crates/fidc-core/tests/decision_quote_preload.rs index 99b4ba6..fc06c99 100644 --- a/crates/fidc-core/tests/decision_quote_preload.rs +++ b/crates/fidc-core/tests/decision_quote_preload.rs @@ -122,6 +122,7 @@ fn single_day_quote_plan_data(date: NaiveDate) -> DataSet { pe_ttm: 10.0, turnover_ratio: None, effective_turnover_ratio: None, + adjustment_factor_backward1: None, extra_factors: Default::default(), }], vec![CandidateEligibility { @@ -310,6 +311,7 @@ fn engine_preloads_declared_decision_quotes_for_current_positions() { pe_ttm: 10.0, turnover_ratio: None, effective_turnover_ratio: None, + adjustment_factor_backward1: None, extra_factors: Default::default(), }, DailyFactorSnapshot { @@ -320,6 +322,7 @@ fn engine_preloads_declared_decision_quotes_for_current_positions() { pe_ttm: 10.0, turnover_ratio: None, effective_turnover_ratio: None, + adjustment_factor_backward1: None, extra_factors: Default::default(), }, ], @@ -478,6 +481,7 @@ fn engine_reuses_preloaded_decision_quotes_without_loader_call() { pe_ttm: 10.0, turnover_ratio: None, effective_turnover_ratio: None, + adjustment_factor_backward1: None, extra_factors: Default::default(), }, DailyFactorSnapshot { @@ -488,6 +492,7 @@ fn engine_reuses_preloaded_decision_quotes_without_loader_call() { pe_ttm: 10.0, turnover_ratio: None, effective_turnover_ratio: None, + adjustment_factor_backward1: None, extra_factors: Default::default(), }, ], @@ -711,6 +716,7 @@ fn engine_loads_distinct_decision_quote_times_on_same_day() { pe_ttm: 10.0, turnover_ratio: None, effective_turnover_ratio: None, + adjustment_factor_backward1: None, extra_factors: Default::default(), }, DailyFactorSnapshot { @@ -721,6 +727,7 @@ fn engine_loads_distinct_decision_quote_times_on_same_day() { pe_ttm: 10.0, turnover_ratio: None, effective_turnover_ratio: None, + adjustment_factor_backward1: None, extra_factors: Default::default(), }, ], diff --git a/crates/fidc-core/tests/delisting.rs b/crates/fidc-core/tests/delisting.rs index 07b513b..48e3f4c 100644 --- a/crates/fidc-core/tests/delisting.rs +++ b/crates/fidc-core/tests/delisting.rs @@ -170,6 +170,7 @@ fn engine_keeps_unresolved_delisted_position_without_fabricating_a_fill() { pe_ttm: 10.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }, DailyFactorSnapshot { @@ -180,6 +181,7 @@ fn engine_keeps_unresolved_delisted_position_without_fabricating_a_fill() { pe_ttm: 10.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }, DailyFactorSnapshot { @@ -190,6 +192,7 @@ fn engine_keeps_unresolved_delisted_position_without_fabricating_a_fill() { pe_ttm: 10.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }, DailyFactorSnapshot { @@ -200,6 +203,7 @@ fn engine_keeps_unresolved_delisted_position_without_fabricating_a_fill() { pe_ttm: 10.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }, ], @@ -436,6 +440,7 @@ fn engine_applies_successor_conversion_before_unresolved_delisting_audit() { pe_ttm: 10.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }, DailyFactorSnapshot { @@ -446,6 +451,7 @@ fn engine_applies_successor_conversion_before_unresolved_delisting_audit() { pe_ttm: 10.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }, DailyFactorSnapshot { @@ -456,6 +462,7 @@ fn engine_applies_successor_conversion_before_unresolved_delisting_audit() { pe_ttm: 10.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }, ], diff --git a/crates/fidc-core/tests/engine_hooks.rs b/crates/fidc-core/tests/engine_hooks.rs index 9afa360..49cb815 100644 --- a/crates/fidc-core/tests/engine_hooks.rs +++ b/crates/fidc-core/tests/engine_hooks.rs @@ -78,6 +78,7 @@ fn single_day_anchor_data(date: NaiveDate) -> DataSet { pe_ttm: 10.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }], vec![CandidateEligibility { @@ -144,6 +145,7 @@ fn factor_row( pe_ttm: 10.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors, } } @@ -1137,6 +1139,7 @@ fn engine_runs_strategy_hooks_in_daily_order() { pe_ttm: 10.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }, DailyFactorSnapshot { @@ -1147,6 +1150,7 @@ fn engine_runs_strategy_hooks_in_daily_order() { pe_ttm: 10.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }, ], @@ -1353,6 +1357,7 @@ fn engine_executes_open_auction_decisions_before_on_day() { pe_ttm: 10.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }], vec![CandidateEligibility { @@ -1453,6 +1458,7 @@ fn engine_executes_futures_order_intents_against_future_account() { pe_ttm: 10.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }], vec![CandidateEligibility { @@ -2168,6 +2174,7 @@ fn engine_runs_minute_hooks_and_executes_minute_orders() { pe_ttm: 10.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }], vec![CandidateEligibility { @@ -2463,6 +2470,7 @@ fn strategy_context_exposes_engine_native_data_helpers() { pe_ttm: 10.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }) .collect::>(); @@ -2631,6 +2639,7 @@ fn strategy_context_exposes_final_order_runtime_view() { pe_ttm: 10.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }], vec![CandidateEligibility { @@ -2874,6 +2883,7 @@ fn engine_applies_account_cash_flow_and_financing_intents() { pe_ttm: 10.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }, DailyFactorSnapshot { @@ -2884,6 +2894,7 @@ fn engine_applies_account_cash_flow_and_financing_intents() { pe_ttm: 10.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }, ], @@ -3069,6 +3080,7 @@ fn engine_expires_pending_day_limit_orders_at_market_close() { pe_ttm: 10.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }, DailyFactorSnapshot { @@ -3079,6 +3091,7 @@ fn engine_expires_pending_day_limit_orders_at_market_close() { pe_ttm: 10.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }, ], @@ -3266,6 +3279,7 @@ fn engine_runs_scheduled_rules_for_daily_weekly_and_monthly_triggers() { pe_ttm: 10.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }, DailyFactorSnapshot { @@ -3276,6 +3290,7 @@ fn engine_runs_scheduled_rules_for_daily_weekly_and_monthly_triggers() { pe_ttm: 10.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }, DailyFactorSnapshot { @@ -3286,6 +3301,7 @@ fn engine_runs_scheduled_rules_for_daily_weekly_and_monthly_triggers() { pe_ttm: 10.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }, ], @@ -3521,6 +3537,7 @@ fn engine_dispatches_process_events_to_external_bus_listeners() { pe_ttm: 10.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }, DailyFactorSnapshot { @@ -3531,6 +3548,7 @@ fn engine_dispatches_process_events_to_external_bus_listeners() { pe_ttm: 10.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }, DailyFactorSnapshot { @@ -3541,6 +3559,7 @@ fn engine_dispatches_process_events_to_external_bus_listeners() { pe_ttm: 10.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }, ], @@ -3886,6 +3905,7 @@ fn engine_applies_dynamic_universe_and_subscription_directives() { pe_ttm: 10.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }, DailyFactorSnapshot { @@ -3896,6 +3916,7 @@ fn engine_applies_dynamic_universe_and_subscription_directives() { pe_ttm: 12.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }, ] @@ -4040,6 +4061,7 @@ fn engine_exposes_current_process_context_to_strategies() { pe_ttm: 10.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }], vec![CandidateEligibility { diff --git a/crates/fidc-core/tests/explicit_order_flow.rs b/crates/fidc-core/tests/explicit_order_flow.rs index 6a76874..e97244e 100644 --- a/crates/fidc-core/tests/explicit_order_flow.rs +++ b/crates/fidc-core/tests/explicit_order_flow.rs @@ -50,6 +50,7 @@ fn order_value_rounding_data(date: NaiveDate, symbol: &str, price: f64) -> DataS pe_ttm: 15.0, turnover_ratio: Some(2.0), effective_turnover_ratio: Some(1.8), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }], vec![CandidateEligibility { @@ -119,6 +120,7 @@ fn intraday_liquidity_data(date: NaiveDate, symbol: &str) -> DataSet { pe_ttm: 15.0, turnover_ratio: Some(2.0), effective_turnover_ratio: Some(1.8), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }], vec![CandidateEligibility { @@ -272,6 +274,7 @@ fn single_symbol_limit_price_data( pe_ttm: 15.0, turnover_ratio: Some(2.0), effective_turnover_ratio: Some(1.8), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }], vec![CandidateEligibility { @@ -343,6 +346,7 @@ fn broker_executes_explicit_order_value_buy() { pe_ttm: 15.0, turnover_ratio: Some(2.0), effective_turnover_ratio: Some(1.8), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }], vec![CandidateEligibility { @@ -495,6 +499,7 @@ fn broker_delayed_limit_open_sell_uses_minute_price() { pe_ttm: 15.0, turnover_ratio: Some(2.0), effective_turnover_ratio: Some(1.8), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }], vec![CandidateEligibility { @@ -629,6 +634,7 @@ fn broker_executes_order_shares_and_order_lots() { pe_ttm: 15.0, turnover_ratio: Some(2.0), effective_turnover_ratio: Some(1.8), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }], vec![CandidateEligibility { @@ -757,6 +763,7 @@ fn broker_executes_target_shares_like_order_to() { pe_ttm: 15.0, turnover_ratio: Some(2.0), effective_turnover_ratio: Some(1.8), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }], vec![CandidateEligibility { @@ -904,6 +911,7 @@ fn broker_executes_target_portfolio_smart_with_custom_prices() { pe_ttm: 15.0, turnover_ratio: Some(2.0), effective_turnover_ratio: Some(1.8), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }, DailyFactorSnapshot { @@ -914,6 +922,7 @@ fn broker_executes_target_portfolio_smart_with_custom_prices() { pe_ttm: 14.0, turnover_ratio: Some(2.2), effective_turnover_ratio: Some(2.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }, ], @@ -1062,6 +1071,7 @@ fn broker_executes_target_portfolio_smart_with_algo_order_style() { pe_ttm: 14.0, turnover_ratio: Some(2.2), effective_turnover_ratio: Some(2.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }], vec![CandidateEligibility { @@ -1205,6 +1215,7 @@ fn broker_executes_order_percent_and_target_percent() { pe_ttm: 15.0, turnover_ratio: Some(2.0), effective_turnover_ratio: Some(1.8), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }], vec![CandidateEligibility { @@ -1329,6 +1340,7 @@ fn broker_uses_day_open_price_for_open_auction_matching() { pe_ttm: 15.0, turnover_ratio: Some(2.0), effective_turnover_ratio: Some(1.8), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }], vec![CandidateEligibility { @@ -1435,6 +1447,7 @@ fn broker_open_auction_uses_auction_volume_without_quote_liquidity() { pe_ttm: 15.0, turnover_ratio: Some(2.0), effective_turnover_ratio: Some(1.8), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }], vec![CandidateEligibility { @@ -1538,6 +1551,7 @@ fn broker_cancels_buy_when_open_hits_upper_limit() { pe_ttm: 15.0, turnover_ratio: Some(2.0), effective_turnover_ratio: Some(1.8), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }], vec![CandidateEligibility { @@ -1653,6 +1667,7 @@ fn broker_applies_price_ratio_slippage_on_snapshot_fills() { pe_ttm: 15.0, turnover_ratio: Some(2.0), effective_turnover_ratio: Some(1.8), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }], vec![CandidateEligibility { @@ -1755,6 +1770,7 @@ fn broker_applies_dynamic_slippage_on_snapshot_fills() { pe_ttm: 15.0, turnover_ratio: Some(2.0), effective_turnover_ratio: Some(1.8), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }], vec![CandidateEligibility { @@ -1862,6 +1878,7 @@ fn broker_applies_tick_size_slippage_on_intraday_last_fills() { pe_ttm: 15.0, turnover_ratio: Some(2.0), effective_turnover_ratio: Some(1.8), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }], vec![CandidateEligibility { @@ -1982,6 +1999,7 @@ fn broker_rejects_intraday_last_order_without_execution_quotes() { pe_ttm: 15.0, turnover_ratio: Some(2.0), effective_turnover_ratio: Some(1.8), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }], vec![CandidateEligibility { @@ -2091,6 +2109,7 @@ fn broker_executes_intraday_last_on_start_quote_with_trade_delta() { pe_ttm: 15.0, turnover_ratio: Some(2.0), effective_turnover_ratio: Some(1.8), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }], vec![CandidateEligibility { @@ -2209,6 +2228,7 @@ fn broker_cancels_market_order_remainder_when_intraday_quote_liquidity_exhausted pe_ttm: 15.0, turnover_ratio: Some(2.0), effective_turnover_ratio: Some(1.8), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }], vec![CandidateEligibility { @@ -2339,6 +2359,7 @@ fn broker_cancels_market_buy_when_minute_has_no_volume() { pe_ttm: 15.0, turnover_ratio: Some(2.0), effective_turnover_ratio: Some(1.8), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }], vec![CandidateEligibility { @@ -2445,6 +2466,7 @@ fn broker_splits_intraday_quote_fills_and_tracks_commission_by_order() { pe_ttm: 15.0, turnover_ratio: Some(2.0), effective_turnover_ratio: Some(1.8), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }], vec![CandidateEligibility { @@ -2616,6 +2638,7 @@ fn broker_aggregates_intraday_quote_fills_into_vwap_leg() { pe_ttm: 15.0, turnover_ratio: Some(2.0), effective_turnover_ratio: Some(1.8), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }], vec![CandidateEligibility { @@ -2771,6 +2794,7 @@ fn broker_executes_algo_vwap_value_with_time_window() { pe_ttm: 15.0, turnover_ratio: Some(2.0), effective_turnover_ratio: Some(1.8), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }], vec![CandidateEligibility { @@ -2931,6 +2955,7 @@ fn broker_executes_algo_twap_percent_across_window_quotes() { pe_ttm: 15.0, turnover_ratio: Some(2.0), effective_turnover_ratio: Some(1.8), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }], vec![CandidateEligibility { @@ -3093,6 +3118,7 @@ fn broker_uses_best_own_price_for_intraday_matching() { pe_ttm: 15.0, turnover_ratio: Some(2.0), effective_turnover_ratio: Some(1.8), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }], vec![CandidateEligibility { @@ -3210,6 +3236,7 @@ fn broker_uses_best_counterparty_price_for_intraday_matching() { pe_ttm: 15.0, turnover_ratio: Some(2.0), effective_turnover_ratio: Some(1.8), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }], vec![CandidateEligibility { @@ -3365,6 +3392,7 @@ fn rebalance_optimizer_skips_unfunded_buy_when_existing_position_cannot_sell() { pe_ttm: 15.0, turnover_ratio: Some(2.0), effective_turnover_ratio: Some(1.8), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }, DailyFactorSnapshot { @@ -3375,6 +3403,7 @@ fn rebalance_optimizer_skips_unfunded_buy_when_existing_position_cannot_sell() { pe_ttm: 18.0, turnover_ratio: Some(2.0), effective_turnover_ratio: Some(1.8), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }, ], @@ -3558,6 +3587,7 @@ fn rebalance_uses_day_open_for_open_auction_valuation() { pe_ttm: 10.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }, DailyFactorSnapshot { @@ -3568,6 +3598,7 @@ fn rebalance_uses_day_open_for_open_auction_valuation() { pe_ttm: 10.0, turnover_ratio: Some(1.0), effective_turnover_ratio: Some(1.0), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }, ], @@ -3744,6 +3775,7 @@ fn rebalance_optimizer_prioritizes_higher_target_weight_when_cash_is_tight() { pe_ttm: 15.0, turnover_ratio: Some(2.0), effective_turnover_ratio: Some(1.8), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }, DailyFactorSnapshot { @@ -3754,6 +3786,7 @@ fn rebalance_optimizer_prioritizes_higher_target_weight_when_cash_is_tight() { pe_ttm: 18.0, turnover_ratio: Some(2.0), effective_turnover_ratio: Some(1.8), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }, ], @@ -3926,6 +3959,7 @@ fn rebalance_optimizer_does_not_scale_targets_above_requested_weight() { pe_ttm: 15.0, turnover_ratio: Some(2.0), effective_turnover_ratio: Some(1.8), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }, DailyFactorSnapshot { @@ -3936,6 +3970,7 @@ fn rebalance_optimizer_does_not_scale_targets_above_requested_weight() { pe_ttm: 18.0, turnover_ratio: Some(2.0), effective_turnover_ratio: Some(1.8), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }, ], @@ -4062,6 +4097,7 @@ fn broker_uses_board_specific_min_quantity_and_step_size_for_buy_sizing() { pe_ttm: 20.0, turnover_ratio: Some(2.0), effective_turnover_ratio: Some(1.8), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }], vec![CandidateEligibility { @@ -4166,6 +4202,7 @@ fn broker_allows_bjse_quantities_above_minimum_without_round_lot_step() { pe_ttm: 20.0, turnover_ratio: Some(2.0), effective_turnover_ratio: Some(1.8), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }], vec![CandidateEligibility { @@ -4272,6 +4309,7 @@ fn broker_allows_full_odd_lot_sell_when_liquidating_position() { pe_ttm: 15.0, turnover_ratio: Some(2.0), effective_turnover_ratio: Some(1.8), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }], vec![CandidateEligibility { @@ -4386,6 +4424,7 @@ fn same_day_sell_then_rebuy_is_rejected_by_default() { pe_ttm: 15.0, turnover_ratio: Some(2.0), effective_turnover_ratio: Some(1.8), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }) .collect::>(); @@ -4526,6 +4565,7 @@ fn same_day_sell_then_rebuy_can_be_allowed_by_policy() { pe_ttm: 15.0, turnover_ratio: Some(2.0), effective_turnover_ratio: Some(1.8), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }) .collect::>(); @@ -4778,6 +4818,7 @@ fn two_day_limit_order_data(day1_open: f64, day2_open: f64) -> DataSet { pe_ttm: 15.0, turnover_ratio: Some(2.0), effective_turnover_ratio: Some(1.8), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }, DailyFactorSnapshot { @@ -4788,6 +4829,7 @@ fn two_day_limit_order_data(day1_open: f64, day2_open: f64) -> DataSet { pe_ttm: 15.0, turnover_ratio: Some(2.0), effective_turnover_ratio: Some(1.8), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }, ], @@ -6104,6 +6146,7 @@ fn broker_reserves_sellable_quantity_for_open_limit_sells() { pe_ttm: 15.0, turnover_ratio: Some(2.0), effective_turnover_ratio: Some(1.8), + adjustment_factor_backward1: None, extra_factors: BTreeMap::new(), }], vec![CandidateEligibility { diff --git a/crates/fidc-core/tests/strategy_selection.rs b/crates/fidc-core/tests/strategy_selection.rs index 72a0c2c..29b61cc 100644 --- a/crates/fidc-core/tests/strategy_selection.rs +++ b/crates/fidc-core/tests/strategy_selection.rs @@ -72,6 +72,7 @@ fn factor( pe_ttm: 18.0, turnover_ratio: None, effective_turnover_ratio: None, + adjustment_factor_backward1: None, extra_factors: Default::default(), } }