SHA256
13 KiB
13 KiB
TODO
本文件用于跟踪 ashare-data 项目的已知问题与后续工作。维护时请保持「问题描述 + 影响范围 + 处理思路」三段式,便于他人接手。
🗓️ 2026-05-15 二轮清理:上一轮(也是 2026-05-15)清理后剩下的 P2 中,可独立完成的 #4/#5/#7/#8 已落地(详见底部 变更日志)。 当前剩余条目均为:①需要用户决策的高风险动作(P0),②依赖外部数据源调研(P2-北交所),③需要与主项目协调的可选合并(P2-财务结构化、P2-gzl 接入)。
📚 本文件分两部分:上半部分是已知缺陷/技术债(P0/P2),下半部分是新功能路线图(Roadmap)。前者修,后者建。
🔴 P0 — 需用户授权的高风险动作
1. 清理 git 历史中的明文密码 ⚠️ 高风险
- 现状:
config.yaml现已在.gitignore中(仓库根.gitignore第 2 行),但历史 commite2c3b41/feef7b6/217b12c中曾以明文形式提交过:任何能访问本仓库的人都能通过password: "ttx2011" host: "db.freeicu.top" port: 32000git show e2c3b41:config.yaml取到这段凭据。 - 影响:数据库密码事实上已经泄露;如仓库已 push 到远端(包括 fork/克隆),轮换密码是唯一彻底方案。
- 处理思路(需用户确认后才能执行):
- 立即在 MySQL 侧轮换
root@db.freeicu.top:32000的密码; - (可选)用
git filter-repo --path config.yaml --invert-paths或 BFG Repo-Cleaner 重写历史:git filter-repo --path config.yaml --invert-paths git push --force --all # ⚠️ 破坏所有协作者的本地副本,需团队周知 git push --force --tags - 让所有协作者重新克隆仓库(旧 clone 的 reflog 仍含明文)。
- 如已公开过(GitHub/GitLab),还需手动让对应平台清理缓存(GitHub 联系 support@github.com,或新建仓库迁移)。
- 立即在 MySQL 侧轮换
- ❗ 这一步会改写所有 commit 哈希,等同于强制变基整个历史,必须由仓库所有者亲自决定并在低峰期执行。请回复后再操作。
🟢 P2 — 长期工程 & 调研
2. 北交所(920xxx)数据支持
- 现状:BaoStock、新浪、腾讯、东方财富的 K 线接口均不支持北交所;当前在
daily.py / sector.py / stock_list.py中显式跳过920xxx。 - 处理思路:调研同花顺 / 雪球 / Wind Quant 等接口;若可,新增独立 fetcher 并合并到主流程。预计需要新增一张
bj_daily表或在stock_daily中加 market 列。
3. 财务数据「JSON 存 TEXT」结构化拆分
- 现状:
stock_financial_income/balance/cashflow仅有code/report_date/data(JSON)三列,下游查询需JSON_EXTRACT,难做索引。 - 处理思路:根据下游真实查询场景(量化筛选 vs 财报展示),把高频指标(ROE、净利润、资产负债率、经营性现金流等)拆出独立列;保留
extra_json兜底。需配套写数据迁移脚本。
4. 并发度压测:跑出实测数据
- 现状:
benchmarks/bench_daily.py已就绪,可一键跑workers=1/2/4/8对照(详见benchmarks/README.md)。 - 下一步:在低峰期跑一次完整压测,把推荐档位写到
config.example.yaml注释里。脚本已自带 speedup 表输出,无需再写采集代码。
6. gzl/ 选股脚本接入主项目
- 现状:
gzl/Selector.py+gzl/select_stock.py读本地 CSV(不读 MySQL),与src/完全解耦,依赖scipy。README 已说明其独立性。 - 处理思路:
- 评估是否纳入主项目 — 如果只是个人玩具脚本可保持现状;
- 若纳入,迁移到
src/strategies/、改读 MySQL、复用get_session()/batch_upsert()/get_logger(); scipy加入pyproject.toml的 optional[strategies]extras。
🚀 新功能路线图 (Roadmap)
这一节是「想做但还没排期」的需求池,与上面的 P0/P2(已知缺陷/技术债)分开维护。 立项时把对应条目挪到 P1/P2,附上责任人和预计动手时间;落地后再移到 变更日志。
⭐ 推荐下一迭代(按"价值高 / 成本可控 / 与现有架构契合"排序)
- 抓取调度 + 告警(详见下方「四、调度与监控」#1+#2)— 让项目从工具变服务,半天工作量
- HTTP API 服务(「三、服务化」#1)— FastAPI 暴露查询接口,半到一天
- 资金面三件套:龙虎榜 / 北向资金 / 融资融券(「一、数据维度扩展」前 3 条)— 接口现成、量小,2-3 天补齐情绪+资金维度
一、数据维度扩展
「价值」= 对量化/选股的直接增益,「成本」= 实现规模 + 外部依赖复杂度。
| # | 需求 | 价值 | 成本 | 关键说明 |
|---|---|---|---|---|
| 1 | 龙虎榜 | 高 | 中 | 东财/同花顺接口稳定;游资/机构席位是短线核心信号 |
| 2 | 北向资金(陆股通)持股明细 | 高 | 低 | 港交所/东财 T+1 披露;新增 hk_holdings 表 |
| 3 | 融资融券余额 | 高 | 低 | 流动性/情绪指标,东财/交易所每日发布 |
| 4 | 业绩预告 / 快报 | 高 | 中 | 早于正式财报,常含异常波动信息;BaoStock 无,需走东财/同花顺 |
| 5 | 限售解禁日历 | 中 | 低 | 解禁前后股价波动显著;东财日历接口 |
| 6 | 股东户数 | 中 | 低 | 季频,反映筹码集中度;BaoStock query_stock_other_basic_info |
| 7 | 十大流通股东 | 中 | 中 | 季频跟踪机构持仓;BaoStock 有现成接口 |
| 8 | 大宗交易 | 中 | 中 | 折溢价 + 营业部,事件驱动 |
| 9 | ST 标记历史 | 中 | 中 | 当前无连续 ST 状态记录,无法回测「摘帽行情」 |
| 10 | IPO / 定增 / 可转债日历 | 中 | 中 | 一级市场事件 |
| 11 | ETF 行情 + 折溢价 | 中 | 中 | 套利策略基础数据 |
| 12 | 股指期货 IF/IH/IC/IM | 中 | 中 | 对冲/基差研究 |
| 13 | 期权行情(50/300/500ETF) | 中 | 高 | 波动率研究 |
| 14 | L1 Tick 行情 | 高 | 极高 | 数据量爆炸(GB/日),需切 ClickHouse / Parquet |
| 15 | 公司公告全文 | 高 | 高 | 需 PDF/HTML 解析 + 全文检索(ES) |
| 16 | 研报 / 一致预期 | 高 | 高 | 多家券商接口闭源,合规风险 |
| 17 | 北交所(920xxx) | 中 | 中 | 已在上方 P2-#2 单列 |
二、数据加工层(让"数据"变"信号")
| # | 需求 | 价值 | 关键说明 |
|---|---|---|---|
| 1 | 后复权日线 + 周/月线聚合表 | 高 | 现仅有前复权;后复权用于长期收益对比 |
| 2 | 技术指标预计算(MA/MACD/RSI/BOLL/KDJ) | 中 | 一次算多次用 |
| 3 | 因子库(动量/反转/价值/质量/规模/波动率) | 高 | 量化必备;每日预计算入 factor_daily 宽表 |
| 4 | 数据质量校验日报 | 高 | 每日跑:股票数、缺口、异常涨跌幅、停牌识别;失败发告警 |
| 5 | 多源交叉校验 | 中 | BaoStock vs 新浪同日 close 偏差 >1% 自动报警 |
三、服务化(让数据被消费)
| # | 需求 | 价值 | 关键说明 |
|---|---|---|---|
| 1 | HTTP API 服务(FastAPI) | 高 | 暴露 /daily /financial /sector 等 REST;前端/其他系统可直接消费 |
| 2 | Python SDK 包装 | 中 | from ashare import get_daily,屏蔽 SQL |
| 3 | Parquet / Feather 导出 | 中 | 量化研究跑数据更快;增量导出到本地或 S3/OSS |
| 4 | Kafka / ClickHouse 同步 | 中 | 接入下游量化平台时再考虑 |
| 5 | CLI 查询子命令 | 低 | ashare query --code 600000 --metric pe-ttm |
四、调度与监控(手动 → 自动)
| # | 需求 | 价值 | 关键说明 |
|---|---|---|---|
| 1 | 抓取任务调度(APScheduler 或 cron + systemd) | 高 | 当前依赖手动 python -m src.main --daily;自动化后无人值守 |
| 2 | 失败告警(企微/钉钉/邮件 webhook) | 高 | 配合 #1;失败/延迟超阈值即推送 |
| 3 | Prometheus metrics 导出 | 中 | 各 fetcher 耗时/成功率/失败码;接 Grafana |
| 4 | 数据完整性 dashboard(Grafana / Superset) | 中 | 直观看股票覆盖、缺口、最新数据日期 |
五、选股 / 策略(承接 gzl)
| # | 需求 | 价值 | 关键说明 |
|---|---|---|---|
| 1 | gzl 接入主项目 | 中 | P2-#6 已列;改读 MySQL,统一日志/连接池 |
| 2 | 策略插件框架 | 高 | src/strategies/ 下每策略一文件,统一 run(date) -> List[Signal] 接口 |
| 3 | 简单回测引擎 | 高 | 基于已有日线表,单策略 N 年回测,输出收益/最大回撤/胜率 |
| 4 | 选股信号定时输出 | 中 | 每日盘后跑所有策略,结果入 signal_daily 表或推送 |
| 5 | 事件驱动信号库 | 中 | 涨停回封、放量突破、底背离、机构席位上榜 |
六、工程基础(质量护栏)
| # | 需求 | 价值 | 关键说明 |
|---|---|---|---|
| 1 | GitHub Actions CI | 高 | 自动跑 pytest,PR 必须绿;成本极低 |
| 2 | Alembic 数据库迁移 | 中 | 替代 db.py 中手写的 DROP TABLE+create_all,版本可控 |
| 3 | Docker + docker-compose | 中 | 自带 MySQL,新机器一行命令起;适合给协作者 |
| 4 | 类型注解全量 + mypy strict | 中 | 现部分函数已有;走全量后 IDE/重构体验显著提升 |
| 5 | ruff / pre-commit hook | 低 | 统一格式;低争议低成本 |
| 6 | PostgreSQL / SQLite 后端兼容 | 中 | 现 batch_upsert 写死 MySQL 方言;抽象后可本地 SQLite 跑端到端测试 |
| 7 | Web 控制台(Streamlit) | 低 | 简单看板:抓取状态、最新日期、表行数;非必需 |
📋 维护节奏建议
- 每次新增 fetcher,请同步更新 README 的:「功能概览表 / 运行示例 / 命令行参数说明 / 数据库表结构 / 项目结构」 五个章节。
- 每次发现可复现 bug,先把现象写进本文件,再开始改代码,避免漏修。
- 新增代码请用
from src.log import get_logger,不要再写print(..., flush=True)。 - 完成的条目移到下方 变更日志,附完成日期,便于回顾。
- 路线图条目立项时:从 Roadmap 挪到 P1/P2,附责任人 + 预计动手时间;落地后再移到变更日志。
变更日志
2026-05-15(第二轮)
- ✅ P2-#5 print → logger 全面替换:
src/baostock_conn.py、src/db.py、src/main.py与全部 9 个 fetcher 中的 72 处print(..., flush=True)已切到from src.log import get_logger,按语义选 INFO/WARNING/ERROR;BaoStock 查询签名打 DEBUG,避免控制台被刷屏 - ✅ P2-#7 扩展测试覆盖:测试用例从 19 → 43。新增
test_log.py(5 例:命名空间、handler 幂等、不冒泡、env 控制 level、未知 level 回退)test_daily_source_codes.py(8 例:sina/tencent/eastmoney 代码前缀映射)test_daily_sources_http.py(8 例:腾讯/东财 HTTP JSON 解析,含空字段、异常包装、北交所短路)
- ✅ P2-#8 sector 三种 only 模式合并保护:
test_sector_merge.py(3 例:region_only 保留 industry / industry_only 保留 region / concept_only 不触碰 stock_sector) - ✅ P2-#4 并发压测脚本骨架:
benchmarks/bench_daily.py+benchmarks/README.md,可一键跑workers=1,2,4,8对照,输出 speedup 表;剩下的就是用户在低峰期跑一次实测
2026-05-15(第一轮)
- ✅
src/main.py新增--market-daily参数,挂载fetch_market_daily(market_daily 只读 stock_daily,无需 BaoStock 登录) - ✅
src/fetchers/market_daily.py修复fetch_history→_fetch_history笔误 - ✅
src/fetchers/sector.py清理第 225 行起的重复 import + 旧版函数残留 - ✅
src/db.py顶部 docstring 修正market_breadth→market_daily,并补全 index_daily / stock_concept / 分钟K线分表 - ✅
requirements.txt增加baostock;pyproject.toml同步并新增[dev]extras - ✅
config.yaml历史明文密码问题:已在 README 加显眼 ⚠️ 安全提示;具体 git 历史清理与密码轮换升级为 P0-1 由用户决策 - ✅ 引入
src/log.py统一 logging(控制台 +logs/ashare.log按日滚动 7 天保留,ASHARE_LOG_LEVEL可调) - ✅ 建立
tests/框架:4 个测试文件、19 个 pytest 用例全部通过(覆盖code_to_bs、_fill_derived_fields、_recent_quarters、_is_20pct) - ✅
pyproject.toml添加[tool.pytest.ini_options],pytest可一键运行 - ✅
config.example.yaml补全workers字段与多源说明 - ✅ README 增加「运行测试」「选股子项目 gzl/」两节,"设计说明" 加 logging 条