Open1
効率的フロンティアの表示

効率的フロンティアをモンテカルシミュレーションを使って作成する
import numpy as np
import pandas as pd
from pylab import plt, mpl
#株価データファイルを読み込み
filename = '../../Users/xxx/Documents/tr_eikon_eod_data.csv'
raw = pd.read_csv(filename,index_col=0,parse_dates=True)
symbols = ['AAPL.O','MSFT.O','SPY','GLD']
noa = len(symbols)
data = raw[symbols]
rets = np.log(data/data.shift(1))
#リターン
def port_ret(weights):
return np.sum(rets.mean()*weights)*252
#リスク
def port_vol(weights):
return np.sqrt(np.dot(weights.T,np.dot(rets.cov()*252,weights)))
prets = []
pvols = []
#シミュレーションを実行
for p in range(2500):
weights = np.random.random(noa)
weights /= np.sum(weights)
prets.append(port_ret(weights))
pvols.append(port_vol(weights))
prets = np.array(prets)
pvols = np.array(pvols)
#グラフにプロット
plt.figure(figsize=(10,6))
plt.scatter(pvols,prets,c=prets/pvols,marker='.',cmap='coolwarm')
plt.xlabel('expected volatility')
plt.ylabel('expected return')
plt.colorbar(label='Sharp ratio')