qmt-parser 是一个面向 MiniQMT / QMT 本地数据目录的 Rust 解析库,用来读取历史二进制 .dat 文件,以及部分本地元数据存储。
它的目标很直接:
- 给应用层提供稳定、typed 的 Rust API。
- 给量化分析场景提供可选的 Polars
DataFrame输出。 - 把 QMT 文件里的时间戳、价格缩放、停牌判断等细节收敛到库内部。
- Tick 分笔文件
- 解析为
Vec<TickData> - 在启用
polarsfeature 时解析为DataFrame
- 解析为
- 1 分钟 K 线文件
- 解析为
Vec<MinKlineData> - 可选
DataFrame
- 解析为
- 日 K 线文件
- 支持字符串日期范围与
NaiveDatetyped 日期范围 DataFrame输出会补齐preClose、suspendFlag
- 支持字符串日期范围与
- 财务
.DAT- 自动识别
7001到7008类型 - 返回
Vec<FinanceRecord>,并附带FinanceDatatyped 载荷
- 自动识别
- 分红送配 LevelDB
- 通过
DividendDb查询指定证券的除权除息记录
- 通过
默认会启用 polars feature。
[dependencies]
qmt-parser = "0.1.0"如果你只需要纯 Rust 结构体,不需要 DataFrame 输出,可以关闭默认 feature:
[dependencies]
qmt-parser = { version = "0.1.0", default-features = false }如果你在本地联调,还可以直接用 Git 仓库:
[dependencies]
qmt-parser = { git = "https://github.com/sunnysab/qmt-parser" }use qmt_parser::parse_ticks_to_structs;
fn main() -> Result<(), Box<dyn std::error::Error>> {
let ticks = parse_ticks_to_structs("data/000001-20250529-tick.dat")?;
if let Some(first) = ticks.first() {
println!("{} {} {:?}", first.symbol, first.date, first.last_price);
}
Ok(())
}#[cfg(feature = "polars")]
use qmt_parser::parse_min_to_dataframe;
#[cfg(feature = "polars")]
fn main() -> Result<(), Box<dyn std::error::Error>> {
let df = parse_min_to_dataframe("data/000001-1m.dat")?;
println!("{:?}", df.shape());
Ok(())
}
#[cfg(not(feature = "polars"))]
fn main() {}use qmt_parser::parse_daily_to_structs;
fn main() -> Result<(), Box<dyn std::error::Error>> {
let rows = parse_daily_to_structs("data/day/000001.dat", "20230101", "20231231")?;
println!("rows = {}", rows.len());
Ok(())
}use qmt_parser::finance::FinanceReader;
fn main() -> Result<(), Box<dyn std::error::Error>> {
let records = FinanceReader::read_file("finance/002419_7001.DAT")?;
if let Some(first) = records.first() {
println!("{:?} {:?}", first.file_type, first.report_date);
}
Ok(())
}use qmt_parser::dividend::DividendDb;
fn main() -> Result<(), Box<dyn std::error::Error>> {
let mut db = DividendDb::new("/path/to/DividData")?;
let records = db.query("SH", "600000")?;
println!("records = {}", records.len());
Ok(())
}qmt_parser::tick- Tick 分笔解析、列名常量、
TickReader
- Tick 分笔解析、列名常量、
qmt_parser::min- 1 分钟 K 线解析、
MinReader
- 1 分钟 K 线解析、
qmt_parser::day- 日线解析、日期过滤、DataFrame 派生逻辑
qmt_parser::finance- 财务
.DAT自动识别与 typed 记录
- 财务
qmt_parser::dividend- LevelDB 分红送配查询
qmt_parser::error- Tick / Min / Day 解析错误类型
crate 根模块已经重导出了最常用的解析函数和结构体,常见调用可以直接从 qmt_parser::* 获取。
- Tick
raw_qmt_timestamp保留原始值,DataFrame路径还会额外生成time - Tick 价格字段按
1000.0缩放 - 日线成交额按
100.0缩放 - 日线
DataFrame中的preClose不是文件原值,而是库内按业务规则重算后的结果 - 分红模块保留
timestamp_raw与unknown64_raw,避免未确认字段被静默丢失
polars(默认开启)- 提供
parse_*_to_dataframe系列接口 - 暴露当前 DataFrame 输出列名常量和 helper
- 提供
- 这个库面向 QMT 本地数据格式,字段语义以实测样本和逆向结果为准
finance与dividend模块里仍有少数字段保留原始含义或启发式命名- README 给的是总览;更细的字段说明、返回值语义和示例请直接看 rustdoc
cargo doc --no-deps如果需要同时看到 polars 相关接口,请确保在默认 feature 下生成,或者显式执行:
cargo doc --no-deps --features polars