# qmt-data-parser **Repository Path**: xiaoliouc/qmt-data-parser ## Basic Information - **Project Name**: qmt-data-parser - **Description**: python解析迅投qmt、miniqmt 数据DAT文件 - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 3 - **Forks**: 2 - **Created**: 2026-08-27 - **Last Updated**: 2026-09-03 ## Categories & Tags **Categories**: Uncategorized **Tags**: 迅投qmt, Python ## README # qmt-data-parser `qmt-data-parser` 是一个面向 MiniQMT / QMT 本地数据目录的 Python 解析库,用来直接读取 QMT 落地的历史二进制 `.dat` 文件,不依赖 xtquant、不需要启动 QMT 客户端。 支持的数据: - **日线 K 线** —— 64 字节记录,支持日期区间过滤,DataFrame 输出自动补齐 `preClose` / `suspendFlag` - **1 分钟 K 线** —— 64 字节记录 - **Tick 分笔** —— 144 字节记录,含五档行情、集合竞价记录特殊处理、QMT 时间戳解码(含北交所规则) - **datadir 目录发现** —— 传入 QMT 的 `datadir` 根目录即可按市场/代码/日期自动定位文件 ## 安装 ```bash pip install qmt-data-parser # 纯解析,无第三方依赖 pip install "qmt-data-parser[pandas]" # 需要 DataFrame 输出 ``` 或从源码安装: ```bash pip install . ``` ## 快速开始 ### 直接解析导出的 .dat 文件 ```python from qmt_parser import parse_tick_file, parse_min_file, parse_daily_file # Tick:文件名形如 000001-20250529-tick.dat ticks = parse_tick_file("data/000001-20250529-tick.dat") print(ticks[0].last_price, ticks[0].ask_price, ticks[0].time) # 1 分钟线 bars = parse_min_file("data/000001-1m.dat") # 日线,支持 YYYYMMDD 日期区间(也接受 date/datetime 对象) daily = parse_daily_file("data/000001-1d.dat", start="20230101", end="20231231") ``` ### 从 QMT datadir 读取 ```python from qmt_parser import QmtDataDir dd = QmtDataDir(r"D:\QMT\userdata_mini\datadir") ticks = dd.parse_ticks("SZ", "000001", "20250529") # tick bars = dd.parse_min("SZ", "000001") # 1 分钟线 daily = dd.parse_daily("SZ", "000001", "20240101", "20241231") # 也支持 SZ000001 / 000001.SZ 风格的证券代码 daily = dd.parse_daily_by_code("000001.SZ", start="20240101", end="20241231") ``` datadir 的目录布局约定: ``` datadir/ ├── SH/ │ ├── 0/600000/20250617.dat # tick(按证券代码分目录,按日分文件) │ ├── 60/600000.dat # 1 分钟线 │ └── 86400/600000.DAT # 日线 ├── SZ/… └── BJ/… ``` ### 输出为 pandas DataFrame ```python import pandas as pd from qmt_parser import QmtDataDir, ticks_to_dataframe, klines_to_dataframe dd = QmtDataDir(r"D:\QMT\userdata_mini\datadir") df_tick = ticks_to_dataframe(dd.parse_ticks("SZ", "000001", "20250529")) df_min = klines_to_dataframe(dd.parse_min("SZ", "000001")) df_day = klines_to_dataframe(dd.parse_daily("SZ", "000001"), daily=True) # daily=True 时自动补齐 suspendFlag(停牌标记)与回填后的 preClose ``` ### 流式读取大文件 每个解析器都有对应的迭代器版本,内存占用与文件大小无关: ```python from qmt_parser import iter_ticks, iter_min, iter_daily for tick in iter_ticks("data/000001-20250529-tick.dat"): ... for bar in iter_daily("data/000001-1d.dat", start="20230101"): ... ``` ## 数据结构 ### `TickData` | 字段 | 含义 | | --- | --- | | `symbol` / `market` / `date` | 证券代码、市场(SH/SZ/BJ,可从路径推断)、交易日 YYYYMMDD | | `time` | 北京时间 `datetime`,由 QMT 原始时间戳解码(属性,自动处理北交所规则) | | `last_price` / `last_close` | 最新价 / 昨收(文件中的价格均为千分之一单位的整数,已换算) | | `amount` / `volume` | 成交额 / 成交量 | | `ask_price` / `bid_price` | 卖一~卖五 / 买一~买五 | | `ask_vol` / `bid_vol` | 五档挂单量 | | `market_phase_status` | 市场阶段状态码(12 = 集合竞价) | 集合竞价记录(`market_phase_status == 12`)中成交字段为 0,参考价放在买一/卖一位置,库内已做处理。 ### `KlineData`(日线与分钟线共用) | 字段 | 含义 | | --- | --- | | `time` | 北京时间 `datetime`(属性,基于 `timestamp_ms`) | | `open` / `high` / `low` / `close` | 价格(已除以 1000 换算) | | `volume` / `amount` | 成交量 / 成交额(日线成交额已除以 100) | | `open_interest` | 持仓量(期货合约有意义) | | `pre_close` | 文件中记录的昨收价 | ## 设计说明 - **零强制依赖**:核心解析只用到标准库(`struct` / `datetime`);pandas 是可选 extra。 - **小端、无文件头**:所有 `.dat` 文件均为定长小端记录的裸流,尾部不完整记录默认丢弃(`parse_*` 的 `strict=True` 可改为报错)。 - **时间处理收敛在库内**:tick 时间戳偏移(沪深与北交所规则不同)、日线成交额缩放、停牌判断等细节由库统一处理。 ## 开发 ```bash pip install -e ".[dev]" pytest ``` 测试使用代码合成的二进制样本,不需要真实 QMT 数据文件。 ## License MIT 关于作者 子晓AI量化 ![输入图片说明](%E5%AD%90%E6%99%93AI%E9%87%8F%E5%8C%96.png) 微信号: shiyang170808 ![输入图片说明](wechat-qr.png) 如有迅投qmt、Ptrade开户需求,可咨询作者