QMT 内置 Python 从 3.6 升到 3.12:两个版本并存怎么选,升级图什么,坑在哪

10·23 封网之后没几天,QMT 这边又动了第二刀:内置 Python 从 3.6 升到 3.12。社区公告早就提过一嘴,但一直缺一份正经的操作文档。最近流传出一份官方 PDF《迅投 QMT Python 版本升级操作流程》(落款:北京睿智融科),流程原文我放在了网盘:https://pan.quark.cn/s/687566bdb9b2

先说清楚:这份流程来自某一家券商的客户端,不代表所有券商都长这样。但迅投是同一家供应商,各家 QMT 的升级逻辑大概率类似,参考价值是有的——具体到你自己,以你券商的通知和客户端界面为准。

先放个心:3.6 和 3.12 可以并存,随时切换

很多人听到”升级”两个字就紧张,以为又是一刀切。这次不是。

py36 和 py312 两个版本可以同时存在,在客户端里选版本、保存、重启即可切换,随时可切回来。操作分两种情况:

场景 步骤
全新安装 登录交易端 → 选 Python 库版本 py3.12 → 点「Python 库下载」→ 设置版本保存 → 重启交易端 → 新增策略跑一遍验证
覆盖安装过、下过 py36 同上下载 py3.12;新版本有问题随时切回 py36,重启后旧策略照跑

所以这不是二选一的单行道。你可以先在 py3.12 上把新策略验证透了再切实盘,也可以随时退回 py36——升级把策略搞坏了不是不可逆事故。当然,别把”能切回去”当免检通行证,该测的还是先测。

那升级到底图什么?

3.6 是 2016 年的版本,3.12 是 2023 年的,中间隔了六个大版本。对写策略的人来说,好处集中在这几个地方:

速度变快了。3.11 是 CPython 史上最大的一次性能升级,官方专门搞了 “Faster CPython” 项目,整体提速 10–60%,3.12 继续优化。落到你的策略上:回测循环、信号计算、批量数据处理,同样的代码跑得更快——回测跑全年历史,省下来的都是你自己的时间。

库的兼容性好很多。这条最容易被低估。pandas 1.x/2.x、numpy 新版和大量现役第三方库早已放弃 3.6——3.6 环境被钉死在旧版 pandas 上,这正是 Panel 问题拖到今天才解决的原因。官方这次借升级把 pandas 换新,意味着后续迅投的新功能大概率只对 3.12 环境开发。留在 3.6 不是”稳定”,是”冻结”:不再有新库、新优化。

报错信息好读十倍。3.11+ 的 traceback 精确到行内的子表达式,告诉你具体是哪个表达式出错。策略半夜崩了看日志,定位效率完全不同——这一条是实打实地减少半夜爬起来调代码的次数。

f-string 终于补全了。当年 3.6.8 时代为了兼容性满篇 .format() 的历史包袱,3.12 环境下可以逐步还了。嵌套引号、多行、任意表达式都支持,日志拼接代码能短一半。

同样的数据占内存更少。CPython 3.11 对 dict、list、set、tuple、str 这些高频容器做了内部表示优化,同样的数据结构比 3.6 时代省 10–20% 内存。如果你加载十年以上的日线做历史回测,或者手里同时攥着十几只股票的分钟级行情做截面策略,这一点能明显感觉到——尤其是大 QMT 客户端本身就吃内存,能省的就是你的。

顺带说两句”听起来热闹但和你关系不大”的东西:GIL 改造(3.12 只是开始,handlebar 是事件驱动,你写不了并行主循环)、asyncio 改进(同上)、自定义解释器。别为这些升级,为前面五条足够了。

坑不止一个:pandas、numpy、语言废弃项都可能炸

安装本身十步里九步是”点下载、重启”,但从 py3.6 跳到 py3.12 跨了六个大版本,废弃和移除的东西不少。按出现概率从高到低排:

pandas:三个高频接口的返回类型变了(必踩)

pandas 从 0.2x 升到 1.x 之后,Panel 被移除,三个高频接口的返回类型从三维 Panel 变成了带两级列索引的 DataFrame:

  • ContextInfo.get_market_data —— 行情
  • ContextInfo.get_financial_data —— 财务
  • ContextInfo.get_top10_share_holder —— 股东

这条是官方 PDF 明说的,新旧写法对照和迁移示例也都在 PDF 里,直接对着改就行(下载地址在文首)。

numpy:类型别名全部删除

numpy 2.0 里把 np.int、np.float、np.bool、np.object、np.str 这些历史别名全删了——py3.6 时代写的 np.int64(price) 能跑,np.int(price) 在 py3.12 里直接 AttributeError。要改成 int(price) 或者显式写 np.int64。迅投 py312 环境里的 numpy 具体是 1.x 还是 2.x,你装完得先确认一下。

语言层面的废弃:这几个是确定会炸的

async 变成正式关键字。py3.5 引入时是”软关键字”,py3.7 转正了。如果你的策略里有变量名或函数参数叫 async(比如 def handlebar(context, async=False):),py3.12 直接 SyntaxError。全局搜一下,重命名就行。

collections 的抽象基类必须从 collections.abc 引。py3.3 就废弃了,py3.10 彻底删除。from collections import Mapping → from collections.abc import Mapping,Iterable、MutableMapping、Callable 同理。这个最容易被忽略,因为 py3.6 里跑得好好的 import,py3.12 一启动就挂。

imp 模块彻底删除。py3.4 废弃,py3.12 删干净了。如果策略里自己写了动态 import、插件加载之类的逻辑用了 imp.load_source 这些,要换成 importlib。

这些语言层面的坑有个共性:炸在 import 阶段或策略启动阶段,不是跑起来才炸。所以切版本后策略第一时间跑不起来,大概率就是这些命中了,先全局搜一遍改起来很快。

切版本前后的动作清单

官方文档只讲了”怎么升”,没讲”怎么确认升完之后一切正常”。我补一套可以照抄的动作:

升级前,在 py36 环境把存量策略在模拟账号跑一天,日志截图存档——这是你的基线。然后切 py3.12,重启,确认客户端里两个版本都在、切换生效。存量策略在 py3.12 模拟账号再跑一天,和基线逐项对比:下单是否正常、成交回报是否一致、日志有没有新增报错。重点盯那三个 pandas 接口涉及的策略,确认截面取数部分已按 PDF 改完。全部通过后再切实盘,切实盘当天先减半仓位或减半频率观察。

前后两份日志一对比,”这次升级到底动了什么”就是你自己客户端的实锤清单,比任何转发都准。

免责声明

  • 本文所述升级流程、界面选项与版本切换方式,整理自一份券商渠道流传的官方操作 PDF,仅代表该文档对应客户端的情况,不代表所有券商。你的客户端长什么样、支持哪些版本,以你所在券商的正式通知和客户端实际界面为准。
  • 文中关于 Python 3.12 性能、第三方库兼容性的描述来自公开技术资料的一般性结论,在 QMT 内置环境中的实际表现可能因客户端封装、内置库版本不同而有差异,请以你在自己环境中的实测结果为准。
  • 升级操作涉及策略运行环境变更,务必先在模拟环境完成验证,确认策略行为与升级前一致后,再考虑切换实盘;切换实盘初期建议降低仓位或频率观察。因版本切换、代码迁移导致的任何交易损失,由操作者自行承担。
  • 本文仅为技术信息分享,不构成任何投资建议,亦不构成对任何券商、任何软件产品的推荐。量化交易存在市场风险、技术风险与合规风险,入市需谨慎。
  • 文章内容基于撰写时(2026 年 10 月)的公开信息,此后官方政策、客户端功能如有变更,以最新公告为准,本文不另行更新。
  • 本文由 AI 创作,请自行判断是否适用。文中关于 Python 版本、pandas/numpy 废弃项的描述来自公开技术资料,QMT 内置环境中的实际情况可能与纯 Python 环境存在差异,请以你在自己券商客户端中的实测结果为准。

赞赏作者

赞赏码

本页面赞赏完全自愿,属于读者无偿鼓励,不提供任何商品、服务、答疑、内容解锁等对价。您可随意选择是否赞赏以及赞赏金额。

微信二维码 Share