Minggu lepas, ketika memperkenalkanBagaimana untuk mengukur risiko kedudukan - Pengenalan kepada Kaedah VaRDalam artikel ini, disebutkan bahawa risiko portfolio tidak sama dengan risiko aset individu dan berkaitan dengan korelasi harga mereka. Mengambil dua aset sebagai contoh, jika korelasi positif mereka sangat kuat, yang bermaksud mereka naik dan jatuh bersama-sama, maka pelaburan pelbagai tidak akan mengurangkan risiko. Jika terdapat korelasi negatif yang kuat, pelaburan pelbagai dapat mengurangkan risiko dengan ketara. Persoalan semula jadi kemudian timbul: bagaimana kita memaksimumkan pulangan pada tahap risiko tertentu ketika melabur dalam portfolio? Ini membawa kita kepada Teori Markowitz, yang akan kita perkenalkan hari ini.
Teori Portfolio Moden (MPT), yang dicadangkan oleh Harry Markowitz pada tahun 1952, adalah kerangka matematik untuk pemilihan portfolio. Ia bertujuan untuk memaksimumkan pulangan yang diharapkan dengan memilih kombinasi aset risiko yang berbeza sambil mengawal risiko.
Di mana,adalah pulangan yang dijangkakan dari portfolio,ialah berat aset ke-i dalam portfolio,adalah pulangan yang dijangkakan bagi aset ke-i.
Di mana,mewakili risiko keseluruhan portfolio,adalah kovariansi aset i dan aset j, yang mengukur hubungan perubahan harga antara kedua-dua aset ini.
Di mana,ialah pekali korelasi aset i dan aset j,danialah masing-masing penyimpangan standard aset i dan aset j.
Rajah di atas adalah ilustrasi sempadan yang cekap, di mana setiap titik mewakili portfolio pelaburan yang berbeza. paksi x menunjukkan turun naik, yang sama dengan tahap risiko, sementara paksi y menandakan kadar pulangan. Jelas, tumpuan kami terletak di tepi atas grafik kerana ia mencapai pulangan tertinggi pada tahap risiko yang sama.
Dalam perdagangan kuantitatif dan pengurusan portfolio, penerapan prinsip-prinsip ini memerlukan analisis statistik data sejarah dan menggunakan model matematik untuk menganggarkan pulangan yang diharapkan, penyimpangan standard dan kovariansi untuk pelbagai aset. Kemudian teknik pengoptimuman digunakan untuk mencari peruntukan berat aset yang terbaik. Proses ini sering melibatkan operasi matematik yang kompleks dan pemprosesan komputer yang luas - inilah sebabnya analisis kuantitatif menjadi sangat penting dalam kewangan moden. Seterusnya, kita akan menggambarkan cara mengoptimumkan dengan contoh Python tertentu.
Pengiraan portfolio optimum Markowitz adalah proses pelbagai langkah, yang melibatkan beberapa langkah utama, seperti penyediaan data, simulasi portfolio, dan pengiraan penunjuk.https://plotly.com/python/v3/ipython-notebooks/markowitz-portfolio-optimization/
Melaluiget_data
Ini adalah data yang diperlukan untuk mengira pulangan dan risiko, yang digunakan untuk membina portfolio pelaburan dan mengira nisbah Sharpe.
Peraturancalculate_returns_risk
Fungsi ini digunakan untuk mengira pulangan tahunan dan risiko tahunan (pengecualian standard) untuk setiap mata wang digital.
Peraturancalculate_optimal_portfolio
fungsi digunakan untuk mensimulasikan pelbagai portfolio pelaburan. Dalam setiap simulasi, berat aset dihasilkan secara rawak dan kemudian pulangan dan risiko yang dijangkakan portfolio dikira berdasarkan berat ini.
Dengan menghasilkan kombinasi secara rawak dengan berat yang berbeza, adalah mungkin untuk meneroka pelbagai portfolio pelaburan berpotensi untuk mencari yang optimum.
Tujuan keseluruhan proses adalah untuk mencari portfolio pelaburan yang menghasilkan pulangan yang diharapkan terbaik pada tahap risiko tertentu. Dengan mensimulasikan pelbagai kombinasi yang mungkin, pelabur dapat lebih memahami prestasi konfigurasi yang berbeza dan memilih kombinasi yang paling sesuai dengan matlamat pelaburan dan toleransi risiko mereka. Kaedah ini membantu mengoptimumkan keputusan pelaburan, menjadikan pelaburan lebih berkesan.
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()
Hasil output akhir: Gabungan yang optimum: Berat BTCUSDT: 0.0721 Berat ETHUSDT: 0.2704 Berat BNBUSDT: 0.3646 Berat LINKUSDT: 0.1892 Berat BCHUSDT: 0.0829 Berat LTCUSDT: 0.0209 Kadar pulangan yang dijangkakan: 0.4195 Risiko yang dijangkakan (pengecualian standard): 0.1219 Nisbah Sharpe: 3.4403