Python 分钟 K 线完整教程:1m/5m 时间标签、集合竞价处理、自行合成周期与分钟级复权(附可运行代码)

本文详解A股分钟级K线数据的关键处理要点:时间标签定义为K线结束时刻、集合竞价(09:30)的正确归并、从1分钟线准确合成5分钟线的方法、分钟线量价校验(分钟成交量总和需等于日成交量)、前复权在分钟线中的应用与口径一致性要求。基于Python/pandas实现,覆盖数据获取、合成、复权、落盘及校验全流程。

本文用一个交易日的真实数据,讲清 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 线的结束时刻

周期第一根上午最后一根下午第一根全天根数
1m09:3011:3013:01241
5m09:3511:3013:0548
30m10:0011:3013:308

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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值