1

Python での関数の計算に問題があります。多数の投資の IRR を計算したいのですが、そのすべてが独自のデータフレームに記述されています。特定の日付までの各投資のデータフレームがあるため、各投資の異なる日付までに投資が行った支払いの流れを説明する複数のデータフレームがあり、各データフレームの最後の行には株式の情報が含まれています各投資がその時点まで持っている資本。これは、各投資の IRR の時系列を取得するために行います。IRRを計算したい各データフレームはリストにあります。

各データフレームの IRR を計算するために、次の関数を作成しました。

def npv(irr, cfs, yrs):
    return np.sum(cfs / ((1. +  irr) ** yrs))
def irr(cfs, yrs, x0)
    return np.asscalar(fsolve(npv, x0=x0, args=(cfs, yrs)))

したがって、リスト内の各データフレームの IRR を計算するために、次のようにしました。

 for i, new_df in enumerate(dfs):
   cash_flow = new_df.FLOWS.values
   years = new_df.timediff.values
   output.loc[i, ['DATE']] = new_df['DATE'].iloc[-1]
   output.loc[i, ['Investment']] = new_df['Investment'].iloc[-1]
   output.loc[i, ['irr']] = irr(cash_flow, years, x0=0.)

出力は、必要な情報、つまり特定の日付までの各投資の IRR を含む、作成したいデータフレームです。問題は、一部のデータフレームでは IRR を正しく計算しますが、他のデータフレームでは正しく計算しないことです。たとえば、このデータフレームの IRR を正しく計算します。

       DATE     INVESTMENT       FLOWS        timediff
0   2014-02-24      1        -36278400.0         0.0
1   2014-03-25      1        -11490744.0    0.07945205479452055
2   2015-01-22      1        -13244300.0    0.9095890410958904
3   2015-09-24      1        -10811412.0    1.5808219178082192
4   2015-11-12      1         -6208238.0    1.715068493150685
5   2016-01-22      1         -6210161.0    1.9095890410958904
6   2016-03-31      1         -4535569.0    2.0986301369863014
7   2016-05-25      1          8420470.0    2.249315068493151
8   2016-06-30      1         12357138.0    2.347945205479452
9   2016-07-14      1          3498535.0    2.3863013698630136
10  2016-12-26      1          4085285.0    2.8383561643835615
11  2017-06-07      1          3056835.0    3.2849315068493152
12  2017-09-11      1         11254424.0    3.547945205479452
13  2017-11-16      1          9274834.0    3.728767123287671
14  2018-02-22      1          1622857.0    3.9972602739726026
15  2018-05-23      1          2642985.0    4.243835616438356
18  2018-08-23      1          9265099.0    4.495890410958904
16  2018-11-29      1          1011915.0    4.764383561643836
19  2018-12-28      1          1760734.0    4.843835616438356
17  2019-01-14      1          1940112.0    4.890410958904109
20  2019-06-30      1         116957227.3   5.347945205479452

IRR は 0.215 です。しかし、このデータフレームは、まったく同じ投資ではありません。0.0001 の IRR を返しますが、実際の IRR は約 0.216 になるはずです。

       DATE     INVESTMENT       FLOWS         timediff
0   2014-02-24      1        -36278400.0         0.0
1   2014-03-25      1        -11490744.0    0.07945205479452055
2   2015-01-22      1        -13244300.0    0.9095890410958904
3   2015-09-24      1        -10811412.0    1.5808219178082192
4   2015-11-12      1         -6208238.0    1.715068493150685
5   2016-01-22      1         -6210161.0    1.9095890410958904
6   2016-03-31      1         -4535569.0    2.0986301369863014
7   2016-05-25      1          8420470.0    2.249315068493151
8   2016-06-30      1         12357138.0    2.347945205479452
9   2016-07-14      1          3498535.0    2.3863013698630136
10  2016-12-26      1          4085285.0    2.8383561643835615
11  2017-06-07      1          3056835.0    3.2849315068493152
12  2017-09-11      1         11254424.0    3.547945205479452
13  2017-11-16      1          9274834.0    3.728767123287671
14  2018-02-22      1          1622857.0    3.9972602739726026
15  2018-05-23      1          2642985.0    4.243835616438356
18  2018-08-23      1          9265099.0    4.495890410958904
16  2018-11-29      1          1011915.0    4.764383561643836
19  2018-12-28      1          1760734.0    4.843835616438356
17  2019-01-14      1          1940112.0    4.890410958904109
20  2019-09-30      1        123753575.7    5.6

これらの 2 つのデータフレームには、最後の行を除いてまったく同じフローがあり、その投資のその日までの資本の在庫が含まれています。したがって、これら 2 つのデータフレームの唯一の違いは最後の行です。これは、この投資がその間流入も流出もなかったことを意味します。なぜ IRR が大きく変動するのかわかりません。または、一部の IRR が正しく計算されない理由。

ほとんどは正しく計算されますが、正しく計算されないものもあります。

私を助けてくれてありがとう。

4

1 に答える 1