Files
ggx/config/datasource.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

87 lines
2.6 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.
# ============================================================
# 数据源配置
# 约定:本文件不含任何密钥;密钥经 *_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