Python: Базовые показатели портфеля

10 окт 2018 Александр  Мыльцев

В предыдущей статье мы рассказали про базовые показатели отдельного актива, которые интересны сами по себе.

Для анализа поведения инвестиционного портфеля необходимы его расчетные характеристики. Математический аппарат для подобных расчётов предложен Г. Марковицем еще в 1952 году и используется успешно финансовом мире. Положения Г. Марковица составляют «ядро» Современной теории портфеля (СТП) и часто именуются распределением активов (asset allocation).

Итак, строго говоря, портфель – это множество, состоящее из пар:

где – это актив из предыдущей статьи, и – вес актива, и в общем случае, но из соображений статистики, о которых мы расскажем в следующих статьях, на практике не превышает 10.

Каждый показатель портфеля аналогичен по смыслу соответствующему показателю актива. И каждый показатель портфеля вычисляется на основе составляющих его активов.

Для избежания путаницы в обозначениях, далее мы будем обозначать показатель с верхним индексом p, относящийся к портфелю, а с верхним индексом a – относящийся к активу. Например, и – доходность портфеля и актива соответственно.

Доходность

Все определения мы дали в предыдущей статье. Здесь и далее приведём только формулы для вычислений:

Доходность (Rate of Return):

Накопленная доходность (Accumulated Rate of Return):

Реальная доходность (Real Rate of Return):

Накопленная реальная доходность (Real Accumulated Rate of Return):

Каждое из значений в Python вычисляется так:

> ror_p = (np.array([asset.rate_of_return() for asset in assets]) * weights).sum()
> aror_p = (ror_p + 1.).cumprod() - 1.
> ror_p_real = (ror_p + 1.) / (inflation + 1.).cumprod() - 1.
> aror_p_real = (aror_p + 1.) / (inflation_accumulated + 1.).cumprod() - 1.

Идея вычисления ror_p словами выражается так: массив накопленных доходностей каждого актива поэлементно умножается на соответствующий вес массива весов weights, а далее вычисляется сумма значений, равная накопленной доходности портфеля. Остальные значения вычисляются способом, знакомым из предыдущей статьи.

Этот код правильно отработает в контексте, в котором заранее определены:

  • массив assets из объектов типа class PortfolioAsset, в котором определены методы rate_of_return, compound_annual_growth_rate, risk:
class PortfolioAsset:
  def rate_of_return(): pass

  def compound_annual_growth_rate(): pass

  def risk(): pass

Конкретные реализации тел методов можно подставить из предыдущей статьи.

  • массив вещественных чисел weights. Ограничения:
    • weights.sum() == 1.
    • weights.size == assets.size
    • np.all(0.0 <= weights and weights <= 1.0)

Риск

Под риском в рамках СТП понимается стандартное отклонение доходности. Поэтому вычисление месячного риска и риска, приведённого к году, для портфеля выполняется ровно также, как и для одного актива:

При решении задач, связанных с оптимизацией характеристик портфеля, такой подход к расчету риска не применяется, ввиду большой вычислительной трудоёмкости связан: после изменения весов приходится пересчитывать весь объем данных. Г. Марковиц предложил намного более элегантный и простой вариант вычисления риска. О методах оптимизации портфеля и других вариантах расчета риска речь пойдет в следующих публикациях.

Вычисление в Python:

> risk_p_monthly = ror_p.std()
> ror_p_mean = (1. + ror_p).mean()
> risk_p_yearly = np.sqrt(risk_p_monthly**2 + ror_p_mean**2)**12 - ror_p_mean**24)

Среднегодовая доходность

Среднегодовая доходность (Compound annual growth rate, CAGR) портфеля вычисляется как среднее геометрическое на выбранном периоде. Через данные месячных доходностей CAGR вычисляется по формуле:

где – рациональное число равное количеству лет.

Реальная среднегодовая доходность (Real CAGR) портфеля вычисляется по формуле:

Что после простых преобразований эквивалентно формуле:

Вычисляется в Python:

> cagr_p = (ror_p + 1.).prod() ** years_total - 1.
> cagr_p_real = (ror_p_real + 1.).prod() ** years_total - 1.
> cagr_p_real = (cagr_p + 1.) / (inflation_accumulated[-1] + 1.) - 1.

В следующей статье мы разберем оптимизацию простейшего портфеля в Python.

Понравилась статья?

Самое интересное и важное в нашей рассылке

Анонсы свежих статей Информация о вебинарах Советы экспертов

Нажимая на кнопку "Подписаться", я соглашаюсь с политикой конфиденциальности


Комментарии (8)

    наверх