如何在Pandas中基于日期偏移从价格DataFrame匹配股票收益?
用Pandas匹配内幕交易前后30天股票收益的实现方案
前提准备
先确保两个DataFrame的日期列是datetime类型,否则无法正确计算日期偏移:
import pandas as pd # 转换日期列格式 insider_trades['tdate'] = pd.to_datetime(insider_trades['tdate']) prices['Date'] = pd.to_datetime(prices['Date'])
方法一:逐列匹配(小数据集友好)
先构建高效查找的索引结构,再循环填充每个偏移列:
- 创建以
(ticker, Date)为复合索引的收益Series,提升查找速度:
return_lookup = prices.set_index(['ticker', 'Date'])['Return']
- 遍历-30到30的天数偏移,计算目标日期并匹配收益:
# 遍历所有天数偏移,填充对应列 for offset in range(-30, 31): # 计算每笔交易对应的目标日期 target_dates = insider_trades['tdate'] + pd.Timedelta(days=offset) # 按股票代码+目标日期匹配收益,无匹配则返回NaN insider_trades[str(offset)] = insider_trades.apply( lambda row: return_lookup.get((row['stockTicker'], target_dates[row.name]), pd.NA), axis=1 )
方法二:批量交叉合并(大数据集高效)
如果数据集规模较大,逐行apply效率偏低,可采用批量扩展+透视的方式:
- 扩展交易数据,为每笔交易生成所有-30到30的天数偏移记录:
# 生成包含所有偏移值的临时表 offsets_df = pd.DataFrame({'offset': range(-30, 31)}) # 交叉连接,让每笔交易对应所有偏移 expanded_trades = insider_trades.merge(offsets_df, how='cross') # 计算每个偏移对应的目标日期 expanded_trades['target_date'] = expanded_trades['tdate'] + pd.Timedelta(days=expanded_trades['offset'])
- 合并收益数据并透视回原格式:
# 合并Prices表获取对应收益 expanded_trades = expanded_trades.merge( prices, left_on=['stockTicker', 'target_date'], right_on=['ticker', 'Date'], how='left' ) # 透视回原表结构,将偏移转为列 pivoted_returns = expanded_trades.pivot_table( index=insider_trades.index, columns='offset', values='Return', aggfunc='first' ).rename(columns=str) # 将匹配后的收益列合并回原内幕交易表 insider_trades = insider_trades.join(pivoted_returns)
注意事项
- 如果
Prices中的日期仅包含交易日,而交易日期tdate加减偏移后遇到非交易日,对应的收益列会自动填充NaN,符合需求; - 若需要将非交易日映射到最近的交易日,可额外编写日期对齐函数(比如用
prices['Date'].unique()构建交易日历,查找最近的匹配日期)。
内容的提问来源于stack exchange,提问作者radras
相关产品推荐
相关产品推荐

