НачатьНачать бесплатно

Вычисление портфелей

Теперь мы сгенерируем портфели, чтобы найти оптимальный для каждого месяца. Функция random.random() из библиотеки numpy генерирует случайные числа из равномерного распределения, после чего мы нормализуем их так, чтобы сумма равнялась 1, с помощью оператора /=. Эти веса используются для вычисления доходности и волатильности. Доходность — это сумма произведений весов на индивидуальные доходности акций. Волатильность вычисляется сложнее и включает ковариации различных акций.

В конце мы сохраним полученные значения в словарях для дальнейшего использования — в качестве ключей будут выступать даты месяцев.

В данном примере для каждой даты генерируется только 10 портфелей, чтобы код выполнялся быстрее. В реальных задачах рекомендуется использовать от 1000 до 5000 случайно сгенерированных портфелей для нескольких акций.

Это упражнение является частью курса

Машинное обучение для финансов на Python

Посмотреть курс

Инструкции к упражнению

  • Сгенерируйте 3 случайных числа для весов с помощью np.random.random().
  • Вычислите returns, взяв скалярное произведение (np.dot(); умножает элементы поэлементно и суммирует два массива) вектора weights и ежемесячной доходности для текущей date в цикле.
  • Используйте метод .setdefault(), чтобы добавить пустой список ([]) в словарь portfolio_weights для текущей date, затем добавьте weights в этот список с помощью append.

Интерактивное практическое упражнение

Попробуйте выполнить это упражнение, дополнив этот пример кода.

portfolio_returns, portfolio_volatility, portfolio_weights = {}, {}, {}

# Get portfolio performances at each month
for date in sorted(covariances.keys()):
    cov = covariances[date]
    for portfolio in range(10):
        weights = np.random.random(____)
        weights /= np.sum(weights) # /= divides weights by their sum to normalize
        returns = np.dot(____, returns_monthly.loc[____])
        volatility = np.sqrt(np.dot(weights.T, np.dot(cov, weights)))
        portfolio_returns.setdefault(date, []).append(returns)
        portfolio_volatility.setdefault(date, []).append(volatility)
        portfolio_weights.setdefault(date, ____).append(____)
        
print(portfolio_weights[date][0])
Редактировать и запускать код