経済指標の取得その2

経済指標の取得その2

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

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

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

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

Datetime を追加する

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

economic_data

で欠損値は削除できたが

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

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

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

として余白を入れる

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

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

economic_data['Days']=economic_data['date']

economic_data['Days']=pd.to_datetime(economic_data['Days'])

economic_data

で確認したら

これだとだめ

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)

年月日へ変換

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

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

このため

あとは時間の部分で

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

正規表現で検索

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

というようにすれば

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

なので

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

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

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

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

数値出ない場合には

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

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

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

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

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

で前に出しているので

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

今日と明日で試してみる

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

そして

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

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 にして

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

dealing_calender

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

と思ったが

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

def convert_date(x):

    date = datetime.datetime.strptime(x,"%Y-%m-%d %H:%M:%S")

    return date

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

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

def convert_date(x):

    date = datetime.datetime.strptime(x,"%Y-%m-%d %H:%M")

    return date

とする

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

で変換できた

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

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

dealing_calender.dtypes

で確認すると

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型の列をインデックスに指定する

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

これでできた

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

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

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

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

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

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

とすれば

経済指標は英語で

Economic indicators
なので

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

print(indicator)

これで

RBNZ Gov Orr Speaks

となった

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

過去ログで見ると

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

のリファレンスを見ると

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

となっている

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

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年前# => 2019-04-02

one_year_ago = today + relativedelta(years=-1)

でいけるはず

処理が遅いため

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ヶ月で指定する

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

でいける

この中から

#重要指標で actual が NULL 以外で importance = high のものを表示

economic_data2[~(economic_data2['actual'].isnull()) & (economic_data2['importance']=='high')]

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

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

これだけに絞る

# 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

これで絞り込み

さらに

# 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を検索

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

ISM

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

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

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)

と変換する

あとはチャート部分

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 を使っているので

import altair as alt

が必要

経済指標の取得その1

経済指標の取得

行う処理は

カレンダーの予想時刻と
現在時刻

つまり date time が一緒になったら
Event で検索

とりあえず event 内容をリストに入れる

あと
Date time も格納する

Datetime に関しては
文字列から datetime に変換する

まずはリストにする

value.tolist()

でリスト変換可能

events = economic_data["event"]

economic_event = events.values.tolist()

#events=events[0]

print(economic_event[0])

economic_events="Chinese Industrial profit YTD  (Feb)"

test_event = economic_event[3]

print(test_event)

print(economic_events)

economic_event

これで

economic_event

へリストで格納できる

これを

economic_data[economic_data['event'].str.contains(economic_event[4])]

というようにすれば検索できるが

Chinese Industrial profit YTD  (Feb)

Investing.com GBP/USD Index

Chinese Industrial profit YTD  (Feb)

Out[78]:

['Chinese Industrial profit YTD  (Feb)',

'Finnish Consumer Confidence  (Mar)',

'Finnish Industrial Confidence  (Mar)',

'Investing.com GBP/USD Index',

'Investing.com Gold Index',

'Investing.com S&P 500 Index',

'Investing.com USD/CAD Index',

'Investing.com USD/CHF Index',

'Investing.com AUD/USD Index',

'Investing.com USD/JPY Index',

'Investing.com NZD/USD Index',

'Investing.com EUR/USD Index',

'Trade Balance  (Feb)',

'Credit Indicator (YoY)  (Feb)',

'Core Retail Sales (MoM)  (Feb)',

'Lithuania Retail Sales (MoM)',

'Lithuania Retail Sales (YoY)',

'Gross Wages (YoY)  (Jan)',

'Exports (MoM)  (Feb)',

'Imports (MoM)  (Feb)',

'Trade Balance',

'Irish Retail Sales (MoM)  (Feb)',

'Irish Retail Sales (YoY)  (Feb)',

'BoE Gov Bailey Speaks',

'Quarterly Unemployment Rate',

'M3 Money Supply (YoY)  (Dec)',

'Private Sector Loans (YoY)  (Dec)',

'BCB Focus Market Readout',

'Greek Credit Expansion (YoY)',

'Trade Balance  (Feb)',

'Trade Balance (USD)  (Feb)',

'GDP (YoY)',

'GDP Quarterly',

'Goods Trade Balance  (Feb)',

'Retail Inventories Ex Auto  (Feb)',

'Wholesale Inventories (MoM)',

'Current Account (USD)  (Feb)',

'Foreign direct investment (USD)  (Feb)',

'French 12-Month BTF Auction',

'French 3-Month BTF Auction',

'French 6-Month BTF Auction',

'Dallas Fed Mfg Business Index  (Mar)']

の中で

Chinese Industrial profit YTD  (Feb)

というように
(Feb)
があるとエラーになる

他の指標も試したけど
()があるものは全てエラーになる

この場合エスケープさせるか
(以降は削除するしかない

Macのキーボードの「Option」と
右上にある「¥マーク」を同時に押しすると
入力ソースが英数であろうと、
ひらがなであろうと
半角のバックスラッシュ(「\」)が入力される

Option + ¥

でバックスラッシュの\\ 2つで
エスケープできるので

economic_data[economic_data['event'].str.contains("Exports \\(MoM\\) ")]

としたらエラーがなくなった

つまりリストの中で()のある部分をエスケープしないとだめ

これは
Replace でできるので

economic_event.replace('(','\\(')

としたけど

すでにリストにしてしまうとだめ

events = economic_data["event"].str.replace('(','\(').str.replace(')','\)')

events

とすれば

/var/folders/db/tkl5w9dd3kn3h53ctyl4s6180000gn/T/ipykernel_8436/2811222662.py:4: FutureWarning: The default value of regex will change from True to False in a future version. In addition, single character regular expressions will *not* be treated as literal strings when regex=True.

  events = economic_data["event"].str.replace('(','\(').str.replace(')','\)')

とエラーは出るけど変換はできる

あとは

economic_event = events.values.tolist()

#events=events[0]

print(economic_event[0])

economic_events="Chinese Industrial profit YTD  (Feb)"

test_event = economic_event[3]

print(test_event)

print(economic_events)

print(economic_event)

でリストにできるので

economic_data[economic_data['event'].str.contains(economic_event[4])]

とすれば検索条件に当てはめることも可能

経済指標カレンダーの取得

経済指標カレンダーの取得

スクレイピングだけだとあっているかわからないので

Investor でも取得してみる

[Python]investpyで株、為替、経済指標データを取得する
を参考に

economic_data = invest.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)

としたがエラー

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 を省略したらできた

today =datetime.date.today().strftime('%d/%m/%Y')

today

で今日の日付を investor で検索する形式に変換して取得

economic_data = investpy.economic_calendar(countries=['japan', 'united states'], from_date=today, to_date=today)

economic_data.tail(5)

とすると今日のカレンダーと思ったけど出ない

economic_data = investpy.economic_calendar(countries=['japan', 'united states'], from_date='23/03/2022', to_date=today)

economic_data.tail(5)

というように前日の日付にすればできる

economic_data = investpy.economic_calendar(countries=['japan', 'united states'], from_date='23/03/2022', to_date=today)

economic_data.tail(5)

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

で日本とアメリカだけ出てくる

なので国コードを外してしてしてみる

まずは昨日の日付をオートで取れるようにする

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

import datetime

from dateutil.relativedelta import relativedelta

を追加

# 今日# => 2020-04-02

today = datetime.date.today()


# 昨日# => 2020-04-01

yesterday = today + relativedelta(days=-1)

で昨日の日付を取れる

today =datetime.date.today()

print(today)

deel_today = datetime.date.today().strftime('%d/%m/%Y')

print(deel_today)

yesterday = today + relativedelta(days=-1)

print(yesterday)

deel_yesterday = yesterday.strftime('%d/%m/%Y')

print(deel_yesterday)

とすれば取引の当日、前日を取得できる

economic_data = investpy.economic_calendar(countries=['japan', 'united states'], from_date=deel_yesterday, to_date=deel_today)

economic_data.tail(5)

で同じ結果であることを確認した

次に国コードを外してみる

# economic_data = investpy.economic_calendar(countries=['japan', 'united states'], from_date=deel_yesterday, to_date=deel_today)

# economic_data.tail(5)

economic_data = investpy.economic_calendar(countries=None, from_date=deel_yesterday, to_date=deel_today)

economic_data.tail(5)

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

で経済指標カレンダー取得はできたけど

ミシガン消費者信頼感指数が出ない

結果として対応するのは

通貨コード

指標名

予測値

前回の値

今回の値となっているが

これが遅延があるのか調べないとわからない

遅延が数秒程度なら

Twitter より早いと思う

economic_data.dtypes

でデータ型を調べたら

全て object

この中で検索などの処理で使うのは

Date

Time

Event

の3つをキーにして検索する

python で株価指数の取得その2

python で株価指数の取得その2

日経平均株価とかダウはよくテレビとかででるけど
フランスとかイギリスなどのはネットで調べる必要があり
アプリなどでもあまりでないことが多いので表示できるように
investpy で実験

import investpy
from datetime import datetime, date, timedelta
from dateutil.relativedelta import relativedelta
import altair as alt
import pandas as pd

でライブラリをインポート

today = datetime.today().strftime('%d/%m/%Y')

で今日の日付を取得し
フォーマットを investpy で使う日付に変更

今回はイギリスの指標の
FTSE 100

フランスの
CAC 40

を取得

フランスは
france

イギリスは
united kingdom
が国名になるので

uk_index =investpy.indices.get_indices(country="united kingdom")
f_index =investpy.indices.get_indices(country="france")

で取得して

uk_index[uk_index['full_name'].str.contains('FTSE 100')]

で検索し 
name が FTSE 100 を確認

ftse = investpy.get_index_historical_data(index='FTSE 100',country='united kingdom',
                                        from_date='01/01/2010',to_date=today)

でFTSE 100の値を取得し

ftse.index = ftse.index.strftime('%Y/%m%d')
ftse = ftse.T
ftse = ftse.T.reset_index()

でDateをカラムに追加

chart =(
    alt.Chart(ftse)
    .mark_line(opacity=0.8,clip=True)
    .encode(
        x="Date:T",
        y=alt.Y("Close:Q",stack=None)
    )
)
chart

でチャートで表示

次にCAC 40

f_index[f_index['full_name'].str.contains('CAC 40')]

で検索

cac40 = investpy.get_index_historical_data(index='CAC 40',country='france',
                                        from_date='01/01/2010',to_date=today)

で値を取得

cac40.index = cac40.index.strftime('/%Y/%m/%d')
cac40 = cac40.T
cac40 = cac40.T.reset_index()

で日付フォーマット変更と
Date をカラムに追加

chart =(
    alt.Chart(cac40)
    .mark_line(opacity=0.8,clip=True)
    .encode(
        x="Date:T",
        y=alt.Y("Close:Q",stack=None)
    )
)
chart

でチャート表示

他にもアジアや中東などの株価指数なども
おなじ要領で調べてグラフ化が可能

python で株価指数の取得

python で株価指数の取得
【Python】investpyを使ったInvesting.comからのデータ取得方法


指数データの取得方法が乗っていたので参考に

import investpy
from datetime import datetime, date, timedelta
from dateutil.relativedelta import relativedelta
import altair as alt
import pandas as pd

でライブラリをインポート

today = datetime.today().strftime('%d/%m/%Y')

で今日の日付を取得し
フォーマットを investpy で使う日付に変更

df = investpy.get_index_historical_data(index='S&P 500',country='united states',
                                        from_date='01/01/2010',to_date=today)


2010年1月1日から今日までの
S&P500
のデータを取得

df.index = df.index.strftime('%Y/%m/%d')

で日付フォーマットを altair で使う形式に変更

df = df.T
df= df.T.reset_index()

でDate をカラムに追加

chart =(
    alt.Chart(df)
    .mark_line(opacity=0.8,clip=True)
    .encode(
        x="Date:T",
        y=alt.Y("Close:Q",stack=None)
    )
)
chart

でチャートを表示

S&P500 ができたのでダウ平均を取得

使用したメソッドの
get_index_historical_data
については
investpy.indices

を参考に

パラメータに指定する株価指数については
https://jp.investing.com/indices/world-indices
で日本語版がでるがコードを指定するので

https://www.investing.com/indices/usa-indices
を参考に

dow =  investpy.get_index_historical_data(index='Dow Jones',country='united states',
                                        from_date='01/01/2010',to_date=today)

としたが

---------------------------------------------------------------------------
RuntimeError                              Traceback (most recent call last)
<ipython-input-23-37a90ad00d34> in <module>
----> 1 dow =  investpy.get_index_historical_data(index='DJI',country='united states',
      2                                         from_date='01/01/2010',to_date=today)

~/anaconda3/lib/python3.8/site-packages/investpy/indices.py in get_index_historical_data(index, country, from_date, to_date, as_json, order, interval)
    511 
    512     if index not in list(indices['name'].apply(unidecode).str.lower()):
--> 513         raise RuntimeError("ERR#0045: index " + index + " not found, check if it is correct.")
    514 
    515     full_name = indices.loc[(indices['name'].apply(unidecode).str.lower() == index).idxmax(), 'full_name']

RuntimeError: ERR#0045: index dji not found, check if it is correct.

となり
指定するコードが違うらしい

VIX 指数(恐怖指数)については

vix = investpy.get_index_historical_data(index='S&P 500 VIX',country='united states',
                                        from_date='01/01/2010',to_date=today)
vix

とすれば表示される

どうやら名称が違うようなので
プライマリーセクターに絞り検索

stock_index =investpy.indices.get_indices(country="united states")
stock_index[stock_index['class']=='primary_sectors']

64に絞りこみできるので

stock_index =investpy.indices.get_indices(country="united states")
stock_index[stock_index['class']=='primary_sectors'].head(35)


stock_index =investpy.indices.get_indices(country="united states")
stock_index[stock_index['class']=='primary_sectors'].tail(35)

で探すが該当するものがでない

pandasで特定の文字列を含む行を抽出(完全一致、部分一致)

で部分一致で検索をする

str.startswith()

で文字列で始まるもの
もしくは

str.contains()

で文字列を含むもの
を対象にする

dow =stock_index[(stock_index['market']=='global_indices') & (stock_index['class']=='other_indices')]
dow[dow['name'].str.contains('DJ')]

で探したがそれらしいものはでてこない

stock_index =investpy.indices.get_indices(country="united states")
stock_index[stock_index['full_name'].str.contains('Dow Jones Industrial')]

で検索すると
Dow 30 が表示される

dow =  investpy.get_index_historical_data(index='Dow 30',country='united states',
                                        from_date='01/01/2010',to_date=today)
dow

で表示されるので
S&P500のときと同じようにチャートを表示する

dow=dow.T
dow = dow.T.reset_index()

で Date をカラムに追加

chart =(
    alt.Chart(dow)
    .mark_line(opacity=0.8,clip=True)
    .encode(
        x="Date:T",
        y=alt.Y("Close:Q",stack=None)
    )
)
chart

でチャート表示

vix 恐怖指数をチャートにするなら

vix = investpy.get_index_historical_data(index='S&P 500 VIX',country='united states',
                                        from_date='01/01/2010',to_date=today)

でデータを取得

vix = vix.T
vix = vix.T.reset_index()


Date をカラムに追加

chart =(
    alt.Chart(vix)
    .mark_line(opacity=0.8,clip=True)
    .encode(
        x="Date:T",
        y=alt.Y("Close:Q",stack=None)
    )
)
chart

でチャートで表示

他の国の株価指数も取得できる
その場合、国の指定をする必要があり

investpy.indices.get_index_countries()

で取得可能な国が表示できる

index_list = investpy.indices.get_index_countries()
index_list

で取得可能な国を表示可能

ユーロ圏の株価指数を調べるのなら
https://www.investing.com/indices/european-indices

株価指数の名前を調べる
ダウ平均が Dow 30 というように
名称が investpy のときわからないときがあるので

DAX
Euro Stoxx 50
がある国を調べる

Germany なので

euro_index =investpy.indices.get_indices(country="germany")

で取得し
https://www.investing.com/indices/germany-30
から
名称が DAX(GDAXI)
であるのを確認したら

euro_index[euro_index['full_name'].str.contains('DAX')]

で探すと出てこないので

euro_index[euro_index['name'].str.contains('DAX')]

で検索すると出てきた

あとは

dax = investpy.get_index_historical_data(index='DAX',country='germany',
                                        from_date='01/01/2010',to_date=today)

でDAXの値を取得

dax.index = dax.index.strftime('%Y/%m/%d')
dax = dax.T
dax = dax.T.reset_index()

で日付フォーマット変更と
Date をカラムに追加

chart =(
    alt.Chart(dax)
    .mark_line(opacity=0.8,clip=True)
    .encode(
        x="Date:T",
        y=alt.Y("Close:Q",stack=None)
    )
)
chart

でチャート表示

応用でユーロストック50なら
https://www.investing.com/indices/eu-stoxx50

Euro Stoxx 50 (STOXX50E)
となっているのを確認できるので

euro_index =investpy.indices.get_indices(country="germany")
euro_index[euro_index['name'].str.contains('Euro Stoxx 50')]

で検索すると簡単にヒットする

あとは

euro_stock50 = investpy.get_index_historical_data(index='Euro Stoxx 50',country='germany',
                                        from_date='01/01/2010',to_date=today)

euro_stock50.index = euro_stock50.index.strftime('%Y/%m/%d')
euro_stock50 = euro_stock50.T
euro_stock50 = euro_stock50.T.reset_index()

chart =(
    alt.Chart(euro_stock50)
    .mark_line(opacity=0.8,clip=True)
    .encode(
        x="Date:T",
        y=alt.Y("Close:Q",stack=None)
    )
)
chart

で表示できる

python で債権利回りの表示

python で債権利回りの表示

債権は

https://investpy.readthedocs.io/_api/bonds.html
で取得できそう

ただし、債権利回りがでてないので検索

債権利回りコードは
https://stackoverflow.com/questions/65063436/pulling-yields-data-from-investpy-package
を参考に

import investpy
data = investpy.bonds.get_bond_historical_data(bond='South Africa 2Y',
                                               from_date='01/01/2019',
                                               to_date='31/12/2019')
data

で南アフリカ2年債の利回りを表示可能

米国債の2年債の利回りなら

data = investpy.bonds.get_bond_historical_data(bond='U.S. 2Y',
                                               from_date='01/01/2019',
                                               to_date='31/12/2019')

data

でOK

債権の国コードや種類については
https://za.investing.com/rates-bonds/world-government-bonds?maturity_from=10&maturity_to=310
で調べることができる

Find Government Bonds

Country of Listing で国を選べば
チャートの下のほうに債権の種類が表示されるので
これをもとに
米国債2年なら
U.S. 2Y
となる

altair で表示するなら
商品市場でWTI、金価格のときにやったのと同じように
行う

今回は日付を date で取得し
年始から今日までの米国債2年債の利回りチャートを表示

from datetime import datetime, date, timedelta
from dateutil.relativedelta import relativedelta

today = datetime.today().strftime('%d/%m/%Y')
today

で今日の日付を取得

US2Y = investpy.bonds.get_bond_historical_data(bond='U.S. 2Y',
                                               from_date='01/01/2021',
                                               to_date=today)
US2Y

で年始から今日までの利回りを取得

US2Y.index = US2Y.index.strftime('%Y/%m/%d')

で日付フォーマット変更

US2Y = US2Y.T
US2Y = US2Y.T.reset_index()


Date カラムを移動

chart =(
    alt.Chart(US2Y)
    .mark_line(opacity=0.8,clip=True)
    .encode(
        x="Date:T",
        y=alt.Y("Close:Q",stack=None)
    )
)
chart

で債権利回りをチャートで表示できる

同様に10年債も表示

US10Y = investpy.bonds.get_bond_historical_data(bond='U.S. 10Y',
                                               from_date='01/01/2019',
                                               to_date=today)
US10Y.index = US10Y.index.strftime('%Y/%m/%d')
US10Y = US10Y.T
US10Y = US10Y.T.reset_index()

us10 =(
    alt.Chart(US10Y)
    .mark_line(opacity=0.8,clip=True,color='Yellow')
    .encode(
        x="Date:T",
        y=alt.Y("Close:Q",stack=None)
    )
)

あとはチャートを重ねて表示するので

alt.layer(chart,us10).resolve_scale(
    y = 'independent'
)

とすると
2年債と10年債の2つのチャートが表示されるようになる

python でWTI、金価格の表示

python でWTI、金価格の表示 その2

investpy でも可能らしいので実線

https://investpy.readthedocs.io/_api/commodities.html
のリファレンスを見ながら実線

経済指標の取得のときには

investpy.economic_calendar()

を使い

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')

で取得

investpy.commodities.get_commodities(group=None)

で商品市場の情報が得られる

全部で66の行になる

途中が省かれて表示されるので

commodity.head(35)

というようにすれば任意の場所まで表示できる

今回なら上から35まで表示

逆に最後から表示したいのなら

commodity.tail(36)

group の部分を指定すると絞り込みができる

金属にするなら

commodity = investpy.commodities.get_commodities(group="metals")
commodity

とすればOK

今回調べたいのはWTI、つまり原油の価格と金の価格なので

group を energy を指定

commodity = investpy.commodities.get_commodities(group="energy")
commodity

name が Crude Oil WTI のものが該当

金は金属なので
group に metails で絞り込む

commodity = investpy.commodities.get_commodities(group="metals")
commodity

この中で name が Gold のものが該当

次にチャートなどに必要なデータの取得

株価の取得方法については
【Python】investpyを使ったInvesting.comからのデータ取得方法

によれば

investpy.get_stock_historical_data()

で取得できる

ETFなら

 investpy.get_etf_historical_data()

指数データなら

investpy.get_index_historical_data()

為替データなら

investpy.get_currency_cross_historical_data()

これらを元に
https://investpy.readthedocs.io/_api/commodities.html
をみると

investpy.commodities.get_commodity_recent_data()

なら最近のデータ

investpy.commodities.get_commodity_historical_data()

で直近のデータ
を取得できそう

構文は

investpy.commodities.get_commodity_historical_data(commodity, from_date, to_date, country=None, as_json=False, order='ascending', interval='Daily')

となっている

commodity には name カラムのものを当てはめる
from_date と to_date には日付を指定
フォーマットがdd/mm/yyyyなので注意

order は昇順、降順を指定
ascending は昇順
descending は降順

interval は取得するデータの間隔
デフォルトは daily
weekly や monthly にすることも可能

例が乗っていたので参考に

data = investpy.get_historical_data(commodity='gold', from_date='01/01/2018', to_date='01/01/2019')

としたがエラーとなる

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-11-69013139b965> in <module>
----> 1 data = investpy.get_historical_data(commodity='gold', from_date='01/01/2018', to_date='01/01/2019')

AttributeError: module 'investpy' has no attribute 'get_historical_data'

パラメータをしっかり設定して

gold =investpy.commodities.get_commodity_historical_data(commodity="Gold", from_date='01/01/2021', to_date='01/09/2021', country=None, as_json=False, order='ascending', interval='Daily')
gold

としたら成功

なお最近のデータであれば

data = investpy.get_commodity_recent_data(commodity='gold')
data

でも取得可能
期間は1ヶ月程度

次に原油WTI

wti = investpy.get_commodity_recent_data(commodity='Crude Oil WTI')
wti

で取得可能

途中でvolume が0になっているところは市場がお休みの日

次に WTI の close の値を altair で表示

chart =(
    alt.Chart(wti)
    .mark_line(opacity=0.8,clip=True)
    .encode(
        x="date:T",
        y=alt.Y("close:Q",stack=None)
    )
)
chart

だと日付の形式の関係で表示されないので
日付形式を

wti['Date']=wti['Date'].str.replace('/','-')

としたが

---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
~/anaconda3/lib/python3.8/site-packages/pandas/core/indexes/base.py in get_loc(self, key, method, tolerance)
   3079             try:
-> 3080                 return self._engine.get_loc(casted_key)
   3081             except KeyError as err:

pandas/_libs/index.pyx in pandas._libs.index.IndexEngine.get_loc()

pandas/_libs/index.pyx in pandas._libs.index.IndexEngine.get_loc()

pandas/_libs/hashtable_class_helper.pxi in pandas._libs.hashtable.PyObjectHashTable.get_item()

pandas/_libs/hashtable_class_helper.pxi in pandas._libs.hashtable.PyObjectHashTable.get_item()

KeyError: 'Date'

The above exception was the direct cause of the following exception:

KeyError                                  Traceback (most recent call last)
<ipython-input-12-cf1271b5fd73> in <module>
----> 1 wti['Date']=wti['Date'].str.replace('/','-')

~/anaconda3/lib/python3.8/site-packages/pandas/core/frame.py in __getitem__(self, key)
   3022             if self.columns.nlevels > 1:
   3023                 return self._getitem_multilevel(key)
-> 3024             indexer = self.columns.get_loc(key)
   3025             if is_integer(indexer):
   3026                 indexer = [indexer]

~/anaconda3/lib/python3.8/site-packages/pandas/core/indexes/base.py in get_loc(self, key, method, tolerance)
   3080                 return self._engine.get_loc(casted_key)
   3081             except KeyError as err:
-> 3082                 raise KeyError(key) from err
   3083 
   3084         if tolerance is not None:

KeyError: 'Date'

となる

wti.columns

で調べると

Index(['Open', 'High', 'Low', 'Close', 'Volume', 'Currency'], dtype='object')

となっているので

wti.reset_index()


Date をカラム側にする

これで

wti.index

とすると

DatetimeIndex(['2021-08-17', '2021-08-18', '2021-08-19', '2021-08-20',
               '2021-08-23', '2021-08-24', '2021-08-25', '2021-08-26',
               '2021-08-27', '2021-08-30', '2021-08-31', '2021-09-01',
               '2021-09-02', '2021-09-03', '2021-09-05', '2021-09-06',
               '2021-09-07', '2021-09-08', '2021-09-09', '2021-09-10',
               '2021-09-13', '2021-09-14', '2021-09-15', '2021-09-16',
               '2021-09-17'],
              dtype='datetime64[ns]', name='Date', freq=None)

となる

wti.index = wti.index.strftime('%Y/%m/%d')

で日付フォーマットを変更

wti[['Close']]

とすれば Close のみに絞り込める

wti= wti.T
wti

とすれば配置を変更して
日付をカラムにできる

udemy の講習のときにはいくつか株のコードを取得したけど
今回はそれはいらない

wti= wti.T.reset_index()

を実行すると
Date が追加された状態のカラムができる

あとは

chart =(
    alt.Chart(wti)
    .mark_line(opacity=0.8,clip=True)
    .encode(
        x="Date:T",
        y=alt.Y("Close:Q",stack=None)
    )
)
chart

で折れ線グラフで WTI Close のグラフが作成できる

応用で金価格グラフも作成

gold =investpy.commodities.get_commodity_historical_data(commodity="Gold", from_date='01/01/2021', to_date='01/09/2021', country=None, as_json=False, order='ascending', interval='Daily')
gold

で年始から取得

gold.reset_index()
gold.index = gold.index.strftime('%Y/%m/%d')

で日付フォーマット変更

gold= gold.T
gold= gold.T.reset_index()

でカラムに Date を追加

chart =(
    alt.Chart(gold)
    .mark_line(opacity=0.8,clip=True)
    .encode(
        x="Date:T",
        y=alt.Y("Close:Q",stack=None)
    )
)
chart

でチャート表示

これで金価格も表示可能

python で今日の日付を dd/mm/YY で取得 その2

python で今日の日付を dd/mm/YY で取得 その2

ほとんどの場合は
yymmdd だけど
investpy で指定するときに
ddmmyy で期間を取得することになる

今日の日付を[yyyymmdd]形式の文字列で取得する。

今日の日付を[yyyymmdd]形式の文字列で取得する。【Python】


を参考に

today =datetime.date.today().strftime('%Y%d%m')
today

とすると

‘20210409’

となる

today =datetime.date.today().strftime('%d/%m/%Y')
today

とすれば

’04/09/2021′

となる

【Python】investpyを使ったInvesting.comからのデータ取得方法

【Python】investpyを使ったInvesting.comからのデータ取得方法



経済指標カレンダーも investpy で取得可能

calendar = investpy.news.economic_calendar(from_date='01/01/2021',to_date=today,
                                           countries=['united states','germany','japan'])
# countriesでの国指定は省略可能。

# 重要度の高・中度の予定
important = investpy.news.economic_calendar(from_date='01/01/2021',to_date=today,
                                            countries=['united states'],importances=['high','medium'])

で取得ができる

あとは
important

calendar
で表示ができるけど

日時を毎回直接打つのはミスするので別の方法で取得

Pythonで翌日や翌月みたいな日付の計算をする

Pythonで今月、前月、来月、昨年、毎月あたりを取得する

を参考に今月と月末を取得して指定するようにする

from datetime import datetime, date, timedelta
from dateutil.relativedelta import relativedelta

で必要なライブラリをインポート

# 月初(今月の1日にする)
first_day = (datetime.today() + relativedelta(day=1)).strftime('%d/%m/%Y')
# 月末 (来月の1日に合わせて1日分戻る)
last_day = (datetime.today() + relativedelta(months=+1,day=1,days=-1)).strftime('%d/%m/%Y')

# 1週間後
week_later =(datetime.today() + relativedelta(weeks=+1)).strftime('%d/%m/%Y')


月末、月始の日付が取得できる

あとは

# 今月の重要度の高・中度の予定
important = investpy.news.economic_calendar(from_date=first_day,to_date=last_day,
                                            countries=['united states'],importances=['high','medium'])


# 1週間の重要度の高・中度の予定
important = investpy.news.economic_calendar(from_date=today,to_date=week_later,
                                            countries=['united states'],importances=['high','medium'])

で指定して
経済指標カレンダーの取得が可能になる

経済指標グラフの日付問題

経済指標グラフの日付問題

形式が
dd/mm/yy
となっているので
altairで表示が月と間違えて表示される

月の表示を英語にすればいけるかもしれない

株価可視化複数アプリでそうしたので

import pandas as pd
import investpy
import altair as alt

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_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')

ISM =economic_data[economic_data['event'].str.contains('ISM Non-Manufacturing PMI')]

chart =(
    alt.Chart(ISM)
    .mark_line(opacity=0.8,clip=True)
    .encode(
        x="date:T",
        y=alt.Y("actual:Q",stack=None)
    )
)
chart

これだと
dd/mm/yy
の mm 部分を日付と間違えるようだ

インタラクティブなデータの視覚化

をみたところ
プロット
のところで
プロットに使用する列が正しいデータ型であり、日付が(YYYY-MM-DD)の形式であることを確認しました。そのために、高価格列と低価格列をdoubleデータ型に変換し、日付列を文字列形式に変換しました。続いて、日付列をDD / MM / YYYY形式からYYYY / MM / DDに変換し、最後にYYYY-MM-DDに変換しました。
をみて

import plotly.graph_objs as go
from plotly.offline import init_notebook_mode, iplot
init_notebook_mode(connected=True)
import plotly.plotly as py
import plotly
import pandas as pd
import datetime

df = pd.read_csv("TSLA.csv")

df['date'] = df['date'].astype('str') 
df['high'] = df['high'].astype('double')
df['low'] = df['low'].astype('double') 

date2 = []
for i in df['date']:
    new_date = datetime.datetime.strptime(i, "%d/%m/%Y").strftime("%Y-%m-%d")
    date2.append(new_date)
    
df['date'] = df['date'].str.replace('/', '-')
df['date'] = date2
df.fillna(0)
df.head()

のうち

df = pd.read_csv("TSLA.csv")

df['date'] = df['date'].astype('str') 
df['high'] = df['high'].astype('double')
df['low'] = df['low'].astype('double') 

date2 = []
for i in df['date']:
    new_date = datetime.datetime.strptime(i, "%d/%m/%Y").strftime("%Y-%m-%d")
    date2.append(new_date)
    
df['date'] = df['date'].str.replace('/', '-')
df['date'] = date2
df.fillna(0)
df.head()

をみたところ
date の部分をループさせて
date2 に格納
date の値を date2 に書き換えて
df.fillna で反映しているみたいだ

df.fillna は欠損値の置き換えらしい

とりあえず実験

date2 =[]
for i in ISM['date']:
    new_date = datetime.datetime.strptime(i,"%d/%m/%Y").strftime("%Y-%m-%d")
    date2.append(new_date)

とすれば

date2 に

['2021-01-08',
 '2021-02-04',
 '2021-03-04',
 '2021-04-05',
 '2021-05-05',
 '2021-06-03']

と格納される

あとは代入すればいけると思って

ISM['date']=ISM['date'].str.replace('/','-')
ISM['date'] = date2
ISM.fillna(0)

としたら

<ipython-input-15-e3cb61543e3a>:1: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
  ISM['date']=ISM['date'].str.replace('/','-')
<ipython-input-15-e3cb61543e3a>:2: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
  ISM['date'] = date2

と警告がでる

これで

chart

とすればいちおう望み通りのグラフにはなる

エラーを

<ipython-input-15-e3cb61543e3a>:2: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

で検索してみたら
pandas の SettingWithCopyWarning で苦労した話

にその原因っぽいのが乗っていた

元のデータの一部を抽出→そのうち一部へ代入した場合、「元のデータのその部分」を修正したかったのか、「一部を変更した新しいデータ」を作りたかったのかどっちかわからないよ、という感じ
らしい

PandasのSettingWithCopyWarningに対する対処方法

も参考にしてみた

view か copy かを明確にしないとダメで
copy なら元の DataFrane は変更されない
view だと元まで変更となる

python で経済指標の取得とグラフ化その2

python で経済指標の取得とグラフ化その2

ISM Manufacturing PMI
ISM製造業PMI

altair でグラフにする

economic_data[economic_data['event'].str.contains('ISM Non-Manufacturing PMI')]

で結果の取得はできた

以前
apple の情報を取得し
そこから特定のカラムの Close だけ取り出したことがあるので

economic_data[economic_data['event'].str.contains('ISM Non-Manufacturing PMI')]['actual']

とすると

99      57.2
535     58.7
1016    55.3
1566    63.7
2027    62.7
2540    64.0
Name: actual, dtype: object

となり
ID と actual の数値がでる

ただし

chart =(
    alt.Chart(ISM)
    .mark_line(opacity=0.8,clip=True)
    .encode(
        x="Date:T",
        y=alt.Y("Stock Prices(USD):Q",stack=None),
        color='Name:N'
    )
)
chart

としてもエラーになる

ISM.dtype

を実行すると

dtype('O')

となる

検索して調べてみた
dtype( ‘O’)とは何ですか?

によれば
python object
とのこと

なので数値にしないとダメ
おそらくやり方が違っているので
株価可視化アプリでやったことを思い出す

economic_data.columns

でカラムを調べると

Index(['id', 'date', 'time', 'zone', 'currency', 'importance', 'event',
       'actual', 'forecast', 'previous'],
      dtype='object')

となる

過去に apple の株価取得したときには

Index(['Open', 'High', 'Low', 'Close', 'Volume', 'Dividends', 'Stock Splits'], dtype='object')

だった

今回は指標を絞ってみる

ISM =economic_data[economic_data['event'].str.contains('ISM Non-Manufacturing PMI')]
ISM.columns

とすると

Index(['id', 'date', 'time', 'zone', 'currency', 'importance', 'event',
       'actual', 'forecast', 'previous'],
      dtype='object')

となる
あまり変わっていない

ISM.reset_index()

でインデックスを振りなおしてみる

ism_act = ISM[['actual']]
ism_act


actual へ絞り込みができた

ただし、そのまま

chart =(
    alt.Chart(ism_act)
    .mark_line(opacity=0.8,clip=True)
    .encode(
        x="Date:T",
        y=alt.Y("Stock Prices(USD):Q",stack=None)
    )
)

としても日付がないので表示できない

pandas.DataFrameから条件を満たす行名・列名の行・列を抽出(選択)

を参考に

ism_act = ISM.filter(items=['date','actual'])
ism_act

とすれば日付も取得できる

chart =(
    alt.Chart(ism_act)
    .mark_line(opacity=0.8,clip=True)
    .encode(
        x="date:T",
        y=alt.Y("actual:Q",stack=None)
    )
)

ででたけど
表示がおかしい

原因は日付表示

99 	08/01/2021 	57.2
535 	04/02/2021 	58.7
1016 	04/03/2021 	55.3
1566 	05/04/2021 	63.7
2027 	05/05/2021 	62.7
2540 	03/06/2021 	64.0

の場合日付を月と認識されるので
表記を変える必要がある

ism_act.index = ism_act.index.strftime('%d %B %Y')

としたが

AttributeError: 'Int64Index' object has no attribute 'strftime'

となる

[Python]pandasの日付データから年、月、日、曜日への変換方法

を参考に

ism_act['date'] = pd.to_datetime(ism_act['date'],format='%Y-%m-%d')

としたがエラー
Pandasデータフレームを日付で並べ替え

を参考に

ism_act['date']=pd.to_datetime(ism_act.date)
ism_act.sort_values(by='date')

とすれば
ソートはできるが日付フォーマットを修正しないとバグる

df_ism_act = pd.DataFrame(ism_act)


Dataframe にしてみたが
おそらく株価アプリのときみたいに
DatetimeIndex を作成したほうがいいかもしれない

ism_act['date']=pd.to_datetime(ism_act['date'], format='%Y%m%d')
ism_act.sort_values(by='date')

だと
08/01/2021
を8/1
として認識して変換している