経済指標の取得その2

経済指標の取得その2

次にpandas のカラムの結合をして新しいカラムを作成してみる

これをdate と time を合わせて
Datetime 形式にして
Datetime インデックスを作成する

https://note.com/kohaku935/n/n18205dcc60fa

を参考にまずは+で結合し

Datetime を追加する

1
2
3
economic_data['Datetime']=economic_data['date']+economic_data['time'].fillna('')
 
economic_data

で欠損値は削除できたが

Time がAllay のものだとこれになってしまう

あとくっついてるので変換できない

1
economic_data['Datetime']=economic_data['date']+" "+economic_data['time'].fillna('')

として余白を入れる

https://note.nkmk.me/python-pandas-datetime-timestamp/
を使えばdatetime へ変換できるはず

その前に一度フォーマットを変えないと日付が月扱いになっている

1
2
3
4
5
economic_data['Days']=economic_data['date']
 
economic_data['Days']=pd.to_datetime(economic_data['Days'])
 
economic_data

で確認したら

これだとだめ

1
2
3
4
5
6
7
8
9
10
11
12
13
date2 =[]
 
for i in economic_data['date']:
 
    new_date = datetime.datetime.strptime(i,"%d/%m/%Y").strftime("%Y-%m-%d")
 
    date2.append(new_date)
 
economic_data['date']=economic_data['date'].str.replace('/','-')
 
economic_data['date'] = date2
 
economic_data.fillna(0)

年月日へ変換

1
pd.to_datetime(economic_data['Days'], format="%Y%m%d %H:%M")

とすればエラーにならない

このため

あとは時間の部分で

時刻でないものを除外するようにする

正規表現で検索

1
economic_data['time'].tail(10).str.contains('[a-zA-Z]')

というようにすれば

アルファベットになっているものだけになる

なので

1
economic_data['time'].tail(10).str.contains('[1-9]')

とすれば時間は数値なので

これで調べることができる

あとはif などで条件をつけて

数値出ない場合には

Datetime には NA を入れるようにする

まずカレンダーで重要なものだけ表示してみて

これでも変わらないのなら、この措置をとる

importanceを hight にすればいけるはず

1
economic_data[economic_data['importance']=='high']

で前に出しているので

これでできたが日付関連が昨日と今日だと微妙におかしい

今日と明日で試してみる

Datetime index が設定できるようにすること

そして

Event の文字のエスケープをしておいて検索ができるようにしておくこと

1
2
3
4
5
6
7
8
9
10
11
12
13
date2 =[]
 
for i in dealing_calender['date']:
 
    new_date = datetime.datetime.strptime(i,"%d/%m/%Y").strftime("%Y-%m-%d")
 
    date2.append(new_date)
 
dealing_calender['date']=dealing_calender['date'].str.replace('/','-')
 
dealing_calender['date'] = date2
 
dealing_calender.fillna(0)

でdatetime にして

1
2
3
dealing_calender['DateTime']=dealing_calender['date']+" "+dealing_calender['time'].fillna('')
 
dealing_calender

Datetime index のためのカラムを作成

と思ったが

【Pandas】DataFrameの文字列日付データを比較して、抽出したりする
にあるようにカラムをdatetime にすれば抽出できそう

1
2
3
4
5
def convert_date(x):
 
    date = datetime.datetime.strptime(x,"%Y-%m-%d %H:%M:%S")
 
    return date

で変換するメソッドを用意

しかし元のデータは秒までないためエラ〜になるので

1
2
3
4
5
def convert_date(x):
 
    date = datetime.datetime.strptime(x,"%Y-%m-%d %H:%M")
 
    return date

とする

1
dealing_calender['DateTime'] = dealing_calender['DateTime'].apply(convert_date)

で変換できた

pandas.DataFrame, Seriesを時系列データとして処理
を参考に
Datetime index を設定する

今回は
既存データの列をDatetimeIndexとして指定する方法

1
dealing_calender.dtypes

で確認すると

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
id                    object
 
date                  object
 
time                  object
 
zone                  object
 
currency              object
 
importance            object
 
event                 object
 
actual                object
 
forecast              object
 
previous              object
 
DateTime      datetime64[ns]
 
dtype: object

となり

すでにdatetime には変換済

set_index()メソッドでdatetime64型の列をインデックスに指定する

1
dealing_calender.set_index('DateTime',inplace=True)

これでできた

あとは時間指定でデータ取り出し

DatetimeIndexがわからんので逆引きでまとめとくの巻
を参考に
時間を指定して取り出す

文字列で時間や日時を指定して行を取り出す, loc
でいけそう

しかしやりたいのは
指定した時間でのevent の取り出し

なので
indexとcolumnを指定してvalueを取り出す

1
dealing_calender.loc['2022-04-19 05:00']['event']

とすれば

経済指標は英語で

Economic indicators
なので

1
2
3
indicator = dealing_calender.loc['2022-04-19 05:00']['event']
 
print(indicator)

これで

1
RBNZ Gov Orr Speaks

となった

次に
この変数で経済指標のグラフの最初の検索処理ができるか試す

過去ログで見ると

1
2
3
economic_data = investpy.economic_calendar(time_zone=None, time_filter='time_only', countries=['japan', 'united states'], from_date='01/02/2021', to_date='28/03/2021')
 
economic_data.tail(5)

となっている

つまり最初の時点で国などを指定している
これだと日本とアメリカのみになっているので
これを変える必要がある

対象を全ての国にするか
メジャーカレンシーのみに絞る

https://investpy.readthedocs.io/_api/news.html

のリファレンスを見ると

1
investpy.news.economic_calendar(time_zone=None, time_filter='time_only', countries=None, importances=None, categories=None, from_date=None, to_date=None)

となっている

しかし期間を指定しないとエラ〜になる

1
2
3
economic_data2 = investpy.economic_calendar(time_zone=None, time_filter='time_only', countries=None, from_date='01/01/2021', to_date='31/01/2021')
 
economic_data2

というように国コードだけ指定外して
期間を指定したらできた

せっかくなので期間を
年始から今日までとしてみる
と思ったけど年間のデータから算出した方が良さそう
そもそも年始にトレードする時
修正が必要になってしまう

[Python]昨日や明日、月末などの日付を取得したい
を参考に

1
2
3
# 1年前# => 2019-04-02
 
one_year_ago = today + relativedelta(years=-1)

でいけるはず

処理が遅いため

1
2
3
economic_data2 = investpy.economic_calendar(time_zone=None, time_filter='time_only', countries=None, from_date='01/01/2022', to_date=deel_today)
 
economic_data2

としてみた

表示されるまで時間がかかる

ネット速度の問題か
それともマシンスペックかはわからない

つまり年ごとで取得するなら
別の時間枠でやらないと間に合わない

とりあえず直近1ヶ月で指定する

1
2
3
economic_data2 = investpy.economic_calendar(time_zone=None, time_filter='time_only', countries=None, from_date=deal_one_month_ago, to_date=deel_today)
 
economic_data2

でいける

この中から

1
2
3
#重要指標で actual が NULL 以外で importance = high のものを表示
 
economic_data2[~(economic_data2['actual'].isnull()) & (economic_data2['importance']=='high')]

以前に経済指標グラフを出す時には
取得期間を半年にした

1
economic_data = investpy.news.economic_calendar(time_zone=None, time_filter='time_only', countries=['japan', 'united states'],importances=None,categories=None,from_date='01/01/2021', to_date='11/06/2021')

で1年にしたら止まった

カレンシーを絞らないとできないと思う
カレンシーの絞り込みはなく国の指定になる

取り扱っている通貨で出すと
ドル united states
ユーロ germany
ポンド united kingdom
豪ドル australia
NZドル new zealand
カナダドル canada
スイスフラン switzerland

これだけに絞る

1
2
3
4
5
6
7
# economic_data2 = investpy.economic_calendar(time_zone=None, time_filter='time_only', countries=None, from_date='01/01/2022', to_date=deel_today)
 
# economic_data2
 
year_economic_data2 = investpy.economic_calendar(time_zone=None, time_filter='time_only', countries=[‘united states','germany','united kingdom','australia','new zealand','canada','switzerland'], from_date=deal_one_month_ago, to_date=deel_today)
 
year_economic_data2

これで絞り込み

さらに

1
2
3
4
5
6
7
# economic_data2 = investpy.economic_calendar(time_zone=None, time_filter='time_only', countries=None, from_date='01/01/2022', to_date=deel_today)
 
# economic_data2
 
year_economic_data2 = investpy.economic_calendar(time_zone=None, time_filter='time_only', countries=[‘united states','germany','united kingdom','australia','new zealand','canada','switzerland'], from_date=deal_one_year_ago, to_date=deel_today)
 
year_economic_data2

で年間にしたらできた

あとはグラフの時と同じ処理をやってみる
探す時に
経済指標の検索ワードを
カレンダーの結果で調べてみる

もしエラーならエスケープ後に再度挑戦する

まずはISMを検索

1
2
3
ISM =year_economic_data2[year_economic_data2['event'].str.contains('ISM Non-Manufacturing PMI')]
 
ISM

で1年間のISMを表示できた

チャートにするには
そのままのsate time ではできないので

1
2
3
4
5
6
7
8
9
10
11
12
13
date2 =[]
 
for i in ISM['date']:
 
    new_date = datetime.datetime.strptime(i,"%d/%m/%Y").strftime("%Y-%m-%d")
 
    date2.append(new_date)
 
ISM['date']=ISM['date'].str.replace('/','-')
 
ISM['date'] = date2
 
ISM.fillna(0)

と変換する

あとはチャート部分

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
actual =(
 
    alt.Chart(ISM)
 
    .mark_line(opacity=0.8,clip=True)
 
    .encode(
 
        x="date:T",
 
        y=alt.Y("actual:Q",stack=None)
 
    )
 
)
 
 
 
forecast =(
 
    alt.Chart(ISM)
 
    .mark_line(opacity=0.8,clip=True,color='red')
 
    .encode(
 
        x="date:T",
 
        y=alt.Y("forecast:Q",stack=None),     
 
    )
 
)
 
 
 
previous =(
 
    alt.Chart(ISM)
 
    .mark_line(opacity=0.8,clip=True,color='green')
 
    .encode(
 
        x="date:T",
 
        y=alt.Y("previous:Q",stack=None),     
 
    )
 
)
 
alt.layer(actual,forecast,previous).resolve_scale(
 
    y = 'independent'
 
)

で表示できる

なおaltair を使っているので

1
import altair as alt

が必要

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です