じっちゃまの教えに則って、EPS売上高ガイダンスをサクッとゲットするよ。
EPS売上高ガイダンスをサクッとゲットしたい経緯
アメリカ株のボスザル「じっちゃま」の教えに則って
アメリカ株のEPS、売上高、ガイダンスを記録しようと思ったけど、毎回エクセルに記入するのがシンドイので、プログラムで取得できるようにしてみました。
yahooファイナンスの難点
データの取得はアメリカの yahoo finance 。
データが揃っており非常にありがたいのだが、難点ある。
売上高の過去予想が無いのと、ガイダンスの結果と過去予想が無い。
・EPS予想 ある(過去もある)
・EPS結果 ある(過去もある)
・売上高予想 ある(過去は無い)
・売上高結果 ある(過去もある)
・ガイダンス予想 ある(過去は無い)
・ガイダンス結果 無い!
データ取得の流れ
売上高の過去予想が無いのと、ガイダンスの結果と過去予想が無いので、
以下の流れになります。
①決算前に実行して保存(売上高、ガイダンス予想を取得しておくため用)
②決算後に実行して保存(結果確認用)
③ガイダンスの結果をedgarでチェック!。(詳細あり)
実施してみる
前置きはとりあえずここまでで、実行するとこんな感じに取れます。
①を決算前の実行で保存しておく(保存しておかないと、決算後に書き換わる為)→ 実行結果を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)
こんな感じで出せます。
次に①を出すための関数(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')
こんな感じで取れます。(売上高は結果に合わせて単位を取ってます。)
次②をとる関数(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
実行すると
最後に③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')
取れるものは何年も前のも取れるので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('ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー')
こんな感じで取れます。
結果は続きますが割愛。
どうだったでしょうか。
エクセルを毎回記入する面倒臭さに比べたら
一回でとれるようにしておけば簡単にEPS、売上高、ガイダンスをチェックできると思います。
ご活用ください。
最後までお読みいただき、ありがとうございます!。
twitterもやってます。よろしくお願いします!。