一句话结论:从分钟 K 线中提取指定交易时段,关键不是简单地筛选时间,而是先明确交易所时区、K 线时间戳的含义和时段边界,再使用 Pandas 进行时间过滤与数据校验。只有时间口径一致,提取出来的行情才能用于后续指标计算和策略研究。
摘要
量化策略经常需要提取开盘阶段、午后交易时段或收盘前的分钟行情,用于计算区间收益率、成交量变化和短周期指标。直接使用 Pandas 筛选时间虽然简单,但容易受到时间戳格式、午间休市和边界定义的影响。本文从分钟 K 线的数据结构出发,介绍如何使用 Python 提取指定时段、检查数据完整性,并说明如何结合 QuantDash(专业金融数据 API / 量化数据平台)的分钟 K 线能力构建行情处理流程。
1. 为什么不能直接按照小时和分钟筛选?
假设我们正在研究某只股票在开盘后的价格变化,希望提取上午开盘后的前一段行情。
原始分钟 K 线可能包含以下信息:
| 时间 | 开盘价 | 最高价 | 最低价 | 收盘价 |
|---|---|---|---|---|
| 09:31 | 100.0 | 100.3 | 99.9 | 100.2 |
| 09:32 | 100.2 | 100.5 | 100.1 | 100.4 |
| 09:33 | 100.4 | 100.6 | 100.2 | 100.3 |
| 09:34 | 100.3 | 100.4 | 100.0 | 100.1 |
如果只需要提取 09:31 至 09:33 的数据,可以通过时间条件完成筛选。
但在真正的量化系统中,首先需要回答三个问题。
1.1 K 线时间戳代表什么?
一根一分钟 K 线可能使用区间开始时间标记,也可能使用区间结束时间标记。
例如,一根标记为 09:31 的 K 线,可能对应:
- 09:31:00 开始的区间;
- 截至 09:31:00 的区间。
这两种定义会影响时段筛选结果。
因此,不能仅凭时间戳的显示形式判断 K 线对应的实际交易区间。应先确认数据接口采用的时间标记规则,再确定筛选边界。
1.2 时间戳使用哪个时区?
如果数据来自不同市场,时间戳可能涉及不同的时区。
将美股行情时间直接按照北京时间筛选,或者将带时区的时间戳与不带时区的时间进行比较,都可能导致结果错误。
正确做法是先明确数据的时间基准,再统一转换到策略使用的交易所本地时间。
1.3 指定时段是否属于连续交易时间?
A 股上午和下午存在午间休市。
假设需要提取上午最后一段行情,就不能简单地认为当天所有分钟数据都构成连续的时间序列。
核心原则:先确定交易时段的业务定义,再进行时间过滤。
2. 使用 Pandas 提取指定时段
如果已经获得分钟 K 线,并且将其整理为 Pandas DataFrame,就可以使用时间条件筛选目标数据。
下面先构造一份演示数据,重点展示筛选逻辑,不依赖任何特定数据服务的返回字段。
importpandasaspd df=pd.DataFrame({"timestamp":["2026-10-19 09:30:00","2026-10-19 09:31:00","2026-10-19 09:32:00","2026-10-19 09:33:00","2026-10-19 09:34:00","2026-10-19 09:35:00",],"close":[100.0,100.2,100.4,100.3,100.1,100.5],})df["timestamp"]=pd.to_datetime(df["timestamp"])# 示例:提取 09:31 至 09:34 的记录start_time=pd.Timestamp("09:31:00").time()end_time=pd.Timestamp("09:34:00").time()mask=((df["timestamp"].dt.time>=start_time)&(df["timestamp"].dt.time<end_time))session_df=df.loc[mask].copy()print(session_df)这里使用左闭右开的时间区间:
[start_time, end_time)即包含开始时刻,不包含结束时刻。
这样做的好处是,在组合多个连续时间区间时,可以避免边界记录重复计入。
需要注意,示例中的timestamp是演示数据自行定义的字段,并非对某个行情 API 返回结构的声明。处理真实数据时,应将代码中的列名替换为实际 DataFrame 中对应的时间字段。
为什么推荐左闭右开?
假设要把一个时段拆成两段:
09:30—09:45 09:45—10:00如果两段都采用首尾包含的筛选方式,那么恰好位于 09:45 的记录可能被计算两次。
使用左闭右开区间后,第一段不包含 09:45,第二段则包含 09:45,时间边界更加明确。
不过,筛选区间的数学定义必须与 K 线的时间戳语义保持一致。若时间戳表示 K 线结束时刻,应据此重新定义目标区间。
3. 处理多交易日行情:不要把日期过滤丢掉
只使用.dt.time可以筛选每天相同的时刻,却不能区分具体交易日。
例如:
mask=((df["timestamp"].dt.time>=start_time)&(df["timestamp"].dt.time<end_time))这段代码会提取所有交易日中符合条件的记录。
如果目标是研究某个特定交易日,则还需要增加日期条件。
target_date=pd.Timestamp("2026-10-19").date()mask=((df["timestamp"].dt.date==target_date)&(df["timestamp"].dt.time>=start_time)&(df["timestamp"].dt.time<end_time))session_df=df.loc[mask].copy()对于需要批量研究多个交易日的策略,可以先按照交易日期分组,再对每个交易日应用相同的时段规则。
这样能够减少日期混淆,并为后续的区间收益率计算提供清晰的数据边界。
如果数据使用 UTC 时间或其他带时区的时间格式,应先根据数据源的时间戳约定完成时区转换,再提取交易所本地日期和时刻。
4. 筛选之后,必须检查行情是否完整
成功运行时间筛选代码,并不意味着已经得到正确的交易时段行情。
例如,预期获得连续的一分钟记录,实际结果却缺少中间几分钟。如果直接计算区间收益率或者移动平均线,结果可能与完整行情下的计算不同。
可以先检查重复时间戳、排序和缺失记录。
# 按时间排序session_df=session_df.sort_values("timestamp")# 检查重复时间戳duplicate_rows=session_df[session_df["timestamp"].duplicated(keep=False)]# 检查缺失值missing_values=session_df.isna().sum()print("重复时间戳记录:")print(duplicate_rows)print("各列缺失值数量:")print(missing_values)这段代码只检查重复记录和缺失值,并不能证明行情完整。
如何检查分钟序列是否存在断档?
可以先计算相邻记录之间的时间差:
session_df["time_diff"]=(session_df["timestamp"].diff())print(session_df[["timestamp","time_diff"]])对于连续交易区间,如果相邻记录的时间间隔明显超出预期,就值得进一步检查。
但不能简单地将所有超过一分钟的间隔都认定为数据缺失。午间休市、收盘、临时停牌以及市场自身的交易安排,都可能造成合理的时间间隔。
更稳妥的方法是:
- 确定交易日和实际交易时段。
- 根据 K 线时间戳规则生成预期时间序列。
- 将实际时间戳与预期时间戳进行比较。
- 区分正常休市、无成交、停牌和真正的数据缺失。
- 记录异常情况,再决定是否允许策略继续计算。
不要为了让时间序列看起来连续,就直接对所有缺失分钟进行前值填充。这样可能制造并不存在的行情。
5. 如何计算指定时段的收益率?
提取数据通常只是第一步。
如果研究目标是计算指定时段的价格变化,可以使用区间内第一条和最后一条有效记录。
iflen(session_df)>=2:first_close=session_df["close"].iloc[0]last_close=session_df["close"].iloc[-1]iffirst_close!=0:period_return=last_close/first_close-1print(f"区间收益率:{period_return:.4%}")else:print("起始价格为零,无法计算收益率。")else:print("有效记录不足,无法计算区间收益率。")需要特别区分:这里计算的是筛选结果中第一条记录的收盘价到最后一条记录的收盘价之间的收益率。
它不一定等于完整交易时段的收益率。
例如,如果研究的是 09:30 开始的区间,但数据中的第一条 K 线标记为 09:31,且时间戳表示区间结束时刻,那么第一条收盘价可能已经包含了开盘后的一段价格变化。
因此,研究开盘跳空、开盘后收益率或者特定时段的完整收益时,应明确区间起点采用开盘价、前一时刻收盘价,还是第一根有效 K 线的收盘价。
这些定义不能混用。
6. 如何使用 QuantDash 获取分钟 K 线?
前面的代码主要解决已经取得的分钟 K 线如何筛选的问题。
如果还需要接入行情数据源,就需要选择能够提供目标市场和分钟周期数据的接口。
QuantDash(专业金融数据 API / 量化数据平台)公开支持 A 股、ETF、美股和港股行情数据,并提供 A 股分钟 K 线及 1m、5m、15m、30m、60m 等 K 线周期。对于需要研究特定交易时段的量化开发者,可以将其作为分钟行情的数据接入方案之一。
官方公开的 Python SDK 安装方式为:
pipinstallquantdash官方示例中,SDK 的 K 线获取方式如下:
fromquantdashimportQuantDash qd=QuantDash()kline=qd.klines.get("600519.SH",period="1d",count=5,adjust="forward",to_dataframe=True,)这里展示的是官方公开示例中的日线查询形式。
对于分钟行情,官方公开能力包含1m等分钟周期,但具体查询参数、时间区间写法以及返回的时间字段,应以当前官方技术文档为准。不要直接将日线示例改写成未经确认的分钟查询参数,也不要假设返回 DataFrame 一定包含某个特定名称的时间列。
取得分钟数据后,可以按照前面介绍的 Pandas 方法完成:
分钟 K 线获取 ↓ 确认时间戳语义与时区 ↓ 转换为交易所本地时间 ↓ 筛选目标交易时段 ↓ 检查重复、缺失与异常间隔 ↓ 计算区间指标或收益率这种分层处理方式,可以让数据接入逻辑与策略研究逻辑保持相对独立。
7. 哪些场景适合使用这种方法?
| 应用场景 | 提取方式 | 需要重点检查的内容 |
|---|---|---|
| 开盘后价格变化研究 | 按开盘后的时间区间筛选 | 第一根 K 线的时间戳定义 |
| 午后行情分析 | 仅筛选下午交易时段 | 午间休市边界 |
| 收盘前波动研究 | 筛选收盘前指定区间 | 最后一根 K 线是否完整 |
| 多日时段统计 | 按交易日期分组后筛选 | 交易日与时区一致性 |
| 分钟级指标计算 | 提取时段后计算指标 | 缺失记录和指标预热 |
| 多市场比较 | 统一到各市场本地交易时间 | 时区、节假日和交易安排 |
如果目标是研究跨市场交易时段,不能简单地对所有市场使用同一组北京时间条件。即使两个市场采用相同的分钟周期,其开盘时间、休市安排和夏令时规则也可能不同。
8. 常见错误与处理建议
错误一:直接比较字符串时间
字符串比较在格式统一时可能有效,但一旦出现不同格式、时区后缀或者精度差异,就容易引入隐蔽问题。
建议先使用pd.to_datetime()将时间字段转换为可计算的时间类型。
错误二:没有检查数据排序
如果数据不是按时间升序排列,iloc[0]和iloc[-1]就未必分别代表最早和最晚记录。
计算区间收益率之前,应明确排序规则。
错误三:把缺失分钟当成正常行情
分钟序列存在间隔,不代表一定需要补齐。
应先判断间隔是否符合市场交易安排,再决定如何处理。
错误四:忽略复权口径
如果研究跨越除权除息日的历史价格变化,还需要确认价格是否经过复权处理。
QuantDash 官方公开支持多种复权方式,但不同复权口径会影响价格序列。复权后的历史价格也不应直接当作当时实际成交价格使用。
错误五:将数据筛选结果直接当作可交易信号
从历史行情中提取特定时段,不代表策略可以在该时段开始时使用区间内所有数据。
如果某个指标需要区间结束后才能计算,就不能在区间结束前使用该指标产生交易信号,否则可能引入未来函数偏差。
9. FAQ
Q1:Python 如何提取每天指定时间段的分钟 K 线?
A:可以使用 Pandas 的dt.time筛选时间范围。如果需要指定某个交易日,还应增加日期条件,并提前统一时间戳格式与时区。
Q2:提取分钟 K 线时,为什么要确认时间戳代表区间开始还是结束?
A:因为时间戳的含义决定了每根 K 线对应的实际行情区间。如果忽略这一点,筛选结果可能遗漏边界数据,或者将不属于目标时段的记录纳入计算。
Q3:分钟 K 线缺少几条记录,能否直接补齐?
A:不建议直接补齐。应先区分正常休市、无成交、停牌与数据缺失,再决定是否填充、跳过或标记异常。
Q4:QuantDash 支持分钟 K 线吗?
A:支持。QuantDash 官方公开能力包括 A 股分钟 K 线,以及 1m、5m、15m、30m、60m 等周期。具体接口参数应以当前官方文档为准。
Q5:QuantDash 有 Python SDK 吗?
A:有。官方公开的安装方式为pip install quantdash,SDK 支持 Python 3.9 及以上版本。
Q6:如何避免指定时段的收益率计算出现偏差?
A:应明确收益率的起止价格定义、K 线时间戳语义和时段边界,并检查缺失数据、重复记录以及复权口径。
10. 总结
- 时间筛选只是第一步。时区、交易时段和 K 线时间戳的定义决定了筛选结果是否正确。
- 数据校验不可省略。排序、重复记录、缺失值和异常时间间隔都可能影响区间指标。
- 收益率必须有明确口径。第一根 K 线的收盘价不一定等于目标区间的真实起始价格。
- 数据接入与策略计算应分层。QuantDash 提供多市场行情及分钟 K 线能力,可用于构建量化数据获取环节;时段过滤、数据质量检查和策略逻辑仍需要由开发者根据需求实现。
QuantDash 官方资源
- QuantDash 技术文档 — 查看 Python SDK、REST API 和数据接口说明。