如何使用Python pandas实现滚动IRR计算
滚动IRR计算实现方案
计算逻辑前提
滚动IRR默认采用**扩展滚动窗口(成立至今口径)**的逻辑,每个时间节点的IRR计算规则为:
- 取从第一期到当前期的所有历史CFs(现金流)作为序列前半部分
- 将当前期的期末NAV作为最后一笔现金流入,补充到现金流序列末尾
- 对拼接后的完整现金流序列计算IRR即可得到当期滚动IRR
如果需要固定长度的滑动窗口IRR,只需要调整取数的窗口范围即可。
代码实现
首先安装依赖库:pip install pandas numpy numpy-financial
核心实现代码:
import pandas as pd import numpy as np import numpy_financial as npf # 构造示例DataFrame,实际使用时替换为你自己的df即可 df = pd.DataFrame({ 'CFs': [-100, 1, 2, 3, 2, 110], 'NAV': [100, 101, 103, 106, 108, 0] }) def calc_period_irr(cf_list, current_nav): full_cf = cf_list + [current_nav] try: # 计算当期IRR,无法计算时返回空值 return npf.irr(full_cf) except: return np.nan # 计算扩展滚动IRR(成立至今) df['rolling_irr_since_inception'] = [ calc_period_irr(df['CFs'].iloc[:i+1].tolist(), df['NAV'].iloc[i]) for i in range(len(df)) ] # 如需计算固定滑动窗口IRR,比如窗口长度为3期,使用以下代码即可 window_size = 3 df[f'sliding_irr_{window_size}period'] = [ calc_period_irr(df['CFs'].iloc[i:i+window_size].tolist(), df['NAV'].iloc[i+window_size-1]) if i + window_size <= len(df) else np.nan for i in range(len(df)) ]
结果优化说明
- 如果你的数据是月度/季度等非年度频次,可通过以下公式换算为年化IRR:年化IRR = (1 + 单期IRR) ** 每年期数 - 1,比如月度数据每年期数取12,季度取4
- 你可以根据业务需求调整try-except块的异常处理规则,比如对无法计算的情况返回特定标识而不是空值
内容的提问来源于stack exchange,提问作者Song Zhibo
相关产品推荐
相关产品推荐

