补齐回测风控统一印花税字段
This commit is contained in:
@@ -87,6 +87,8 @@ pub struct StrategyExecutionSpec {
|
|||||||
alias = "minCommission"
|
alias = "minCommission"
|
||||||
)]
|
)]
|
||||||
pub minimum_commission: Option<f64>,
|
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")]
|
#[serde(default, alias = "stamp_tax_rate_before_change")]
|
||||||
pub stamp_tax_rate_before_change: Option<f64>,
|
pub stamp_tax_rate_before_change: Option<f64>,
|
||||||
#[serde(default, alias = "stamp_tax_rate_after_change")]
|
#[serde(default, alias = "stamp_tax_rate_after_change")]
|
||||||
@@ -153,6 +155,8 @@ pub struct StrategyEngineConfig {
|
|||||||
alias = "minCommission"
|
alias = "minCommission"
|
||||||
)]
|
)]
|
||||||
pub minimum_commission: Option<f64>,
|
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")]
|
#[serde(default, alias = "stamp_tax_rate_before_change")]
|
||||||
pub stamp_tax_rate_before_change: Option<f64>,
|
pub stamp_tax_rate_before_change: Option<f64>,
|
||||||
#[serde(default, alias = "stamp_tax_rate_after_change")]
|
#[serde(default, alias = "stamp_tax_rate_after_change")]
|
||||||
@@ -255,6 +259,8 @@ pub struct StrategyRiskPolicySpec {
|
|||||||
alias = "minCommission"
|
alias = "minCommission"
|
||||||
)]
|
)]
|
||||||
pub minimum_commission: Option<f64>,
|
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")]
|
#[serde(default, alias = "stamp_tax_rate_before_change")]
|
||||||
pub stamp_tax_rate_before_change: Option<f64>,
|
pub stamp_tax_rate_before_change: Option<f64>,
|
||||||
#[serde(default, alias = "stamp_tax_rate_after_change")]
|
#[serde(default, alias = "stamp_tax_rate_after_change")]
|
||||||
@@ -312,6 +318,7 @@ const RISK_POLICY_VALUE_ALIAS_GROUPS: &[(&str, &[&str])] = &[
|
|||||||
"minimumCommission",
|
"minimumCommission",
|
||||||
&["minimum_commission", "min_commission", "minCommission"],
|
&["minimum_commission", "min_commission", "minCommission"],
|
||||||
),
|
),
|
||||||
|
("stampTaxRate", &["stamp_tax_rate"]),
|
||||||
(
|
(
|
||||||
"stampTaxRateBeforeChange",
|
"stampTaxRateBeforeChange",
|
||||||
&["stamp_tax_rate_before_change"],
|
&["stamp_tax_rate_before_change"],
|
||||||
@@ -725,6 +732,7 @@ fn apply_cost_overrides(
|
|||||||
cfg: &mut PlatformExprStrategyConfig,
|
cfg: &mut PlatformExprStrategyConfig,
|
||||||
commission_rate: Option<f64>,
|
commission_rate: Option<f64>,
|
||||||
minimum_commission: Option<f64>,
|
minimum_commission: Option<f64>,
|
||||||
|
stamp_tax_rate: Option<f64>,
|
||||||
stamp_tax_rate_before_change: Option<f64>,
|
stamp_tax_rate_before_change: Option<f64>,
|
||||||
stamp_tax_rate_after_change: Option<f64>,
|
stamp_tax_rate_after_change: Option<f64>,
|
||||||
stamp_tax_change_date: Option<&str>,
|
stamp_tax_change_date: Option<&str>,
|
||||||
@@ -737,6 +745,16 @@ fn apply_cost_overrides(
|
|||||||
cfg.minimum_commission = Some(value);
|
cfg.minimum_commission = Some(value);
|
||||||
cfg.risk_config.trading_constraints.minimum_commission = 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) {
|
if let Some(value) = valid_non_negative(stamp_tax_rate_before_change) {
|
||||||
cfg.stamp_tax_rate_before_change = Some(value);
|
cfg.stamp_tax_rate_before_change = Some(value);
|
||||||
cfg.risk_config
|
cfg.risk_config
|
||||||
@@ -879,6 +897,7 @@ fn apply_risk_policy_overrides(
|
|||||||
cfg,
|
cfg,
|
||||||
policy.commission_rate,
|
policy.commission_rate,
|
||||||
policy.minimum_commission,
|
policy.minimum_commission,
|
||||||
|
policy.stamp_tax_rate,
|
||||||
policy.stamp_tax_rate_before_change,
|
policy.stamp_tax_rate_before_change,
|
||||||
policy.stamp_tax_rate_after_change,
|
policy.stamp_tax_rate_after_change,
|
||||||
policy.stamp_tax_change_date.as_deref(),
|
policy.stamp_tax_change_date.as_deref(),
|
||||||
@@ -1221,6 +1240,7 @@ pub fn platform_expr_config_from_spec(
|
|||||||
&mut cfg,
|
&mut cfg,
|
||||||
engine.commission_rate,
|
engine.commission_rate,
|
||||||
engine.minimum_commission,
|
engine.minimum_commission,
|
||||||
|
engine.stamp_tax_rate,
|
||||||
engine.stamp_tax_rate_before_change,
|
engine.stamp_tax_rate_before_change,
|
||||||
engine.stamp_tax_rate_after_change,
|
engine.stamp_tax_rate_after_change,
|
||||||
engine.stamp_tax_change_date.as_deref(),
|
engine.stamp_tax_change_date.as_deref(),
|
||||||
@@ -1630,6 +1650,7 @@ pub fn platform_expr_config_from_spec(
|
|||||||
&mut cfg,
|
&mut cfg,
|
||||||
execution.commission_rate,
|
execution.commission_rate,
|
||||||
execution.minimum_commission,
|
execution.minimum_commission,
|
||||||
|
execution.stamp_tax_rate,
|
||||||
execution.stamp_tax_rate_before_change,
|
execution.stamp_tax_rate_before_change,
|
||||||
execution.stamp_tax_rate_after_change,
|
execution.stamp_tax_rate_after_change,
|
||||||
execution.stamp_tax_change_date.as_deref(),
|
execution.stamp_tax_change_date.as_deref(),
|
||||||
@@ -2231,6 +2252,7 @@ mod tests {
|
|||||||
"liquidityLimitEnabled": true,
|
"liquidityLimitEnabled": true,
|
||||||
"commissionRate": 0.0003,
|
"commissionRate": 0.0003,
|
||||||
"minimumCommission": 5.0,
|
"minimumCommission": 5.0,
|
||||||
|
"stampTaxRate": 0.0007,
|
||||||
"stampTaxChangeDate": "20240103"
|
"stampTaxChangeDate": "20240103"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -2240,7 +2262,8 @@ mod tests {
|
|||||||
"rejectLowerLimitSelection": true,
|
"rejectLowerLimitSelection": true,
|
||||||
"rejectUpperLimitBuy": true,
|
"rejectUpperLimitBuy": true,
|
||||||
"rejectLowerLimitSell": 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.volume_limit_enabled);
|
||||||
assert!(cfg.risk_config.trading_constraints.liquidity_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!((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!(
|
assert_eq!(
|
||||||
cfg.risk_config.trading_constraints.stamp_tax_change_date,
|
cfg.risk_config.trading_constraints.stamp_tax_change_date,
|
||||||
NaiveDate::from_ymd_opt(2024, 1, 3).unwrap()
|
NaiveDate::from_ymd_opt(2024, 1, 3).unwrap()
|
||||||
|
|||||||
Reference in New Issue
Block a user