Files
ggx/config/backtest.yml
T
simon fce725e13c 初始提交:高股息策略研究与回测系统
从 Point-in-Time 股票筛选到统一 Web 前端的完整链路:
筛选 → 画像 → 策略 → 回测 → Walk-forward → 绩效分析 → 报告/前端。

架构
- 数据层与策略层分离;策略代码不写 SQL,只经 data/repo.py 取数
- 所有业务阈值集中在 config/*.yml,代码零硬编码(字段写错直接报错)
- 报告只做「run_id → SQL → 渲染」,不做任何计算,数字可追溯
- 前后端分离:output/ 静态站点 + hdiv web 提供的 REST API

数据安全
- 只增不删:SQL 钩子拦截 DELETE/DROP/TRUNCATE,并有源码扫描测试守护
- qlib 原有表只读,本项目数据写入 hd_ 前缀表
- 回补使用 INSERT IGNORE,保证既有行零改动
- .env 存密钥且已 gitignore;output/、logs/、.venv/ 不入库

交付物
- 30 张 hd_* 表、7 个 YAML 配置、283 项自动化测试
- 统一 Web 前端(hash 路由 SPA)+ nginx 部署配置与 launchd 托管脚本

如实声明的限制
- 策略缺少稳定的样本外超额收益(Walk-forward 7 窗口均值 -0.95%,
  基准 +2.29%);其价值体现在回撤控制,而非超额收益
- 涨跌停/停牌约束仅覆盖 2019 年起;index_weight 尚未填充
- AI Agent 层(plan.md 第四版 P8)未实现

详见 docs/user-guide.md 与 docs/implementation-status.md。
2026-10-03 13:54:56 +08:00

98 lines
3.8 KiB
YAML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# ============================================================
# 回测配置(★ 可直接修改)
# 对应 plan.md §22–§27(Walk-forward / 过拟合控制)与 §29–§31
# ============================================================
version: 1
capital:
initial: 1000000 # 元
currency: CNY
period:
# P0b 已完成 2015-2018 行情回补,行情/每日指标均覆盖 2015-01-05 起,
# 因此按 plan.md §22「历史数据 10 年」的要求使用完整窗口。
start: 2015-01-01
end: latest
# ------------------------------------------------------------
# 调度:多久评估一次信号、多久重建一次股票池
# ------------------------------------------------------------
schedule:
# 信号评估频率(月):1 = 每月末评估一次买卖信号
signal_frequency_months: 1
# 股票池重建频率(月):高股息池成员(大市值/长上市/连续分红)非常稳定,
# 每年重建一次即可;调小更严格但显著更慢。
universe_refresh_months: 12
# 信号与成交的时间关系由 fill.price 决定(next_open = 次日开盘成交)
# ------------------------------------------------------------
# 分位阈值口径
# ------------------------------------------------------------
percentile_reference:
# rolling —— 用截至评估日的滚动窗口分布(PIT 自适应,单次回测默认)
# frozen —— 冻结训练窗口分布(walk-forward 测试段必须用这个,plan.md §25)
mode: rolling
# rolling 模式下的回看年数
lookback_years: 5
# ------------------------------------------------------------
# Walk-forward(plan.md §23/§24/§25)
# ------------------------------------------------------------
walk_forward:
enabled: true
# rolling —— 固定长度训练窗(plan.md §23 的示例)
# expanding —— 训练窗递增
scheme: rolling
train_years: 5 # plan.md §43: Training = 5~8 年
test_years: 1 # plan.md §43: Test = 1~2 年
step_months: 12 # 窗口步进
min_train_years: 5
# 测试期禁止重新调参:引擎层硬约束,train 段产出的参数对象冻结后传入
freeze_params_in_test: true
# ------------------------------------------------------------
# 分红处理(plan.md §30/§31)
# ------------------------------------------------------------
dividend:
# reinvest —— 现金分红按规则再投资(plan.md §31 模式 B)
# hold —— 现金留存不再投资
# cash_out —— 分红移出组合
cash_mode: reinvest
reinvest_rule: same_stock_next_open
apply_dividend_tax: true
# 是否处理送股/转增/配股(plan.md §30)
handle_stock_dividend: true
handle_rights_issue: true
# ------------------------------------------------------------
# 基准(plan.md §28.4)
# ------------------------------------------------------------
benchmark:
- { code: 000300.SH, name: 沪深300 }
- { code: 000922.CSI, name: 中证红利 }
- { code: 000001.SH, name: 上证指数 }
# 无风险利率(年化),用于 Sharpe / Sortino
risk_free_rate: 0.02
# ------------------------------------------------------------
# 成交撮合
# ------------------------------------------------------------
fill:
# next_open —— 信号次日开盘成交(默认,最贴近实盘)
# next_close / same_close
price: next_open
partial_fill: false
# 单笔成交不超过当日成交量的比例(流动性约束)
max_volume_pct: 0.05
# 涨跌停处理:skip(跳过当日)/ defer(顺延到下一可成交日)
limit_up_down_rule: skip
suspended_rule: defer
# ------------------------------------------------------------
# 可复现性(plan.md §47 原则 6)
# ------------------------------------------------------------
reproducibility:
record_code_version: true
record_data_version: true
seed: 42