Pythonでの株価の分析
Pythonをもうちょっと学ぶためにPythonでいろいろとやってみました。今回も携帯関連会社の株価で実施してみました。
データの取り込み
まずはいつもどおり、必要なライブラリーの取り込みを行います。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
データの取得
先の記事で格納済みのデータを取り込みます。まずはNTT (証券コード: 9432)から
ntt = pd.read_csv('NTT_Stock.csv',index_col = 'Date',parse_dates=True)
ntt
その他の携帯関連会社のデータ取り込み
同じように格納済みデータを取り込みます。
kddi = pd.read_csv('KDDI_Stock.csv',index_col = 'Date',parse_dates=True)
softbank = pd.read_csv('Softbank_Stock.csv',index_col = 'Date',parse_dates=True)
rakuten = pd.read_csv('Rakuten_Stock.csv',index_col = 'Date',parse_dates=True)
kddi
softbank
rakuten
株価データの表示
終値でそれぞれの株価を同じグラフに表示します。
ntt['Close'].plot(label='NTT',figsize=(16,8),title='Close Price')
kddi['Close'].plot(label='KDDI')
softbank['Close'].plot(label='Softbank')
rakuten['Close'].plot(label='Rakuten')
plt.legend()
2020年以降のそれぞれの取引高を一つのグラフ上に表示します。
ntt.loc['2020-01-01':]['Volume'].plot(label='NTT',figsize=(16,8),title='Volume')
kddi.loc['2020-01-01':]['Volume'].plot(label='KDDI')
softbank.loc['2020-01-01':]['Volume'].plot(label='Softbank')
rakuten.loc['2020-01-01':]['Volume'].plot(label='Rakuten')
plt.legend()
2021年3月の終わりに楽天の取引高が非常に大きくなっていることがわかります。何が起こっているのかを調べるために、最大の取引高が発生している日時を調べます。
rakuten['Volume'].idxmax()
この時に何があったのか調べてみると、日本郵政と楽天の資本提携が3月12日(金)に発表されており、それに伴って、週明けの3月15日(月)に取引が膨らんだようです。
https://corp.rakuten.co.jp/news/press/2021/0312_02.html
次は、取引高と株価をかけて、実際にそれぞれの株で売買された金額を見える化してみます。終値と取引高をかけます。
ntt['Total Ammount'] = ntt['Close']*ntt['Volume']
kddi['Total Ammount'] = kddi['Close']*kddi['Volume']
softbank['Total Ammount'] = softbank['Close']*softbank['Volume']
rakuten['Total Ammount'] = rakuten['Close']*rakuten['Volume']
ntt.loc['2020-01-01':]['Total Ammount'].plot(label='NTT',figsize=(16,8))
kddi.loc['2020-01-01':]['Total Ammount'].plot(label='KDDI')
softbank.loc['2020-01-01':]['Total Ammount'].plot(label='Softbank')
rakuten.loc['2020-01-01':]['Total Ammount'].plot(label='Rakuten')
plt.legend()
plt.ylabel('Total Ammount')
ソフトバンクの株価で2020年12月の取引額がやたら大きい所があることがわかります。楽天の時と同様に調べてみると以下のようになります。
softbank.loc['2020-01-01':]['Total Ammount'].idxmax()
2020年12月9日に出資先のドアダッシュの上場があり、それに伴って取引が拡大したようです。
https://www.bloomberg.co.jp/news/articles/2020-12-10/QL3M03T0G1L701
移動平均線の描画
ソフトバンクの始値の50日と200日の移動平均線を書いてみます。
softbank['MA50'] = softbank['Open'].rolling(50).mean()
softbank['MA200'] = softbank['Open'].rolling(200).mean()
softbank[['Open','MA50','MA200']].plot(label='Softbank',figsize=(16,8))
株価の関係ー散布図
次にそれぞれの株価の関係を見てみます。散布図で表示して見ます。
from pandas.plotting import scatter_matrix
mobile_stock = pd.concat([ntt['Close'],kddi['Close'],softbank['Close'],rakuten['Close']],axis=1)
mobile_stock.columns = ['NTT','KDDI','Softbank','Rakuten']
scatter_matrix(mobile_stock,figsize=(11,11),alpha=0.2,hist_kwds={'bins':50});
ローソク足の描画
2021年10月のソフトバンクのローソク足を描画してみます。
import mplfinance as mpf
mpf.plot(softbank.loc['2021-10':'2021-10'], type='candle', figratio=(12,4))
株価分析
毎日の変化量など株価の分析をしてみます。
日次の株価変化量
日次の株価変化量を計算してみます。公式は以下のとおりです。

r_tは日次の株価変化量
p_tはある日の株価
p_t-1はある日の前日の株価
日次の株価変化量は前日に買った株を翌日に買った場合に得られる(損益率)を算出しています。これは、株式の将来の価値を予測するのには役に立ちませんが、株式のボラティリティを分析するのに非常に役立ちます。毎日のリターンの分布が広い株の株価は日ごとに変動しやすくなります。日次の株価変化量を計算し、ヒストグラムでプロットして、どの株が最も安定しているかを確認してみます。
まずはNTTの株価変化量の計算
pct_changeはデータの前後の変化率を計算します。引数は変化率を求める前後の日数です。今回は日次の変化量なので1です。
ntt['returns'] = ntt['Close'].pct_change(1)
ntt.head()
NTT以外の日次変化量も計算します。
kddi['returns'] = kddi['Close'].pct_change(1)
softbank['returns'] = softbank['Close'].pct_change(1)
rakuten['returns'] = rakuten['Close'].pct_change(1)
kddi.head()
softbank.head()
rakuten.head()
import seaborn as sns
sns.set()
それぞれの株のヒストグラムを表示してみます。
0を中心に正規分布していることがわかります。
ntt['returns'].hist(bins=50)
kddi['returns'].hist(bins=50)
softbank['returns'].hist(bins=50)
rakuten['returns'].hist(bins=50)
すべてのヒストグラムを重ねてみます。
ntt['returns'].hist(bins=100,label='NTT',figsize=(10,8),alpha=0.5)
kddi['returns'].hist(bins=100,label='KDDI',alpha=0.5)
softbank['returns'].hist(bins=100,label='Softbank',alpha=0.5)
rakuten['returns'].hist(bins=100,label='Rakuten',alpha=0.5)
plt.legend()
正直、よくわからないので、KDEで表示してみます。ソフトバンクと楽天が重なってわかりにくいので、楽天を赤点線で表示してます。
ntt['returns'].plot(kind='kde',label='NTT',figsize=(12,6))
kddi['returns'].plot(kind='kde',label='KDDI')
softbank['returns'].plot(kind='kde',label='Softbank')
rakuten['returns'].plot(kind='kde',label='Rakuten',ls='--')
plt.legend()
こうやって見てみると、楽天とソフトバンクはほとんど変わらないように見えることがわかります。
さらにボックスプロットで表示してみます。
box_df = pd.concat([ntt['returns'],kddi['returns'],softbank['returns'],rakuten['returns']],axis=1)
box_df.columns = ['NTT','KDDI','Softbank','Rakuten']
box_df.plot(kind='box',figsize=(8,11),colormap='jet')
イメージ通りではあるのですが、ソフトバンクと楽天のボラタリティが大きいことがわかります。
株価間の株価変化量の関係の確認
株価の時と同じように変化量の関係を散布図で表示してみます。
scatter_matrix(box_df,figsize=(8,8),alpha=0.2,hist_kwds={'bins':50});
なんとなくNTTとKDDIは関係がありそうです。という事で、NTTとKDDIで表示
box_df.plot(kind='scatter',x='NTT',y='KDDI',alpha=0.4,figsize=(10,8))
累積日次変化量
次は該当の株に2000年1月1日(楽天は2000年4月に上京しているので、上場時)に1円投資したら、現在の株価がどうなっているかを調べてみます。
累積日次変化量の数式は以下の通り:

NTTの累積日次変化量を計算します。
累積日次変化量を計算するには累積積を求める必要があるのでcumprod関数を利用します。
ntt['Cumulative Return'] = (1 + ntt['returns']).cumprod()
ntt.head()
同様に他の株式も計算します。
kddi['Cumulative Return'] = (1 + kddi['returns']).cumprod()
softbank['Cumulative Return'] = (1 + softbank['returns']).cumprod()
rakuten['Cumulative Return'] = (1 + rakuten['returns']).cumprod()
ntt['Cumulative Return'].plot(label='NTT',figsize=(16,8),title='Cumulative Return')
kddi['Cumulative Return'].plot(label='KDDI')
softbank['Cumulative Return'].plot(label='Softbank')
rakuten['Cumulative Return'].plot(label='Rakuten')
plt.legend()
2000年1月1日のソフトバンクの株価が高かったこともあり、意外と、楽天が1番になりました。
でも、20年で2倍にしかならないってどうなんだろうと思います。もっとも、配当を考慮してませんが。
ちなみに、配当を考慮すると以下のようになって、KDDIと楽天が同じような感じですね。どちらにしても2倍程度です。
ntt['returns'] = ntt['Adj Close'].pct_change(1)
kddi['returns'] = kddi['Adj Close'].pct_change(1)
softbank['returns'] = softbank['Adj Close'].pct_change(1)
rakuten['returns'] = rakuten['Adj Close'].pct_change(1)
ntt['Cumulative Return'] = (1 + ntt['returns']).cumprod()
kddi['Cumulative Return'] = (1 + kddi['returns']).cumprod()
softbank['Cumulative Return'] = (1 + softbank['returns']).cumprod()
rakuten['Cumulative Return'] = (1 + rakuten['returns']).cumprod()
ntt['Cumulative Return'].plot(label='NTT',figsize=(16,8),title='Cumulative Return')
kddi['Cumulative Return'].plot(label='KDDI')
softbank['Cumulative Return'].plot(label='Softbank')
rakuten['Cumulative Return'].plot(label='Rakuten')
plt.legend()
ディスカッション
コメント一覧
まだ、コメントがありません