# ============================================================ # 数据源配置 # 约定:本文件不含任何密钥;密钥经 *_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/adj_factor/daily_basic:**不要设成 480**。 # 2026-10-04 回补 2005-2014 时实测:以约 196 次/分钟跑 `daily`, # 300 次调用后即被 Tushare 拒绝(此 token 的实际上限 ≤ 200/min)。 # 一旦触发限频,客户端要冷却 62 秒再重试 —— 逐日回补 2,400+ 天时, # 这种「撞墙再等」远比「按额度平滑配速」慢,而且有耗尽 4 次重试的风险。 daily: 170 adj_factor: 170 daily_basic: 170 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 # ------------------------------------------------------------ # 行情同步的「完整性」判定(决定断点续传是否重拉整段历史) # # 一个交易日被视为已完整同步,要求: # 当日股票数 >= max(min_symbols_floor, min_symbols_ratio × 当年应有上市股票数) # # 早年市场小得多(2005 年约 1,350 只、2010 年约 1,700 只、2024 年约 5,400 只), # 用单一绝对阈值会把 2005-2009 的每一天都判成「未完成」——回补一旦中断就得 # 从第一天重来。所以改为「按当年规模成比例」判定。 # ------------------------------------------------------------ sync: # 绝对下限:低于它一定判为不完整(防止比例判定在极早年失效) min_symbols_floor: 200 # 相对下限:占「当年应有上市股票数」的比例 min_symbols_ratio: 0.6