Как рассчитать будущую стоимость инвестиций с помощью Pandas, если процентные ставки и платежи со временем меняются?

Предположим, что я хотел бы знать, как со временем меняется стоимость моих вложенных денег. У меня есть следующие данные в Pandas DataFrame:

            contribution    monthly_return
2020-01-01  91.91           np.Nan
2020-02-01  102.18          0.037026
2020-03-01  95.90          -0.012792
2020-04-01  117.89         -0.009188    
2020-05-01  100.44          0.011203
2020-06-01  98.89           0.053917
2020-07-01  106.10         -0.049397
2020-08-01  112.55          0.062375
2020-09-01  103.16         -0.063198

...и так далее. Каждый месяц я вношу дополнительную сумму денег в свой "фонд" (вклад). Ежемесячный доход показывает, как изменилась стоимость моих денег за последний месяц.

Я хотел бы добавить дополнительный столбец, где я мог бы найти информацию о текущей стоимости моих инвестиций в каждый месяц (чтобы я мог изобразить это на графике). Насколько я знаю, я не могу использовать ни одну из финансовых функций numpy (например, np.fv()), потому что взносы и ставки со временем меняются. Я могу кумулятивно суммировать взносы, но я не знаю, как суммировать прибыль и убыток от инвестиций.

Это может быть тривиальный вопрос, но я полностью застрял и потратил на эту проблему больше часов, чем когда-либо мог признать. Любая помощь будет оценена по достоинству!


person chestnut    schedule 29.02.2020    source источник
comment
Ваши инвестиции на 2020-01-01 составляют 91,91. Какому периоду времени соответствует monthly_return -0,038305 в тот же день? Декабрь 2019? Вы имеете в виду, что у вас были деньги на счету до 2020-01-01? Каковы единицы monthly_return, $, %?   -  person Sergey Bushmanov    schedule 01.03.2020
comment
Допустим, мы начинаем с 0$ инвестиций. Каждый месяц я вношу указанную сумму денег. Вышеупомянутый пример — это всего лишь образец, который я извлек из своих данных — я допустил ошибку, за первый месяц не должно быть никакого ежемесячного дохода. Каждый следующий месячный_доход соответствует разнице между месяцем и предыдущим месяцем. Единицы Month_Returns — %. Надеюсь развеял все сомнения!   -  person chestnut    schedule 01.03.2020
comment
Единицы месячной доходности, %? Ежемесячно, ежегодно, просто, сложно?   -  person Sergey Bushmanov    schedule 01.03.2020
comment
Отредактировал мой предыдущий комментарий. Ежемесячный простой доход.   -  person chestnut    schedule 01.03.2020


Ответы (1)


Предположим, у вас есть df:

print(df)
            contribution  monthly_return
2020-01-01         91.91             NaN
2020-02-01        102.18        0.037026
2020-03-01         95.90       -0.012792
2020-04-01        117.89       -0.009188
2020-05-01        100.44        0.011203
2020-06-01         98.89        0.053917
2020-07-01        106.10       -0.049397
2020-08-01        112.55        0.062375
2020-09-01        103.16       -0.063198

Тогда давайте найдем множитель, на который ежемесячно растут ваши деньги:

df['monthly_multiplier'] = 1 + df['monthly_return'].shift(-1)
print(df)
            contribution  monthly_return  monthly_multiplier
2020-01-01         91.91             NaN            1.037026
2020-02-01        102.18        0.037026            0.987208
2020-03-01         95.90       -0.012792            0.990812
2020-04-01        117.89       -0.009188            1.011203
2020-05-01        100.44        0.011203            1.053917
2020-06-01         98.89        0.053917            0.950603
2020-07-01        106.10       -0.049397            1.062375
2020-08-01        112.55        0.062375            0.936802
2020-09-01        103.16       -0.063198                 NaN

Наконец, мы можем перебрать строки и посмотреть, как растет ваше богатство:

df['fv'] = 0
fv = 0
for index, row in df.iterrows():
    fv = (fv+row['contribution'])*row['monthly_multiplier']
    df.loc[index,'fv']=fv
print(df)
            contribution  monthly_return  monthly_multiplier          fv
2020-01-01         91.91             NaN            1.037026   95.313060
2020-02-01        102.18        0.037026            0.987208  194.966728
2020-03-01         95.90       -0.012792            0.990812  288.194245
2020-04-01        117.89       -0.009188            1.011203  410.633607
2020-05-01        100.44        0.011203            1.053917  538.629162
2020-06-01         98.89        0.053917            0.950603  606.027628
2020-07-01        106.10       -0.049397            1.062375  756.546589
2020-08-01        112.55        0.062375            0.936802  814.171423
2020-09-01        103.16       -0.063198                 NaN         NaN

df['fv'] — это ваше состояние на конец указанного месяца или непосредственно перед вашим следующим взносом.

person Sergey Bushmanov    schedule 29.02.2020
comment
Большое спасибо за ваш ответ! К сожалению, мне кажется, что предложенное Вами решение довольно неправильное. В вашем примере только текущий вклад умножается на норму прибыли каждый месяц. Каждый месячный_доход также должен влиять на все деньги, которые были внесены в предыдущие месяцы. Думайте об этом как об инвестиционном фонде. Каждый месяц я вношу дополнительные деньги, но изменения стоимости распространяются на все деньги, собранные в фонде, а не только на то, что я вношу сейчас. - person chestnut; 01.03.2020
comment
Исправлено по вашему комментарию. - person Sergey Bushmanov; 01.03.2020