Python按交易时段对齐资产表现 解决跨日累计变动计算问题
跨自然日交易时段累计行情变动计算修正方案
问题根因
- 原实现直接以时间戳对应的自然日作为交易会话
Session的分组依据,未覆盖23:00-23:59时段归属下一交易日Asia盘的跨日规则,该区间数据被错误划入前一自然日的Open时段分组,直接导致后续累计计算对齐偏差。 - 时段切分逻辑仅按单时间点的时刻值打标签,未同步修正跨日时段对应的会话日期,分组维度本身存在错误。
修正后可运行代码
import pandas as pd from datetime import time, timedelta # 拉取原始1分钟行情数据 cl1 = con.bdib('CO1 Comdty', start_datetime=start, end_datetime=end, event_type='TRADE', interval=interval) cl1['Timestamp'] = pd.to_datetime(cl1.index) cl1['RawDate'] = cl1['Timestamp'].dt.date cl1['t'] = cl1['Timestamp'].dt.time # 核心修正:同步打准时段标签+所属交易会话日期 def mark_session_tz(row): ts = row['Timestamp'] t_val = row['t'] raw_date = row['RawDate'] # 23:00-次日07:00 统一归属下一自然日的Asia交易时段 if t_val >= time(23, 0): return pd.Series(['Asia', (ts + timedelta(days=1)).date()]) elif t_val < time(7, 0): return pd.Series(['Asia', raw_date]) elif t_val < time(14, 0): return pd.Series(['Europe', raw_date]) elif t_val < time(22, 0): return pd.Series(['US', raw_date]) else: # 22:00-23:00 为当日盘前Open时段,归属当前自然日 return pd.Series(['Open', raw_date]) cl1[['Timezone', 'Session']] = cl1.apply(mark_session_tz, axis=1) # 按修正后的交易会话+时段分组,生成组内连续分钟序号 perf = cl1[['close', 'Timezone', 'Session']].copy() perf['cnt'] = 1 perf['Minute'] = perf.groupby(['Session', 'Timezone'])['cnt'].cumsum() # 透视计算各时段累计价格变动 perf = perf.pivot(index=['Session', 'Minute'], columns='Timezone', values='close') perf = perf[['Asia', 'Europe', 'US']] # 各时段首根K线变动记为0,逐分钟差分后累计 perf = perf.diff().fillna(0).cumsum()
关键修正点说明
- 跨日归属规则对齐:每日23:00-23:59的1分钟数据自动将会话日期加1天,统一归入下一交易日的Asia时段分组,完全匹配实际交易时段覆盖范围。
- 分组维度校准:将原逻辑的「原始自然日+时段」分组改为「修正后交易会话日+时段」,保证每个交易时段的分钟序列从该时段第一根K线开始连续计数,不会出现序列断裂、错位。
- 空值逻辑补全:原
diff()操作未处理每组第一行的空值,容易出现累计曲线起始点异常,新增fillna(0)保证每个时段累计变动从0值开始计算。
验证规则:取6月22日23:00-23:59的样本数据校验,其
Session字段应为202X-06-23、Timezone字段为'Asia',会和6月23日00:00-07:00的数据归为同一组参与Asia时段累计计算,和实际交易时段划分规则完全对齐。
内容的提问来源于stack exchange,提问作者Analyst
相关产品推荐
相关产品推荐

