Open1

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

Eiichi NiinoEiichi Niino

効率的フロンティアをモンテカルシミュレーションを使って作成する


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')