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

基于Pandas生成资产超额收益DataFrame:各列与1m_Tbill做差

计算资产超额收益率的Pandas解决方案

你需要把现有DataFrame里的各资产收益率减去无风险利率(1m_Tbill)得到超额收益率的新DataFrame,这里有几种简单高效的实现方式,我一步步给你说明:

先回顾下你的原始数据结构:

In[2]: df
Out[2]:
sp500 1m_Tbill MCD LUV AIG
Period
1997-01-31 0.061317 0.0045 0.002755 0.000000 0.118938
1997-02-28 0.005928 0.0039 -0.047802 0.068707 -0.001032
1997-03-31 -0.042614 0.0043 0.092486 -0.058511 -0.029132
1997-04-30 0.058406 0.0043 0.132275 0.242938 0.094782
1997-05-30 0.058577 0.0049 -0.059206 -0.063216 0.053502
...

方法一:直接广播运算(最简洁高效)

Pandas支持列与列的广播运算,我们先移除无风险利率列,再让剩下的所有资产列减去无风险利率列即可:

import pandas as pd

# 生成超额收益率DataFrame:资产列 - 1m_Tbill列
excess_returns = df.drop('1m_Tbill', axis=1) - df['1m_Tbill']

# 可选:给列名加上_excess后缀,明确标识是超额收益率
excess_returns.columns = [f"{col}_excess" for col in excess_returns.columns]

运行后会得到类似这样的结果:

sp500_excess  MCD_excess  LUV_excess  AIG_excess

Period
1997-01-31 0.056817 -0.001745 -0.004500 0.114438
1997-02-28 0.002028 -0.051702 0.064807 -0.004932
1997-03-31 -0.046914 0.088186 -0.062811 -0.033432
...

方法二:使用apply函数(更灵活)

如果你需要对某些列做特殊处理,或者想更清晰地控制运算逻辑,可以用apply函数:

def compute_excess_return(series):
    # 跳过无风险利率列
    if series.name == '1m_Tbill':
        return None
    # 计算当前资产列的超额收益率
    return series - df['1m_Tbill']

# 应用函数到每一列,然后过滤掉空的1m_Tbill列
excess_returns = df.apply(compute_excess_return).dropna(axis=1)

额外注意事项

  • 确保1m_Tbill列是数值类型,如果是字符串格式,先做转换:df['1m_Tbill'] = pd.to_numeric(df['1m_Tbill'])
  • 新DataFrame会保留原有的Period索引,方便后续的时间序列分析
  • 如果原始DataFrame有其他无关列,可以先通过df[['sp500', 'MCD', 'LUV', 'AIG', '1m_Tbill']]筛选出目标列再运算

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 10:04:47