Optimalisasi portofolio investasi dengan metode Markowitz





Contoh implementasi standar dengan Python untuk pengoptimalan portofolio investasi menggunakan metode Markowitz. Ada banyak penerapan metode ini. Termasuk Python. Diimplementasikan lagi (lihat tautan di GitHub ).



Sumber



Mari kita ambil sedikit teori dari sumber-sumber ini:

Portofolio Investasi Terbaik Melalui Simulasi Monte Carlo dalam Teori Portofolio Python

Markowitz (Wikipedia)



Mendownload data kutipan



Kami menggunakan data dari layanan Yahoo.Finance



! pip install yfinance
import yfinance as yf




Kami mengambil beberapa saham pasar Amerika selama 3 bulan terakhir.



data = yf.download(['AAPL','GE','BAC','AMD','PLUG','F'],period='3mo')




Tarif penutupan



Kami akan menggunakan kurs penutupan harian dalam perhitungan kami



closeData = data.Close
closeData








Bagan kursus



import matplotlib.pyplot as plt

for name in closeData.columns:
    closeData[name].plot()
    plt.grid()
    plt.title(name)
    plt.show()




























Mengubah kursus



Selanjutnya, Anda memerlukan perubahan relatif ke hari sebelumnya.



dCloseData = closeData.pct_change()
dCloseData








Grafik perubahan tarif relatif





for name in dCloseData.columns:
    dCloseData[name].plot()
    plt.title(name)
    plt.grid()
    plt.show()




























Hasil rata-rata



Pengembalian harian rata-rata untuk setiap saham untuk menghitung pengembalian portofolio.



dohMean = dCloseData.mean()
dohMean








Kovarian





Untuk menghitung risiko portofolio, diperlukan matriks kovarians.



cov = dCloseData.cov()
cov








Portofolio acak



Kami akan menghasilkan portofolio acak. Di dalamnya, jumlah sahamnya sama dengan 1 (satu).



import numpy as np

cnt = len(dCloseData.columns)

def randPortf():
    res = np.exp(np.random.randn(cnt))
    res = res / res.sum()
    return res

r = randPortf()
print(r)
print(r.sum())




[0.07519908 0.07594622 0.20932539 0.40973202 0.1234458  0.10635148]
1.0




Pengembalian portofolio



Pengembalian portofolio dihitung sebagai jumlah saham dari pengembalian setiap saham dalam portofolio.



def dohPortf(r):
    return np.matmul(dohMean.values,r)

r = randPortf()
print(r)
d = dohPortf(r)
print(d)




[0.0789135  0.13031559 0.25977124 0.21157419 0.13506695 0.18435853]
0.006588795350151513




Risiko portofolio¶



Kami menghitung risiko portofolio melalui produk matriks saham portofolio dan matriks kovarian.



def riskPortf(r):
    return np.sqrt(np.matmul(np.matmul(r,cov.values),r))

r = randPortf()
print(r)
rs = riskPortf(r)
print(rs)




[0.10999361 0.13739338 0.20412889 0.13648828 0.24021123 0.17178461]
0.02483674110724784




Awan portofolio



Mari buat satu set portofolio dan tampilkan hasilnya pada grafik pengembalian risiko. Mari kita temukan parameter portofolio optimal untuk risiko minimum dan rasio Sharpe maksimum. Mari bandingkan dengan data portofolio rata-rata.




risk = np.zeros(N)
doh = np.zeros(N)
portf = np.zeros((N,cnt))

for n in range(N):
    r = randPortf()

    portf[n,:] = r
    risk[n] = riskPortf(r)
    doh[n] = dohPortf(r)

plt.figure(figsize=(10,8))

plt.scatter(risk*100,doh*100,c='y',marker='.')
plt.xlabel(', %')
plt.ylabel(', %')
plt.title(" ")

min_risk = np.argmin(risk)
plt.scatter([(risk[min_risk])*100],[(doh[min_risk])*100],c='r',marker='*',label=' ')

maxSharpKoef = np.argmax(doh/risk)
plt.scatter([risk[maxSharpKoef]*100],[doh[maxSharpKoef]*100],c='g',marker='o',label=' - ')

r_mean = np.ones(cnt)/cnt
risk_mean = riskPortf(r_mean)
doh_mean = dohPortf(r_mean)
plt.scatter([risk_mean*100],[doh_mean*100],c='b',marker='x',label=' ')

plt.legend()

plt.show()








Mari kita tampilkan data dari portofolio yang ditemukan.



import pandas as pd

print('----------   ----------')
print()
print(" = %1.2f%%" % (float(risk[min_risk])*100.))
print(" = %1.2f%%" % (float(doh[min_risk])*100.)) 
print()
print(pd.DataFrame([portf[min_risk]*100],columns=dCloseData.columns,index=[', %']).T)
print()

print('----------    ----------')
print()
print(" = %1.2f%%" % (float(risk[maxSharpKoef])*100.))
print(" = %1.2f%%" % (float(doh[maxSharpKoef])*100.)) 
print()
print(pd.DataFrame([portf[maxSharpKoef]*100],columns=dCloseData.columns,index=[', %']).T)
print()

print('----------   ----------')
print()
print(" = %1.2f%%" % (float(risk_mean)*100.)) 
print(" = %1.2f%%" % (float(doh_mean)*100.)) 
print()
print(pd.DataFrame([r_mean*100],columns=dCloseData.columns,index=[', %']).T)
print()




----------   ----------

 = 1.80%
 = 0.59%

        , %
AAPL  53.890706
AMD   12.793389
BAC    4.117541
F     16.547201
GE    10.945462
PLUG   1.705701

----------    ----------

 = 2.17%
 = 0.88%

        , %
AAPL  59.257114
AMD    8.317192
BAC    2.049882
F      8.689935
GE     4.772159
PLUG  16.913719

----------   ----------

 = 2.33%
 = 0.68%

        , %
AAPL  16.666667
AMD   16.666667
BAC   16.666667
F     16.666667
GE    16.666667
PLUG  16.666667




kesimpulan



Kami mengulangi metode klasik untuk menghitung saham dari portofolio investasi. Kami mendapat hasil yang cukup konkret.



Pengoptimalan portofolio menggunakan metode Markowitz mengandaikan pelestarian parameter di masa depan (korelasi antara instrumen individu dan tingkat profitabilitasnya). Tapi ini tidak dijamin. Ini akan diverifikasi dalam karya berikut.



Jelas bahwa seseorang seharusnya tidak mengharapkan hasil positif dari pemeriksaan di atas. Namun kemudian Anda bisa mencari cara memodifikasi metode Markowitz untuk mendapatkan penghasilan yang lebih terjamin di masa mendatang. Berikut topik untuk studi lainnya.



All Articles