Files
big-qmt/py-client/README.md
2026-09-17 00:56:05 +08:00

87 lines
5.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Python 3.14 客户端
运行目标为 Windows x64、标准 CPython 3.14;本次验证版本为 3.14.7。
迁移仅针对本目录QMT 服务端及其内置 Python 不变。
## 安装与运行
`py-client` 目录执行 PowerShell 命令:
```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 延迟注解](https://docs.python.org/3.14/whatsnew/3.14.html#pep-649-pep-749-deferred-evaluation-of-annotations)。
## 验证与性能
```powershell
.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`](etc/etf.yaml)
完整规则和启用步骤见 [`strategy/etf/README.md`](strategy/etf/README.md)。
## ZT 做 T 策略2026-09 重构)
ZT 已从"本地 SQLite 重算持仓 + base/added 分桶归档"改为**正T/反T 轮次状态机**
持仓数量只以券商快照为准,本地只记录"意图与两条腿的状态"。设计说明见
[../docs/zt.md](../docs/zt.md)。
- 新增状态文件 `{qmt_data_dir}/zt_{account_id}_rounds.json`,旧的
`zt_{account_id}_state.db` 不再读写,保留作为审计记录。
- `libs/state.py``strategy/zt/{open,positions,profit}.py` 已删除。
- **不接管账户已有持仓**:只有本策略自己建仓(`base_source=opened`)的证券
才被管理,其它持仓原样保留、不做 T日志以 `[ZT跳过]`/`[ZT汇总] 未接管=N`
体现。升级时会丢弃状态文件里旧版本留下的"接管"记录。
- `zt_sell_ratio``zt_buy_fall_pct``zt_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决策]` 每只证券每轮一行,写明最终动作或等待原因。