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.