Mengukur Risiko dan Pulangan - Pendahuluan kepada Teori Markowitz

Penulis:Lydia, Dicipta: 2023-11-13 11:05:54, Dikemas kini: 2024-01-01 12:23:29

img

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.

Konsep utama Teori Markowitz

  1. Kadar pulangan yang dijangkakan: Ini adalah pulangan yang pelabur menjangkakan untuk menerima daripada memegang aset atau portfolio pelaburan, biasanya meramalkan berdasarkan data pulangan sejarah.

img

Di mana,imgadalah pulangan yang dijangkakan dari portfolio,imgialah berat aset ke-i dalam portfolio,imgadalah pulangan yang dijangkakan bagi aset ke-i.

  1. Risiko (Volatiliti atau Penyimpangan Standard): Digunakan untuk mengukur ketidakpastian pulangan pelaburan atau turun naik pelaburan.

img

Di mana,imgmewakili risiko keseluruhan portfolio,imgadalah kovariansi aset i dan aset j, yang mengukur hubungan perubahan harga antara kedua-dua aset ini.

  1. Covariance: Mengukur hubungan antara perubahan harga dua aset.

img

Di mana,imgialah pekali korelasi aset i dan aset j,imgdanimgialah masing-masing penyimpangan standard aset i dan aset j.

  1. Sempadan yang cekap: Dalam sistem penyelarasan risiko - pulangan, sempadan cekap adalah set portfolio pelaburan yang boleh memberikan pulangan maksimum yang dijangkakan pada tahap risiko tertentu.

img

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.

Contoh Kod Python untuk Mencari Gabungan Optimal Menggunakan Kaedah Simulasi

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/

  1. Dapatkan data pasaran:

Melaluiget_dataIni adalah data yang diperlukan untuk mengira pulangan dan risiko, yang digunakan untuk membina portfolio pelaburan dan mengira nisbah Sharpe.

  1. Mengira Kadar Pulangan dan Risiko:

Peraturancalculate_returns_riskFungsi ini digunakan untuk mengira pulangan tahunan dan risiko tahunan (pengecualian standard) untuk setiap mata wang digital.

  1. Mengira Portofolio Optimal Markowitz:

Peraturancalculate_optimal_portfoliofungsi 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

img


Lebih lanjut