В 2024 году на Habr.ru вышла первая статья о библиотеке okama для Python. Сегодня мы покажем, как с её помощью рассчитать дивидендную доходность Индекса Мосбиржи, избежав ручного сбора данных и сложных вычислений.
Московская биржа публикует два индекса:
Индекс Мосбиржи (IMOEX)
Индекс Мосбиржи полной доходности (MCFTR)
Первый из них даёт информацию только по ценовой доходности, входящих в него акций. Второй - полную доходность: ценовая доходность плюс доходность, полученная за счет реинвестирования дивидендов.
Где взять дивидендную доходность? Немного формул
Согласно правилам Московской биржи, доходность MCFTR для каждого периода считается следующим образом:
TRn - доходность индекса в период n
In - значение ценового индекса в период n
In-1 - значение ценового индекса в период n-1
IDn – дивиденды, выраженные в пунктах индекса полной доходности за период n
При формировании индекса базовым периодом является один день, но мы для упрощения расчетов будем считать по ценам закрытия месяца, предполагая что капитализация дивидендной доходности за один месяц является незначительной. Можно было бы использовать и разницу в значениях за 1 год, но точность пострадала бы значительно, так как за 1 год эффект от капитализации уже вполне ощутим.
Таким образом для нас искомой величиной является отношение:
- ценовая доходность. То есть для расчета дивидендной доходности индекса за 1 месяц достаточно просто вычесть из доходности MCFTR доходность ценового индекса.
Для получения результата за год необходимо рассчитать геометрическую сумму дивидендных доходностей за все месяцы:
Считаем дивидендную доходность индекса в Python
Импортируем библиотеку okama и загружаем данные индексов через класс ok.AssetList
.
import okama as ok
ls = ['IMOEX.INDX', 'MCFTR.INDX']
moex = ok.AssetList(ls, ccy='RUB', first_date='2000-01', last_date='2024-12')
moex

Данные загружены ровно за 25 лет: с 2000 по 2024 года. Для удобства последняя дата выбрана как last_date='2024-12
, чтобы убрать данные неполного 2025 года.
Считаем ценовую доходность индекса IMOEX
по календарным годам:
df_price = moex.annual_return_ts.loc[:, 'IMOEX.INDX'] # ценовая доходность, приведенная к году
df_price.tail()

В 2024 году ценовая доходность была отрицательной -6,96%.
Аналогичным образом считаем полную доходность индекса по данным MCFTR
:
df_total = moex.annual_return_ts.loc[:, 'MCFTR.INDX']
df_total.tail()

В 2024 году полная доходность Индекса Мосбиржи была положительной. Всего +1,62%. Но все-таки это не минус, как в ценовом индексе. Ситуацию спасли дивиденды!
Теперь давайте посчитаем дивидендную доходность по месяцам. В библиотеке okama
используются месячные исторические данные. Так что с этим проблем нет.
df = moex.assets_ror # месячные данные доходности индексов IMOEX и MCFTR
df.tail()

Создаем еще один столбец в DataFrame с месячной дивидендной доходностью:
df['div'] = df['MCFTR.INDX'] - df['IMOEX.INDX']
df.tail()

Осталось только рассчитать дивидендную доходность по календарным годам. С помощью "волшебного" Pandas.resample
это сделать очень просто:
df_div = df['div'].resample('A').apply(lambda x: np.prod(x + 1.) - 1)
df_div.tail(10) * 100 # умножаем на 100 чтобы получить данные в процентах

В 2024 году дивидендная доходность Индекса Мосбиржи составила 9,09%.
Средняя дивидендная доходность за последние 10 лет:
div_results = df_div['2015':'2024'] * 100
div_results.mean()

В среднем дивидендная доходность индекса была равна 6,84%. Что довольно много, с учетом того, что средняя инфляция равна 7,0%.
Осталось взять среднюю ценовую доходность и сравнить.
price_results = df_price['2015':'2024'] * 100
price_results.mean()

Средняя ценовая доходность индекса равна 10,51%. Это значит, что дивидендная доходность составляет почти 40% от полной доходности Индекса Мосбиржи!
div_results.mean() / (price_results.mean() + div_results.mean())

Средняя полная доходность за последние 10 лет при этом равна 17,72%. Это с учетом турбулентного 2015 и глубоких просадок в 2022 - 2023 годах...

Все упомянутые фрагменты кода, а так же функция, которая позволяет получить подобную столбчатую диаграмму по годам, доступны в формате Jupyter Notebook.
Что всё это значит для ваших финансов?
Высокая дивидендная доходность хороша во многих отношения. Но есть и существенный минус. При получении дивиденда надо платить налог. В отличие от купонов по облигациям не спасает даже Индивидуальный инвестиционный счет (ИИС). НДФЛ по дивидендам придется платить и там. С учетом высокой доли дивидендов в общей доходности – это не очень выгодно. Придется отдать 0,88% - 1,02% в зависимости от размера НДФЛ.
Хорошим выходом являются инвестиции через индексные фонды на российские акции. ОПИФ или БПИФ не платит налог на поступающие дивиденды. Фонд автоматически их реинвестирует обратно в акции, входящие в состав индекса. Но у фонда есть ежегодная комиссия. В большинстве индексных БПИФов на российские акции комиссия заметно ниже, чем потери при уплате НДФЛ на поступающие дивиденды. Впрочем, комиссия фонда или TER (Total Expense Ratio) – это не единственные потери, которые могут быть у владельца паёв. Поэтому, прежде чем выбирать среди индексных фондов, желательно проанализировать отставание от бенчмарка (в данном случае MCFTR).