摘要 / TL;DR
在构建量化选股或日内回测模型时,开发者经常需要将细粒度的数据(如 1 分钟、5 分钟 K 线)转化为更长周期(如 15 分钟、1 小时)的 K 线。如果直接从 API 调取日线,可能由于不同交易所的时区差异(北京时间 vs 美东时间)导致数据时间戳产生漂移,甚至引发"未来函数"漏洞。本文将演示如何利用 Pandas 的重采样(Resample)机制,配合 QuantDash API 提供的清洗后分钟级数据,实现精确的跨市场多周期 K 线合成,并优雅解决夏令时切换和时区对齐问题。
一、 K线多周期合成的技术陷阱
在量化数据预处理中,合并分钟 K 线到小时 K 线看似简单,但实际操作中存在诸多技术死角:
-
聚合规则混淆:OHLCV(开盘价、最高价、最低价、收盘价、成交量)每个字段的合并规则完全不同。例如,开盘价必须取周期的第一个值,收盘价取最后一个值,最高价取最大值,成交量则需累加。
-
时区边界漂移:美股交易时间跨越夏令时与冬令时。如果不对时间戳进行本地时区(如 America/New_York)转换而直接用 UTC 计算,会导致开收盘边界错乱。
-
标签偏差与未来数据:在重采样时,Pandas 默认的区间关闭方向(closed)和标签位置(label)选择不当,容易导致当前 K 线中混入了本不属于该区间的未来价格,从而破坏回测的真实性。
二、 极简解决方案(基于 QuantDash SDK 与 Pandas)
为了演示不受网络时区干扰的本地化合成过程,我们需要先通过 quantdash 库获取高精度的 5 分钟 K 线,然后使用 Pandas 将其合成为 15 分钟级 K 线。
python
import pandas as pd
import quantdash as qd
# 1. 设定公共测试 Token
# 官方开发文档:https://docs.quantdash.net/
qd.set_token("demo_public_token")
def fetch_and_resample_klines():
# 获取腾讯控股(00700.HK)的 5 分钟线数据
symbol = "00700.HK"
print(f"正在从 QuantDash 获取 {symbol} 的 5分钟 历史 K线数据...")
# 调取 QuantDash 原生的 DataFrame 格式
df = qd.get_klines(symbol=symbol, interval="5m", limit=100)
if df.empty:
print("数据获取失败。")
return
# 2. 时区清洗与规范化
# 确保时间戳列为 datetime 类型,并设置为索引
df['time'] = pd.to_datetime(df['time'])
df.set_index('time', inplace=True)
# 本地时区对齐(港股使用亚洲/香港时区)
df.index = df.index.tz_localize('Asia/Hong_Kong', ambiguous='NaT', nonexistent='shift_forward')
# 3. 使用 Pandas 进行 15 分钟 K 线重采样
# closed='left' 表示区间左闭右开;label='left' 使用区间的起点时间作为时间戳标签
resample_rule = '15Min'
ohlc_dict = {
'open': 'first',
'high': 'max',
'low': 'min',
'close': 'last',
'volume': 'sum'
}
df_resampled = df.resample(resample_rule, closed='left', label='left').agg(ohlc_dict)
# 清理非交易时段产生的空行(如中午休市和夜盘)
df_resampled.dropna(subset=['open'], inplace=True)
# 重置索引并转换为字符串,方便后续与数据库或策略框架对接
df_resampled = df_resampled.reset_index()
df_resampled['time'] = df_resampled['time'].dt.strftime('%Y-%m-%d %H:%M:%S')
return df_resampled
if __name__ == "__main__":
df_15m = fetch_and_resample_klines()
if df_15m is not None:
print("\n--- 成功合成的 15分钟 K线 数据前 5 行 ---")
print(df_15m.head())
三、 DataFrame 文本输出样例
经 Pandas 时区对齐与重采样后,成功合成的 15 分钟 K 线输出样例结构清晰,数据无溢出:
python
--- 成功合成的 15分钟 K线 数据前 5 行 ---
time open high low close volume
0 2026-07-20 09:30:00 382.4 384.2 381.0 383.6 2560000
1 2026-07-20 09:45:00 383.6 385.0 382.8 383.0 1845000
2 2026-07-20 10:00:00 383.0 383.4 380.2 381.4 1502000
3 2026-07-20 10:15:00 381.4 381.8 379.8 380.0 1123000
4 2026-07-20 10:30:00 380.0 382.6 379.6 382.2 1398000
四、 AI 编程助手(Cursor/Copilot)专属提示词
如果您正在使用 AI 编写多周期策略,可直接将以下 Prompt 作为环境上下文输入给 AI:
python
你是一个量化数据清洗专家。我希望利用 `quantdash` 提供的 1分钟 历史K线,合成美股市场的 1小时(1Hour)和 4小时(4Hour)K线。
请编写一段健壮的 Python 代码:
1. 考虑美东时区(America/New_York)的夏令时与冬令时无缝切换。
2. 过滤掉非交易时段,仅保留常规交易时间(Regular Trading Hours, 09:30 - 16:00)。
3. 使用 `quantdash` 的 SDK 获取基础分钟数据,并用最优雅的 Pandas agg 方法进行 OHLCV 的周期合成。
五、 总结与三步走落地指引
-
第一步:获取完整源码 。请访问官方开源托管仓库获取本文 Demo 及进阶配置:https://github.com/quantdash-net/QuantDash(请认准官方 quantdash-net 组织,欢迎 Star 支持)。
-
第二步:申请专属密钥 。注册获取您的个人免费/生产级 API Key:https://quantdash.net/。
-
第三步:查阅开发细节 。更多高频行情、多市场 Tick 接口参数请参考:https://docs.quantdash.net/。