初始提交:高股息策略研究与回测系统

从 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。
This commit is contained in:
2026-10-03 13:54:56 +08:00
commit fce725e13c
127 changed files with 28001 additions and 0 deletions
+97
View File
@@ -0,0 +1,97 @@
# ============================================================
# 回测配置(★ 可直接修改)
# 对应 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