見出し画像

【Python】EPSと株価を重ねて確認!

株価は、上にも下にも行き過ぎた動きをするけれど、株価の妥当性を表すものが利益であり、PERであるとするならば、EPSが成長していれば、株価を下支えすることになる。

そんな、企業を見る上で重要となる指標「EPSの成長と株価」を同じグラフに表示してみよう!

このプログラムでできる事
 ・EPS株価の推移の確認
 ・予想EPS実績EPSの比較(Beat or Miss)
 ・NASDAQの株価との比較
 ・1年、3年、5年のEPS成長率の確認
使用上の注意点
・最新の決算は反映されていない可能性があります。
・株式分割をしているとEPSが下がっているように見えます。
・上場間もない企業には適さないかもしれません。
・EPSがマイナスからプラスに転じた時の成長率の表示が不適です。

実行すると、下記の様な図が取得できます。

画像1

事前準備は下記の通り。

0.事前準備

事前準備はこちら。5分もあればできると思います。

1.インストール

下記のコードをコピペして実行します。(2021/07/07:参照処理修正)

pip install yahoo_fin 
pip install yfinance

2.コード

下記のコードをコピペして実行します。
詳細は、コード内のコメントに記載したので、割愛します。

(1)利用時は調べたいティッカーに変更してください。
(2)データ取得期間は2006年以降としています。(サブプライム・リーマンショックとコロナショックを網羅する期間が妥当と考えたため。)

#! pip install yahoo_fin
import yahoo_fin.stock_info as si
# import fix_yahoo_finance as yf
import yfinance as yf
import pandas as pd
from datetime import datetime as dt
import datetime
from matplotlib import dates
import matplotlib.pyplot as plt
%matplotlib inline

plt.close()

# データ取得期間設定
start_tmp = '2006-1-01'
end_tmp = datetime.date.today().strftime("%Y-%m-%d")

# 銘柄の指定
codelist = ['MSFT']

# EPS情報の取得    
ticker=codelist[0]
ticker_earnings_hist = si.get_earnings_history(ticker)

# EPSグラフ作成のためのデータ調整
df =pd.DataFrame.from_dict(ticker_earnings_hist).loc[:,["startdatetime","epsestimate","epsactual"]]
df.rename(columns={'epsestimate':'EPS_Estimate','epsactual':'EPS_Actual','startdatetime':'Date'},inplace=True)
df['Date'] = pd.to_datetime(df["Date"], format='%Y-%m-%d')
df = df.sort_index(axis='index',ascending=False)[["Date","EPS_Estimate", "EPS_Actual"]]
# 期間調整
df2=df[(df['Date'] > start_tmp) &(df['Date'] < end_tmp)]   
fig, ax1 = plt.subplots(figsize=(16,8))
fig.patch.set_facecolor('black') 

# EPSグラフと株価の軸を結合 
ax2 = ax1.twinx()

# EPSグラフ作成 予想と結果を重ねて表示
ax2.bar(df2.Date, df2.EPS_Estimate,width=75,color='#565656',alpha=1.0)
ax2.bar(df2.Date, df2.EPS_Actual,width=80,color='#ff005c',alpha=0.7)

# EPSデータと株価取得日の範囲調整
start = df2.iloc[0,0]
end = end_tmp

# 比較対象の株価データ取得
data_ind = yf.download("QQQ", start=start, end=end)["Adj Close"]
data_ind2=(1+data_ind.pct_change()).cumprod()

# グラフ作成と光沢感を出す繰り返し処理
ax1.plot(data_ind2,color="white",alpha=0.9,linewidth=2)    
for n in range(1,10):
 ax1.plot(data_ind2,linewidth=(2*n),alpha=0.2/(1*n),color="white")
 
# メインの株価データ取得    
data_stk = yf.download(ticker, start=start, end=end)["Adj Close"]
data_stk2=(1+data_stk.pct_change()).cumprod()

# グラフ作成と光沢感を出す繰り返し処理
ax1.plot(data_stk2,color="#00ff41",alpha=0.9,linewidth=2)    
for n in range(1,10):
 ax1.plot(data_stk2,linewidth=(2*n),alpha=0.2/(1*n),color="#00ff41")
 
# EPS成長率の計算    
growth_01=(round(df2.EPS_Actual.pct_change(4).iloc[-1]*100,1))
growth_03=(round(df2.EPS_Actual.pct_change(12).iloc[-1]*100,1))
growth_05=(round(df2.EPS_Actual.pct_change(20).iloc[-1]*100,1))

# EPS成長率をグラフに書き込み    
ax1.text(0.05, 1.0, "EPS growth" ,horizontalalignment='left', verticalalignment='top',transform=ax1.transAxes, fontsize=24,color="#565656")    
ax1.text(0.05, 0.9, " 1y: "+str(growth_01)+" %" ,horizontalalignment='left', verticalalignment='top',transform=ax1.transAxes, fontsize=24,color="#565656")
ax1.text(0.05, 0.8, " 3y: "+str(growth_03)+" %" ,horizontalalignment='left', verticalalignment='top',transform=ax1.transAxes, fontsize=24,color="#565656")    
ax1.text(0.05, 0.7, " 5y: "+str(growth_05)+" %" ,horizontalalignment='left', verticalalignment='top',transform=ax1.transAxes, fontsize=24,color="#565656")    

# グラフ関連処理
plt.title(ticker, color="white",fontsize=50)
ax1.set_xlabel(' White Line : NASDAQ   ( hippen_research Ltd. )',fontsize=20,color="white")
ax1.set_ylabel('Stock Price', fontsize=34,color="white")
ax2.set_ylabel('EPS', fontsize=34,color="white")
ax1.set_yscale("log")
ax1.set_zorder(2)
ax2.set_zorder(1)
ax1.patch.set_alpha(0)    
ax1.grid(False)
ax1.tick_params(axis='x', colors='#565656',labelsize=20)
ax1.axes.yaxis.set_ticklabels([])
ax2.axes.yaxis.set_ticklabels([])    
plt.xlabel(xlabel="")    
plt.show()
plt.close()

# ここまで

3.実行結果

下記の様な図が取得できたと思います。

画像3

緑色:対象銘柄の株価
白色:NASDAQ
赤色:実績EPS
灰色:予想EPS

左上にはEPSの成長率(1年、3年、5年)を表示しています。
・棒グラフは、実績EPS(赤色)と予想EPS(灰色)を重ねて表示しています。つまり、灰色が見えている部分は、決算が予想を下回った幅を示しています。逆に、赤色が濃くなっている部分は、予想を上回った幅を示しています。

最近の株価の動き、
NASDAQに対する株価の優劣、
EPS成長の推移や、EPSの予想と実績の乖離、
1年、3年、5年のEPSの成長率と

この1枚の図だけで、知りたい情報が、かなり網羅できたように思います。
めちゃくちゃ便利じゃないですか?

4.こぼれ話

Pythonの標準出力のチャート、下記の様なダサダサのチャートです。

画像3

近所のコンビニに、寝巻のまま、サンダルで朝食を買いに来たひどい寝ぐせのおじさんみたいなチャートです。

そこで、カッコいいグラフを作る為に、色の強弱をつけたり、いらないメモリを削除したりと、見えない工夫を凝らしてグラフを作っているのですが、

中でも、今回のグラフの一番の目玉は、光って見える株価のチャートです。

Robinhoodで表示されるチャートは光って見えるのですが、配色を同じようにしても、いま一つ、似た感じにならず、「どうやって光らせているのか謎」だったのですが、方法が判明しました!(おそらく・・・)

実は、今回のチャート、少しづつ違う色で、10回なぞっているのです。

# グラフ作成と光沢感を出す繰り返し処理
ax1.plot(data_stk2,color="#00ff41",alpha=0.9,linewidth=2)    
for n in range(1,10):
 ax1.plot(data_stk2,linewidth=(2*n),alpha=0.2/(1*n),color="#00ff41")

少しづつ線を太くしつつ色を薄くしながら、10回同じところに線を描くことで、チャートに光沢感をだしているのです。

パラメータを変えて、大げさにすると、下記の様な感じです。

画像4

まぁ、どうでもいい話ですが、隠れた苦労話でした。

今回作成したプラグラムが、何かの役に立てば幸いです。

おつかれさん「缶コーヒー一杯ぐらい、ご馳走してあげよう」という太っ腹な方がいれば、よろしくお願いします!
課金しなくても、参考になったら、「ハートボタン」をクリックしたり、「リツイート」してくれると読まれる可能性があがるので嬉しいです。やる気が出ます。よろしくお願いします!

おまけ

以下のおまけでは、課金してくれた人へ感謝を込めて、上記のプログラムを少し改良して、「複数銘柄に対応する繰り返し処理」をつけて、もう少し便利にしたり、最近の「EPSの実績と予想の値をテキストで出力する機能」(8~10期ぐらい)をつけています。

ここから先は

4,160字 / 3画像

¥ 100

この記事が気に入ったらサポートをしてみませんか?