test: enforce causal historical slippage and reject missing calibration

This commit is contained in:
boris
2026-09-11 11:42:21 +08:00
parent 98199c02a2
commit 1fc8a3a9e6
3 changed files with 128 additions and 35 deletions
+19 -16
View File
@@ -1740,8 +1740,9 @@ fn broker_applies_price_ratio_slippage_on_snapshot_fills() {
}
#[test]
fn broker_applies_dynamic_slippage_on_snapshot_fills() {
fn broker_applies_explicit_historical_slippage_on_snapshot_fills() {
let date = NaiveDate::from_ymd_opt(2024, 1, 10).unwrap();
let previous_date = NaiveDate::from_ymd_opt(2024, 1, 9).unwrap();
let data = DataSet::from_components(
vec![Instrument {
symbol: "000002.SZ".to_string(),
@@ -1752,20 +1753,20 @@ fn broker_applies_dynamic_slippage_on_snapshot_fills() {
delisted_at: None,
status: "active".to_string(),
}],
vec![DailyMarketSnapshot {
date,
[previous_date, date].into_iter().map(|day| DailyMarketSnapshot {
date: day,
symbol: "000002.SZ".to_string(),
timestamp: Some("2024-01-10 10:18:00".to_string()),
timestamp: Some(format!("{day} 15:00:00")),
day_open: 10.0,
open: 10.0,
high: 10.1,
low: 9.9,
close: 10.0,
high: if day == previous_date { 10.1 } else { 10.9 },
low: if day == previous_date { 9.9 } else { 9.1 },
close: if day == previous_date { 10.0 } else { 10.8 },
last_price: 10.0,
bid1: 9.99,
ask1: 10.01,
prev_close: 10.0,
volume: 100_000,
volume: if day == previous_date { 100_000 } else { 2_000_000 },
minute_volume: 100_000,
bid1_volume: 80_000,
ask1_volume: 80_000,
@@ -1774,7 +1775,7 @@ fn broker_applies_dynamic_slippage_on_snapshot_fills() {
upper_limit: 11.0,
lower_limit: 9.0,
price_tick: 0.01,
}],
}).collect(),
vec![DailyFactorSnapshot {
date,
symbol: "000002.SZ".to_string(),
@@ -1786,8 +1787,8 @@ fn broker_applies_dynamic_slippage_on_snapshot_fills() {
adjustment_factor_backward1: None,
extra_factors: BTreeMap::new(),
}],
vec![CandidateEligibility {
date,
[previous_date, date].into_iter().map(|day| CandidateEligibility {
date: day,
symbol: "000002.SZ".to_string(),
is_st: false,
is_star_st: false,
@@ -1798,15 +1799,15 @@ fn broker_applies_dynamic_slippage_on_snapshot_fills() {
is_kcb: false,
is_one_yuan: false,
risk_level_code: None,
}],
vec![BenchmarkSnapshot {
date,
}).collect(),
[previous_date, date].into_iter().map(|day| BenchmarkSnapshot {
date: day,
benchmark: "000300.SH".to_string(),
open: 100.0,
close: 100.0,
prev_close: 99.0,
volume: 1_000_000,
}],
}).collect(),
)
.expect("dataset");
let mut portfolio = PortfolioState::new(1_000_000.0);
@@ -1815,7 +1816,9 @@ fn broker_applies_dynamic_slippage_on_snapshot_fills() {
ChinaEquityRuleHooks::default(),
PriceField::Open,
)
.with_slippage_model(SlippageModel::Dynamic(DynamicSlippageConfig::new(
.with_volume_limit(false)
.with_liquidity_limit(false)
.with_slippage_model(SlippageModel::HistoricalVolumeVolatility(DynamicSlippageConfig::new(
0.5, 0.3, 0.1,
)));