本文用一个交易日的真实数据,讲清 A 股分钟 K 线的几个关键约定:时间标签代表什么、为什么 1 分钟线一天 241 根、怎样从 1 分钟线正确合成 5 分钟线、分钟线该用哪种复权口径,以及如何做量价校验。示例标的 600519.SH,交易日 2026-10-30,代码均于 2026-11-01 实跑。
1. 环境准备
pip install quantdash pandas
export QUANTDASH_API_KEY=你的密钥
Python 3.9+。分钟 K 线需要开通对应权限,否则接口返回 403。
2. 获取 1 分钟、5 分钟、30 分钟 K 线
from datetime import datetime
import pandas as pd
from quantdash import QuantDash
qd = QuantDash()
def ms(s: str) -> int:
"""'YYYY-mm-dd HH:MM' 转毫秒时间戳"""
return int(datetime.strptime(s, "%Y-%m-%d %H:%M").timestamp() * 1000)
def get_min(symbol, period, day, adjust="none"):
return qd.klines.get(symbol, period=period, adjust=adjust,
start_time=ms(f"{day} 09:00"), end_time=ms(f"{day} 15:10"),
count=10000, to_dataframe=True)
for p in ["1m", "5m", "30m"]:
d = get_min("600519.SH", p, "2026-10-30")
print(p, len(d), d["trade_time"].iloc[0], "->", d["trade_time"].iloc[-1])
输出:
1m 241 2026-10-30 09:30:00 -> 2026-10-30 15:00:00
5m 48 2026-10-30 09:35:00 -> 2026-10-30 15:00:00
30m 8 2026-10-30 10:00:00 -> 2026-10-30 15:00:00
支持的分钟周期为 1m/5m/15m/30m/60m。按区间取数时一定要显式传 count(上限 10000),否则默认只返回 100 根。
3. 时间标签:标签 = 这根 K 线的结束时刻
| 周期 | 第一根 | 上午最后一根 | 下午第一根 | 全天根数 |
|---|---|---|---|---|
| 1m | 09:30 | 11:30 | 13:01 | 241 |
| 5m | 09:35 | 11:30 | 13:05 | 48 |
| 30m | 10:00 | 11:30 | 13:30 | 8 |
1 分钟线多出的一根是 09:30,查看它:
m1 = get_min("600519.SH", "1m", "2026-10-30")
print(m1.loc[0, ["trade_time", "open", "high", "low", "close", "volume"]])
开高低收都是 1363.00,成交量 1534——这是开盘集合竞价。
对齐信号时的注意点:标 09:35 的 5 分钟线在 09:35 才收盘,策略在 09:35 之后才能使用它的收盘价,否则就是未来函数。
4. 从 1 分钟线合成 5 分钟线
4.1 错误写法
m1["ts"] = pd.to_datetime(m1["trade_time"])
wrong = (m1.set_index("ts")
.resample("5min", label="right", closed="right")
.agg({"open": "first", "close": "last", "volume": "sum"})
.dropna())
print(len(wrong)) # 49,多一根
09:30 的集合竞价被单独放进了一个 5 分钟桶。
4.2 正确写法
def resample_min(m1: pd.DataFrame, rule: str = "5min") -> pd.DataFrame:
d = m1.copy()
d["ts"] = pd.to_datetime(d["trade_time"])
auction = d["ts"].dt.strftime("%H:%M") == "09:30"
d.loc[auction, "ts"] += pd.Timedelta(minutes=1) # 并入第一根
agg = {"open": "first", "high": "max", "low": "min",
"close": "last", "volume": "sum", "amount": "sum"}
return (d.set_index("ts")
.resample(rule, label="right", closed="right")
.agg(agg)
.dropna(subset=["close"]))
mine = resample_min(m1)
api5 = get_min("600519.SH", "5m", "2026-10-30")
print(len(mine), len(api5)) # 48 48
print(int(mine["volume"].iloc[0]), int(api5["volume"].iloc[0])) # 4148 4148
接口给的第一根 5 分钟线成交量 4148 = 1534(集合竞价)+ 2614(09:31–09:35),合成结果完全一致。
5. 量价校验
day = qd.klines.get("600519.SH", period="1d", adjust="none", count=3, to_dataframe=True)
day_vol = int(day.loc[day["trade_date"] == "2026-10-30", "volume"].iloc[0])
print(int(m1["volume"].sum()), int(api5["volume"].sum()), day_vol)
三者都是 59927。建议把「分钟线成交量加总 = 日线成交量」写进每日入库校验。
6. 分钟线复权
除权会影响分钟线。600519.SH 在 2026-06-26 除权,取除权前的 2026-06-24:
raw = get_min("600519.SH", "5m", "2026-06-24", adjust="none")
fwd = get_min("600519.SH", "5m", "2026-06-24", adjust="forward")
print(raw["close"].iloc[-1], round(fwd["close"].iloc[-1], 2),
round(raw["close"].iloc[-1] / fwd["close"].iloc[-1], 6))
f = qd.klines.ex_factors("600519.SH", to_dataframe=True)
print(f.tail(1)[["trade_date", "ex_factor"]])
输出:不复权 1207.68,前复权 1179.76,比值 1.023663,与 2026-06-26 的除权因子一致。
口径选择:
| 场景 | 口径 |
|---|---|
| 日内交易、挂单价比较 | none |
| 跨除权日的分钟回测 | forward(整段重拉) |
| 长期落盘存档 | none + 单独存除权因子 |
7. 批量与落盘
from pathlib import Path
out = Path("data/min5")
out.mkdir(parents=True, exist_ok=True)
for sym in ["600519.SH", "000001.SZ"]:
d = get_min(sym, "5m", "2026-10-30")
d.to_parquet(out / f"{sym}_20261030_5m_raw.parquet", index=False)
print(sym, len(d))
按「标的_日期_周期_口径」命名,后续排查口径问题会轻松很多。
8. 常见问题
| 现象 | 原因 | 处理 |
|---|---|---|
| 1m 一天 241 根 | 含 09:30 集合竞价 | 正常 |
| 自己合成多一根 | 集合竞价单独成桶 | 并入第一根 |
| 和别的数据错一根 | 标签约定不同 | 确认结束时刻/开始时刻 |
| 除权前后断层 | 拼接了不同时间拉的前复权数据 | 存不复权,按因子计算 |
| 403 | 未开通分钟权限 | 开通后重试 |
9. 总结
分钟 K 线最关键的是三个约定:标签是结束时刻、09:30 为集合竞价、复权口径要固定。把这三点写进代码和校验,分钟级研究的数据底座就稳了。
接口文档:https://docs.quantdash.net/zh-Hans
本文详解A股分钟级K线数据的关键处理要点:时间标签定义为K线结束时刻、集合竞价(09:30)的正确归并、从1分钟线准确合成5分钟线的方法、分钟线量价校验(分钟成交量总和需等于日成交量)、前复权在分钟线中的应用与口径一致性要求。基于Python/pandas实现,覆盖数据获取、合成、复权、落盘及校验全流程。
497

被折叠的 条评论
为什么被折叠?



