Самое любопытное из релиза okama 1.4.0
В релизе 1.4.0 собрано довольно много нового. Всего не покажешь, да и зачем, если есть новые блокноты Jupyter Notebook с примерами. Но самое интересно, всё-таки показать стоит.
Изъятия и пополнения портфеля. Дисконтирование (DCF)
Самое прогрессивное изменение – включение в инвестиционные стратегии (класс Portfolio
) возможности изъятия и пополнения. Другие метрики портфеля, такие как риск и доходность предполагают, что промежуточных денежных потоков нет. Поэтому новые методы и свойства класса пришлось изолировать. Теперь они доступны через конструкцию типа Portfolio.dcf.wealth_index
.
Пример
Создаём консервативную инвестиционную стратегию из облигаций, акций и золота (60/30/10). Пенсионные накопления равны 10 млн. руб. (пусть это будет пенсионный портфель). Будущий пенсионер планирует ежемесячно снимать 40 тыс. руб. в качестве прибавки к пенсии. На сколько хватит сбережений? Иными словами – какой “срок дожития” в этой стратегии?
Создаем портфель:
discount_rate
здесь умышлено равно None. Это значит, что мы соглашаемся дисконтировать изъятия на среднюю инфляцию. Для большинства это ОК. Если кто-то хорошо разбирается в DCF, то можно поставить свою ставку дисконтирования.
Ребалансировка портфеля делает один раз в год.
Для удобства портфелю присвоен символ symbol="retirement_portf.PF"
. Теперь на графиках портфель будет обозначаться этим символом.
Теперь можно протестировать стратегию вместе с изъятиями на исторических данных.
На графике видно, что баланс портфеля продержался выше нуля весь срок (21 год). Портфелю не удалось опередить инфляцию, хотя он держался долго - примерно до 2020 года. Но потом изъятия во время просадки его “подкосили”.
Прежде чем принимать какие-то инвестиционные решения, важно протестировать стратегию не только на исторических данных, но и спрогнозировать… На сколько денег хватит!? Тот факт, что портфель в прошлом продержался 21 год, не значит, что во всех случаях ему это удастся в будущем.
Дальше стоит побаловаться с методом Монте-Карло. Посмотрим, как портфель “выживает” на случайно сгенерированных данных доходности. Параметры генерации доходностей тем не менее совпадают с историческими параметрами стратегии.
Здесь мы сгенерировали 50 случайных сценариев. Прогноз сделан на 30 лет. Старт инвестиций произошел в начале периода (backtest=True) в 2003 году.
По графику видно, что большинство случайных сценариев “обнулили” портфель где-то между 2034 и 2050 годами. Но были и оптимистичные сценарии, когда через 30 лет баланс портфеля всё еще не был равен нулю. Не стоить забывать, что каждый месяц размер изъятий из портфеля индексируется на инфляцию.
Итак, всё выглядит довольно оптимистично… Но хорошо бы получить количественные оценки. На графике это сделать сложно.
Для этого будем генерировать не 100 сценариев а 1000. И прогноз будет не на 30 лет а на 50.
(Google Colab считал это 6 минут. Не ждите быстрых результатов)
Метод dcf.monte_carlo_survival_period()
тоже генерирует случайные сценарии (выбрано нормальное распределение, но можно использовать логнормальное). Но в данном случае ничего рисовать не нужно. Это просто распределение “периодов дожития” во всех случайных сценариях.
Свойства этого распределения замечательно отображает функция Pandas describe()
.
Как видно, в среднем “срок дожития” стратегии составляет 29 лет.
25% перцентиль (пессимистичные сценарии) - 20 лет.
25 перцентиль (оптимистичные сценарии) - 37 лет.
Что очень неплохо для пенсионного портфеля.
П.С. Это не инвестиционная рекомендация. Не надо применять такой портфель
При помощи okama можно подобрать веса лучше и диверсифицировать портфель внутри каждого из классов.