Zacznij terazZacznij za darmo

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

Zobacz kurs

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) weights z miesięcznymi zwrotami dla bieżącej date w pętli.
  • Użyj metody .setdefault(), aby dodać pustą listę ([]) do słownika portfolio_weights dla bieżącej date, a następnie dołącz weights do 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])
Edytuj i uruchom kod