补齐回测风控统一印花税字段

This commit is contained in:
boris
2026-07-04 14:36:24 +08:00
parent 14810708f0
commit 8fa4ab24fb
+38 -1
View File
@@ -87,6 +87,8 @@ pub struct StrategyExecutionSpec {
alias = "minCommission"
)]
pub minimum_commission: Option<f64>,
#[serde(default, alias = "stamp_tax_rate")]
pub stamp_tax_rate: Option<f64>,
#[serde(default, alias = "stamp_tax_rate_before_change")]
pub stamp_tax_rate_before_change: Option<f64>,
#[serde(default, alias = "stamp_tax_rate_after_change")]
@@ -153,6 +155,8 @@ pub struct StrategyEngineConfig {
alias = "minCommission"
)]
pub minimum_commission: Option<f64>,
#[serde(default, alias = "stamp_tax_rate")]
pub stamp_tax_rate: Option<f64>,
#[serde(default, alias = "stamp_tax_rate_before_change")]
pub stamp_tax_rate_before_change: Option<f64>,
#[serde(default, alias = "stamp_tax_rate_after_change")]
@@ -255,6 +259,8 @@ pub struct StrategyRiskPolicySpec {
alias = "minCommission"
)]
pub minimum_commission: Option<f64>,
#[serde(default, alias = "stamp_tax_rate")]
pub stamp_tax_rate: Option<f64>,
#[serde(default, alias = "stamp_tax_rate_before_change")]
pub stamp_tax_rate_before_change: Option<f64>,
#[serde(default, alias = "stamp_tax_rate_after_change")]
@@ -312,6 +318,7 @@ const RISK_POLICY_VALUE_ALIAS_GROUPS: &[(&str, &[&str])] = &[
"minimumCommission",
&["minimum_commission", "min_commission", "minCommission"],
),
("stampTaxRate", &["stamp_tax_rate"]),
(
"stampTaxRateBeforeChange",
&["stamp_tax_rate_before_change"],
@@ -725,6 +732,7 @@ fn apply_cost_overrides(
cfg: &mut PlatformExprStrategyConfig,
commission_rate: Option<f64>,
minimum_commission: Option<f64>,
stamp_tax_rate: Option<f64>,
stamp_tax_rate_before_change: Option<f64>,
stamp_tax_rate_after_change: Option<f64>,
stamp_tax_change_date: Option<&str>,
@@ -737,6 +745,16 @@ fn apply_cost_overrides(
cfg.minimum_commission = Some(value);
cfg.risk_config.trading_constraints.minimum_commission = value;
}
if let Some(value) = valid_non_negative(stamp_tax_rate) {
cfg.stamp_tax_rate_before_change = Some(value);
cfg.stamp_tax_rate_after_change = Some(value);
cfg.risk_config
.trading_constraints
.stamp_tax_rate_before_change = value;
cfg.risk_config
.trading_constraints
.stamp_tax_rate_after_change = value;
}
if let Some(value) = valid_non_negative(stamp_tax_rate_before_change) {
cfg.stamp_tax_rate_before_change = Some(value);
cfg.risk_config
@@ -879,6 +897,7 @@ fn apply_risk_policy_overrides(
cfg,
policy.commission_rate,
policy.minimum_commission,
policy.stamp_tax_rate,
policy.stamp_tax_rate_before_change,
policy.stamp_tax_rate_after_change,
policy.stamp_tax_change_date.as_deref(),
@@ -1221,6 +1240,7 @@ pub fn platform_expr_config_from_spec(
&mut cfg,
engine.commission_rate,
engine.minimum_commission,
engine.stamp_tax_rate,
engine.stamp_tax_rate_before_change,
engine.stamp_tax_rate_after_change,
engine.stamp_tax_change_date.as_deref(),
@@ -1630,6 +1650,7 @@ pub fn platform_expr_config_from_spec(
&mut cfg,
execution.commission_rate,
execution.minimum_commission,
execution.stamp_tax_rate,
execution.stamp_tax_rate_before_change,
execution.stamp_tax_rate_after_change,
execution.stamp_tax_change_date.as_deref(),
@@ -2231,6 +2252,7 @@ mod tests {
"liquidityLimitEnabled": true,
"commissionRate": 0.0003,
"minimumCommission": 5.0,
"stampTaxRate": 0.0007,
"stampTaxChangeDate": "20240103"
}
},
@@ -2240,7 +2262,8 @@ mod tests {
"rejectLowerLimitSelection": true,
"rejectUpperLimitBuy": true,
"rejectLowerLimitSell": true,
"volumePercent": 25
"volumePercent": 25,
"stampTaxRateAfterChange": 0.0004
}
}
});
@@ -2265,6 +2288,20 @@ mod tests {
assert!(cfg.risk_config.trading_constraints.volume_limit_enabled);
assert!(cfg.risk_config.trading_constraints.liquidity_limit_enabled);
assert!((cfg.risk_config.trading_constraints.volume_percent - 0.25).abs() < 1e-12);
assert_eq!(
cfg.risk_config
.trading_constraints
.stamp_tax_rate_before_change,
0.0007
);
assert_eq!(
cfg.risk_config
.trading_constraints
.stamp_tax_rate_after_change,
0.0004
);
assert_eq!(cfg.stamp_tax_rate_before_change, Some(0.0007));
assert_eq!(cfg.stamp_tax_rate_after_change, Some(0.0004));
assert_eq!(
cfg.risk_config.trading_constraints.stamp_tax_change_date,
NaiveDate::from_ymd_opt(2024, 1, 3).unwrap()