You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

股票期权历史蜡烛图缺失致重采样时间异常的解决方法咨询

解决股票期权K线重采样时间戳异常问题

针对你遇到的「首尾1分钟K线缺失导致重采样后时间偏移」问题,提供两种直接可行的解决方案:

方案一:补全缺失的1分钟K线数据

先为每个交易日生成完整的1分钟时间序列,填充缺失的K线(行情数据沿用前值,成交量设为0),再进行重采样,从根源避免时间偏移。

修改后的代码

import pandas as pd

def fill_missing_minute_data(data, market_open="09:15:00", market_close="15:30:00"):
    # 按天分组处理
    filled_dfs = []
    tz = data.index.tz  # 保留原数据时区
    for day, group in data.groupby(lambda x: x.date()):
        # 生成当天完整的1分钟时间序列
        start_dt = pd.Timestamp(f"{day} {market_open}", tz=tz)
        end_dt = pd.Timestamp(f"{day} {market_close}", tz=tz)
        full_minutes = pd.date_range(start=start_dt, end=end_dt, freq="1T")
        
        # 重新索引并填充缺失值
        filled_group = group.reindex(full_minutes)
        # 行情字段(open/high/low/close)沿用前值,成交量填0
        filled_group[['open', 'high', 'low', 'close']] = filled_group[['open', 'high', 'low', 'close']].ffill()
        filled_group['volume'] = filled_group['volume'].fillna(0)
        
        filled_dfs.append(filled_group)
    
    return pd.concat(filled_dfs)

def regroup_data(data, regroup_interval):
    gp = data.groupby(lambda x: x.date())
    dfList = []
    for k, res in gp:
        resampledf = res.resample(regroup_interval).agg(
            {'open': 'first', 'high': 'max', 'low': 'min', 'close': 'last', 'volume': 'sum'})
        resampledf.reset_index(inplace=True)
        dfList.append(resampledf)
    resSampleDF = pd.concat(dfList, ignore_index=True)
    resSampleDF.set_index('date', inplace=True)
    return resSampleDF

# 数据加载与预处理
absoluteFileName = "C:\\Users\\learner\\stock.csv"
data_full = pd.read_csv(absoluteFileName)
data_full['date'] = pd.to_datetime(data_full['date'])
data_full.set_index('date', inplace=True)

# 补全缺失的1分钟K线
filled_data = fill_missing_minute_data(data_full)

# 重采样为3分钟K线
df2 = regroup_data(filled_data, '3T')
print(df2)

效果说明

补全后,2023-11-23的9:15会被填充为前一个有效K线的行情数据(如果是开盘首分钟缺失,可根据需求调整为当天第一个有效K线的open值),重采样后的时间戳会严格从9:15开始,生成9:15-9:17、9:18-9:20等标准区间的K线。


方案二:直接修正重采样的时间基准

不补全原始数据,而是在重采样时强制指定每个交易日的开盘时间为时间基准,忽略原始数据的起始时间。

修改后的regroup_data函数

def regroup_data(data, regroup_interval, market_open="09:15:00"):
    gp = data.groupby(lambda x: x.date())
    dfList = []
    tz = data.index.tz  # 保留时区信息
    for day, res in gp:
        # 手动指定重采样的时间原点为当天开盘时间
        origin = pd.Timestamp(f"{day} {market_open}", tz=tz)
        resampledf = res.resample(regroup_interval, origin=origin).agg(
            {'open': 'first', 'high': 'max', 'low': 'min', 'close': 'last', 'volume': 'sum'})
        resampledf.reset_index(inplace=True)
        dfList.append(resampledf)
    resSampleDF = pd.concat(dfList, ignore_index=True)
    resSampleDF.set_index('date', inplace=True)
    # 过滤掉没有数据的区间(比如开盘前的无效区间)
    resSampleDF = resSampleDF.dropna(subset=['open'])
    return resSampleDF

效果说明

重采样时直接以9:15为每个交易日的时间起点,即使原始数据从9:16开始,第一个3分钟区间仍会是9:15-9:17,该区间的行情数据会取9:16-9:17的有效数据聚合,时间戳完全符合预期。


内容的提问来源于stack exchange,提问作者Poorab

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 07:07:08