python で経済指標の取得とグラフ化
経済指標を取得しグラフ化することで
ニュース発表時の期待値との乖離を理解しやすくなる
まずは経済指標の値を取得
できればあとは
dow index
gold
WTI
なども取得できるようにする
jupyter-notebook
で実験をしてそれから
streamlit で表示
というコンセプトで
FXで重要な経済指標をWebスクレイピングで取得する方法
[Python]investpyで株、為替、経済指標データを取得する
を参考に
investpy
をインストール
!pip install investpy
で
jupyter notebook でインストールできる
investpyで世界の株価データを取得してみた
も参考に
import pandas as pd
import investpy
で必要なライブラリをインポート
code = '7203' #トヨタ自動車
stock_data = investpy.get_stock_historical_data(stock=code, country='japan', from_date='01/02/2021', to_date='28/03/2021')
stock_data.tail(5)
とすると
2021/2/1 から 2021/3/28
までのトヨタ自動車の株価を取得して表示できる
investpy.get_stock_historical_data
で
企業シンボルを stock=
国を country=
期間を from_date=, to_date
で指定する
これを APPle にするなら
symbol = "AAPL" #アップル
stock_data = investpy.get_stock_historical_data(stock=symbol, country='united states', from_date='01/02/2021', to_date='28/03/2021')
stock_data.tail(5)
とすればOK
違いはstock= を symbol にして
contury= を united states
にしていること
なお指定期間の為替の取得も可能
usd_jpy = investpy.get_currency_cross_historical_data(currency_cross='USD/JPY', from_date='01/02/2021', to_date='28/03/2021')
usd_jpy.tail(5)
で
from_date と to_date
で指定した期間の為替情報を
get_currency_cross_historical_data()
で取得している
currency_cross= で通過ペアの指定をしている
次に経済指標
investpy.economic_calendar
で各国の経済指標を得ることができる
economic_data = investpy.economic_calendar(time_zone='GMP +9:00', countries=['japan', 'united states'], from_date='01/02/2021', to_date='28/03/2021')
economic_data.tail(5)
だと
ValueError Traceback (most recent call last)
<ipython-input-16-10b765be85cc> in <module>
----> 1 economic_data = investpy.economic_calendar(time_zone='GMP +9:00', countries=['japan', 'united states'], from_date='01/02/2021', to_date='28/03/2021')
2 economic_data.tail(5)
~/anaconda3/lib/python3.8/site-packages/investpy/news.py in economic_calendar(time_zone, time_filter, countries, importances, categories, from_date, to_date)
80 else:
81 if time_zone not in cst.TIMEZONES.keys():
---> 82 raise ValueError("ERR#0108: the introduced time_zone does not exist, please consider passing time_zone as None.")
83
84 if not isinstance(time_filter, str):
ValueError: ERR#0108: the introduced time_zone does not exist, please consider passing time_zone as None.
となる
github で調べたら
https://github.com/alvarobartt/investpy/search?q=economic_calendar
にあるように
def economic_calendar(time_zone=None, time_filter='time_only', countries=None, importances=None, categories=None, from_date=None, to_date=None):
と定義されている
さらに詳細を
https://github.com/alvarobartt/investpy/blob/f7f43c4458a155237321528c9a46e2aa4a3e824d/investpy/news.py
で確認
time_zone (:obj:`str`, optional):
time zone in GMT +/- hours:minutes format, which will be the reference time, if None, the local GMT time zone will be used.
time_filter (:obj:`str`, optional):
it can be `time_only` or `time_remain`, so that the calendar will display the time when the event will occurr according to
the time zone or the remaining time until an event occurs.
とあるので約してみると
time_zone(:obj: `str`、オプション):
GMT +/-時間:分形式のタイムゾーン。これが参照時間になります。[なし]の場合、ローカルGMTタイムゾーンが使用されます。
time_filter(:obj: `str`、オプション):
それは「time_only」または「time_remain」にすることができ、カレンダーはイベントが発生する時間を表示します
タイムゾーンまたはイベントが発生するまでの残り時間。
ということなので
economic_data = investpy.economic_calendar(countries=['japan', 'united states'], from_date='01/02/2021', to_date='28/03/2021')
economic_data.tail(5)
というように
time_zone を省略したらできた
次に
economic_data[economic_data['importance']=='high']
というように
importance カラムが high になっているものだけを抽出すれば
重要指標のみ表示ができる
actual
が実際の値
forecast が予測値
previousが前回の値
つまりこの3つのうち
forecast
previous
でグラフを作成、もしくは該当する経済指標でグラフを作成すればいい
とりあえずグラフにするサンプル
とはいっても株価のだけど
investpyで世界の株価データを取得してみた
で日立製作所の株価データをグラフにするのがあったので実線
stock = '6501' # Hitachi Ltd
country = 'japan'
stock_df = investpy.get_stock_recent_data(stock=stock, country=country)
stock_df.reset_index(drop=False, inplace=True)
stock_df.head()
ででる
reset_index() のオプションについて調べてみた
Pandas.DataFrameのインデックスをreset_indexメソッドで振り直す
によれば
DataFrameのreset_indexメソッドを使えば、DataFrameの行のindexを簡単に振り直すことができる
ということ
drop=False
については
オリジナルのindexを列として保存しておくならFalse、保存しないならTrue
inplace=True
については
reset_indexを実行したオブジェクト自体を変更する場合はTrue、変更しないのならFalse
つまり reset_index() でインデックス番号が振られるので
head() などで絞り込みができる
あとはグラフにしてみる
from matplotlib import pyplot as plt
import matplotlib.dates as mdates
import seaborn as sns; sns.set()
fig,ax = plt.subplots(figsize=(12,4))
locator = mdates.DayLocator()
formatter = mdates.ConciseDateFormatter(locator)
ax.xaxis.set_minor_locator(locator)
ax.xaxis.set_major_formatter(formatter)
sns.lineplot(data=stock_df, x='Date', y='Close')
ax.set_title('Hitachi Ltdt')
plt.show()
でできる
今度は経済指標に戻って
米国原油在庫量であるCrude Oil Inventories
が経済指標にあったので
event からこれを指定する
economic_data = investpy.economic_calendar(time_zone=None, time_filter='time_only', countries=['japan', 'united states'], from_date='01/01/2021', to_date='11/06/2021')
economic_data[economic_data['event']=='Crude Oil Inventories']
これで一覧で取得できた
あとは
actual
forecast
previous
の3つをグラフにして
対応する通貨の値動きを追加すれば
どんな値動きをしていたのかがわかる
次に新規失業保険申請件数
これは
Initial Jobless Claims
なので
economic_data[economic_data['event']=='Initial Jobless Claims']
となる
ただし
ISM Non-Manufacturing PMI (Jan)
というように月などが入っていると完全一致しないため
== では判定できない
python 文字列 含む 判定 pandas
で検索し
pandasで特定の文字列を含む行を抽出(完全一致、部分一致)
を参考に特定の文字列で始まるものを試す
str.contains(): 特定の文字列を含む
str.startswith(): 特定の文字列で始まる
があたりっぽい
print(df[df['name'].str.contains('li')])
がサンプル
なので
economic_data[economic_data['event'].str.contains('ISM Non-Manufacturing PMI')]
とすれば
ISM Non-Manufacturing PMI
を含むものを抽出することができるので
月ごとの結果が取得できるようになる
とりあえず取得するべき経済指標に関しては
economic_data2 = investpy.economic_calendar(time_zone=None, time_filter='time_only', countries=['japan', 'united states'], from_date='01/01/2021', to_date='31/01/2021')
economic_data2[economic_data2['importance']=='high']
で1月の重要経済指標を取得し表示
あとはグラフなどにしたい経済指標を絞り込む
英語なので google 翻訳などで調べていくと
ISM Manufacturing PMI
ISM製造業PMI
ADP Nonfarm Employment Change
ADP非農業部門雇用者数
Crude Oil Inventories
米国 原油在庫量
新規失業保険申請件数
これは
Initial Jobless Claims
ISM非製造業指数
ISM Non-Manufacturing PMI
Nonfarm Payrolls
米非農業部門雇用者数
Unemployment Rate
失業率
JOLTs Job Openings
JOLTS求人労働異動調査
つまり求人情報の数
Core CPI
消費者物価指数
正式名称は生鮮食品除く総合指数。生鮮食品とは、生鮮魚介、生鮮野菜、生鮮果物のこと。
Core Retail Sales
米国コア小売売上高前月比
PPI
生産者物価指数
生産者が出荷した製品や原材料などの販売価格の変動を調査・算出した経済指標
Retail Sales
小売売上高
米国の小売・サービス業の月間売上高
インフレと経済活動を評価する
Building Permits
(Building Permits)は、政府や他の規制当局が発行した新施設の建設のための許可数
中期的に不動産市場を予測する
Philadelphia Fed Manufacturing Index
フィラデルフィア連銀製造業景況指数
Existing Home Sale
中古住宅販売件数
CB Consumer Confidence
米国 消費者信頼感指数
Core Durable Goods Orders
コア耐久財受注
報告月の前月と比較した米国耐久財製造業者が受注した受注額を反映します。耐久財とは家具、電気器具などで、3年以上もつことが予想
Fed Interest Rate Decision
FRB政策金利
GDP (QoQ)
実質GDP
New Home Sales
新築住宅販売戸数
Pending Home Sales
住宅販売契約指数
が重要指標
なお調べるときに
actual が None のものを除外すると見やすいと思うが
economic_data2[economic_data2['actual']=='None']
pandasで複数条件のAND, OR, NOTから行を抽出(選択)
を参考にやったがダメ
Pandasで NaN (Null) の行だけ抽出
を参考に
isnull() で抽出可能になった
python では not は ~ でなり
複数条件にするときには () で条件を囲む
今回
importance==hight
actual が isnull() でないもの
のものを表示するので
economic_data2[~(economic_data2['actual'].isnull()) & (economic_data2['importance']=='high')]
とすればOK
とりあえず経済指標の絞り込みはできるようになったので
次にグラフにする
複数のグラフを表示するには
altair でできたのでこれをつかう