見出し画像

じっちゃまの教えに則って、EPS売上高ガイダンスをサクッとゲットするよ。


EPS売上高ガイダンスをサクッとゲットしたい経緯

アメリカ株のボスザル「じっちゃま」の教えに則って
アメリカ株のEPS、売上高、ガイダンスを記録しようと思ったけど、毎回エクセルに記入するのがシンドイので、プログラムで取得できるようにしてみました。

yahooファイナンスの難点

データの取得はアメリカの yahoo finance 。
データが揃っており非常にありがたいのだが、難点ある。

売上高の過去予想が無いのと、ガイダンスの結果と過去予想が無い。

・EPS予想 ある(過去もある)
・EPS結果 ある(過去もある)
・売上高予想 ある(過去は無い
・売上高結果 ある(過去もある)
・ガイダンス予想 ある(過去は無い
ガイダンス結果 無い!

データ取得の流れ

売上高の過去予想が無いのと、ガイダンスの結果と過去予想が無いので、
以下の流れになります。

①決算前に実行して保存(売上高、ガイダンス予想を取得しておくため用)
②決算後に実行して保存(結果確認用)
③ガイダンスの結果をedgarでチェック!。(詳細あり)


実施してみる


前置きはとりあえずここまでで、実行するとこんな感じに取れます。

画像1

①を決算前の実行で保存しておく(保存しておかないと、決算後に書き換わる為)→ 実行結果をhtml保存すれば簡単です。

決算が来たら②の部分と決算前に実行していた①の今季予想と見比べる。
これでEPS、売上高がOKかどうかがわかります。

ガイダンスがOKかどうかは、決算前の①の来季予想とedgarの8-Kに書いてあるガイダンスの結果で確認が出来ます。(EPSは③だけで答え合わせできます。)

edgarの8-K(ガイダンスの結果)の取得方法はここにあります。
https://note.com/konno_masayuki/n/nb4d5862b9807

だいぶ決算見るの楽になりましたかね。。。
EPS、売上高、ガイダンスの3つそろって良い決算!!!。
(私も日本株を卒業してからは、じっちゃまのおかげで少しづ稼げるようになりました。)

じっちゃまが口酸っぱくいっているこの3つを確認していけばテンバガーが見つけられると思います。

はい、それではプログラムです。

今回もjupyter notebookの使用を想定しています。
(jupyter notebookとはなんぞやという人は調べてみてください。)

入っていなかったらインストールしてください。

!pip install pandas_datareader

!pip install yahoofinancials

!pip install yahoo_earnings_calendar

!pip install timeout_decorator

必要なものをimportする。

import datetime
import pandas as pd
import numpy as np
import time 
import pandas_datareader.data as web 
import timeout_decorator
from yahoofinancials import YahooFinancials
from yahoo_earnings_calendar import YahooEarningsCalendar
import matplotlib.pyplot as plt
pd.options.display.float_format = '{:.2f}'.format

前段で、チャートを出す関数を定義します。

def yf_chart(ticker,chart_days):
   
    #日付計算
   today = datetime.date.today().strftime('%Y/%m/%d')
   start_day = datetime.date.today() - datetime.timedelta(days=chart_days)
   start_day = start_day.strftime('%Y/%m/%d')

   df = web.DataReader(ticker,"yahoo",start_day,today)
   return df[['Close']].plot(figsize=(15, 5), lw=2)

アメリカ10年債利回りで実行すると

yf_chart("^TNX",365)

画像2

こんな感じで出せます。

次に①を出すための関数(EPS、売上高予想取得、ガイダンス取得)を定義します。

# EPS、売上高予想取得(ガイダンス取得)関数

#実行時に帰ってこないことがあるのでtimeoutを設定
@timeout_decorator.timeout(60)

def yf_estimate(ticker):
   #ticker = 'BIDU'

   url = 'https://finance.yahoo.com/quote/'+ticker+'/analysis?p='+ticker
   dfs = pd.read_html(url)

   # EPS予想
   earning_estimate_df = dfs[0].loc[:, ~dfs[0].columns.str.contains('Year')]
   earning_estimate_df = earning_estimate_df[earning_estimate_df['Earnings Estimate'] == 'Avg. Estimate']
   earning_estimate_df.drop('Earnings Estimate',axis=1,inplace=True)

   #売上予想
   revenue_estimate_df = dfs[1].loc[:, ~dfs[1].columns.str.contains('Year')]
   revenue_estimate_df = revenue_estimate_df[revenue_estimate_df['Revenue Estimate'] == 'Avg. Estimate']
   revenue_estimate_df.drop('Revenue Estimate',axis=1,inplace=True)
   
   #EPS、売上結合
   estimate_df = pd.concat([earning_estimate_df, revenue_estimate_df], sort = True)
   estimate_df = estimate_df.reset_index(drop=True)

   # 単位変換(0に戻す)
   d = {'B': '*10 ** 9', 'M': '*10 ** 6', 'k': '*10 ** 3'}
   for col in estimate_df.columns:
        if estimate_df[col].dtype == 'object':
           estimate_df[col] =  estimate_df[col].replace(d, regex=True).map(pd.eval)
  
   #列名変更
   for col in estimate_df.columns:
       #文字列の変換
       if 'Current Qtr.' in col:
           rep_col = col.replace('Current Qtr.','今季予想')
       else:
           rep_col = col.replace('Next Qtr.','来季予想')
       
       estimate_df = estimate_df.rename(columns = {col:rep_col})

   #df整形
   estimate_df = estimate_df.T
   estimate_df = estimate_df.rename(columns={1:'売上高予想'})
   estimate_df = estimate_df.rename(columns={0:'EPS予想'})
   estimate_df = estimate_df.reset_index()
   estimate_df = estimate_df.rename(columns={'index':'quarter'}) 
   estimate_df.insert(0, 'ticker', ticker)
   estimate_df = estimate_df.reindex(columns = ['ticker','quarter','EPS予想','売上高予想'])
   estimate_df['データ取得日'] = datetime.date.today().strftime('%Y/%m/%d')
   
   return estimate_df

実行すると

yf_estimate('GOOG')

画像3

こんな感じで取れます。(売上高は結果に合わせて単位を取ってます。)

次②をとる関数(EPS、売上高結果を取得する関数)を定義します。

# EPS、売上高結果取得関数

@timeout_decorator.timeout(60)
def yf_actual(ticker):

   tick = YahooFinancials(ticker)

    #データ取得    get_stock_earnings_data = tick.get_stock_earnings_data()

   #eps,売上結果取得
   earnings_df = get_stock_earnings_data[ticker]['earningsData']['quarterly']
   earnings_df = pd.DataFrame(earnings_df)

   financials_df = get_stock_earnings_data[ticker]['financialsData']['quarterly']
   financials_df = pd.DataFrame(financials_df)

   #eps,売上結合
   if not earnings_df.empty:
       #空じゃなければ
       actual_df = pd.merge(earnings_df,financials_df, left_on=['date'], right_on=['date'],how='left')
   else:
       #空なら
       actual_df = financials_df

   #整形
   actual_df = actual_df.rename(columns = {'actual':'EPS結果'})
   actual_df = actual_df.rename(columns = {'revenue':'売上高結果'})
   actual_df.drop('earnings',axis=1,inplace=True)
   
   if not earnings_df.empty:
       #空じゃなければ
       actual_df.drop('estimate',axis=1,inplace=True)
   
   actual_df = actual_df.set_index('date')
   actual_df = actual_df.reset_index()
   actual_df = actual_df.rename(columns = {'date':'quarter'}) 
   actual_df.insert(0, 'ticker', ticker)
   actual_df['データ取得日'] = datetime.date.today().strftime('%Y/%m/%d')
   
   return actual_df

実行すると

画像4

最後に③EPSの答え合わせをとる関数を定義します。

# EPSの結果と過去予想の一覧を取る関数
#tickerのEPS結果と過去予想一覧がとれる

def yf_old_eps(ticker):

   yec = YahooEarningsCalendar()
   wao =yec.get_earnings_of(ticker)

   #seriesからdfに変換
   df = pd.DataFrame(wao)

   #過去2年に絞る
   today = datetime.date.today().strftime('%Y/%m/%d')
   df =df[(df['startdatetime'] > '2019-01-01') & (df['startdatetime']  <= today)]
   
   #整形
   df =df[['ticker','startdatetime','epsactual','epsestimate','epssurprisepct']]
   df['startdatetime'] =  pd.to_datetime(df['startdatetime']).dt.strftime('%Y/%m/%d')
   
   df = df.rename(columns = {'startdatetime':'決算日'})
   df = df.rename(columns = {'epsactual':'EPS結果'})   
   df = df.rename(columns = {'epsestimate':'EPS予想'})  
   df['データ取得日'] = datetime.date.today().strftime('%Y/%m/%d')    
   
   return df

実行すると

yf_old_eps('GOOG')

画像5

取れるものは何年も前のも取れるので2019年からに絞っています。
epssurpriseはどれだけ予想からよかったのかを%で表しています。

単発実行ができたので
これを調べたい銘柄まとめてやります。

#調べたいものをリストで設定
tickers = ['GDRX','ZM','U']

#リストを回す
for ticker in tickers:
       
   print(ticker)
   print('\n')
   print('■chart')
   
   display(yf_chart('GOOG',365))
   plt.pause(1)
   
   print(ticker)
   print('\n')
   
   print('■予想')
   display(yf_estimate(ticker))
   
   print('■結果')
   display(yf_actual(ticker))
   
   print('■過去EPS')
   display(yf_old_eps(ticker))

   print('ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー')

こんな感じで取れます。

画像6

画像7

結果は続きますが割愛。

どうだったでしょうか。
エクセルを毎回記入する面倒臭さに比べたら
一回でとれるようにしておけば簡単にEPS、売上高、ガイダンスをチェックできると思います。

ご活用ください。

最後までお読みいただき、ありがとうございます!。
twitterもやってます。よろしくお願いします!。



読んでる皆さんと自分がもっと稼げるように、全額惜しみなく勉強代とさせていただきます!。