基于Pandas生成资产超额收益DataFrame:各列与1m_Tbill做差
你需要把现有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_excessPeriod
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

