min117の日記

初期desireもち。趣味Mac,メインFedora,仕事xp。

最小分散フロンティアをPython3で作図する

 

年末なのでbitFlyerやハピタスが何か特典つけるかも。

招待URL

bitFlyer口座開設(ビットコイン1,000円もらえる)URL

 

資産の持ち方(ポートフォリオ)の最適化について。書籍にPythonコードあり。平均分散アプローチによるポートフォリオ選択、らしい。

 

最小分散フロンティアをPython3で作図する

できた。

理解は二の次で書物のコードほぼそのまま。調整はしたけど(適時printしたりとか、時間入れるとか、フォントとか、pngに落とすのとか)

 

ソース

$ vim myKINRIFI04.py

 

保存用

#!/usr/bin/python3
# -*- coding: utf-8 -*-

import pandas as pd
import pandas_datareader as web

import matplotlib.pyplot as plt
# %matplotlib inline
from matplotlib import rcParams

import japanize_matplotlib

rcParams['figure.figsize']=15,10
rcParams['font.size']=15
import sys
import os

import datetime
import math
import numpy as np
import numpy.polynomial.polynomial as pol

print('----------------------------')
print('Pythonによるファイナンス入門P70')
print('----------------------------')
print('最小フロンティアの計算と作図')
print('----------------------------')

import numpy.linalg as lin

# if sys.platform.startswith('Win')
#     FontPath = 'C:\Windows\Fonts\meiryo.ttc'
# elif sys.platform.startswith('darwin')
#     FontPath = '/System/Library/Fonts/ヒラギノ角ゴシック W4.ttc'
# elif sys.platform.startswith('linux')
#     FontPath = '/usr/share/fonts/truetype/takao-gothic/TakaoExGothic.ttf'
#
# jpfont = FontProperties(fname=FontPath)

print('最小分散ポートフォリオの計算')
Mu = np.array([1.0, 3.0, 1.5, 6.0, 4.5])
Stdev = np.array([5.0, 10.0, 7.5, 15.0, 11.0])
CorrMatrix = np.array([[1.00, 0.25, 0.18, 0.10, 0.25],
                       [0.25, 1.00, 0.36, 0.20, 0.20],
                       [0.18, 0.36, 1.00, 0.25, 0.36],
                       [0.10, 0.20, 0.25, 1.00, 0.45],
                       [0.25, 0.20, 0.36, 0.45, 1.00]])
Sigma  = np.diag(Stdev).dot(CorrMatrix).dot(np.diag(Stdev))
iota = np.ones(Mu.shape)
inv_Sigma = lin.inv(Sigma)
A = Mu.dot(inv_Sigma).dot(iota)

B = Mu.dot(inv_Sigma).dot(Mu)
C = iota.dot(inv_Sigma).dot(iota)
D = B*C - A**2
V_Target = np.linspace(Mu.min(), Mu.max(), num=5)
V_Risk = np.zeros(V_Target.shape)
V_Weight = np.zeros*1
for idx, Target_Return in enumerate(V_Target):
    V_Weight[idx,:] = (C*Target_Return -A)/D*lin.solve(Sigma, Mu) \
                      + (B-A*Target_Return)/D*lin.solve(Sigma, iota)
    V_Risk[idx] = (C/D)*(Target_Return - A/C)**2 + 1.0/C

print('CorrMatrix')
print(CorrMatrix)
print('----------------------------')
print('V_Weight')
print(V_Weight)
print('----------------------------')
print('V_Risk')
print(V_Risk)
print('----------------------------')

print('最小分散フロンティアの作図')
sigma_gmv = 1.0/np.sqrt(C)
sigma_p = np.linspace(sigma_gmv, 1.05*np.max(Stdev), num=250)
mu_p_efficient = (A + np.sqrt(np.abs(C*sigma_p**2 - 1.0)*D))/C
mu_p_inefficient = (A - np.sqrt(np.abs(C*sigma_p**2 - 1.0)*D))/C

fig1  = plt.figure(1, facecolor='w')
plt.plot(sigma_p, mu_p_efficient, 'k-')
plt.plot(sigma_p, mu_p_inefficient, 'k:')
plt.plot(np.sqrt(np.diagonal(Sigma)), Mu, 'kx')

#plt.legend([u'効率的フロンティア', u'非効率的フロンティア', u'個別資産'], loc='best', frameon=False, pror=jpfont)
plt.legend([u'効率的フロンティア', u'非効率的フロンティア', u'個別資産'], loc='best', frameon=False)

plt.xlabel(u'標準偏差(%)')
plt.ylabel(u'期待収益率(%)')

#df["時間軸(月次)"] = pd.to_datetime(df["時間軸(月次)"],format="%Y年%m月")
#ax1.set_title(datetime.datetime.now().strftime('%Y/%m/%d %H:%M:%S'), fontsize=20)
#plt.title(datetime.datetime.now())
myDATETIME = datetime.datetime.now().strftime('%Y/%m/%d %H:%M:%S')
#plt.title(datetime.datetime.now().strftime('%Y/%m/%d %H:%M:%S'), fontsize=20)
#plt.title(myDATETIME, fontsize=20)
plt.title('最小分散フロンティア ' + myDATETIME, fontsize=20)

plt.savefig("myKINRIFI04.png", dpi=100)
print('myKINRIFI04.png を保存しました')

 

その買うを、もっとハッピーに。|ハピタス

*1:V_Target.shape[0],Mu.shape[0]