Obliczanie portfeli
Teraz wygenerujemy portfele, aby znaleźć najlepszy z nich dla każdego miesiąca. Funkcja random.random() z biblioteki numpy generuje losowe liczby z rozkładu jednostajnego – następnie normalizujemy je tak, by sumowały się do 1, używając operatora /=. Na podstawie tych wag obliczamy zwroty i zmienność. Zwroty to sumy iloczynów wag i indywidualnych zwrotów poszczególnych akcji. Zmienność jest bardziej złożona i uwzględnia kowariancje między różnymi akcjami.
Na koniec zapiszemy wartości w słownikach do późniejszego wykorzystania – jako klucze posłużą daty miesięcy.
W tym ćwiczeniu generujemy tylko 10 portfeli dla każdej daty, żeby kod działał szybciej. W prawdziwym zastosowaniu warto generować od 1000 do 5000 losowych portfeli dla kilku akcji.
To ćwiczenie jest częścią kursu
Uczenie maszynowe w finansach z Pythonem
Instrukcje do ćwiczenia
- Wygeneruj 3 losowe liczby dla wag, używając
np.random.random(). - Oblicz
returns, wyznaczając iloczyn skalarny (np.dot(); mnoży elementy parami i sumuje dwie tablice)weightsz miesięcznymi zwrotami dla bieżącejdatew pętli. - Użyj metody
.setdefault(), aby dodać pustą listę ([]) do słownikaportfolio_weightsdla bieżącejdate, a następnie dołączweightsdo tej listy.
Interaktywne ćwiczenie praktyczne
Spróbuj tego ćwiczenia, uzupełniając ten przykładowy kod.
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])