Rockyzsu/stock / 工作台地图
七段流水线与 21 个目录:这套代码是按什么顺序串起来的
把 Rockyzsu/stock 当成一堆散装脚本是最容易迷路的方式。事实上它有一条清晰的流水线:采集 → 落库 → 分析与选股 → 监控 → 推送 → 交易执行 → 记录与复盘。21 个顶层目录几乎都能挂到这七段上。
本文按固定提交 9478dee528cc 逐个目录点算:仓库共 242 个 tree 条目(217 个文件 + 25 个目录),其中 152 个 Python 脚本、49 个 Jupyter Notebook。同时把五个落库点(MySQL、MongoDB、Redis、Elasticsearch、SQLite)在流水线上的位置标出来——因为在多数脚本里,「取到数据」和「写进哪张表」是两件事。
七段流水线
把这套代码串起来看:七段流水线各自负责什么
| 段 | 这段解决什么 | 主要目录 | 真实代码入口 | 当前状态 |
|---|---|---|---|---|
| ① 数据采集 | 从十余个站点取行情、公告、基金、汇率、行业数据 | datahub/(28 个 .py) | jisilu.py、ninwen.py、jucao_announcement.py、dfcf_hot_block.py、foreignexchange.py | 依赖登录态;部分可跑 |
| ② 落库 | 把采集结果写进数据库、搜索库或内存缓存 | 各脚本内嵌,无独立目录 | MySQL(pymysql/sqlalchemy)、MongoDB(pymongo/motor)、Redis(redis)、Elasticsearch(elasticsearch)、SQLite(sqlite3) | 需自建四类服务 |
| ③ 分析与选股 | 按因子筛股、算指标、识别 K 线形态、基金分析 | analysis/(10 .py + 39 .ipynb)、k-line/(4 .py)、fund/(45 .py)、根目录 25 个脚本 | select_stock.py、StockAnalyze.py、recognize_form.py、k_line.py | 1 个脚本导入期报错 |
| ④ 监控 | 轮询行情或转债,命中阈值就告警 | monitor/(9 个 .py,README 未提及) | jsl_monitor.py、realtime_monitor_ts.py、big_deal.py、ceiling_break.py | 配置键缺失,导入即 KeyError |
| ⑤ 推送 | 邮件、企业微信、Server 酱、短信 | 无独立目录,工具函数集中在 configure/util.py | notify()、send_message_via_wechat()、send_from_aliyun_ssl()、send_sms() | 需自备账号与密钥 |
| ⑥ 交易执行 | 券商客户端下单、PTrade 桥接、富途行情 | trader/(2)、ptrade/(1 个空文件)、futu/(5) | trader/auto_trader.py、monitor/server_api.py、futu/basic_usage.py | 缺凭证 / 目录为空 / 无下单代码 |
| ⑦ 记录与复盘 | 持仓、交割单、每日盈亏、选股跟踪 | utils/(3)、根目录脚本、daily/(2 个 Notebook) | utils/delivery_order.py、recordMyChoice.py、statistices.py | 依赖券商导出文件与本地 CSV |
这张表本身就是「README 与代码不一致」的解药。README 的目录清单停留在一个更早的、扁平的结构;而流水线的真实分层是「采集集中、落库内嵌、监控独立、交易分散」。想改某个环节时,先在这张表里找到它归属哪一段,再去对应目录。
目录职责
21 个目录逐个说明:它在流水线上管哪一段
| 目录 | .py 数 | 段落 | 职责 | 注意点 |
|---|---|---|---|---|
fund/ | 45 | ③ 分析与选股 | LOF/ETF 场内份额监控、ARK ETF 持仓、天天基金、雪球私募与蛋卷基金 | 以爬虫为主,站点改版即失效 |
datahub/ | 28 | ① 采集 | 集思录可转债、宁稳网、巨潮公告、东财涨停池、同花顺行业、汇率、股吧新闻 | 登录态与验证码是主要卡点 |
| 根目录脚本 | 25 | ③⑦ mixed | 选股、K 线、龙虎榜、质押、股吧新闻、模拟仓记录 | 裸脚本,靠 toolkit.py 与全局配置耦合 |
analysis/ | 10(+39 ipynb) | ③ 分析与选股 | 次新涨停强度、股票诊断、IPO 速度与指数相关性、封单金额 | 以 Notebook 为主,依赖作者本地中间表 |
monitor/ | 9 | ④ 监控 | 可转债监控、自选池实时监控、大单、封板、爬虫存活监控、Redis 推送接口 | README 完全未提及此目录 |
common/ | 7 | 通用 | Tushare 封装、服务基类、AES 加解密、PDF 转文本 | AES 与 PDF 依赖未列入依赖清单 |
backtest/ | 5 | ③ 回测 | backtrader 入门示例、DataFrame Feed、均线回测 | 数据路径硬编码为作者本机绝对路径 |
futu/ | 5 | ⑥ 交易 | 富途 OpenAPI 行情订阅、实时价、逐笔、取消订阅的基础用法 | 只有行情,没有下单代码 |
k-line/ | 4 | ③ 分析与选股 | talib 形态识别(如两只乌鸦)、K 线绘图、目标搜索 | talib 需要本地 C 库 |
utils/ | 3 | ⑦ 记录 | 交割单入库(按券商分表)、盈亏对比、价格提醒 | 交割单 CSV 编码为 GBK |
configure/ | 2 | 通用 | sample_config.json 模板、settings.py 配置读取与 DBSelector | 导入期即读 config.json |
hk_stock/ | 2 | ① 采集 | 港股打新数据(aastocks、lianghuaipo) | 需 selenium 与浏览器驱动 |
trader/ | 2 | ⑥ 交易 | easytrader 自动下单(国金 / 同花顺客户端) | 缺 config.py 与 user.json |
ptrade/ | 1 | ⑥ 交易 | README 称「自动交易实盘代码」 | 实际是 0 字节 __init__.py |
machine_learning/ | 1 | ③ 分析与选股 | README 称「机器学习预测」 | 整个目录只有 1 个文件 |
market/ | 1 | ① 采集 | 上交所开户数与指数关系 | 写入 MongoDB |
common/ 之外的工具 | — | 通用 | toolkit.py(根目录):读 data.cfg、读股票列表 | 凭证文件被 gitignore |
daily/ | 0(2 ipynb) | ⑦ 记录 | 复盘 Notebook | 含被提交的 .ipynb_checkpoints 残留 |
juejin/ | 0(1 ipynb) | ① 采集 | 掘金平台取数 Notebook | 无对应脚本 |
data/ | 0(1 txt) | — | 临时数据文件 | 被 .gitignore 忽略却仍有文件在库内 |
temp/ | 0(1 txt) | — | 临时文件 | 无职责,可忽略 |
source_code_reading/ | 0(1 md + 1 py) | — | 源码阅读笔记 | 说明文件仅 15 字节 |
共 21 个顶层目录。其中 10 个 README 从未提及(backtest / configure / daily / data / juejin / market / monitor / source_code_reading / temp / utils),完整比对见版本核验页。
落库拓扑
数据落在哪里:五个存储点与它们的真实库表
| 存储 | 库名 / 索引 | 谁在用 | 典型表 / 键 | 说明 |
|---|---|---|---|---|
| MySQL | db_stock(36 处引用)、db_daily、db_jisilu、db_zdt、db_position、db_selection、db_news | 绝大多数脚本 | tb_bond_jisilu、tb_bond_release、tb_jsl_{日期}、tb_basic_info、tb_stock_candidates、tb_position_{日期}、tb_delivery_gj_django、tb_delivery_hb_django | 主力存储;连接档案有 local/qq/ubuntu/ptrade/tencent-1c 五套,默认走 qq |
| MongoDB | qq / local 两套连接 | fund/ark_funds.py、market/securities_account_opening.py、configure/util.py | 集合名随脚本而定,如 ARK 持仓、上交所开户数 | 同步用 pymongo,异步用 motor |
| Redis | redis.qq(127.0.0.1:6379) | monitor/jsl_monitor.py、monitor/server_api.py、k_line.py | 键 ptrade 等;set() 后 expire(key, 60) | 可转债快照经 Redis 交给下游;代码读的是 redis.uc,样例配置只有 qq |
| Elasticsearch | 索引 cnstock | stockInfo.py、transfer_data_es.py、select_stock.py、strategy_verify.py、utils/push_msn.py | es.index(index='cnstock', doc_type='doc', ...) | 地址硬编码为内网 10.18.6.102:9200,且用了新版客户端已移除的 doc_type |
| SQLite | 本地文件 testdb.db / *.db | store_data.py、strategy_verify.py | 表 newtable 等 | 文件随 cwd 生成;store_data.py 用的是 pandas 1.0 已移除的 flavor 参数 |
| 本地 CSV / Excel | 仓库外文件 | bases.csv(6 处引用)、stock_list.txt、mystock.csv、holding_file | 因子筛选基础表、自选清单、持仓清单 | 多数被 .gitignore 忽略,需自己生成 |
五个落库点全部需要自建——这是本站判断「它不能一键跑起来」的主要依据之一。另外注意 bases.csv:select_stock.py、k_line.py、real_time_big_deal.py、new_stock_break.py、stock_check.py、utils/push_msn.py 六个脚本都读它,而它在 .gitignore 里。
数据流与交易流
两条链路分别在走什么:数据流与交易流
数据流(采集 → 落库 → 消费)
- 在
configure/下把sample_config.json复制成config.json,填 MySQL / MongoDB / Redis 的连接信息与各站点凭证。预期输出:import configure.settings不再抛FileNotFoundError。 - 运行
datahub/下的采集脚本(如jisilu.py)取回数据。预期输出:脚本打印抓取条数;需要登录态的脚本会先走datahub/jsl_login.py做 JS 加密登录。 - 采集脚本内部完成落库:MySQL 用
to_sql或insert,MongoDB 用insert_many。预期输出:数据库里出现tb_bond_jisilu这类表,或 Mongo 集合里出现文档。 - 消费端读库:选股脚本读
db_stock,监控脚本读db_stock与 Redis。预期输出:筛选结果打印到终端,或命中阈值的行被推送到 Redis 键。 - 推送端取 Redis 或直接调用
configure/util.py的发送函数。预期输出:收到邮件 / 企业微信 / Server 酱消息(具体渠道取决于配置)。
交易流与数据流是两条独立的链路:交易侧不读 MySQL,而是直接问券商客户端要持仓与行情——trader/auto_trader.py 用 easytrader 取持仓、用 easyquotation 取买一卖一价,下单后再把持仓写回 db_position。也就是说,监控归监控、下单归下单,两者之间目前只有 Redis 键 ptrade 这一条桥。
体量盘点
152 个脚本之外还有什么:体量、重复与残留
| 盘点项 | 读数 | 意味着什么 |
|---|---|---|
| 文件总数 | 242 个 tree 条目(217 文件 + 25 目录) | 体量中等,逐目录读完是可行的 |
| Python 脚本 | 152 个 | 单文件平均约 4KB,属「小脚本拼装」风格,不是大型工程 |
| Notebook | 49 个(analysis 39、fund 3、根目录 4、daily 2、juejin 1) | 分析类内容大量沉淀在 Notebook 里,没有脚本化 |
| 同名重复文件 | 4 组:收益率曲线绘制.ipynb、新闻分析.ipynb、选股.ipynb、雪球赏金.ipynb 同时存在于根目录与 analysis/ | 改一份不会同步另一份,是复现时的典型坑 |
| 零字节文件 | ptrade/__init__.py、analysis/统计分时最大站跌幅.ipynb | 前者是空模块,后者是空 Notebook,都不要当成功能 |
| 编辑器残留 | daily/.ipynb_checkpoints/fupan-checkpoint.ipynb(72 字节) | 被 .gitignore 忽略的类型却在仓库里,说明是早期提交 |
| 被忽略但已入库的目录 | configure/(3 文件)、data/(1 文件) | .gitignore 里有 configure/ 与 data/,但它们已被提交,等于规则只对新增文件生效 |
| 无版本约束的依赖清单 | requirements.txt 17 行 / 130 字节 / 无版本号 / loguru 重复 3 次 | 实际第三方包约 40 个,缺约 24 个 |
读代码时的实际影响:①遇到 选股.ipynb 先确认是根目录那份还是 analysis/ 那份;②看到 ptrade/ 不要以为有实现;③configure/ 虽被 gitignore 但确实在库内,可以直接读。
阅读顺序
想读懂这套代码,建议按什么顺序
推荐的阅读顺序(从可理解到可运行)
- 先读
configure/sample_config.json:所有凭证与连接档案的清单,理解「这个项目需要什么才能跑」。预期输出:一份 15 个顶层键的配置清单。 - 再读
configure/settings.py:只有 90 行,是 DBSelector 与 Tushare 封装,理解配置怎么被消费。预期输出:知道默认数据库档案是qq、默认字符集是utf8mb4。 - 接着读
datahub/jisilu.py:一个完整的采集脚本(可转债列表 → 落库 → 公告)。预期输出:理解「采集脚本长什么样」的模板。 - 然后读
monitor/jsl_monitor.py:监控 + Redis + 通知的组合,理解「命中阈值之后发生什么」。预期输出:理解 EXPIRE_TIME / ACCESS_INTERVAL 这类参数的作用。 - 最后读
trader/auto_trader.py:看交易链路,同时确认它缺什么(config.py、user.json)。预期输出:知道交易这条路需要自己补的凭证清单。 - 读不进源码时先看
backtest/:5 个文件量级小、逻辑独立,适合当练手入口——但要先把datapath.py的路径改成自己的。
FAQ
关于 Rockyzsu/stock 的常见问题
21 个目录我需要全都看吗?
datahub/;想选股,看 select_stock.py 与 analysis/;想做监控告警,看 monitor/;想接交易,看 trader/ 与 ptrade/。其余目录(temp/、source_code_reading/、daily/)与功能无关,可以直接跳过。为什么落库代码没有独立目录?
tb_basic_info / tb_baseinfo / tb_baseInfo 三种大小写同时存在)。以源码为准。MySQL、MongoDB、Redis、Elasticsearch 必须全装吗?
fund/ark_funds.py 与 market/ 依赖 MongoDB;monitor/jsl_monitor.py 依赖 Redis;stockInfo.py 与 select_stock.py 的一部分依赖 Elasticsearch。建议先确定要跑哪个脚本,再按它的 import 与 DBSelector 调用装对应的服务。monitor/ 为什么这么重要?
backtest/ 只有 5 个文件,够用吗?
datapath.py 只有一行,指向作者本机路径 /home/xda/othergit/backtrader/datas/。这些目录结论会不会因为新提交而失效?
9478dee528cc(2026-04-17)。如果仓库之后有新提交,请重新点算——方法很简单:拉一次 git/trees/{commit}?recursive=1 然后按顶层目录分组计数。本站对所有动态数字都标注了采集日期。索引类问题:这些目录怎么和 EasyClaw 对应?
datahub/ 是自建脚本 + 自建库,EasyClaw 的 akshare-finance 是直接提问取数;同样是「盯盘预警」,monitor/ 需要自建 cron 与推送通道,EasyClaw 的 stock-monitor-skill-0-1-0 提供 7 类预警规则。完整对照见导航栏的「对比」页。Rockyzsu/stock 与 EasyClaw 无已证实集成。