В предыдущей статье мы рассказали про базовые показатели отдельного актива, которые интересны сами по себе. Для решения задач портфельных инвестиций (в частности практической реализации теории Г.Марковица, о которой мы расскажем в следующих статьях) бо’льший интерес представляют портфели и их показатели, которые расчитываются на основе входящих в них активов. В этой статье мы рассмотрим базовые показатели портфеля.
Итак, строго говоря портфель – это множество, состоящее из пар: , где – это актив из предыдущей статьи, и – вес актива, и в общем случае, но из соображений статистики, о которых мы расскажем в следующих статьях, не превышает .
Каждый показатель портфеля аналогичен по смыслу соответствующему показателю актива. И каждый показатель портфеля вычисляется на основе составляющих его активов.
Для избежания путаницы в обозначениях, далее мы будем обозначать показатель с верхним индексом , относящийся к портфелю, а с верхним индексом – относящийся к активу. Например, и – доходность портфеля и актива соответственно.
Доходность
Все определения мы дали в предыдущей статье. Здесь и далее приведём только формулы для вычислений:
Доходность (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(axis=0)
> aror_p = (ror_p + 1.).cumprod() - 1.
> ror_p_real = (ror_p + 1.) / (inflation + 1.) - 1.
> aror_p_real = (aror_p + 1.) / (inflation_accumulated + 1.) - 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)
Среднегодовая доходность
Среднегодовая доходность (CAGR) портфеля вычисляется по формуле:
где – рациональное число равное количеству лет. Вычисляется в Python:
Реальная среднегодовая доходность (Real CAGR) портфеля вычисляется по формуле:
Что после простых преобразований эквивалентно формуле:
Вычисляется в Python
:
> cagr_p = (ror_p + 1.).prod() ** (1 / years_total) - 1.
> cagr_p_real = (ror_p_real + 1.).prod() ** (1 / years_total) - 1.
> cagr_p_real = (cagr_p + 1.) / (inflation_accumulated[-1] + 1.) - 1.