Files
big-qmt/py-client
2026-09-18 19:21:05 +08:00
..
2026-09-01 14:28:49 +08:00
2026-09-07 21:22:51 +08:00
2026-09-17 00:56:05 +08:00
2026-09-18 19:07:43 +08:00
2026-09-17 15:10:46 +08:00
2026-09-14 23:59:53 +08:00
2026-09-18 19:21:05 +08:00
2026-09-17 06:59:46 +08:00
2026-09-07 21:22:51 +08:00
2026-09-07 21:22:51 +08:00
2026-09-17 00:56:05 +08:00
2026-09-17 00:56:05 +08:00
2026-09-07 21:22:51 +08:00
2026-09-10 20:13:10 +08:00

Python 3.14 客户端

运行目标为 Windows x64、标准 CPython 3.14;本次验证版本为 3.14.7。 迁移仅针对本目录QMT 服务端及其内置 Python 不变。

安装与运行

py-client 目录执行 PowerShell 命令:

py -3.14 -m venv .venv
.venv/Scripts/python.exe -m pip install -r requirements.txt
.venv/Scripts/python.exe -m pip check
.venv/Scripts/python.exe main.py

requirements.txt 锁定本次在 Python 3.14 下实际验证的完整依赖版本。 不要复用 Python 3.11 的虚拟环境。.python-version 为支持该文件的工具声明版本。

优化范围与行为约束

已审查本目录全部 39 个原有 Python 源文件;只修改有适用优化或迁移需求的文件。

  • 移除旧的 from __future__ import annotations,使用 Python 3.14 原生延迟求值注解,前向引用不再手工加引号。验证所有业务模块、类及方法注解可正常解析。
  • 订单时间解析采用上限 4096 项的 LRU 缓存;每次刷新只读取一次时间和转换一次订单状态。缓存键为日期与时间原值,订单字段变化立即生效,继续使用原 strptime 解析规则。
  • 信号时间边界解析采用上限 256 项的 LRU 缓存,当前时刻与允许交易的结果不缓存。
  • 趋势、做 T 信号筛选直接查持仓字典,避免逐信号扫描持仓列表;候选顺序、重复信号及行情请求顺序不变。
  • 交易时段常量复用,订单方向映射复用;避免构建单元素集合、合并校验列表和已存在状态的默认对象。
  • 保持原浮点计算、价格阈值、资金规则、调度频率、线程结构、HTTP 重试、SQLite 事务及深复制隔离语义。

未启用 free-threaded Python、JIT 或多解释器线程池。现有交易任务共享客户端、锁和可变状态,切换并发模型不是等价替换。 延迟注解的运行时读取语义由原字符串注解变为按需求值,外部 SDK 调用者若需要字符串形式,应使用 annotationlib.get_annotations(..., format=Format.STRING)

官方说明:Python 3.14 延迟注解

验证与性能

.venv/Scripts/python.exe -B -m unittest discover -s tests -v
.venv/Scripts/python.exe -B benchmarks/hotpaths.py

130 项离线测试通过,覆盖 SDK 与 API 字段契约、委托簿、配置校验、IPO 申购状态机、 ZT 轮次状态机正T/反T、Trend 采集任务与 Python 3.14 回归。 测试使用模拟客户端和临时目录,不启动真实交易、不访问真实接口。

同一 CPython 3.14.7、原算法与优化算法对比;每组重复 5 次取中位数:

场景 原算法 µs/次 优化后 µs/次 倍率
订单日期解析(缓存命中) 4.263 0.061 69.90×
信号时间边界解析(缓存命中) 0.230 0.045 5.09×
交易时段判断(下午) 0.413 0.183 2.25×
订单方向解析 0.163 0.092 1.78×
1000 持仓、2000 信号筛选 13127.276 67.827 193.54×

以上是局部微基准,缓存未命中仍执行原解析逻辑;不是 3.11 对 3.14 的整轮交易加速数据。 网络及数据库耗时未纳入,未做实盘端到端性能测量。

基线问题

修改前 18 项测试中 12 项失败,原因是模型仅有 get_local_order_id 属性,调用处却使用缺失的 local_order_id,存储层还将属性当方法调用。 本次增加同一属性的兼容别名,并统一存储层属性访问,保留原属性名和 API 数据字段;这些是使既有撤单、成交对账测试恢复的接口修复。

ETF 自适应网格策略

入口为 strategy: etf,标的和参数见 etc/etf.yaml 完整规则和启用步骤见 strategy/etf/README.md

ZT 做 T 策略2026-09 重构)

ZT 已从"本地 SQLite 重算持仓 + base/added 分桶归档"改为正T/反T 轮次状态机 持仓数量只以券商快照为准,本地只记录"意图与两条腿的状态"。设计说明见 ../docs/zt.md

  • 新增状态文件 {qmt_data_dir}/zt_{account_id}_rounds.json,旧的 zt_{account_id}_state.db 不再读写,保留作为审计记录。
  • libs/state.pystrategy/zt/{open,positions,profit}.py 已删除。
  • 不接管账户已有持仓:只有本策略自己建仓(base_source=opened)的证券 才被管理,其它持仓原样保留、不做 T日志以 [ZT跳过]/[ZT汇总] 未接管=N 体现。升级时会丢弃状态文件里旧版本留下的"接管"记录。
  • zt_sell_ratiozt_buy_fall_pctzt_max_price 现在真正生效; 新增 zt_t_band_pct(默认 1.0)与 zt_max_hold_days(默认 5
  • ZT 日志带 [ZT启动]/[ZT成交]/[ZT状态]/[ZT轮次]/[ZT决策]/[ZT下单]/[ZT跳过]/ [ZT汇总]/[ZT异常] 标签,可直接 grep 定位问题; 其中 [ZT决策] 每只证券每轮一行,写明最终动作或等待原因。