3b033fd29465d044856d38effa916f3e4936b313
问题: - platform expr 选股从 eligible_universe_on 开始 - eligible_universe_on 无条件过滤新股 - 导致即使 strategy_spec.universe.exclude 不含 new_listing,仍会过滤新股 修复: - StrategyRuntimeSpec 补 universe_exclude 字段 - platform expr 选股从 factor/candidate/market 合并开始 - 按 strategy_spec.universe.exclude 自己决定是否排除 new_listing - 补回归测试 相关: - 保持旧策略默认排除不变 - 新策略可以显式不排除新股
fidc-backtest-engine
面向中国 A 股和期货策略的 Rust 回测核心。仓库目标是提供平台自有的策略 DSL、执行模型、撮合模型和结果分析能力,最终由 fidc-backtest-service 对外提供策略运行服务。
当前能力
- 日频、分钟、tick 级策略生命周期与确定性回放。
- A 股行情、估值、因子、基准、候选资格、涨跌停触达、停牌和 ST 标记。
- 平台策略 DSL 与
StrategyContext数据 API,不暴露非平台脚本语法。 BacktestConfig支持起止日期、初始资金、决策滞后、执行价格字段、基准代码。DailyMarketSnapshot支持open/close/last/day_open/prev_close/upper_limit/lower_limit。- Universe 选择器支持动态市值带、排序、Top-N、动态订阅和策略内更新。
- A 股规则钩子支持 T+1、停牌、涨停不可买、跌停不可卖、整手和最小下单量。
- Broker 支持目标权重、显式金额、目标股数、限价、VWAP/TWAP、挂单、撤单和订单查询。
- 期货账户支持多空持仓、开平仓、今昨仓、保证金、手续费、结算和到期处理。
- 报告输出支持权益曲线、成交、持仓、月度收益、风险指标、基准序列和 JSON 分析包。
- 内置
OmniMicroCapStrategy,覆盖动态市值带、均线过滤、止损止盈、固定频率再平衡和盘中执行近似。
Workspace 布局
.
├── Cargo.toml
├── crates
│ ├── bt-demo
│ └── fidc-core
│ └── src
│ ├── broker.rs
│ ├── calendar.rs
│ ├── cost.rs
│ ├── data.rs
│ ├── engine.rs
│ ├── futures.rs
│ ├── platform_expr_strategy.rs
│ ├── portfolio.rs
│ ├── rules.rs
│ ├── scheduler.rs
│ ├── strategy.rs
│ └── strategy_ai.rs
├── data/demo
└── docs
核心模块
calendar: 交易日历、交易日滚动和调度日期工具。instrument: 证券和合约静态定义。data: 行情、因子、基准、候选资格、公司行为、盘口和期货交易参数数据模型。universe: 动态市值带和预排序候选集。portfolio: 股票账户现金、持仓、可卖数量、盈亏、分红应收和资金流水。futures: 期货账户、合约参数、保证金、手续费和多空持仓。rules: 中国市场交易规则和风控校验。broker: 股票撮合、订单簿、滑点、成交量约束、限价和显式订单执行。scheduler: 日、周、月、分钟、tick 调度规则。platform_expr_strategy: 平台 DSL 解析后的表达式策略执行模型。strategy: 策略 trait、内置策略和运行时视图。strategy_ai: 策略 AI 手册、提示词生成和数据库字段目录合并。engine: 回测主循环、事件发布、报告和指标汇总。
平台策略模型
策略代码不直接运行 Python 或非平台 API,而是被解析为平台自有的策略 spec。执行链路是:
- 页面编辑平台 DSL。
- spec 生成器解析变量、函数、选股、排序、风控、资金分配和显式订单。
- 回测引擎按交易日和调度事件构造
StrategyContext。 - 策略返回
StrategyDecision或显式订单动作。 - Broker、规则钩子和账户模型完成撮合、费用、持仓和权益更新。
- Analyzer 输出标准化结果供服务和前端展示。
平台 DSL 支持:
strategy("name") { ... }策略入口。let自定义参数和fn自定义函数。when / unless / else条件块。selection.market_cap_band(...)动态市值带。filter.stock_expr(...)任意指标、因子和组合选股。ordering.rank_by(...)与ordering.rank_expr(...)排序。allocation.buy_scale(...)动态买入资金比例。risk.stop_loss(...)、risk.take_profit(...)多条件止盈止损。order.*、cancel.*、update_universe(...)、subscribe(...)显式交易动作。
任意数据库指标和自定义因子通过 factor("field")、factor_value("field", lookback)、rolling_mean("field", n)、sma("close", n) 等函数读取。未预计算的均线窗口可在回测中按已有历史数据实时计算。
内置微盘策略
OmniMicroCapStrategy 是平台内置的微盘轮动策略,用于 demo、性能验证和策略迁移基线:
- 使用
benchmark_signal_symbol的同日决策价格计算指数信号。 - 按
(index_level - base_index_level) * xs + base_cap_floor计算动态市值带。 - 在预排序 eligible universe 中按市值区间截取候选。
- 过滤停牌、ST、退市、科创板、一元股、涨停、跌停和不可买卖标记。
- 使用个股短中长均线过滤。
- 支持止损、止盈、定期再平衡和替补买入。
- 默认按 10:18 附近的平台调度快照近似盘中决策,并使用
last_price或配置的盘口价格执行。
运行方式
默认运行仓库 demo 数据:
cargo run --bin bt-demo
运行平台内置微盘策略:
FIDC_BT_STRATEGY=omni-microcap \
FIDC_BT_SIGNAL_SYMBOL=000001.SH \
cargo run --release --bin bt-demo
接入真实分区 snapshot 目录:
FIDC_BT_DATA_LAYOUT=partitioned \
FIDC_BT_DATA_DIR=/path/to/snapshots \
FIDC_BT_SIGNAL_SYMBOL=000001.SH \
cargo run --bin bt-demo
约定目录结构:
snapshots/
├── instruments.csv
├── benchmark/YYYY/MM/*.csv
├── market/YYYY/MM/*.csv
├── factors/YYYY/MM/*.csv
└── candidates/YYYY/MM/*.csv
运行后默认生成:
output/demo/equity_curve.csvoutput/demo/trades.csvoutput/demo/holdings_summary.csv
测试与构建
cargo fmt
cargo test
cargo build
Description
China A-share long-term backtest engine core, referencing nautilus_trader architecture and rqalpha market rules.
Languages
Rust
100%