Rockyzsu/stock / 工作台地图

七段流水线与 21 个目录:这套代码是按什么顺序串起来的

把 Rockyzsu/stock 当成一堆散装脚本是最容易迷路的方式。事实上它有一条清晰的流水线:采集 → 落库 → 分析与选股 → 监控 → 推送 → 交易执行 → 记录与复盘。21 个顶层目录几乎都能挂到这七段上。

本文按固定提交 9478dee528cc 逐个目录点算:仓库共 242 个 tree 条目(217 个文件 + 25 个目录),其中 152 个 Python 脚本、49 个 Jupyter Notebook。同时把五个落库点(MySQL、MongoDB、Redis、Elasticsearch、SQLite)在流水线上的位置标出来——因为在多数脚本里,「取到数据」和「写进哪张表」是两件事。

21 个顶层目录152 个 .py49 个 .ipynb5 个落库点
① 采集 datahub集思录/宁稳/巨潮/东财/同花顺
② 落库 五种存储MySQL / Mongo / Redis / ES / SQLite
③ 分析选股analysis / fund / k-line
④ 监控与交易monitor / trader / ptrade / futu
按仓库真实目录(提交 9478dee)整理的流水线示意;目录归类为本站整理,非官方架构图。

七段流水线

把这套代码串起来看:七段流水线各自负责什么

段这段解决什么主要目录真实代码入口当前状态
① 数据采集从十余个站点取行情、公告、基金、汇率、行业数据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.py1 个脚本导入期报错
④ 监控轮询行情或转债,命中阈值就告警monitor/(9 个 .py,README 未提及)jsl_monitor.py、realtime_monitor_ts.py、big_deal.py、ceiling_break.py配置键缺失,导入即 KeyError
⑤ 推送邮件、企业微信、Server 酱、短信无独立目录,工具函数集中在 configure/util.pynotify()、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),完整比对见版本核验页。

落库拓扑

数据落在哪里:五个存储点与它们的真实库表

存储库名 / 索引谁在用典型表 / 键说明
MySQLdb_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
MongoDBqq / local 两套连接fund/ark_funds.py、market/securities_account_opening.py、configure/util.py集合名随脚本而定,如 ARK 持仓、上交所开户数同步用 pymongo,异步用 motor
Redisredis.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索引 cnstockstockInfo.py、transfer_data_es.py、select_stock.py、strategy_verify.py、utils/push_msn.pyes.index(index='cnstock', doc_type='doc', ...)地址硬编码为内网 10.18.6.102:9200,且用了新版客户端已移除的 doc_type
SQLite本地文件 testdb.db / *.dbstore_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 里。

数据流与交易流

两条链路分别在走什么:数据流与交易流

数据流(采集 → 落库 → 消费)

  1. 在 configure/ 下把 sample_config.json 复制成 config.json,填 MySQL / MongoDB / Redis 的连接信息与各站点凭证。预期输出:import configure.settings 不再抛 FileNotFoundError。
  2. 运行 datahub/ 下的采集脚本(如 jisilu.py)取回数据。预期输出:脚本打印抓取条数;需要登录态的脚本会先走 datahub/jsl_login.py 做 JS 加密登录。
  3. 采集脚本内部完成落库:MySQL 用 to_sql 或 insert,MongoDB 用 insert_many。预期输出:数据库里出现 tb_bond_jisilu 这类表,或 Mongo 集合里出现文档。
  4. 消费端读库:选股脚本读 db_stock,监控脚本读 db_stock 与 Redis。预期输出:筛选结果打印到终端,或命中阈值的行被推送到 Redis 键。
  5. 推送端取 Redis 或直接调用 configure/util.py 的发送函数。预期输出:收到邮件 / 企业微信 / Server 酱消息(具体渠道取决于配置)。

交易流与数据流是两条独立的链路:交易侧不读 MySQL,而是直接问券商客户端要持仓与行情——trader/auto_trader.py 用 easytrader 取持仓、用 easyquotation 取买一卖一价,下单后再把持仓写回 db_position。也就是说,监控归监控、下单归下单,两者之间目前只有 Redis 键 ptrade 这一条桥。

体量盘点

152 个脚本之外还有什么:体量、重复与残留

盘点项读数意味着什么
文件总数242 个 tree 条目(217 文件 + 25 目录)体量中等,逐目录读完是可行的
Python 脚本152 个单文件平均约 4KB,属「小脚本拼装」风格,不是大型工程
Notebook49 个(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 但确实在库内,可以直接读。

阅读顺序

想读懂这套代码,建议按什么顺序

推荐的阅读顺序(从可理解到可运行)

  1. 先读 configure/sample_config.json:所有凭证与连接档案的清单,理解「这个项目需要什么才能跑」。预期输出:一份 15 个顶层键的配置清单。
  2. 再读 configure/settings.py:只有 90 行,是 DBSelector 与 Tushare 封装,理解配置怎么被消费。预期输出:知道默认数据库档案是 qq、默认字符集是 utf8mb4。
  3. 接着读 datahub/jisilu.py:一个完整的采集脚本(可转债列表 → 落库 → 公告)。预期输出:理解「采集脚本长什么样」的模板。
  4. 然后读 monitor/jsl_monitor.py:监控 + Redis + 通知的组合,理解「命中阈值之后发生什么」。预期输出:理解 EXPIRE_TIME / ACCESS_INTERVAL 这类参数的作用。
  5. 最后读 trader/auto_trader.py:看交易链路,同时确认它缺什么(config.py、user.json)。预期输出:知道交易这条路需要自己补的凭证清单。
  6. 读不进源码时先看 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 必须全装吗?
不必全装,但要看你想跑哪个脚本。多数采集与选股脚本依赖 MySQL;fund/ark_funds.py 与 market/ 依赖 MongoDB;monitor/jsl_monitor.py 依赖 Redis;stockInfo.py 与 select_stock.py 的一部分依赖 Elasticsearch。建议先确定要跑哪个脚本,再按它的 import 与 DBSelector 调用装对应的服务。
monitor/ 为什么这么重要?
因为它有 9 个脚本、覆盖了可转债监控、自选池实时监控、大单监控与封板监控四类机制,是这个项目「自动化」能力的核心。但 README 的目录清单完全没提它——只看 README 的人会以为这个项目只有采集和分析,不知道它能盯盘告警。
backtest/ 只有 5 个文件,够用吗?
作为「回测怎么写」的入门示例够了,作为回测系统远远不够。5 个文件都是 backtrader 的示例代码:一个课程示例、一个 DataFrame Feed、一个 DataFrame Feed 的路径常量、一个均线回测、一个 SMA demo。没有数据准备、没有绩效统计、没有成本模型。而且 datapath.py 只有一行,指向作者本机路径 /home/xda/othergit/backtrader/datas/。
这些目录结论会不会因为新提交而失效?
会。本页所有目录与文件数都锚定提交 9478dee528cc(2026-04-17)。如果仓库之后有新提交,请重新点算——方法很简单:拉一次 git/trees/{commit}?recursive=1 然后按顶层目录分组计数。本站对所有动态数字都标注了采集日期。
索引类问题:这些目录怎么和 EasyClaw 对应?
按任务对应,而不是按目录对应。同样是「取 A 股行情」,datahub/ 是自建脚本 + 自建库,EasyClaw 的 akshare-finance 是直接提问取数;同样是「盯盘预警」,monitor/ 需要自建 cron 与推送通道,EasyClaw 的 stock-monitor-skill-0-1-0 提供 7 类预警规则。完整对照见导航栏的「对比」页。Rockyzsu/stock 与 EasyClaw 无已证实集成。

接下来读哪一页?

理解了目录分布之后,最实际的一步是把它跑起来——环境安装页给了一条补依赖、建库、写配置、跑最小实验的完整顺序。