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

如何在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'])

方法一:逐列匹配(小数据集友好)

先构建高效查找的索引结构,再循环填充每个偏移列:

  1. 创建以(ticker, Date)为复合索引的收益Series,提升查找速度:
return_lookup = prices.set_index(['ticker', 'Date'])['Return']
  1. 遍历-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效率偏低,可采用批量扩展+透视的方式:

  1. 扩展交易数据,为每笔交易生成所有-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'])
  1. 合并收益数据并透视回原格式:
# 合并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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 00:52:40