• bookloveru2

pythonで株価分析⑤【ポートフォリオを視覚化・最適化してリスク分散を検討】

更新日:2021年11月1日

皆様、こんにちは。

今回は、大人気シリーズ「pythonで株価分析してみた」の第5弾です❕




本記事では、現在保有している米国株のポートフォリオって、本当にこのままで良いのか❓という観点から、リスク分散について考えていきます。




今回も、せっかくpythonを使用するので、ビジュアルがなるべく格好良くなるようにしてみました('ω')ノ


 

目次

保有銘柄の現状

日時変化率と基本統計量から、保有銘柄ポートフォリオの主役を抜擢

株価の分布と保有銘柄の相関関係からみるリスク分散

python一括コード

 


では、早速いきましょう❕



❶保有銘柄の現状

今回の対象銘柄は、下記の4銘柄です。

  1. マクドナルド【MCD】

  2. セールスフォース【CRM】

  3. AT&T【T】

  4. Google【GOOGL】

分析期間は2016/1/1~2020/12/26現在までです。これらを保有していたとして、どのようなポートフォリオが最適なのかを見ていきます。


はい。ドン❕


import datetime
import fix_yahoo_finance as yf
import matplotlib.pyplot as plt
import requests
import argparse
import numpy as np
import seaborn as sns
 
#スタート日を決める
number = "2016-1-1" #@param {type:"string"}
 
#銘柄コード
start = number
end = datetime.date.today()
code1 = "MCD" #@param ["AAPL"] {allow-input: true}
code2 = "CRM" #@param ["AMD"] {allow-input: true}
code3 = "T" #@param ["MSFT"] {allow-input: true}
code4 = "GOOGL" #@param ["FB"] {allow-input: true}
codelist = [code1,code2,code3,code4]

#終値取得(data2に終値を取り込み))
data2 = yf.download(codelist, start=start, end=end)["Adj Close"]
#取得単価
price1 =  123#@param {type:"number"}
price2 =  67#@param {type:"number"}
price3 =  36#@param {type:"number"}
price4 =  750#@param {type:"number"}
#保有数量
code1stock =  10#@param {type:"number"}
code2stock =  20#@param {type:"number"}
code3stock =  30#@param {type:"number"}
code4stock =  3#@param {type:"number"}
#取得価額。保有数量×取得単価
mypf1 = code1stock * price1
mypf2 = code2stock * price2
mypf3 = code3stock * price3
mypf4 = code4stock * price4
mypf = mypf1 + mypf2 + mypf3 + mypf4
#prに時価総額を格納 終値行列×保有数量
pr1 = data2[code1] * code1stock
pr2 = data2[code2] * code2stock
pr3 = data2[code3] * code3stock
pr4 = data2[code4] * code4stock
pf = pr1 + pr2 + pr3 + pr4
marketprice = pf.iloc[-1]
print("現在の時価総額は下記の通りです")
print(marketprice)
#損益状況
profit = marketprice - mypf
print("損益状況はは下記の通りです")
print(profit)
par = round(((1 - (marketprice / mypf)) * -100), 1)

ここまでの結果です。👇

※今回紹介する全てのコードは、記事の最後に一括で再掲します!(^^)!。

損益状況は6792ドルの利益が出ている状況です!(^^)!

そして、時価総額は12,692ドル(130万円くらいってところでしょうか?)




続いて、グラフにしていきます。👇

#グラフの箱サイズ
pf.plot(label = "MY Portfolio", kind = 'area', alpha = 1, figsize = (8,6), fontsize = 16, stacked=True,cmap='cool',grid = True)

# 株価を標準化
std = data2.apply(lambda x: (x-x.mean())/x.std(), axis=0).fillna(0)
std.plot(figsize=(8,6),fontsize=18)
plt.legend(loc = 'upper left', bbox_to_anchor=(0, 1), borderaxespad=0, fontsize=18)
plt.grid(True)


結果です。👇


注目して頂きたい銘柄はAT&T【T】です。

他の銘柄が好調に上昇する中、AT&T【T】だけが現在でも0以下となっています。

これは、AT&T【T】が携帯キャリアの会社で、膨大な基地局等インフラを整備・維持するのに、莫大な資金を投じており、尚且つ年利5%以上の高配当を出し続ける会社であることに理由があるように思えます。





 

❷日時変化率と基本統計量から、保有銘柄ポートフォリオの主役を抜擢


さて、次にいきます。

次は、株価の日時変化率と基本統計量を見ていきます。

#データを対前日比の株価変動率に変換しstdpctに格納
stdpct = data2.pct_change().dropna() * 100
#営業日ごとの株価変動率をプロット 
stdpct.plot(label = True ,figsize = (8,6),marker = 'o',fontsize = 16)
plt.legend(loc = 'upper left', bbox_to_anchor=(0, 1), borderaxespad=0, fontsize=16) 
plt.grid(True)

#株価変動率の基本統計量を取得 
stastics = round(stdpct.describe(),2)

#統計量をグラフ化
fig, ax = plt.subplots(figsize=(8,6))
ax.axis('off')
ax.axis('tight')
ax.table(cellText=stastics.values,
         colLabels=stastics.columns,
         rowLabels=stastics.index,
         loc='center',
         bbox=[0,0,1,1])

結果です。👇




セールスフォース【CRM】は今を時めくSaaS(Software as a Service)銘柄です。

流石に期待値が高く、値動きにも反映されています。大幅な上昇も見込めますが、下落率も大きいと言えます。基本統計量のmax26.04%の上昇 ~ min▲15.89%の下落からも見て取れます。


そのリターンは、今回のポートフォリオの主役とも言えます。


 

❸株価の分布と保有銘柄の相関関係からみるリスク分散


さて、最後になります。

ここでは、株価の分布と保有銘柄の相関関係を見ていきます。


#バイオリンプロット
plt.figure(figsize=(15, 6))
ax = sns.violinplot(data=stdpct, fliersize = 6, width = 1.6, inner=None, color="0.7", linewidth=0.3)
ax = sns.swarmplot(data=stdpct) 
plt.grid(True)
#seabornで保有銘柄の相関関係を分析
sns.pairplot(stdpct, kind = "reg",diag_kind = "hist",size = 2)
sns.set_context("poster",font_scale = 1)
plt.show()

結果です。👇

美しいバイオリンプロットです。

セールスフォースはやはり値動きが激しい。その為キャピタルゲインを狙うチャンスが多い銘柄です。

一方で、AT&Tは安定した値動きです。その為預貯金替わりに購入し、安定的に配当金を受領するといったことに向いている銘柄と言えそうです。




更に、保有銘柄の相関関係を見ていきましょう。👇

プロット結果から、現在絶好調であるIT銘柄は、似たような値動きをすることが多いように見えます。つまり、IT銘柄だけを購入した場合、上昇するときは良いが、下落するときは、一気に保有資産が吹き飛ぶと考えてもよさそうです。

その為、ITを保有する際には、AT&Tなどの相関の弱い銘柄を一緒に購入しておくと、リスク分散になるかもしれません!!(^^)!



如何でしたでしょうか?

今回は、

ポートフォリオの視覚化と最適化によるリスク分散

をみていきました。


私も自分のポートフォリオの再編を考えたいと思います❕

では、ばいちゃ。('ω')ノ






 

❹python一括コード


あっ、一括コード載せときますね(^_-)-☆

以下です。👇今後ともよろしくお願いいたします。


import datetime
import fix_yahoo_finance as yf
import matplotlib.pyplot as plt
import requests
import argparse
import numpy as np
import seaborn as sns
 
#スタート日を決める
number = "2016-1-1" #@param {type:"string"}
 
#銘柄コード
start = number
end = datetime.date.today()
code1 = "MCD" #@param ["AAPL"] {allow-input: true}
code2 = "CRM" #@param ["AMD"] {allow-input: true}
code3 = "T" #@param ["MSFT"] {allow-input: true}
code4 = "GOOGL" #@param ["FB"] {allow-input: true}
codelist = [code1,code2,code3,code4]

#終値取得(data2に終値を取り込み))
data2 = yf.download(codelist, start=start, end=end)["Adj Close"]
#取得単価
price1 =  123#@param {type:"number"}
price2 =  67#@param {type:"number"}
price3 =  36#@param {type:"number"}
price4 =  750#@param {type:"number"}
#保有数量
code1stock =  10#@param {type:"number"}
code2stock =  20#@param {type:"number"}
code3stock =  30#@param {type:"number"}
code4stock =  3#@param {type:"number"}
#取得価額。保有数量×取得単価
mypf1 = code1stock * price1
mypf2 = code2stock * price2
mypf3 = code3stock * price3
mypf4 = code4stock * price4
mypf = mypf1 + mypf2 + mypf3 + mypf4
#prに時価総額を格納 終値行列×保有数量
pr1 = data2[code1] * code1stock
pr2 = data2[code2] * code2stock
pr3 = data2[code3] * code3stock
pr4 = data2[code4] * code4stock
pf = pr1 + pr2 + pr3 + pr4
marketprice = pf.iloc[-1]
print("現在の時価総額は下記の通りです")
print(marketprice)
#損益状況
profit = marketprice - mypf
print("損益状況はは下記の通りです")
print(profit)
par = round(((1 - (marketprice / mypf)) * -100), 1)
#グラフの箱サイズ
pf.plot(label = "MY Portfolio", kind = 'area', alpha = 1, figsize = (8,6), fontsize = 16, stacked=True,cmap='cool',grid = True)

# 株価を標準化
std = data2.apply(lambda x: (x-x.mean())/x.std(), axis=0).fillna(0)
std.plot(figsize=(8,6),fontsize=18)
plt.legend(loc = 'upper left', bbox_to_anchor=(0, 1), borderaxespad=0, fontsize=18)
plt.grid(True)

#データを対前日比の株価変動率に変換しstdpctに格納
stdpct = data2.pct_change().dropna() * 100
#営業日ごとの株価変動率をプロット 
stdpct.plot(label = True ,figsize = (8,6),marker = 'o',fontsize = 16)
plt.legend(loc = 'upper left', bbox_to_anchor=(0, 1), borderaxespad=0, fontsize=16) 
plt.grid(True)

#株価変動率の基本統計量を取得 
stastics = round(stdpct.describe(),2)

#統計量をグラフ化
fig, ax = plt.subplots(figsize=(8,6))
ax.axis('off')
ax.axis('tight')
ax.table(cellText=stastics.values,
         colLabels=stastics.columns,
         rowLabels=stastics.index,
         loc='center',
         bbox=[0,0,1,1])

#バイオリンプロット
plt.figure(figsize=(15, 6))
ax = sns.violinplot(data=stdpct, fliersize = 6, width = 1.6, inner=None, color="0.7", linewidth=0.3)
ax = sns.swarmplot(data=stdpct) 
plt.grid(True)
#seabornで保有銘柄の相関関係を分析
sns.pairplot(stdpct, kind = "reg",diag_kind = "hist",size = 2)
sns.set_context("poster",font_scale = 1)
plt.show()

pythonでプログラミングがしたい!! 
pythonを学びたい!という方には、
オンラインプログラミング教室『Aidemy アイデミー』がお勧めです。
ご自身でプログラム環境を用意する必要は無く、サイトへアクセスするだけです。  創業者は東京大学工学部卒の石川聡彦さん。
著書に『人工知能プログラミングのための数学がわかる本』(KADOKAWA/2018年)など。  
無料で、お試しもできますので安心です。
お時間ある方は下記リンクを覗いてみてはいかがでしょうか(*'ω'*)



閲覧数:152回0件のコメント