Improve jq microcap execution semantics

This commit is contained in:
boris
2026-04-18 18:02:50 +08:00
parent 9f4165e689
commit 0e2c25e4c4
26 changed files with 5058 additions and 362 deletions

View File

@@ -1,5 +1,8 @@
use chrono::NaiveDate;
use fidc_core::{CnSmallCapRotationConfig, CnSmallCapRotationStrategy, DataSet, Strategy, StrategyContext, PortfolioState};
use fidc_core::{
CnSmallCapRotationConfig, CnSmallCapRotationStrategy, DataSet, JqMicroCapConfig,
JqMicroCapStrategy, PortfolioState, Strategy, StrategyContext,
};
use std::path::PathBuf;
#[test]
@@ -28,9 +31,51 @@ fn strategy_emits_target_weights_and_diagnostics() {
assert!(decision.rebalance);
assert!(decision.rebalance);
assert!(!decision.diagnostics.is_empty());
assert!(decision
.diagnostics
.iter()
.any(|line| line.contains("signal_symbol=")));
assert!(
decision
.diagnostics
.iter()
.any(|line| line.contains("signal_symbol="))
);
assert_eq!(strategy.name(), "cn-dyn-smallcap-band");
}
#[test]
fn jq_strategy_emits_same_day_decision() {
let data_dir = PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("../../data/demo");
let data = DataSet::from_csv_dir(&data_dir).expect("demo data");
let execution_date = NaiveDate::from_ymd_opt(2024, 1, 10).unwrap();
let portfolio = PortfolioState::new(1_000_000.0);
let mut cfg = JqMicroCapConfig::jq_microcap();
cfg.benchmark_signal_symbol = "000001.SZ".to_string();
cfg.benchmark_short_ma_days = 3;
cfg.benchmark_long_ma_days = 5;
cfg.stock_short_ma_days = 3;
cfg.stock_mid_ma_days = 4;
cfg.stock_long_ma_days = 5;
let mut strategy = JqMicroCapStrategy::new(cfg);
let decision = strategy
.on_day(&StrategyContext {
execution_date,
decision_date: execution_date,
decision_index: 0,
data: &data,
portfolio: &portfolio,
})
.expect("jq decision");
assert!(!decision.rebalance);
assert!(
decision
.diagnostics
.iter()
.any(|line| line.contains("jq_microcap signal="))
);
assert!(
decision
.diagnostics
.iter()
.any(|line| line.contains("selected="))
);
}