我的问题不在于如何计算IRR(内部收益率),而是给定类似于下面的数据集,当样本量急剧增加时,如何最好地计算IRR而无需等待数月的结果。
我正在使用该np.irr
功能
数据示例
import pandas as pd
import numpy as np
date_list =['2018-01-01', '2018-01-02', '2018-01-03', '2018-01-04','2018-01-05', '2018-01-06', '2018-01-07', '2018-01-14','2018-01-21', '2018-01-31','2018-02-08', '2018-02-28']
ids_list = [1,1,1,1,2,2,2,2,3,3,3,3]
flows_list = [ -10, 2, 2, 10, -50, 25, 20, 20, -100, 0, 3, 150]
df = pd.DataFrame(list(zip(date_list,ids_list,flows_list)), columns=['Date','ID','Flow'])
df['Date'] = pd.to_datetime(df['Date'],format='%Y-%m-%d')
产生以下数据集
In [144]: df
Out[144]:
Date ID Flow
0 2018-01-01 1 -10
1 2018-01-02 1 2
2 2018-01-03 1 2
3 2018-01-04 1 10
4 2018-01-05 2 -50
5 2018-01-06 2 25
6 2018-01-07 2 20
7 2018-01-14 2 20
8 2018-01-21 3 -100
9 2018-01-31 3 0
10 2018-02-08 3 3
11 2018-02-28 3 150
资料说明
Date
是现金流入或流出的日期。ID
本质上是每项投资的唯一 ID。Flow
是该ID
(投资)的现金流。我需要使用每日频率作为我的输入
np.irr
如果我做一个简单的pandas.groupby
In [145]: df.groupby(['ID'])['Flow'].agg(np.irr)
Out[145]:
ID
1 0.141962
2 0.150155
3 0.153450
Name: Flow, dtype: float64
所以对于ID
1,np.irr
返回是有意义的,因为我的频率是一致的。
但是,对于其余部分,您会看到日期不是按天等间距排列的。
np.irr
ID 3的“手动”计算示例
df.loc[df.ID ==3]['Date'].apply(lambda x: (x - min(df.loc[df.ID ==3]['Date'])).days)
8 0
9 10
10 18
11 38
Name: Date, dtype: int64
可以在上面看到每个现金流都发生在开始、第 10 天、第 18 天和最后第 38 天。
cfs = np.zeros(39)
cfs[[0,10,18,38]] = df.loc[df.ID ==3]['Flow'].values
np.irr(cfs)
这产生了3 的实际 np.irr
值ID
:
Out[155]: 0.011386397119650837
所以我的问题是:
如何以最佳方式计算现金流频率不一致的
np.irr
地方?pandas.DataFrame