Tính toán danh mục
Giờ bạn sẽ tạo các danh mục để tìm danh mục tốt nhất của từng tháng. random.random() của numpy tạo các số ngẫu nhiên từ phân phối đều; sau đó ta chuẩn hóa để chúng có tổng bằng 1 bằng cách dùng toán tử /=. Ta dùng các trọng số này để tính lợi nhuận và độ biến động. Lợi nhuận là tổng của trọng số nhân với lợi nhuận từng cổ phiếu. Độ biến động phức tạp hơn, có liên quan đến hiệp phương sai giữa các cổ phiếu khác nhau.
Cuối cùng, ta sẽ lưu các giá trị vào các dictionary để dùng về sau, với ngày tháng làm khóa.
Trong ví dụ này, ta chỉ tạo 10 danh mục cho mỗi ngày để mã chạy nhanh hơn; nhưng trong thực tế, bạn sẽ muốn dùng khoảng 1000 đến 5000 danh mục ngẫu nhiên đối với một vài cổ phiếu.
Bài tập này là một phần của khóa học
Machine Learning cho Tài chính bằng Python
Hướng dẫn bài tập
- Tạo 3 số ngẫu nhiên cho trọng số bằng
np.random.random(). - Tính
returnsbằng cách lấy tích vô hướng (np.dot(); nhân từng phần tử và cộng tổng hai mảng) giữaweightsvà lợi nhuận theo tháng củadatehiện tại trong vòng lặp. - Dùng phương thức
.setdefault()để thêm một danh sách rỗng ([]) vào dictionaryportfolio_weightschodatehiện tại, rồi thêmweightsvào danh sách đó.
Bài tập tương tác thực hành trực tiếp
Hãy thử làm bài tập này bằng cách hoàn thành đoạn mã mẫu này.
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])