Kom igångKom igång gratis

Beräkna portföljer

Nu ska vi generera portföljer för att hitta den bästa för varje månad. numpy:s random.random() genererar slumpmässiga tal från en likformig fördelning, som vi sedan normaliserar så att de summerar till 1 med hjälp av operatorn /=. Vi använder dessa vikter för att beräkna avkastning och volatilitet. Avkastningen är summan av vikterna multiplicerade med de individuella avkastningarna. Volatiliteten är mer komplex och beräknas utifrån kovariansen mellan de olika aktierna.

Slutligen lagrar vi värdena i ordböcker för senare användning, med månadsdatum som nycklar.

I det här fallet genererar vi bara 10 portföljer per datum så att koden körs snabbare, men i ett verkligt scenario skulle du vilja använda ungefär 1 000 till 5 000 slumpmässigt genererade portföljer för ett fåtal aktier.

Den här övningen är en del av kursen

Maskininlärning för finans i Python

Visa kurs

Övningsinstruktioner

  • Generera 3 slumpmässiga tal för vikterna med np.random.random().
  • Beräkna returns genom att ta skalärprodukten (np.dot(); multiplicerar element för element och summerar två arrayer) av weights med de månatliga avkastningarna för aktuellt date i loopen.
  • Använd metoden .setdefault() för att lägga till en tom lista ([]) i ordboken portfolio_weights för aktuellt date, och lägg sedan till weights i listan.

Interaktiv övning med praktiskt arbete

Testa den här övningen genom att slutföra den här exempelkoden.

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])
Redigera och kör kod