初始提交:高股息策略研究与回测系统
从 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:
@@ -0,0 +1,86 @@
|
||||
# ============================================================
|
||||
# 数据源配置
|
||||
# 约定:本文件不含任何密钥;密钥经 *_env 字段引用根目录 .env
|
||||
# 与 ~/project/qlib 共用同一 MariaDB 与 Tushare 账号。
|
||||
# ============================================================
|
||||
version: 1
|
||||
|
||||
database:
|
||||
host: 127.0.0.1
|
||||
port: 3306
|
||||
db: qlib
|
||||
user: qlib
|
||||
password_env: MYSQL_PASSWORD
|
||||
charset: utf8mb4
|
||||
pool_size: 8
|
||||
pool_recycle_sec: 3600
|
||||
|
||||
# ---- 只读表白名单(qlib 既有表)----
|
||||
# db.py 会在 SQLAlchemy 事件层拦截对这些表的 INSERT/UPDATE/DELETE。
|
||||
# 例外:index_weight 是空表,P0a 需要填充成分股权重(纯新增),
|
||||
# 见 allow_write_tables。stock_daily/daily_basic/adjust_factor 的历史回补
|
||||
# 由 P0b 专用通道处理,需显式开启 allow_backfill。
|
||||
read_only_tables:
|
||||
- stock
|
||||
- stock_daily
|
||||
- adjust_factor
|
||||
- daily_basic
|
||||
- financial_indicator
|
||||
- stock_name_history
|
||||
- trading_calendar
|
||||
|
||||
# 允许写入的 qlib 既有表(仅新增行,禁止 UPDATE/DELETE)
|
||||
allow_write_tables:
|
||||
- index_weight
|
||||
|
||||
# 历史回补专用允许列表(P0b 使用;默认关闭)
|
||||
# 注意:回补通道使用 INSERT IGNORE,**绝不覆盖既有行**,
|
||||
# 因此对 qlib 现有数据是纯追加,可安全用于 2015-2018 区间补齐。
|
||||
backfill_tables:
|
||||
- stock_daily
|
||||
- adjust_factor
|
||||
- daily_basic
|
||||
allow_backfill: false
|
||||
|
||||
# ---- 本项目自有表前缀 ----
|
||||
# ddl.py 拒绝创建非该前缀的表;写操作拒绝指向非该前缀的表
|
||||
own_prefix: hd_
|
||||
# qlib 的 alembic 版本链禁止被本项目触碰
|
||||
forbidden_tables:
|
||||
- alembic_version
|
||||
|
||||
forbid_delete: true
|
||||
|
||||
tushare:
|
||||
api_url: http://api.tushare.pro
|
||||
token_env: TUSHARE_TOKEN
|
||||
# 限频是**按接口**计算的(实测:dividend 为 200 次/分钟,
|
||||
# 超过会返回「抱歉,您访问接口(dividend)频率超限(200次/分钟)」并中断任务)。
|
||||
# 因此这里为每个接口单独配置,取值留安全余量。
|
||||
rate_limit_default: 380
|
||||
rate_limits:
|
||||
dividend: 180 # 实测上限 200/min
|
||||
fina_indicator: 180
|
||||
cashflow: 180
|
||||
balancesheet: 180
|
||||
income: 180
|
||||
index_weight: 180
|
||||
suspend_d: 180
|
||||
stk_limit: 180
|
||||
daily: 480
|
||||
adj_factor: 480
|
||||
daily_basic: 480
|
||||
index_daily: 180
|
||||
retry: 4
|
||||
retry_backoff_sec: 2
|
||||
timeout_sec: 60
|
||||
# 单次请求最大等待(长任务)
|
||||
max_retry_backoff_sec: 30
|
||||
# 命中限频时强制等待的秒数(Tushare 为滑动 60 秒窗口)
|
||||
rate_limit_cooldown_sec: 62
|
||||
|
||||
paths:
|
||||
output_dir: output
|
||||
templates_dir: templates
|
||||
assets_dir: assets
|
||||
log_dir: logs
|
||||
Reference in New Issue
Block a user