見出し画像

じっちゃまの教えに則って、EPS売上高ガイダンスをもっともっともっと見やすくゲットする

アメリカ株のEPS、売上高、ガイダンスをサクッとできたけど
前回の記事ではあまりイケてなかったので、もっと見やすく取得できるようにしました。

結果こんな感じに。

画像1

次の決算が発表されたら、
・最新の決算結果と取っておいた①今期予想を見比べる。
・今季ガイダンスも更新されるので取っておいた②来期予想と見比べる。

これで、EPS、売上高、ガイダンスがOKだら良い決算ということになります。前回と比べてさらに見やすくなったと思います。

それではコードです。
今回もjupyter notebookの使用を想定しています。
(jupyterやpythonがよく分からんという方はまずこっち)


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

!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

①を出すための関数
売上高予想取得(ガイダンス取得)関数

(前回から修正)

# 売上高の予測DFと、ガイダンスDFも一緒に返す。

#実行時に帰ってこないことがあるので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.','')
       
       rep_col = rep_col.replace('(','')
       rep_col = rep_col.replace(')','')
       
       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')
   estimate_df['status']  = '予想'
   
   return estimate_df

実行サンプル

yf_estimate('GOOG')

画像2


②を出すための関数
EPS、売上高結果を取得する関数

(これも前回から修正)

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

   tick = YahooFinancials(ticker)

   #データ取得
  #コメントアウトされてしまってました。修正しました 2020/12/24 
  
   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')
   
   actual_df['status']  = '結果'
   
   return actual_df

実行サンプル

yf_actual('GOOG')

画像3

取得したいtickerをリストで設定


tickers = ['GOOG','GDRX','U']

準備が整ったので連続実行

#⭐空のDF作成
df_ticker =  pd.DataFrame(index=[], columns=[])

#回して取得
for ticker in tickers:
       
   df_actual = yf_actual(ticker)
   df_estimante = yf_estimate(ticker)
   df_ticker = pd.concat([df_ticker,df_actual,df_estimante])

#きれいに整形
df_ticker.loc[df_ticker['status'] == '結果','qt'] = df_ticker[df_ticker['status'] == '結果']['quarter'].str[:1]
df_ticker.loc[df_ticker['status'] == '結果','year'] = df_ticker[df_ticker['status'] == '結果']['quarter'].str[2:]
df_ticker.loc[ df_ticker['status'] == '予想','qt'] = df_ticker[df_ticker['status'] == '予想']['quarter'].str[:4]
df_ticker.loc[df_ticker['status'] == '予想','year'] = df_ticker[df_ticker['status'] == '予想']['quarter'].str[4:]

結果表示

df_ticker

一覧で取れます。

画像4

後から整理しやすいように、yearとqt(期)を追加しています。

結果を取得したあと見たい銘柄のみに絞るには

df_ticker[df_ticker['ticker'] == 'U']

画像5

前回よりも、さらに整理されて見やすくなったと思います。

コピペでエクセルに貼り付けるもよし、htmlで保存しておいてあとで結果と見比べるもよし。

どうぞご活用ください。

最後までお読みいただき、ありがとうございます!。
記事が面白かったという方は「♡」「フォロー」よろしくお願いします!。

おすすめ記事:



じっちゃまおすすめ本:
(決算情報取得して、合わせて読んだら勝率上がるよねって本)





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