本記事はpythonの話です。
前回の記事では複数銘柄の株価データを自動取得し、綺麗にチャートを作成するところまで紹介しました。
今回は取得した株価データをもう少し深掘りし、ある期間内の値動きの変化やポートフォリオ全体としてバランスを見てみます。
スポンサーリンク
保有銘柄の値動きの変化をプロットしてみる
データ取得部分は割愛しますが、自身の保有銘柄について株価データを取得します。
私の場合、AMBA,AMZN,NVDA,CGNX,PFE,VYMの6銘柄です。
事前にpandasデータフレーム(df)に、取得した各銘柄の終値データを格納しています。
そのままプロットすると銘柄ごとに株価のスケールが違い、amazonの1000$に引っ張られて表示されてしまうので、それぞれの銘柄のスケールを標準化した上でプロットします。
なお、株価の収集期間は2017/10/1〜11/10までの約1ヶ月間です。
1 2 3 4 5 6 7 8 |
import matplotlib.pyplot as plt #株価を標準化 ndf = df.apply(lambda x: (x-x.mean())/x.std(), axis=0).fillna(0) #プロット ndf.plot(figsize=(12,6),fontsize = 12 ) plt.show() |
プロット結果は上図のようになりました。
今月、一ヶ月の値動きは全体的に右上がりの傾向となっていることがわかります。
今月のボラティリティとパフォーマンスを確認する
次に、値動きを株価変動率としてみていきます。
株価データを前日からの上昇率である株価変動率に変換し、プロットしていきます。
1 2 3 4 5 6 7 |
#データを対前日比の株価変動率に変換しdfpctに格納 dfpct = df.pct_change().dropna() * 100 #営業日ごとの株価変動率をプロット dfpct.plot(label = True ,figsize = (12,6),marker = 'o',fontsize = 12) plt.legend(loc = "upper left") plt.show() |
PCTは前日比の変化率で、単位はパーセントです。
10月15日前後にAMBAが6%程度の急騰、10月末にAMZNが好決算を受けて13%の急騰があったことが確認できます。
PCTの値の基本統計量と、箱ひげ図でプロットすることでもう少し詳細な内容が読み取れるようになります。
1 2 3 4 5 6 7 8 9 |
#株価変動率の基本統計量を取得 print(round(dfpct.describe(),2)) #seabornで箱ひげ図を作成 import seaborn as sns sns.boxplot(data = dfpct,fliersize = 8,width = 0.5) sns.set_context("talk",font_scale = 1) plt.show() |
出力結果として、まずは基本統計量は平均、標準偏差、最大値最小値、四分位が確認できます。
まずみるべき点は平均です。10月は各銘柄概ねプラスで推移し、特にAMBA,AMZN,NVDA,CGNXの4銘柄は1日あたり0.5%程度上昇していたことがわかります。
また、次にみるべきは標準偏差で、ようはボラティリティの大きさです。
各銘柄においてstdで表示されている数値(仮にa)において、一日の変化率が「平均値 ±a」%以内に収まる確率が68%であることを示しています。
また、「平均値 ± 2×a」%に収まる確率は95%であることも示しています。
標準偏差をみると、10月の値動きはAMZN,AMBA,NVDAが大きく、CGNX,PFE,VYMが小さいことがわかります。
1 2 3 4 5 6 7 8 9 |
AMBA AMZN NVDA CGNX PFE VYM count 29.00 29.00 29.00 29.00 29.00 29.00 mean 0.53 0.58 0.66 0.68 -0.05 0.04 std 1.99 2.56 1.50 1.24 0.59 0.28 min -3.43 -1.69 -2.53 -1.92 -1.26 -0.65 25% -0.55 -0.33 -0.09 -0.03 -0.36 -0.12 50% 0.21 0.20 0.45 0.51 -0.03 0.05 75% 1.28 0.86 1.34 1.47 0.25 0.22 max 6.30 13.22 5.27 4.29 1.14 0.55 |
平均値、ボラティリティの大きさ等を感覚的に掴みやすいのが箱ひげ図です。出力結果は以下の通りとなります。
箱ひげ図は、ボックス内の線が平均値を表し、色がついたボックス内の値動きになる確率が50%であることを示しています。
また、ボックスから突き出たヒゲの範囲まででほぼ100%の値動きを示していますが、髭の長さが箱の1.5倍を超えるようなデータは外れ値としてヒゲを突き抜けてプロットされています。
したがって解釈としては、異常に高かったり低かったりするデータは外れ値として表示されるが、ほぼ全ての値動きデータはヒゲの間で観測され、そのうち50%のデータは箱の範囲で確認されることとなります。
そのルールで箱ひげ図をみみてみると、最も今月ボラティリティが高かったのは、AMBAでボックスの長さも髭の長さも一番長くなっています。
逆にPFEやVYMは値動きの幅が小さく、ほとんど変化率0%を中心に微妙な値動きのみとなっていることがわかります。
また、NVDAとCGNXは平均値が高く、ボックスの下限ちが0%以上となっています。これは75%以上の値動きがプラスの値動きだったことを示しており、今月、安定して高パフォーマンスだったことがわかります。(箱部分が50%で上ヒゲ部分が25%)
先ほど基本統計量で最も標準偏差が大きかったAMZNは箱ひげ図でみるとそこまでではなさそうです。おそらくデータ数が少ないため、決算直後の+13%という外れ値に影響を大きく受けたためと考えられます。
seabornで保有銘柄の相関関係を分析する
さて、最後に気になるのは値動きの相関です。
いくら銘柄数を増やして分散投資をしていても、全てが同じような値動きをしてしまえば、上がる時は全部上がり、下がる時は全部下がるという生きた心地がしないポートフォリオになってしまいます。
正の相関、負の相関、または無相関がバランスよく組み込まれていると少しは安心できます。
1 2 3 |
sns.pairplot(dfpct, kind = "reg",diag_kind = "hist",size = 4.5) sns.set_context("poster",font_scale = 1) plt.show() |
出力結果は銘柄ごとの散布図と単回帰直線、及びその信頼区間を示しています。
単回帰直線の傾きが右肩上がりの場合は正の相関があり、右下がりの場合は負の相関があります。傾きがほぼゼロの場合は無相関に近いということを示しています。
AMBA,AMZN,NVDA,COGNXは若干の正の相関があり、これら4銘柄に対してPFEとVYMは負の相関になっているため、ポートフォリオとしては若干のリスク分散はできていると考えられます。
特にAMBA,AMN,NVDAは相関が比較的高く、同時に上がったり下がったりする可能性が高いですが、一方でコグネックスは相関が低い傾向も示されています。
ただ、この図は銘柄が増えてくると小さくなって見辛い上に、若干わかりにくいので他のバージョンも作ってみます。
1 2 3 4 5 6 7 8 |
sns.set(style="white") # Generate a mask for the upper triangle mask = np.zeros_like(dfpct.corr(), dtype=np.bool) mask[np.triu_indices_from(mask)] = True sns.heatmap(dfpct.corr(),annot = True,mask =) plt.show() |
この図は銘柄間の相関関係だけをヒートマップで示したもので、赤っぽくなっているほど相関が高く、黒いほど低いです。
NVDAとAMZN、VYMとPFEが正の相関が高いです。またPFEはAMBA,AMZN,NVDAと負の相関があることがわかります。
相関だけみるのであればこちらの方がシンプルでみやすいですね。