じっちゃまの教えに則って、EPS売上高ガイダンスをもっともっともっと見やすくゲットする
アメリカ株のEPS、売上高、ガイダンスをサクッとできたけど
前回の記事ではあまりイケてなかったので、もっと見やすく取得できるようにしました。
結果こんな感じに。
次の決算が発表されたら、
・最新の決算結果と取っておいた①今期予想を見比べる。
・今季ガイダンスも更新されるので取っておいた②来期予想と見比べる。
これで、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')
②を出すための関数
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')
取得したい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
一覧で取れます。
後から整理しやすいように、yearとqt(期)を追加しています。
結果を取得したあと見たい銘柄のみに絞るには
df_ticker[df_ticker['ticker'] == 'U']
前回よりも、さらに整理されて見やすくなったと思います。
コピペでエクセルに貼り付けるもよし、htmlで保存しておいてあとで結果と見比べるもよし。
どうぞご活用ください。
最後までお読みいただき、ありがとうございます!。
記事が面白かったという方は「♡」「フォロー」よろしくお願いします!。
おすすめ記事:
じっちゃまおすすめ本:
(決算情報取得して、合わせて読んだら勝率上がるよねって本)
いいなと思ったら応援しよう!
読んでる皆さんと自分がもっと稼げるように、全額惜しみなく勉強代とさせていただきます!。