Calcola i portafogli
Ora genereremo dei portafogli per trovare il migliore di ogni mese. random.random() di numpy genera numeri casuali da una distribuzione uniforme; poi li normalizziamo in modo che sommino a 1 usando l'operatore /=. Usiamo questi pesi per calcolare rendimenti e volatilità. I rendimenti sono somme di pesi per i singoli rendimenti. La volatilità è più complessa e coinvolge le covarianze dei diversi titoli.
Infine salveremo i valori in dizionari per usarli in seguito, con le date dei mesi come chiavi.
In questo caso genereremo solo 10 portafogli per ciascuna data così il codice sarà più rapido, ma in uno scenario reale vorresti usare da 1000 a 5000 portafogli generati casualmente per un numero ridotto di titoli.
Questo esercizio fa parte del corso
Machine Learning per la finanza in Python
Istruzioni dell'esercizio
- Genera 3 numeri casuali per i pesi usando
np.random.random(). - Calcola
returnsfacendo il prodotto scalare (np.dot(); moltiplica elemento per elemento e somma due array) traweightse i rendimenti mensili per ladatecorrente nel loop. - Usa il metodo
.setdefault()per aggiungere una lista vuota ([]) al dizionarioportfolio_weightsper ladatecorrente, quindi aggiungiweightsalla lista.
esercizio interattivo pratico
Prova questo esercizio completando questo codice di esempio.
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])