Новые релизы okama

Версия 1.4.4 - Новые классы для стратегий изъятий и пополнения портфеля

Новая версия окамы полностью посвящена инвестиционным стратегиям с денежными потоками. В ней реализован новый подход, согласно которому каждой стратегии изъятий/пополнений соответствует свой класс для конфигурации.

Новые функции

3 новых класса для настройки стратегий Cash Flow

Параметры денежного потока для инвестиционных портфелей теперь настраиваются в отдельных классах.

  • IndexationStrategy для стратегий с регулярными индексируемыми снятиями/пополнениями
  • PercentageStrategy для стратегий с регулярными снятиями/пополнениями с фиксированным процентом
  • TimeSeriesStrategy для стратегий с произвольным количеством снятий и/или пополнений

Все 3 класса наследуются от родительского класса CashFlow.
У класса Portfolio больше нет параметров Cash Flow (initial_amount, cashflow, discount_rate). Идея в том, чтобы старый класс Portfolio как был так и остался для “простых” стратегий без промежуточных снятий и пополнений.

Новый класс для настройки параметров моделирования Монте-Карло

Класс MonteCarlo имеет несколько свойств:

  • distribution - тип распределения для генерации временных рядов доходности
  • period - длина прогнозируемого периода в годах
  • number - количество случайных временных рядов

Все параметры Монте-Карло связаны с экземпляром PortfolioDCF и могут быть доступны с помощью конструкции Portfolio().dcf.mc. Например, тип распределения случайной величины доступен через Portfolio().dcf.mc.disctribution.

Новые методы и свойства в PortfolioDCF

PortfolioDCF имеет новый параметр use_discounted_values (по умолчанию False). Он определяет, использовать ли дисконтированные значения при бэктестинге (значения начальных инвестиций, размеры снятий и пополнений). Параметр discount_rate перемещен из Portfolio в PortfolioDCF.

Новые методы и свойства

  • find_the_largest_withdrawals_size - найти наибольший размер снятия средств в рамках стратегии. Для поиска максимального размера снятий используется моделирование Монте-Карло в соответствии со стратегией денежного потока. Этот метод работает с IndexationStrategy и PercentageStrategy
  • initial_investment_fv используется для расчета будущей стоимости (FV) начальных инвестиций в конце прогнозируемого периода
  • initial_investment_pv используется для расчета дисконтированной стоимости (PV) начальных инвестиций на дату first_date из параметров Portfolio()
  • wealth_index_with_assets работает как в Portfolio(), но учитывает денежные потоки (вклады и изъятия)
  • метод set_mc_parameters используется для добавления параметров моделирования Монте-Карло

Изменения в старых методах и свойствах в PortfolioDCF

  • методы monte_carlo_survival_period, survival_date_hist и survival_period_hist теперь имеют новый параметр threshold. Это “порог”, который определяет когда мы считаем баланс портфеля равным нулю. Считается как процент начальных инвестиций
  • количество параметров plot_forecast_monte_carlo сокращено. Остались только backtest и figsize.

Новый ноутбук с примерами использования стратегий снятия/пополнения

Новые примеры использования стратегий IndexationStrategy, PercentageStrategy и TimeSeriesStrategy доступны в ноутбуке 04 investment portfolios with DCF.ipynb.


Обновлена документация библиотеки okama.
Теперь там можно подробно познакомиться с новыми классами семейства CashFlow и MonteCarlo.

Во всех случаях есть примеры применения.

О новой архитектуре

Немного “философии” и размышлений о будущем в работе со стратегиями семейства CashFlow…

В версии 1.4.4 пришлось сильно “перекроить” архитектуру объектов. Теперь каждая из стратегий снятий или пополнений настраивается в своём классе с определенными параметрами.

Сделано это для того, чтобы дальше можно было добавлять легко стратегии с более сложной логикой. Например, если размер снятия зависит от результатов инвестиций в предыдущие периоды. Возможно, будут появляться новые классы CashFlow. Логика применений и настройки старых классов тоже могут меняться.

Еще мне хотелось упростить модуль portfolio.py, который разросся и содержит всё, что касается портфелей. Было бы здорово разместить все классы семейства CashFlow в отдельном модуле. Но, оказалось, что не так всё просто…

В версии 1.4.1 появилось кеширование полученных “тяжелые” данных. Например, результатов симуляции Монте-Карло. Когда компьютер считает тысячи временных рядов доходностей с учетом ребалансировок, на это уходит время. Потом с помощью этих рядов считаются какие-то вспомогательные параметры (например, “период дожития”) или строятся графики. “Выбрасывать” и генерировать всё с нуля каждый раз, когда что-то хочешь посчитать или нарисовать… это расточительство :slight_smile:

Кеширование, конечно, полезно. НО! Когда меняется что-то мало-мальски значимое в настройках классов (размер изъятия, количество случайных сценариев в Моне-Карло, даты и т.п.) необходимо почистить кэш, ибо он из добра превращается в зло. А значит это, что каждый из новых классов CashFlow и MonteCarlo должен иметь возможность изменять состояние класса PortfolioDCF. Получаются взаимосвязанные классы. Само по себе отслеживание состояний – довольно сложный процесс. Кроме того, теперь не получится разместить классы CashFlow в отдельном модуле из-за возникающих круговых ссылок.

Получается своего рода развилка.

  • Простота кода и устойчивая конструкция без отслеживания статусов, но отсутствие кеша и более медленная работа.
  • Взаимосвязанные классы. Потенциальные ошибки. Сложный модуль portfolio.py. Быстрая работа.

Я пока склоняюсь все-таки поддерживать вариант 2. Python и так медленный язык. Идти дальше в сторону замедления не хочется. Но, не факт что получится…

Если есть идеи по архитектуре, дайте знать.

Версия 1.5.0 - Стратегии ребалансировки

Большой релиз. В нем много нового. Но основное - это продвинутые стратегии ребалансировки для классов Portfolio и EfficientFrontierReb.

Теперь выбирать можно среди 3 вариантов ребалансировки:

  • Календарная ребалансировка (как было раньше)
  • Ребалансировка по условию (абсолютное отклонение веса или относительное)
  • Смешанная стратегия

В смешанных стратегиях применяется календарный принцип (например, раз в год). Но ребалансировка срабатывает только если отклонение в весе одного из активов выше условия. Это похоже на то, как происходит в реальной жизни.

Все методы ребалансировки могут применяться при оптимизации весов портфеля, прогнозировании методом Монте-Карло и построении Границы эффективности.

Новая версия окамы уже доступна: pip install okama

Подробности релиза 1.5.0

Кроме стратегий ребалансировок в классе EfficientFrontierReb появилась возможность учитывать ограничения по весам (параметр bands). Устранена важная ошибка, которая мешала правильно строить границы эффективности с учетом ребалансировок.
Большое спасибо @Artt за участие в работе над релизом!

В нескольких классах добавлены новые методы. Есть важные исправления ошибок.

Класс Rebalance

rs = ok.Rebalance(
    period="year",
    abs_deviation=0.10,
    rel_deviation=0.30
)
pf = ok.Portfolio(['SPY.US', 'AGG.US'], rebalancing_strategy=rs)

ВНИМАНИЕ:
Старый способ инициализации Portfolio устарел:

# Устаревший вариант (не работает!)
ok.Portfolio(rebalancing_period="year")

В тоже время всё еще можно инициализировать класс Portfolio вообще без указания стратегии ребалансировки (по умолчанию используется календарная ежемесячная ребалансировка):

# Рабочий вариант (ребалансировка по умолчанию - ежемесячная)
ok.Portfolio(['SPY.US', 'AGG.US'], weights=[.6, .4])

Класс Rebalance

  • Новый класс Rebalance имеет 3 параметра: period, abs_deviation, rel_deviation
  • Rebalance.wealth_ts() рассчитывает временной ряд для баланса ребалансируемого портфеля (опционально с активами)
  • Rebalance.assets_weights_ts() вычисляет месячные временные ряды весов активов портфеля с учетом ребалансировки
  • Rebalance.return_ror_ts() возвращает временной ряд месячной доходности портфеля с учетом ребалансировок

Новые методы и свойства класса Portfolio

  • новое свойство rebalancing_strategy для настройки периодичности, абсолютных и относительных отклонений весов в стратегии ребалансировки
  • новое свойство rebalancing_events возвращает временной ряд событий ребалансировки и их тип

Изменения в классе PortoflioDCF

  • PortfolioDCF.monte_carlo_wealth_pv генерирует дисконтированные случайные временные ряды балансов портфелей с учетом пополнений/изъятий
  • PortfolioDCF.monte_carlo_wealth_fv генерирует номинальные (не дисконтированные) случайные временные ряды балансов портфелей с учетом пополнений/изъятий
  • PortfolioDCF.find_the_largest_withdrawals_size() теперь использует метод бисекции для поиска максимального размера изъятий
  • PortfolioDCF.find_the_largest_withdrawals_size() имеет 3 возможные цели: ‘maintain_balance_pv’, ‘maintain_balance_fv’ и ‘survival_period’
  • PortfolioDCF.find_the_largest_withdrawals_size() имеет новый атрибут withdrawals_range определяет возможный диапазон изъятий для ускорения расчетов
  • в PortfolioDCF.find_the_largest_withdrawals_size() атрибут iter_max ограничивает количество промежуточных итераций при поиске решения
  • PortfolioDCF.find_the_largest_withdrawals_size() метод возвращает класс Result. Если решение не найдено, остаются доступными промежуточные результаты

Новые методы и свойства класса EfficienFrontierReb

Класс EfficienFrontierReb теперь использует параметр rebalancing_strategy при инициализации (аналогично Portfolio).
Поддерживает ограничения весов активов через параметр bounds.

  • новый параметр rebalancing_strategy для определения стратегии ребалансировки
  • новый параметр bounds задает ограничения на веса активов
  • новый метод EfficienFrontierReb.plot_pair_ef() строит Границу эффективности для каждой пары активов

Изменения в классе EfficientFrontier

  • метод EfficientFrontier.get_monte_carlo генерирует случайные ребалансируемые портфели методом Монте-Карло с учетом ограничений bounds.

Новый Jupyter Notebook с примерами стратегий ребалансировки

Добавлен новый Jupyter Notebook с примерами инвестиционных портфелей с различными стратегиями ребалансировки:
10 rebalancing portfolio.ipynb

Обновленная документация с подробным описаниями всех классов доступна на ReadTheDocs.


Скоро обновление библиотеки okama до версии 1.5.1

В новой версии будет много важного и полезного:
:black_small_square:Продвинутые стратегии снятия денег: Vanguard Dynamic Spending (VDS) и
Cut Withdrawals If Drawdown (CWID)
:black_small_square: Возможность добавлять произвольные снятия и пополнения по датам в любой стратегии (extra cash flow)
:black_small_square: Возможность самостоятельной настройки параметров распределения в прогнозировании с помощью Монте-Карло (нормальное, логнормальное и Стьюдента)
:black_small_square: skew-t распределения Стьюдента для прогнозов стратегий с высоким коэффициентом асимметрии

90% работы над новой версией уже завершено. Обновление ожидается в сентябре.

П.С. Если кто-то из разработчиков хочет подключиться к работе над окамой и примкнуть к нашему небольшому коллективу, пишите в личку. В проекте есть задачи разной сложности. Могут пригодиться и джуны, и синьоры.

1 Like