如何将NQ期货5分钟OHLCV数据按18:00CT-17:00CT周期重采样为日线数据
解决CME NQ期货自定义交易日重采样问题
要实现18:00CT至次日17:00CT的日线OHLCV聚合,核心是将这个非自然日的交易时段映射到统一的日期标签,具体步骤如下:
1. 时区处理(关键)
CME采用美国中部时间(CT/CDT,含夏令时),必须将时间索引转换为带时区的格式,避免夏令时导致的时间偏移错误:
import pandas as pd # 读取原始数据 nq_data = pd.read_csv(r"C:\Python\data\NQ Data Extract 2023-07-20.csv") # 合并日期时间列并转换为带CT时区的时间 nq_data['DateTime'] = pd.to_datetime(nq_data['Date'] + ' ' + nq_data['Time']) # 转换为美国中部时区,自动处理夏令时模糊/缺失时间 nq_data['DateTime'] = nq_data['DateTime'].dt.tz_localize('US/Central', ambiguous='infer', nonexistent='shift_forward') nq_data.set_index('DateTime', inplace=True) # 删除冗余的日期、时间列 nq_data.drop(['Date', 'Time'], axis=1, inplace=True)
2. 自定义交易日重采样
我们需要将前一天18:00CT到当天17:00CT的数据聚合为当天的日线数据,这里提供两种等价实现方式:
方式一:索引偏移法
通过调整时间索引,将目标交易时段映射到同一个自然日,再进行重采样:
# 将所有时间点减去18小时,把18:00CT的起始时间对齐到自然日00:00 adjusted_index = nq_data.index - pd.Timedelta(hours=18) nq_adjusted = nq_data.set_index(adjusted_index) # 按自然日重采样并聚合OHLCV df_daily = nq_adjusted.resample('1D').agg({ 'Open': 'first', 'High': 'max', 'Low': 'min', 'Close': 'last', 'Volume': 'sum' }).copy() # 将日期标签加1天,得到实际交易日(比如映射到7月20日的时段对应7月21日交易日) df_daily.index = df_daily.index + pd.Timedelta(days=1) # 删除全空的无效交易日 df_daily.dropna(how='all', subset=['Open', 'High', 'Low', 'Close'], inplace=True)
方式二:resample offset参数法
直接通过resample的offset参数调整重采样起始时间,无需手动修改索引:
# 用offset参数将重采样起始时间偏移18小时,匹配CME交易日起点 df_daily = nq_data.resample('1D', offset='-18h').agg({ 'Open': 'first', 'High': 'max', 'Low': 'min', 'Close': 'last', 'Volume': 'sum' }).copy() # 删除全空的无效交易日 df_daily.dropna(how='all', subset=['Open', 'High', 'Low', 'Close'], inplace=True)
逻辑验证
以2023-07-20 18:00CT到2023-07-21 17:00CT的时段为例:
- 方式一中,该时段时间减去18小时后,会被归入2023-07-20自然日,最终索引加1天对应2023-07-21交易日
- 方式二中,
offset='-18h'直接将重采样起始点设为前一天18:00,聚合结果的日期即为对应交易日
内容的提问来源于stack exchange,提问作者Dex
相关产品推荐
相关产品推荐

