Tuần trước, khi giới thiệuLàm thế nào để đo rủi ro vị trí - Giới thiệu về phương pháp VaR, nó đã được đề cập rằng rủi ro của một danh mục đầu tư không bằng với rủi ro của các tài sản cá nhân và liên quan đến mối tương quan giá của chúng. lấy hai tài sản làm ví dụ, nếu mối tương quan tích cực của chúng rất mạnh, nghĩa là chúng tăng và giảm cùng nhau, thì đầu tư đa dạng sẽ không làm giảm rủi ro. Nếu có mối tương quan tiêu cực mạnh, đầu tư đa dạng có thể làm giảm rủi ro đáng kể. Câu hỏi tự nhiên sau đó nảy sinh: làm thế nào chúng ta tối đa hóa lợi nhuận ở một mức độ rủi ro nhất định khi đầu tư vào danh mục đầu tư? Điều này dẫn chúng ta đến Lý thuyết Markowitz, mà chúng ta sẽ giới thiệu hôm nay.
Lý thuyết danh mục đầu tư hiện đại (MPT), được đề xuất bởi Harry Markowitz vào năm 1952, là một khuôn khổ toán học cho việc lựa chọn danh mục đầu tư. Nó nhằm mục đích tối đa hóa lợi nhuận mong đợi bằng cách chọn các kết hợp khác nhau của các tài sản rủi ro trong khi kiểm soát rủi ro. Ý tưởng cốt lõi là giá của tài sản không di chuyển hoàn toàn đồng bộ với nhau (tức là, có mối tương quan không đầy đủ giữa các tài sản), và rủi ro đầu tư tổng thể có thể được giảm thông qua phân bổ tài sản đa dạng.
Ở đâu?là lợi nhuận dự kiến của danh mục đầu tư,là trọng lượng của tài sản số i trong danh mục đầu tư,là lợi nhuận dự kiến của tài sản số i.
Ở đâu?đại diện cho tổng rủi ro của danh mục đầu tư,là sự tương đồng của tài sản i và tài sản j, đo mối quan hệ thay đổi giá giữa hai tài sản này.
Ở đâu?là hệ số tương quan của tài sản i và tài sản j,vàtương ứng là độ lệch chuẩn của tài sản i và tài sản j.
Biểu đồ trên là một minh họa của một ranh giới hiệu quả, trong đó mỗi điểm đại diện cho một danh mục đầu tư có trọng số khác nhau. trục x biểu thị sự biến động, tương đương với mức độ rủi ro, trong khi trục y biểu thị tỷ lệ lợi nhuận. Rõ ràng, chúng tôi tập trung vào cạnh trên của biểu đồ vì nó đạt được lợi nhuận cao nhất ở mức rủi ro tương đương.
Trong giao dịch định lượng và quản lý danh mục đầu tư, áp dụng các nguyên tắc này đòi hỏi phân tích thống kê dữ liệu lịch sử và sử dụng các mô hình toán học để ước tính lợi nhuận dự kiến, độ lệch chuẩn và sự tương đồng cho các tài sản khác nhau. Sau đó, các kỹ thuật tối ưu hóa được sử dụng để tìm phân bổ trọng lượng tài sản tốt nhất. Quá trình này thường liên quan đến các hoạt động toán học phức tạp và xử lý máy tính rộng rãi - đây là lý do tại sao phân tích định lượng đã trở nên rất quan trọng trong tài chính hiện đại. Tiếp theo, chúng tôi sẽ minh họa cách tối ưu hóa bằng các ví dụ cụ thể của Python.
Tính toán danh mục đầu tư tối ưu của Markowitz là một quá trình nhiều bước, liên quan đến một số bước chính, chẳng hạn như chuẩn bị dữ liệu, mô phỏng danh mục đầu tư và tính toán chỉ số.https://plotly.com/python/v3/ipython-notebooks/markowitz-portfolio-optimization/
Thông quaget_data
Đây là dữ liệu cần thiết để tính toán lợi nhuận và rủi ro, được sử dụng để xây dựng danh mục đầu tư và tính toán tỷ lệ Sharpe.
Cáccalculate_returns_risk
chức năng được sử dụng để tính toán lợi nhuận hàng năm và rủi ro hàng năm (sự lệch chuẩn) cho mỗi loại tiền kỹ thuật số.
Cáccalculate_optimal_portfolio
trong mỗi mô phỏng, các trọng số tài sản được tạo ngẫu nhiên và sau đó lợi nhuận và rủi ro dự kiến của danh mục đầu tư được tính dựa trên các trọng số này.
Bằng cách tạo ra các kết hợp ngẫu nhiên với các trọng lượng khác nhau, có thể khám phá nhiều danh mục đầu tư tiềm năng để tìm ra danh mục đầu tư tối ưu.
Mục đích của toàn bộ quá trình là tìm danh mục đầu tư mang lại lợi nhuận dự kiến tốt nhất ở mức độ rủi ro nhất định. Bằng cách mô phỏng nhiều sự kết hợp có thể, các nhà đầu tư có thể hiểu rõ hơn về hiệu suất của các cấu hình khác nhau và chọn sự kết hợp phù hợp nhất với mục tiêu đầu tư và dung nạp rủi ro của họ. Phương pháp này giúp tối ưu hóa các quyết định đầu tư, làm cho đầu tư hiệu quả hơn.
import numpy as np
import pandas as pd
import requests
import matplotlib.pyplot as plt
# Obtain market data
def get_data(symbols):
data = []
for symbol in symbols:
url = 'https://api.binance.com/api/v3/klines?symbol=%s&interval=%s&limit=1000'%(symbol,'1d')
res = requests.get(url)
data.append([float(line[4]) for line in res.json()])
return data
def calculate_returns_risk(data):
returns = []
risks = []
for d in data:
daily_returns = np.diff(d) / d[:-1]
annualized_return = np.mean(daily_returns) * 365
annualized_volatility = np.std(daily_returns) * np.sqrt(365)
returns.append(annualized_return)
risks.append(annualized_volatility)
return np.array(returns), np.array(risks)
# Calculate Markowitz Optimal Portfolio
def calculate_optimal_portfolio(returns, risks):
n_assets = len(returns)
num_portfolios = 3000
results = np.zeros((4, num_portfolios), dtype=object)
for i in range(num_portfolios):
weights = np.random.random(n_assets)
weights /= np.sum(weights)
portfolio_return = np.sum(returns * weights)
portfolio_risk = np.sqrt(np.dot(weights.T, np.dot(np.cov(returns, rowvar=False), weights)))
results[0, i] = portfolio_return
results[1, i] = portfolio_risk
results[2, i] = portfolio_return / portfolio_risk
results[3, i] = list(weights) # Convert weights to a list
return results
symbols = ['BTCUSDT','ETHUSDT', 'BNBUSDT','LINKUSDT','BCHUSDT','LTCUSDT']
data = get_data(symbols)
returns, risks = calculate_returns_risk(data)
optimal_portfolios = calculate_optimal_portfolio(returns, risks)
max_sharpe_idx = np.argmax(optimal_portfolios[2])
optimal_return = optimal_portfolios[0, max_sharpe_idx]
optimal_risk = optimal_portfolios[1, max_sharpe_idx]
optimal_weights = optimal_portfolios[3, max_sharpe_idx]
# Output results
print("Optimal combination:")
for i in range(len(symbols)):
print(f"{symbols[i]} Weight: {optimal_weights[i]:.4f}")
print(f"Expected return rate: {optimal_return:.4f}")
print(f"Expected risk (standard deviation): {optimal_risk:.4f}")
print(f"Sharpe ratio: {optimal_return / optimal_risk:.4f}")
# Visualized investment portfolio
plt.figure(figsize=(10, 5))
plt.scatter(optimal_portfolios[1], optimal_portfolios[0], c=optimal_portfolios[2], marker='o', s=3)
plt.title('portfolio')
plt.xlabel('std')
plt.ylabel('return')
plt.colorbar(label='sharp')
plt.show()
Kết quả đầu ra cuối cùng: Sự kết hợp tối ưu: Trọng lượng của BTCUSDT: 0.0721 Trọng lượng của ETHUSDT: 0.2704 Trọng lượng của BNBUSDT: 0,3646 Trọng lượng của LINKUSDT: 0.1892 Trọng lượng của BCHUSDT: 0.0829 Trọng lượng của LTCUSDT: 0,0209 Tỷ lệ lợi nhuận dự kiến: 0.4195 Rủi ro dự kiến (mức lệch chuẩn): 0,1219 Tỷ lệ Sharpe: 3.4403