使用numpy_financial.irr计算月度IRR:数组构造错误排查
月度IRR计算的现金流数组构造错误排查
错误点分析
你构造的现金流数组存在三个核心问题,导致IRR结果偏差:
1. 初始余额符号错误
IRR计算遵循现金流出为负、现金流入为正的规则:初始余额initial_balance是你投入账户的起始资金,属于现金流出,因此数组第一个元素(t=0时刻)应为 -initial_balance,而非正数值。
2. 每日现金流符号完全反转
你提供的每日现金流数组是账户资金的变动额(正为账户增加,负为账户减少),但IRR计算需要的是投资者视角的现金流:
- 账户资金增加→你向账户投入资金(现金流出),对应负数值
- 账户资金减少→你从账户取出资金(现金流入),对应正数值
因此每日现金流数组的所有元素符号需要反转。
3. 时间点错位冗余元素
你在每日现金流前额外添加了一个0,导致时间点错位(原本31天的现金流被扩展为32天),直接使用原31天的现金流数组即可。
修正后的代码
from numpy_financial import irr initial_balance = 579676.18 final_balance = 2921989.17 # 原每日账户变动现金流 daily_account_changes = [0, 22700.00, 0 ,0 ,0 ,5320.00 ,0 ,0 ,-39900.00 ,0 ,0 ,0 ,0 ,0 ,0 ,-2278500.00 ,0, 31472.00, -42000.00, 0 , 0 , 0, -70300.00, 0, 0, 0, 0, 0, 0,36650.00, 0] # 转换为投资者视角的现金流:账户变动取反 daily_cashflows = [-x for x in daily_account_changes] # 正确构造现金流数组:初始流出 + 每日现金流 + 期末流入 final_array = [-initial_balance] + daily_cashflows + [final_balance] # 计算日IRR(结果应接近0.0001465) daily_irr = irr(final_array) print(daily_irr)
验证逻辑
修正后的数组满足IRR核心逻辑:初始投入资金的折现、每日现金流的折现、期末提取资金的折现总和为0。此时计算出的IRR为日内部收益率,若需月度IRR,可通过(1 + daily_irr) ** 31 - 1转换。
内容的提问来源于stack exchange,提问作者LegsNotHands
相关产品推荐
相关产品推荐

