Мои вопросы не о том, как рассчитать 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
является уникальным идентификатором каждой сделанной инвестиции.
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
для идентификатора 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)
Это дает фактические np.irr
для ID
3:
Out[155]: 0.011386397119650837
Итак, мой вопрос:
Как рассчитать np.irr
по pandas.DataFrame
, где частоты денежных потоков не согласованы оптимальным способом?