Tuần trước, chúng tôi đã giới thiệuQuản lý rủi ro VaRKhi nói về rủi ro của danh mục đầu tư, nó không bằng rủi ro của từng tài sản riêng lẻ mà 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, tức là chúng cùng tăng và cùng giảm, thì việc đa dạng hóa các khoản đầu tư dài hạn sẽ không làm giảm rủi ro. Nếu mối tương quan tiêu cực rất mạnh, thì việc đa dạng hóa có thể làm giảm đáng kể rủi ro. Câu hỏi tự nhiên đặt ra là, khi đầu tư vào một danh mục đầu tư, làm thế nào để tối đa hóa lợi nhuận ở một mức độ rủi ro nhất định? Đây chính là lúc lý thuyết Markowitz mà tôi sẽ giới thiệu hôm nay phát huy tác dụng.
Lý thuyết danh mục đầu tư hiện đại (MPT), được Harry Markowitz đề xuất vào năm 1952, là một khuôn khổ toán học để lựa chọn danh mục đầu tư nhằm tối đa hóa lợi nhuận kỳ vọng bằng cách lựa chọn các kết hợp tài sản rủi ro khác nhau. lợi nhuận trong khi kiểm soát rủi ro. Ý tưởng cốt lõi là giá tài sản không biến động hoàn toàn đồng bộ (tức là không có mối tương quan không hoàn hảo giữa các tài sản) và rủi ro đầu tư tổng thể có thể giảm bằng cách đa dạng hóa phân bổ tài sản.
\(E(R_p) = \sum_{i=1}^{n} w_i E(R_i)\)
Trong đó \(E(R_p)\) là tỷ lệ lợi nhuận dự kiến của danh mục đầu tư, \(wi\) là trọng số của tài sản thứ \(i\) trong danh mục đầu tư và \(E(R_i)\) là tỷ lệ lợi nhuận dự kiến của $ Tài sản thứ i. .
\(\sigma_p = \sqrt{\sum_{i=1}^{n} \sum_{j=1}^{n} w_i w_j \sigma_{ij}}\)
Trong đó \(\sigma_p\) là tổng rủi ro của danh mục đầu tư và \(\sigma_{ij}\) là hiệp phương sai giữa tài sản \(i\) và tài sản \(j\), đo lường mối quan hệ giữa sự thay đổi giá của hai tài sản.
\(\sigma_{ij} = \rho_{ij} \sigma_i \sigma_j\)
Trong đó \(\rho_{ij}\) là hệ số tương quan giữa tài sản \(i\) và tài sản \(j\), \(\sigma_i\) và \(\sigma_j\) lần lượt là độ lệch chuẩn của tài sản \(i\) và tài sản \(j\).
Hình ảnh trên là sơ đồ của đường biên hiệu quả. Mỗi điểm biểu diễn một danh mục đầu tư với các trọng số khác nhau. Trục ngang là độ biến động, tức là mức độ rủi ro, và trục dọc là tỷ lệ lợi nhuận. Rõ ràng là chúng ta tập trung vào phần trên của đồ thị, nơi đạt được lợi nhuận cao nhất ở cùng mức rủi ro.
Trong giao dịch định lượng và quản lý danh mục đầu tư, việc áp dụng các nguyên tắc này đòi hỏi phả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 kỳ vọng, độ lệch chuẩn và hiệp phương sai của nhiều tài sản khác nhau. Sau đó, các kỹ thuật tối ưu hóa được áp dụng để tìm ra cấu hình trọng số tài sản tốt nhất. Quá trình này thường bao gồm các phép tính toán học phức tạp và nhiều xử lý máy tính, đó 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. Sau đây sẽ sử dụng một ví dụ Python cụ thể để minh họa cách tối ưu hóa.
Việc tính toán danh mục đầu tư tối ưu của Markowitz là một quá trình gồm nhiều bước bao gồm một số bước chính như chuẩn bị dữ liệu, mô phỏng danh mục đầu tư và tính toán chỉ số. Tham khảo: https://plotly.com/python/v3/ipython-notebooks/markowitz-portfolio-optimization/
Nhận dữ liệu thị trường:
get_data
Chức năng lấy dữ liệu giá lịch sử của loại tiền kỹ thuật số đã chọn. Đây là dữ liệu cần thiết để tính toán tỷ lệ lợi nhuận và rủi ro, được sử dụng để xây dựng danh mục đầu tư và tính tỷ lệ Sharpe.Tính toán lợi nhuận và rủi ro:
calculate_returns_risk
Hàm này tính toán tỷ lệ lợi nhuận hàng năm và rủi ro hàng năm (độ lệch chuẩn) cho mỗi loại tiền kỹ thuật số. Điều này nhằm định lượng hiệu suất lịch sử của từng tài sản để sử dụng trong danh mục đầu tư tối ưu.Tính toán danh mục đầu tư tối ưu của Markowitz:
calculate_optimal_portfolio
Chức năng mô phỏng nhiều danh mục đầu tư. Trong mỗi mô phỏng, 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 toán dựa trên các trọng số này.Mục tiêu của toàn bộ quá trình là tìm ra danh mục đầu tư mang lại lợi nhuận kỳ vọng tốt nhất cho một mức rủi ro nhất định. Bằng cách mô phỏng nhiều kết hợp có thể xảy ra, 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à lựa chọn kết hợp phù hợp nhất với mục tiêu đầu tư và khả năng chịu rủi ro của mình. Cách tiếp cận này giúp tối ưu hóa các quyết định đầu tư và giúp việc đầu tư hiệu quả hơn.
import numpy as np
import pandas as pd
import requests
import matplotlib.pyplot as plt
# 获取行情数据
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)
# 计算马科维茨最优组合
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) # 将权重转换为列表
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]
# 输出结果
print("最优组合:")
for i in range(len(symbols)):
print(f"{symbols[i]}权重: {optimal_weights[i]:.4f}")
print(f"预期收益率: {optimal_return:.4f}")
print(f"预期风险(标准差): {optimal_risk:.4f}")
print(f"夏普比率: {optimal_return / optimal_risk:.4f}")
# 可视化投资组合
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()
Đầu ra cuối cùng:
Sự kết hợp tốt nhất:
Khối lượng BTCUSDT: 0,0721
Khối lượng ETHUSDT: 0,2704
Trọng lượng BNBUSDT: 0.3646
Trọng lượng LINKUSDT: 0,1892
Trọng lượng BCHUSDT: 0,0829
Trọng lượng LTCUSDT: 0,0209
Lợi nhuận dự kiến: 0,4195
Rủi ro dự kiến (độ lệch chuẩn): 0,1219
Tỷ lệ Sharpe: 3.4403