Rockyzsu/stock / 环境安装

Windows 上把它跑起来要补哪些东西:一份不隐藏难点的清单

先把结论说清楚:clone 完直接运行是不行的。这个仓库没有 setup.py、没有 pyproject.toml、没有 Dockerfile、没有 CI,requirements.txt 只有 17 行、130 字节、且没有任何版本号,而源码实际 import 的第三方包约 40 个——也就是要自己补约 24 个。

更关键的是:configure/settings.py 在模块顶层就要读 configure/config.json。文件不存在时,任何 import configure.settings 都会立刻抛 FileNotFoundError;而 config.json 恰恰被 .gitignore 排除在外。所以顺序只能是:先建配置 → 再补依赖 → 再建服务 → 最后跑脚本。

无 setup.py / Docker需补约 24 个包三类服务起步核验提交 9478dee
Python 环境f-string 语法要求 3.6+
补装约 24 个包requests/matplotlib/numpy/selenium…
四类服务MySQL / MongoDB / Redis / ES
config.json导入期即读取,缺则报错
依据 requirements.txt、configure/sample_config.json 与源码 import 扫描整理的安装前置示意;具体版本以官方为准,非官方安装指南。

安装前检查

动手前要先确认哪些项,否则一开工就会卡住

检查项为什么必须先确认不确认会怎样怎么确认
Python 版本代码使用 f-string(3.6+),但同时存在 Python 2 残留模块用 3.6 以下的解释器直接语法错误;用 3.10 以上会在 futu/ 报 collections 导入错误先看报错排查页的版本陷阱表,再决定解释器版本
configure/config.jsonsettings.py 导入期就读取它任何 from configure.settings import ... 都抛 FileNotFoundError复制 sample_config.json 为 config.json
MySQL多数采集与选股脚本的读写目标DBSelector.get_engine() 返回 None 或连接异常确认服务已启动、库已建、档案键(默认 qq)已配
Redismonitor/jsl_monitor.py 推送快照依赖它监控跑起来但推送环节断掉注意代码读的是 redis.uc 而样例配置只有 redis.qq
MongoDBfund/ark_funds.py 与 market/ 依赖它这两个脚本无法落库按需安装,不必为跑通全部脚本而强上
ElasticsearchstockInfo.py 等用 es.index()新闻与策略类脚本无法落库注意地址在源码里被硬编码为内网 IP,必须改
Node.jsdatahub/jsl_login.py 用 execjs 执行集思录的登录加密 JS集思录登录直接失败需要本地有 Node 运行时;纯 pip 装不出来
TA-Lib 的 C 库k-line/ 与 plot_line.py 用 talibpip install talib 会失败pip 装的是包装层,底层 C 库要单独装

建议的投入策略:不要一开始就把三类服务全装齐。先挑一个目标脚本(例如只读的 datahub/foreignexchange.py 或 datahub/jisilu.py),按它的 import 与 DBSelector 调用来决定装什么。

搭建顺序

从零到能跑的七个步骤:每步的预期输出

Windows 环境搭建顺序(每步含预期输出)

  1. 建一个干净的虚拟环境并装一个常被忽略的「隐藏前置」:python -m venv .venv 后 pip install wheel。预期输出:wheel 安装成功。这一步常常被跳过,而它决定了后面几个老包能不能装上。
  2. 改掉仓库里被忽略但实际存在的配置目录状态:确认 configure/ 已在工作区(它被 .gitignore 忽略,但历史上已提交,clone 会拿到),然后把 configure/sample_config.json 复制为 configure/config.json。预期输出:configure/config.json 存在且 JSON 合法。
  3. 安装依赖清单里的包:pip install -r requirements.txt。预期输出:easytrader、loguru、rsa、redis、pypinyin、sqlalchemy、pandas、tushare、akshare、parsel、xlwt、easyquotation、pymongo、pymysql 装好。注意这份清单没有版本号,不同时间安装会得到不同版本。
  4. 补装清单里没有、但源码会 import 的包:requests、matplotlib、numpy、fire、elasticsearch、lxml、scipy、joblib、aiohttp、xlrd、xlutils、demjson、Crypto(pycryptodome)、pdfplumber、motor、twilio、backtrader 等。预期输出:按你要跑的那个脚本的 import 逐个补齐。
  5. 按需启动数据库与中间件(MySQL / Redis / MongoDB / Elasticsearch),并建好库名。预期输出:DBSelector().get_mysql_conn('db_stock') 返回连接对象而不是 None。
  6. 改动硬编码的外部地址:stockInfo.py 里的 Elasticsearch 地址、backtest/datapath.py 里的数据目录。预期输出:这两个文件不再指向别人的机器。
  7. 跑一个只读、无登录态的最小实验(见下一节)。预期输出:终端打印出可核对的数据行数或结果表。

依赖补装

requirements.txt 之外还要装哪些包(按 import 扫描统计)

package为什么需要谁会用到注意事项
requests几乎所有爬虫脚本的 HTTP 客户端(28 个文件 import)datahub/、fund/、根目录抓取脚本清单里没有,必装
matplotlibK 线绘图与收益曲线(20 个文件 import)k-line/、plot_line.py、new_stock_break.py清单里没有;配 mpl_finance 使用(该库已弃用)
numpy数值计算(10 个文件 import)select_stock.py、utils/delivery_order.py 等部分文件使用 np.str,该别名在 NumPy 2.0 已移除
selenium需要浏览器渲染的站点(7 个文件)new_stock_fund.py、hk_stock/aastock_new_stock.py还要装浏览器驱动
fire把函数变成命令行(6 个文件)monitor/alert_me.py、utils/delivery_order.py、market/…清单里没有
backtrader回测示例的引擎backtest/ 全部 5 个文件清单里没有
mpl_financeK 线绘制工具k-line/ 与 plot_line.py上游已弃用,改名 mplfinance
talib技术形态识别k-line/recognize_form.py、k-line/search_target.py、plot_line.py需先装本地 C 库
Crypto(pycryptodome)AES 解密common/aes.py清单里没有
elasticsearch新闻与策略落库stockInfo.py、transfer_data_es.py注意 doc_type 参数在新版客户端已移除
demjson宽松 JSON 解析(接口返回非标准 JSON)configure/util.py、market/securities_account_opening.py老库,注意 Python 版本兼容
execjs + Node执行集思录登录加密脚本datahub/jsl_login.py、datahub/ttjj_new_stock.pyNode 运行时不在 pip 里
motor异步 MongoDB 客户端configure/settings.py 的 mongo(async_type=True)清单里没有
twilio短信通知configure/util.py 的 send_sms()且该函数本身存在属性访问 bug
pdfplumber公告 PDF 转文本common/pdf_convertor.py清单里没有
joblib对象序列化datahub/bond_industry_info.py清单里没有
xlrd / xlutils读写旧版 ExcelrecordMyChoice.py新版 xlrd 已不支持 xlsx
aiohttp异步抓取datahub/ttjj_new_stock.py清单里没有
scrapySelector 解析(仅用其解析能力)stockInfo.py、new_stock_fund.py引入整包只为用选择器,成本偏高
pymongo / pymysql / sqlalchemy / redis四类落库点的驱动全站多处已在 requirements.txt 中

上表按「源码 import 扫描」统计,原始输出见研究目录的 _scan.txt。清单里有版本约束的包一个都没有,所以同一份代码在不同时间安装可能得到不同版本——这也是本站给出「静态核验」边界的原因之一。

服务准备

四类服务与本地文件的安装配置:最小准备动作

服务用途谁依赖最小准备动作
MySQL主力存储:可转债、行情、持仓、交割单datahub/、select_stock.py、utils/delivery_order.py 等大多数脚本建库(如 db_stock)+ 在 config.json 里填一套档案
Redis监控快照的内存中转monitor/jsl_monitor.py、k_line.py启动 6379;注意代码读 redis.uc 键,需与配置对齐
MongoDB基金持仓、开户数等文档型数据fund/ark_funds.py、market/securities_account_opening.py按需启动;配置里已有 qq/local 两套样例
Elasticsearch新闻与策略的检索库stockInfo.py、select_stock.py 等 5 个文件启动后必须改源码里硬编码的 10.18.6.102:9200
SQLite无需安装的本地落库store_data.py、strategy_verify.py无需服务;注意 store_data.py 用了 pandas 1.0 已移除的 flavor 参数
本地数据文件因子筛选与自选清单bases.csv(6 处引用)、stock_list.txt、mystock.csv被 .gitignore 排除,需自己生成或导出

一个容易被忽略的点:bases.csv 被 6 个脚本引用,而它由 select_stock.py 的 local=True 分支生成(内部调用 ts.get_stock_basics() 再落 CSV 与 MySQL 表 bases)。如果这个文件不存在,相关脚本会直接读 CSV 失败。

配置详解

configure/config.json 的字段说明与凭证安全

配置键作用样例值特征安全提醒
mysqlMySQL 连接档案集合有 local / qq / ubuntu / ptrade / tencent-1c 五套,默认走 qq密码明文写在 json 里,不要把 config.json 提交到任何仓库
mongoMongoDB 连接qq(:11111)与 local(:17017)两套同上
redisRedis 连接样例只有 qq(127.0.0.1:6379),但监控脚本读的是 uc需自行补 uc 键,否则监控脚本导入即 KeyError
ts_tokenTushare 官方 token空字符串属个人凭据,避免外传
xc_token_pro / xc_server第三方 tushare 封装 xcsc_tushare 的 token 与服务器地址均为空字符串该包不在 requirements.txt 中
jsl_cookies集思录站点 cookie(6 个字段)含 kbzw__Session、Hm_lvt_* 等等价于登录态,泄露即等于账号被用
jsl_monitor监控参数与集思录账号样例 5 个键,代码实际读 11 个键缺失键会导致导入期 KeyError
enterprise_wechat企业微信推送userid / agentid / corpid / corpsecretcorpsecret 权限较高,按最小权限申请
aliyun / mail邮箱推送账号与授权码建议用独立发信账号
twillio短信推送sid / token键名拼写为 twillio(多一个 l),与代码里的属性访问不一致
WECHAT_IDServer 酱的 SendKey空字符串源码里已提示该接口需要收费
holding_file持仓文件名样例值为 v与实际持仓文件名要对上
data_path数据目录空字符串多个脚本会切到该目录再读写文件

三条安全底线:①config.json、user.json、data.cfg、validate_key.py 在 .gitignore 里,是有意排除的凭证文件——切勿提交;②jsl_cookies 与券商 user.json 等于账号登录态;③send_sms() 存在属性访问 bug(把 dict 当对象用),真实使用前需自行修正。

起步实验

最小的可运行实验怎么做:从只读到完整链路

优先级实验为什么适合作为起步实验预期能看到什么失败时先查什么
1datahub/foreignexchange.py(美元汇率)只读公开接口,不依赖登录态与数据库即可打印结果终端输出汇率数据或写入 MySQL(取决于分支)requests 是否装上、网络是否可达
2datahub/jisilu.py(集思录可转债)覆盖「登录态 + 抓取 + 落库」完整链路,是最有代表性的采集脚本可转债列表写入 db_stock.tb_bond_jisiluconfig.json 是否配好、MySQL 是否连着
3backtest/ma_line_backtest.py(均线回测)不依赖数据库与登录态,只依赖一个 CSV,适合验证回测链路终端打印初始资金与结束资金datapath.py 的路径与 CSV 是否存在
4datahub/zdt.py(每日涨跌停)依赖第三方站点与 MySQL,可验证「抓取→建表→插入」全链路当日涨停/跌停数据写入 db_zdt是否重复运行(表已存在会直接报错)
5monitor/ceiling_break.py(封板监控)验证监控链路:轮询 + 阈值 + 推送命中阈值时触发通知配置键、Redis、推送渠道三处

本页不给「复制这段命令就能成功」的承诺。原因是本站没有在本机 clone 运行过这个仓库(它需要四类服务与多家站点登录态),所以上述都是静态源码核验得出的路径判断,而不是实机运行记录。真正的起步实验能不能成功,取决于你的环境与当时的接口可用性。

FAQ

关于 Rockyzsu/stock 的常见问题

Rockyzsu/stock 能用 pip install 安装吗?
不能。仓库里没有 setup.py、没有 pyproject.toml、没有发布到 PyPI 的包,也没有 Release 与 Tag。官方路径只有 git clone,然后自己装依赖、自己建数据库。以官方仓库当前状态为准。
为什么装完 requirements.txt 还是跑不起来?
因为那份清单只覆盖了约 40 个第三方包里的 17 个(且含重复行),requests、matplotlib、numpy、fire、backtrader、elasticsearch、talib 等都不在里面。另外还有 8 个模块存在导入期问题(导入不存在的符号或缺失模块),这两类问题叠加就会表现为「装了也跑不动」。详见报错排查页。
必须装 MySQL、MongoDB、Redis、Elasticsearch 四类服务吗?
不必。取决于你要跑哪个脚本:多数采集与选股脚本依赖 MySQL;fund/ark_funds.py 与 market/ 依赖 MongoDB;monitor/jsl_monitor.py 依赖 Redis;stockInfo.py 等 5 个文件依赖 Elasticsearch;store_data.py 用 SQLite 无需服务。建议先定目标脚本,再装对应服务。
Windows 上有哪些特别的坑?
主要有三类:①talib 需要本地 C 库,Windows 上要单独装;②datahub/jsl_login.py 用 execjs 执行登录加密 JS,需要额外装 Node 运行时;③部分路径与编码假设来自 Linux 环境,典型如 backtest/datapath.py 的 /home/xda/... 与交割单 CSV 的 GBK 编码。
config.json 填错了会怎样?
分两种:①文件不存在 → import configure.settings 立刻抛 FileNotFoundError,这是硬失败;②文件存在但键缺失 → 取决于脚本,有的会打印「找不到对应的 key」并返回 None(config_dict() 的行为),有的会直接 KeyError(monitor/jsl_monitor.py 在导入期就取 11 个键)。所以起步动作永远是确认配置文件存在且键完整。
官方有没有安装文档?
README 里有一段「使用教程」,但内容是把 sample_config.json 改名为 config.json 并解释数据库映射关系,其中内嵌的示例代码与实际实现已经不一致(默认数据库档案、字符集都不同)。没有分平台的安装说明、没有依赖版本说明、没有数据库初始化脚本。
装不起来的话,有没有更省事的路径?
如果目的只是「拿到 A 股数据做一次分析」,用 EasyClaw 技能可以跳过整套环境:akshare-finance 覆盖股票、基金、债券、外汇、指数的行情与基本面;tushare-finance 覆盖 220+ 个 Tushare Pro 接口。但如果目标是复用这套代码的工程细节、或要自己控数据链路,仍然只能自己搭。Rockyzsu/stock 与 EasyClaw 无已证实集成。

接下来读哪一页?

环境搭好之后,真正会卡人的地方是数据:14 个数据源各有各的登录态与凭证要求。数据源页把它们的取数方式、所需凭证与 Tushare 三路对照一次讲清。