Skip to content

feat: blocks 命令 — 本地板块文件同步(行业/概念/指数/地区) - #40

Merged
xbfighting merged 3 commits into
masterfrom
feat-issue-39-blocks
Jul 7, 2026
Merged

feat: blocks 命令 — 本地板块文件同步(行业/概念/指数/地区)#40
xbfighting merged 3 commits into
masterfrom
feat-issue-39-blocks

Conversation

@xbfighting

Copy link
Copy Markdown
Owner

Summary

tdx2db sync 自动同步板块-个股关系入库,替代"通达信手工导出 CSV → 导入"流程;板块新鲜度与行情同节奏。

Related Issue

Closes #39

What Changed

  • blocks.py 新模块,四条数据链(均为本地文件,无新依赖):
    • 概念/指数/风格 ← infoharbor_block.dat(文本 GBK;截断名经 880 码还原 tdxzs 官方全名)
    • 行业 ← tdxhy.cfg X 码 × tdxzs3.cfg 类别 12(881 研究行业,一/二/三级各一行)
    • 跨市场指数成分 ← spblock.dat(中证500/1000/2000/A500、国证2000、深证成指等,infoharbor 空板块自动补齐;独有板块归"特殊")
    • 地区 ← base.dbf DY 字段(struct 手工解析 DBF,仅取 GPDM/DY)× tdxzs.cfg 类别 3
  • block_stock_relation:+block_type 列,唯一约束 (block_type, block_name, code),全量替换式快照(板块关系无历史语义);迁移脚本附
  • CLI:blocks 子命令(--csv-only/--db-only)+ sync 第 3 步自动执行;status 纳入统计
  • 文件缺失逐链降级 WARNING,不阻塞行情同步

Why This Approach

  • 本地文件而非在线协议:守"本地文件唯一数据源"契约;这些文件由盘后下载自动更新,新鲜度与 .day 一致
  • 全量替换而非增量:板块成分调整由文件直接体现,快照语义最简且天然自愈
  • 唯一约束含 block_type:同名板块跨体系真实存在(880302 与 881002 都叫"煤炭开采")

Done Criteria Mapping(vs issue #39

  • blocks 独立可用 + sync 自动执行
  • 表结构 + 唯一约束 + 全量替换
  • 行业多级:000001 实测 银行/全国性银行/股份制银行 三行
  • CSV 比对:行业 127/127、地区 32/32、概念 269/270(差 1 个为官方全名变体"碳纤维概念",block_code 可对齐)、指数 73 命中 + 9 个小众主题无本地源(Out of Scope 已列)
  • fixture 单测 7 个(合成 GBK 文本 + 手工构造 DBF)
  • status 纳入
  • README/AGENTS/skill/CLAUDE 四处文档
  • 缺文件降级测试

How to Test

  1. pytest(62 passed)
  2. 真实数据:tdx2db --tdx-path <TDX> --db-type sqlite --db-name t blocks --db-only → 实测入库 136,143 条(行业 467 / 概念 270 / 指数 115 / 地区 32 / 风格 157 / 特殊 23 个板块)
  3. tdx2db status 应显示 block_stock_relation 行数

Risks / Tradeoffs

  • 全量替换在写入中途失败会留下空表——下次 sync 自愈;板块表非关键路径可接受
  • infoharbor/spblock 为新版通达信格式,旧版客户端可能仍是二进制 block_*.dat(会触发降级 WARNING),等真实用户反馈再决定是否兼容旧格式

🤖 Generated with Claude Code

xbfighting and others added 3 commits July 7, 2026 17:02
- 新模块 blocks.py:四条数据链解析(infoharbor_block.dat 概念/指数/风格、
  tdxhy×tdxzs3 类别12 行业多级、spblock.dat 跨市场指数补充、base.dbf DY×tdxzs 地区)
- infoharbor 截断板块名经 880 码还原 tdxzs 官方全名;空板块由 spblock
  同名成分补齐(中证500/1000 等);spblock 独有板块归为"特殊"
- block_stock_relation 表:新增 block_type,唯一约束改 (block_type,
  block_name, code)(880 码可空 + 同名跨体系);全量替换式快照写入
- cli:blocks 子命令 + sync 末尾自动执行;status 纳入板块表统计
- 迁移脚本 scripts/migrate_block_relation.sql(原表无写入路径,直接重建)
- 测试 +7:四链解析逐字段断言(合成 GBK/DBF fixture)+ 快照替换语义 + 缺文件降级
- 真实数据验证:136,143 条入库;与导出 CSV 比对行业 127/127、地区 32/32、
  概念 269/270(1 个为 tdxzs 官方全名变体)、指数 73+9 小众缺失(无本地源)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- DELETE + INSERT 同一 engine.begin() 事务,任一批次失败不再留下
  空表/半新半旧快照
- 新增回滚测试:坏数据写入失败后旧快照行数不变

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@xbfighting
xbfighting merged commit 72d0112 into master Jul 7, 2026
5 checks passed
@xbfighting
xbfighting deleted the feat-issue-39-blocks branch July 7, 2026 09:13
xbfighting added a commit that referenced this pull request Jul 7, 2026
新增 blocks 板块同步(#39/#40/#41)、Windows CI + 二进制 fixture(#34)、
定位文档与消费端复权指南(#36)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

blocks 命令:本地板块文件同步(行业/概念/指数/地区)

1 participant