0

私の質問は、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

データの説明

  1. Date現金が流入または流出した日です。

  2. ID基本的に、行われた各投資の一意の ID です。

  3. FlowIDその(投資)のキャッシュフローです。

  4. 入力として毎日の頻度を使用する必要があります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

したがって、ID1 の場合、np.irr返される頻度は一貫しているため、意味があります。

ただし、残りの日付については、日付が 1 日ごとに均等に配置されていないことがわかります。

np.irrID 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

4

1 に答える 1