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 排除在外。所以顺序只能是:先建配置 → 再补依赖 → 再建服务 → 最后跑脚本。
安装前检查
动手前要先确认哪些项,否则一开工就会卡住
| 检查项 | 为什么必须先确认 | 不确认会怎样 | 怎么确认 |
|---|---|---|---|
| Python 版本 | 代码使用 f-string(3.6+),但同时存在 Python 2 残留模块 | 用 3.6 以下的解释器直接语法错误;用 3.10 以上会在 futu/ 报 collections 导入错误 | 先看报错排查页的版本陷阱表,再决定解释器版本 |
configure/config.json | settings.py 导入期就读取它 | 任何 from configure.settings import ... 都抛 FileNotFoundError | 复制 sample_config.json 为 config.json |
| MySQL | 多数采集与选股脚本的读写目标 | DBSelector.get_engine() 返回 None 或连接异常 | 确认服务已启动、库已建、档案键(默认 qq)已配 |
| Redis | monitor/jsl_monitor.py 推送快照依赖它 | 监控跑起来但推送环节断掉 | 注意代码读的是 redis.uc 而样例配置只有 redis.qq |
| MongoDB | fund/ark_funds.py 与 market/ 依赖它 | 这两个脚本无法落库 | 按需安装,不必为跑通全部脚本而强上 |
| Elasticsearch | stockInfo.py 等用 es.index() | 新闻与策略类脚本无法落库 | 注意地址在源码里被硬编码为内网 IP,必须改 |
| Node.js | datahub/jsl_login.py 用 execjs 执行集思录的登录加密 JS | 集思录登录直接失败 | 需要本地有 Node 运行时;纯 pip 装不出来 |
| TA-Lib 的 C 库 | k-line/ 与 plot_line.py 用 talib | pip install talib 会失败 | pip 装的是包装层,底层 C 库要单独装 |
建议的投入策略:不要一开始就把三类服务全装齐。先挑一个目标脚本(例如只读的 datahub/foreignexchange.py 或 datahub/jisilu.py),按它的 import 与 DBSelector 调用来决定装什么。
搭建顺序
从零到能跑的七个步骤:每步的预期输出
Windows 环境搭建顺序(每步含预期输出)
- 建一个干净的虚拟环境并装一个常被忽略的「隐藏前置」:
python -m venv .venv后pip install wheel。预期输出:wheel安装成功。这一步常常被跳过,而它决定了后面几个老包能不能装上。 - 改掉仓库里被忽略但实际存在的配置目录状态:确认
configure/已在工作区(它被.gitignore忽略,但历史上已提交,clone 会拿到),然后把configure/sample_config.json复制为configure/config.json。预期输出:configure/config.json存在且 JSON 合法。 - 安装依赖清单里的包:
pip install -r requirements.txt。预期输出:easytrader、loguru、rsa、redis、pypinyin、sqlalchemy、pandas、tushare、akshare、parsel、xlwt、easyquotation、pymongo、pymysql 装好。注意这份清单没有版本号,不同时间安装会得到不同版本。 - 补装清单里没有、但源码会 import 的包:
requests、matplotlib、numpy、fire、elasticsearch、lxml、scipy、joblib、aiohttp、xlrd、xlutils、demjson、Crypto(pycryptodome)、pdfplumber、motor、twilio、backtrader等。预期输出:按你要跑的那个脚本的 import 逐个补齐。 - 按需启动数据库与中间件(MySQL / Redis / MongoDB / Elasticsearch),并建好库名。预期输出:
DBSelector().get_mysql_conn('db_stock')返回连接对象而不是None。 - 改动硬编码的外部地址:
stockInfo.py里的 Elasticsearch 地址、backtest/datapath.py里的数据目录。预期输出:这两个文件不再指向别人的机器。 - 跑一个只读、无登录态的最小实验(见下一节)。预期输出:终端打印出可核对的数据行数或结果表。
依赖补装
requirements.txt 之外还要装哪些包(按 import 扫描统计)
| package | 为什么需要 | 谁会用到 | 注意事项 |
|---|---|---|---|
requests | 几乎所有爬虫脚本的 HTTP 客户端(28 个文件 import) | datahub/、fund/、根目录抓取脚本 | 清单里没有,必装 |
matplotlib | K 线绘图与收益曲线(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_finance | K 线绘制工具 | 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.py | Node 运行时不在 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 | 读写旧版 Excel | recordMyChoice.py | 新版 xlrd 已不支持 xlsx |
aiohttp | 异步抓取 | datahub/ttjj_new_stock.py | 清单里没有 |
scrapy | Selector 解析(仅用其解析能力) | 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 的字段说明与凭证安全
| 配置键 | 作用 | 样例值特征 | 安全提醒 |
|---|---|---|---|
mysql | MySQL 连接档案集合 | 有 local / qq / ubuntu / ptrade / tencent-1c 五套,默认走 qq | 密码明文写在 json 里,不要把 config.json 提交到任何仓库 |
mongo | MongoDB 连接 | qq(:11111)与 local(:17017)两套 | 同上 |
redis | Redis 连接 | 样例只有 qq(127.0.0.1:6379),但监控脚本读的是 uc | 需自行补 uc 键,否则监控脚本导入即 KeyError |
ts_token | Tushare 官方 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 / corpsecret | corpsecret 权限较高,按最小权限申请 |
aliyun / mail | 邮箱推送 | 账号与授权码 | 建议用独立发信账号 |
twillio | 短信推送 | sid / token | 键名拼写为 twillio(多一个 l),与代码里的属性访问不一致 |
WECHAT_ID | Server 酱的 SendKey | 空字符串 | 源码里已提示该接口需要收费 |
holding_file | 持仓文件名 | 样例值为 v | 与实际持仓文件名要对上 |
data_path | 数据目录 | 空字符串 | 多个脚本会切到该目录再读写文件 |
三条安全底线:①config.json、user.json、data.cfg、validate_key.py 在 .gitignore 里,是有意排除的凭证文件——切勿提交;②jsl_cookies 与券商 user.json 等于账号登录态;③send_sms() 存在属性访问 bug(把 dict 当对象用),真实使用前需自行修正。
起步实验
最小的可运行实验怎么做:从只读到完整链路
| 优先级 | 实验 | 为什么适合作为起步实验 | 预期能看到什么 | 失败时先查什么 |
|---|---|---|---|---|
| 1 | datahub/foreignexchange.py(美元汇率) | 只读公开接口,不依赖登录态与数据库即可打印结果 | 终端输出汇率数据或写入 MySQL(取决于分支) | requests 是否装上、网络是否可达 |
| 2 | datahub/jisilu.py(集思录可转债) | 覆盖「登录态 + 抓取 + 落库」完整链路,是最有代表性的采集脚本 | 可转债列表写入 db_stock.tb_bond_jisilu | config.json 是否配好、MySQL 是否连着 |
| 3 | backtest/ma_line_backtest.py(均线回测) | 不依赖数据库与登录态,只依赖一个 CSV,适合验证回测链路 | 终端打印初始资金与结束资金 | datapath.py 的路径与 CSV 是否存在 |
| 4 | datahub/zdt.py(每日涨跌停) | 依赖第三方站点与 MySQL,可验证「抓取→建表→插入」全链路 | 当日涨停/跌停数据写入 db_zdt | 是否重复运行(表已存在会直接报错) |
| 5 | monitor/ceiling_break.py(封板监控) | 验证监控链路:轮询 + 阈值 + 推送 | 命中阈值时触发通知 | 配置键、Redis、推送渠道三处 |
本页不给「复制这段命令就能成功」的承诺。原因是本站没有在本机 clone 运行过这个仓库(它需要四类服务与多家站点登录态),所以上述都是静态源码核验得出的路径判断,而不是实机运行记录。真正的起步实验能不能成功,取决于你的环境与当时的接口可用性。
FAQ
关于 Rockyzsu/stock 的常见问题
Rockyzsu/stock 能用 pip install 安装吗?
setup.py、没有 pyproject.toml、没有发布到 PyPI 的包,也没有 Release 与 Tag。官方路径只有 git clone,然后自己装依赖、自己建数据库。以官方仓库当前状态为准。为什么装完 requirements.txt 还是跑不起来?
requests、matplotlib、numpy、fire、backtrader、elasticsearch、talib 等都不在里面。另外还有 8 个模块存在导入期问题(导入不存在的符号或缺失模块),这两类问题叠加就会表现为「装了也跑不动」。详见报错排查页。必须装 MySQL、MongoDB、Redis、Elasticsearch 四类服务吗?
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 个键)。所以起步动作永远是确认配置文件存在且键完整。官方有没有安装文档?
sample_config.json 改名为 config.json 并解释数据库映射关系,其中内嵌的示例代码与实际实现已经不一致(默认数据库档案、字符集都不同)。没有分平台的安装说明、没有依赖版本说明、没有数据库初始化脚本。装不起来的话,有没有更省事的路径?
akshare-finance 覆盖股票、基金、债券、外汇、指数的行情与基本面;tushare-finance 覆盖 220+ 个 Tushare Pro 接口。但如果目标是复用这套代码的工程细节、或要自己控数据链路,仍然只能自己搭。Rockyzsu/stock 与 EasyClaw 无已证实集成。