从 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。
98 lines
3.8 KiB
YAML
98 lines
3.8 KiB
YAML
# ============================================================
|
||
# 回测配置(★ 可直接修改)
|
||
# 对应 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
|