股票期权历史蜡烛图缺失致重采样时间异常的解决方法咨询
解决股票期权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
相关产品推荐
相关产品推荐

