Files
claude_dev c66f7cb14e chore(deps): 锁三机统一依赖基线(Python3.10+pandas2.3/numpy2.2新稳定版, requirements-lock.txt)
依据:
- vnpy 4.4.0 pyproject: numpy>=2.2.3 / pandas>=2.2.3(均无上限,不钉<3)
- pandas 目标=2.3.3(2.x 稳定线顶端,3.0 破坏性变更未回归,按稳定优先不采用)
- numpy 目标=2.2.6(与 TA-Lib 0.6.8 在 NAS 生产容器实证兼容)
- 其余依赖==钉到 NAS 容器已验证可跑版本(fastapi 0.139/uvicorn 0.49/polars 1.42 等)
- Python 3.10 三机统一基线(xtquant 限 3.6-3.12,VPS 锁 3.10)
- 不含 vnpy(源码引用)/ xtquant(VPS Windows only)/ CUDA(torch 传递依赖)
- 矩阵文档新增「锁定决策(2026-07-15)」小节:依据+迁移步骤+验证前置
- 验证前置:落生产前须全套 pytest 0 回归 + 一个 CTA 回测冒烟
2026-07-15 08:12:40 +08:00

12 KiB
Raw Permalink Blame History

三机环境版本矩阵(Mac 开发 / NAS 容器 / Windows VPS

创建:2026-07-14。目的:记录三机 Python + 关键依赖版本现状,暴露不一致,给出 Lock 建议。 数据来源:Mac venv311 + NAS 容器均经实地 pip list 核实;VPS 基于部署文档 vps-production-runbook.md,未本轮直接 SSH 复核(SSH 不通)。


1. 机器角色一览

机器 角色 Python 虚拟环境 / 路径 数据来源
Mac Mini 开发 + 测试 3.11.15venv311 ./venv311/(项目内) 实地 pip list
Mac 系统 Python 不参与项目 3.14.6homebrew/ 3.9.6/usr/bin python3 --version
NAS 容器 sanguo_vnpy_v2 测试 + 回测 + 采集(生产近邻) 3.10.20 /app(容器内)= NAS /volume1/homes/admin/.sanguo_projects/sanguo_vnpy_v2 实地 docker exec ... pip list
Windows VPS 49.232.102.198 生产(miniQMT + bridge 3.10.11 C:\Python310\python.exe 部署文档(本轮未直连)

2. 关键依赖版本矩阵

版本号 = pip show 的 Version 字段; = 未安装;🚫 = 平台不兼容(Windows only);🔍 = 仅有源码引用(sys.path.insert)未 pip install。

依赖 Mac venv311 (3.11.15) NAS 容器 (3.10.20) Windows VPS (3.10.11) 备注
python 3.11.15 3.10.20 3.10.11 ⚠️ Mac 比 prod 高一个小版本
vnpy 🔍 源码引用(vnpy_v4.4.0/ 🔍 源码引用(/app/vnpy_v4.4.0+ vnpy 4.4.0 pip metadata 不装(VPS 只跑 bridge Mac 容器均靠 sys.path.insert 引用源码,不 pip install vnpy
vnpy_ctastrategy 1.4.1
vnpy_sqlite 1.1.3
fastapi 0.139.0(本次新装) 0.139.0 装了(文档未给版本) 一致
uvicorn 0.51.0(本次新装) 0.49.0 装了 小版本差
akshare 三机都没装;日线采集走 NAS 宿主系统 pythonakshare 在 NAS 宿主,不在容器里)
baostock 0.9.3 0.9.3 Mac/NAS 一致
polars 1.42.1(本次新装) 1.42.1 Mac/NAS 一致;Mac 此前缺失致 collect-only 失败
xtquant 🚫 Windows only 🚫 Windows only miniQMT site-packages VPS 专属,靠 miniQMT 客户端
pandas 3.0.3 2.3.3 ? 🔴 major 版本分裂Mac=3.x / NAS=2.x
numpy 1.26.4 2.2.6 ? 🔴 major 版本分裂Mac=1.x / NAS=2.x
pyarrow 25.0.0 24.0.0 小版本差
PyJWT 2.13.0(本次新装) 2.13.0 一致
bcrypt 5.0.0(本次新装) 5.0.0 一致
TA-Lib 0.6.8 Mac 缺(需 brew install ta-lib
pyzmq 27.1.0 Mac 缺
PySide6 6.8.2.1 Mac 缺(GUI 依赖,dev 可选)
SQLAlchemy 2.0.51 Mac 缺
redis 8.0.1 Mac 缺
APScheduler 3.11.3 Mac 缺
deap 1.4.4 Mac 缺(遗传算法,回测用)
plotly 6.8.0 Mac 缺
scipy 1.17.1 未列(应已装) Mac 有
pytest 9.1.1 未列 dev 工具

3. 当前发现的不一致(按严重度)

🔴 CRITICAL —— 可能在 Mac 跑通但在 prod 静默踩坑

  1. pandas major 版本分裂Mac venv311 = pandas 3.0.3NAS 容器 = pandas 2.3.3

    • pandas 3.0 有大量破坏性变更(默认 dtype、chained assignmentSettingWithCopyWarning 升级为异常等)。
    • 在 Mac 过的测试,到 NAS 容器可能因为 pandas 3→2 的 API 差异失败或行为不同。
    • 这是最危险的不一致:单测绿不代表行为一致。
  2. numpy major 版本分裂Mac venv311 = numpy 1.26.4NAS 容器 = numpy 2.2.6

    • numpy 2.0 有 breaking change(部分标量类型 Promotion 规则改变、np.float_ 移除等)。
    • 方向与 pandas 相反:Mac 反而比 prod 旧。
  3. Python minor 分裂Mac venv311 = 3.11.15NAS/VPS = 3.10.x

    • 影响有限但存在(如 match 语法、tomllibExceptionGroup、类型 Hint 差异)。
    • pyproject.toml 已声明 requires-python = ">=3.10",理论上 3.11 合法,但偏离 prod。

🟡 WARNING —— Mac venv311 依赖不完整(已知)

  1. venv311 缺核心运行时依赖(本轮未补,按任务约束只做 collect-only + trader 子集):

    • TA-Lib(需先 brew install ta-libC 库依赖)
    • pyzmq / SQLAlchemy / redis / APScheduler / deap / plotly / PySide6
    • akshare(Mac 完全没装,日线采集靠 NAS 宿主 python)
    • vnpy(源码引用,故意不 pip install —— 容器也是源码引用)
  2. VPS 信息未本轮 SSH 复核49.232.102.198:22 Connection closed,本轮失败。文档记录的版本来自 vps-production-runbook.md,标注日期前的核实结果。

🟢 INFO —— 可接受的小差异

  1. polars/pandas/pyarrow 小版本 driftpyarrow 25 vs 24、uvicorn 0.51 vs 0.49):patch/minor 差异,影响小。

🎯 锁定决策(2026-07-15

产出文件:requirements-lock.txt(项目根,三机共享单一基线)。本节记录决策依据与迁移/验证步骤。

目标版本组合

维度 目标版本 依据
Python 3.10(三机统一基线) xtquant 限 3.63.12VPS 生产锁 3.10.11NAS 容器 3.10.20。三机唯一交集
pandas 2.3.32.x 稳定线顶端,非 3.0 见下方「pandas 不升 3.0 的依据」
numpy 2.2.62.2.x 最新稳定) TA-Lib 0.6.8 在 NAS 容器与 numpy 2.2.6 实证兼容;vnpy 要 >=2.2.3
TA-Lib 0.6.8 vnpy 要 >=0.6.40.6.8 ≫ 0.4.32numpy 2.x 兼容门槛),NAS 实证
fastapi / uvicorn 0.139.0 / 0.49.0 NAS 实证版本
polars / pyarrow 1.42.1 / 24.0.0 NAS 实证版本
其余依赖 requirements-lock.txt(全部 == 钉到 NAS 实证版本) 「已验证可跑」> 盲目追新

关键证据 1:vnpy 4.4.0 声明的依赖上限(决定性)

vnpy_v4.4.0/pyproject.toml(项目靠 sys.path.insert 引用源码,其声明即天花板):

requires-python = ">=3.10"        # classifiers: 3.10 / 3.11 / 3.12 / 3.13
dependencies = [
    ...
    "numpy>=2.2.3",               # ← 仅下限,无上限(不钉 <3)
    "pandas>=2.2.3",              # ← 仅下限,无上限(不钉 <3)
    "ta-lib>=0.6.4",
    "PySide6==6.8.2.1",           # ← 精确钉死
    ...
]

结论:vnpy 4.4.0 并未声明 pandas<3 pandas 3.0 在语法上被允许。因此选 2.3.x 是稳定性决策(见下),而非 vnpy 强制天花板。

关键证据 2TA-Lib 与 numpy 2.x 兼容

  • NAS 容器实地核实(docker exec ... python -c):Python 3.10.20 + pandas 2.3.3 + numpy 2.2.6 + TA-Lib 0.6.8 全部正常 import。
  • TA-Lib 0.6.8 远高于支持 numpy 2.x 的 0.4.32 门槛。目标 numpy 2.2.6 与 TA-Lib 不冲突。

pandas 不升 3.0 的依据(与新稳定原则的对应)

  • pandas 3.0 有大量破坏性变更(默认 dtype 变、chained assignment / SettingWithCopyWarning 升级为异常等),未经 vnpy 4.4.0 源码回归
  • NAS 生产容器跑 pandas 2.3.3 已验证稳定;「新稳定」≠「盲追 major」,2.3.x 顶端的 2.3.3 本身就是近期版本、不算旧。
  • 与 §「不推荐的方向」一致:prod 升 3.0 major 须先在测试库充分回归,本次 lock 默认保守。
  • 若未来要升 pandas 3.0:必须先跑全套 pytest + CTA 回测冒烟确认无回归,再改本 lock。

三机迁移步骤

  1. Mac 重建 venv310(对齐生产 Python):
    brew install python@3.10
    /opt/homebrew/bin/python3.10 -m venv venv310
    ./venv310/bin/pip install -r requirements-lock.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
    # vnpy 源码引用(sys.path.insert),无需 pip install vnpy
    # akshare 若 Mac 不跑采集可不装
    
    废弃 venv311pandas 3.0.3 / numpy 1.26.4 的分裂环境)。
  2. NAS 容器:当前生产依赖已与 lock 一致(lock 即取自该容器 freeze),按需 pip install -r requirements-lock.txt 校齐;不动 vnpy 源码引用
  3. VPSpip install -r requirements-lock.txt 装公共基线;xtquant 仍由 miniQMT site-packages 提供(Windows only,不入 lock)。

⚠️ 验证前置条件(lockfile 落生产前必须通过)

  • 全套 pytest 0 回归:测试环境按 requirements-lock.txt 全新装一遍后 pytest -q 全绿。
  • CTA 回测冒烟:至少跑一个 CTA 策略回测,确认 vnpy 源码 + TA-Lib + pandas 2.3.3 + numpy 2.2.6 协同无回归(收益/指标与基线一致)。
  • 任一项失败 → 不得部署到生产;回到本文件修正目标版本后再验。

4. Lock 建议(推荐方案,不执行)

推荐基线:对齐 NAS 容器(最稳定的生产近邻)

理由:NAS 容器是当前依赖最齐、跑得最稳的环境;VPS 只跑 bridge 子集,依赖面窄;Mac 是开发机,应模拟 prod 而不是超前。Python 3.10 是三机唯一交集。

维度 推荐基线(= NAS 当前) 落地动作(Mac 侧)
Python 3.10.x(容器 3.10.20 / VPS 3.10.11 重建 venvpython3.10 -m venv venv310(用 homebrew python@3.10),废弃 venv311
pandas 2.3.xNAS 2.3.3 pip install 'pandas>=2.3,<3'锁 <3
numpy 2.2.xNAS 2.2.6 pip install 'numpy>=2.2,<3'
polars 1.42.x 已对齐
pyarrow 24.x pip install 'pyarrow>=24,<25'
fastapi / uvicorn / PyJWT / bcrypt 当前版本即可 已对齐

落地步骤(建议,不在本任务范围)

  1. 生成 lockfile:在 NAS 容器内跑 pip freeze > requirements-lock.txt,作为三机共享 lock 基线。
  2. Mac 重建 venv310
    brew install python@3.10
    /opt/homebrew/bin/python3.10 -m venv venv310
    ./venv310/bin/pip install -r requirements-lock.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
    # 不含 vnpy(源码引用)/ PySide6(可选 GUI/ xtquantWindows only/ akshare(可选,按需)
    
  3. 加 requirements 约束:在 pyproject.tomldependencies 加上限:
    "pandas>=2.3,<3",      # 避免 pandas 3.x breaking change
    "numpy>=2.2,<3",
    
  4. CI 校验:在 Gitea Actions 加一步 pip check + import 探针,防止 drift 再发生。
  5. VPS 不动VPS 只跑 sanguo_qmt_bridge(依赖面 = fastapi + uvicorn + xtquant),与主项目 lock 解耦。

不推荐的方向

  • 把 prod 升到 pandas 3 / numpy 2 / Python 3.11 来"追平" Macprod 是稳定优先,3.0 新 major 须先在测试库充分回归。
  • 在 Mac venv311 补装 vnpy:vnpy 源码引用是项目既定设计(容器也是源码引用),pip install 会引入版本冲突。

5. 本轮修复记录(2026-07-14

为让 pytest --collect-only 0 错误通过,在 venv311 内新装:

版本 原因
polars + polars-runtime-32 1.42.1 tests/factor/test_data_adapter.py collect 失败;polars 是 pyproject.toml [alpha] 真实依赖
fastapi 0.139.0 tests/api/* collect 失败(No module named 'fastapi'
uvicorn[standard] 0.51.0 fastapi.testclient 间接需要
PyJWT 2.13.0 sanguo_api/auth.py import jwt
bcrypt 5.0.0 sanguo_api/auth.py import bcrypt

结果:pytest --collect-only -q380 collected + 1 error384 collected, 0 errorspytest tests/trader/ tests/data_platform/228 passed, 0 failed


6. 待办(跟踪项)

  • VPS SSH 复核(本轮 22 端口 Connection closed,下一轮巡检补实测版本)
  • pandas 3.x 锁上限决策(见 §4 步骤 3)
  • venv310 重建计划排期
  • requirements-lock.txt 生成(从 NAS 容器 freeze