経済指標の値の取得と計算

経済指標の値の取得と計算

とりあえず経済指標の基準値は調べたので

まずは売買するロジックを作成する

経済指標で結果が予測値より悪いなら売り

結果が予想より良いのなら書い

という簡単なロジックを実装する

def dealing_logic(forecast,actual_news):

    deal_flag = actual_news - forecast

    if deal_flag <0:

        print("売り")

    else:

        print("書い")

まずは簡単に実験

forecast = 962

actual = 853

dealing_logic(forecast,actual)

で売りになったので

次は
マイナスの値で
マイナスの値でも動作するのを確認

次に判定
フラグ変数を用意し

経済指標
債権
株価指数
Vix
といった値で売買判定をする

Vix は警戒とかはマイナスの値を多くすることにする

つまり

Vix は0〜100で
20までは安定しているとみるので

値を0
30で警戒なので-1
40を超えたらパニックなので-2
50 以上はリーマンショッククラスなので-3
とする

このように結果をもとにして

判定するフラグのトータルが+なら書い

マイナスなら売りとする

ダウの下げとかを気にするのではなく

これらをフラグとしておけば市場の数値ではなく

売り買いのみの判定に使える

https://note.nkmk.me/python-pandas-read-excel/

をみた感じだと

read_excel()

Pandas でexcel を読み込んでいる

Vix の取得は

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



vix = investpy.get_index_historical_data(index='S&P 500 VIX',country='united states',

                                        from_date='01/01/2010',to_date=today)



vix.loc["2022-06-02"]["High"]

25.78

と Hight の値を取得できた

あとは日付の部分を自動で取得したいので

index_date に格納して指定する

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

vix.loc[index_today]["High"]

としても同じ

25.78

となったので成功

問題はこれが数値か文字列かによるので

if flag_vix > 50:

    print("市場はパニック")

elif flag_vix > 20:

    print("市場は正常")

で判定できているので数字になっている

同様に経済指標カレンダーの

Forecast actual previous

の値も取り出してみる

あとtwitter で取得したツイート内容の切り出し

数字以外は削除しないと比較できない

とりあえず  broomberg のツイートを取得し

不要な部分を削除し経済指標の数値のみにする

https://teratail.com/questions/266272
によれば

特定ユーザの特定キーワード検索が可能

for tweet in tweepy.Cursor(api.search, q='"2020年05月28日" from:@TakumiSoftware').items(10):

    if (tweet.text[:2] == 'RT'): continue



    print(tweet.user.name)

    print(tweet.text)

    print('-----------------------------------------------')


しかしエラーになる

api.search_tweets(q='"RBA Rate Statemen"', lang='ja', result_type='recent',count=12)

もだめ

api.search_tweets(q='"#経済指標"', lang='ja', result_type='recent',count=12)

は動作する

ツイート取得したあとはテキストから数字のみ取り出せればいいので

これを先にやる

for tweet in tweepy.Cursor(api.search_tweets, q='GDP(YoY)').items(10):

    print(tweet.text)

としたら10件取得できた

結果が

⠀#EU 1Q 2022

#GDP = 5,4% YoY (5,1% previous)

#GDP = 0,6% QoQ (0,3% previous)

Grammar check: Eurozone GDP in Q1 better than estimated, QoQ +0,6% (estimated +0,3%) vs 0,3% in Q4 2021, YoY +5,4%… https://t.co/T2QYk1MzMT

RT @PatelisAlex: Powering ahead.



Greek real GDP surges 7.0%yoy in Q1 (real, not nominal) https://t.co/pWQqFZB8bi

BNP inom EURO-området bättre än väntat.



European Gross Domestic Product (GDP) YoY 5.4% - https://t.co/R9Ra2BQVGK

Euro area GDP came in stronger than expected for Q1:

+5.4% YoY (est. 5.1%); .6% QoQ (est. .3%).



Output rose .5% Q… https://t.co/U2xUt4c083

RT @Financialjuice1: EUROZONE GDP REVISED YOY ACTUAL 5.4% (FORECAST 5.1%, PREVIOUS 5.1%) $MACRO

EUROZONE GDP REVISED YOY ACTUAL 5.4% (FORECAST 5.1%, PREVIOUS 5.1%) $MACRO


 European GDP Growth Rate YoY 3rd Est (Q1)



Actual: 5.4%


Expected: 5.1%

Previous: 4.7%



#EUR

Euro Zone Econ. Stats Released:

GDP (YoY) (Q1)

Actual:  5.4%

Expected: 5.1%

Prior: 5.1%

Better Than Expected


 GDP Growth Rate YoY 3rd Est (Q1)

Actual: 5.4%

Expected: 5.1%

Previous: 4.7%

https://t.co/p0AAzoJmBh

なので

ほぼ取得したい内容がある

あとはここから数値のみ取り出して比較できるようにすr

https://docs.tweepy.org/en/stable/client.html#tweepy.Client.search_recent_tweets
のリファレンスを見た感じだと

since_id を指定すればユーザ指定ができそう

なので bloomberg のid を調べる

34713362
がid 

あとはこれを指定してできるかどうか

screen_name だと

@business
なので

bloomberg = api.user_timeline(screen_name='@business')

# bloomberg

for tweet in bloomberg:

    print(tweet.text)

で表示できた

あとは取得したついーとから数字だけ取り出す


for tweet in tweepy.Cursor(api.search_tweets, q='"French oil and gas" from:@business').items(10):

    if (tweet.text[:2] == 'RT'): continue



    print(tweet.user.name)

    print(tweet.text)

    print('-----------------------------------------------')

としたら特定のアカウントで検索もできた

あとはここから数値の抜き取り

https://teratail.com/questions/266272

を参考に特定ユーザツイート検索ができた

marketnews = api.user_timeline(screen_name='@Financialjuice1')

# bloomberg

for tweet in marketnews:

    print(tweet.text)

で経済指標の最も早いニュースを英語で取得

marketnews =list(marketnews)

marketnews_data = []

for tweet in marketnews:

    marketnews_data.append(tweet.text)

   

print(marketnews_data[9])

で経済指標発表時のツイート取得

次にこのツイートの中身を数字だけにする

【Python】文字列から数字だけを取り出す方法

を参考に

Re.sub()

を使い

marketnews_data[3]

を数値だけにする

actual = re.sub(r"\D","",marketnews_data[3])

actual

だと

'025'

となるので

少数だけにしたい

以前、経済指標で数値以外を削除した方法を使う

分かりやすいpythonの正規表現の例

を参考に

actual = re.sub(r"[^0-9.-]","",marketnews_data[3])

actual

としたが

'.0.25.'

となる

とりあえずリストにすれば正規表現で抜き出しはできるので
あとは処理を調べる

actual = re.sub(r"[^0-9.-]|.$","",marketnews_data[3])

というように

| で条件を追加して

.$ というように末尾が. であるものを削除

ただし最初の . が消せない

また

HONG KONG CPI MOM NSA ACTUAL -0.20% (FORECAST -, PREVIOUS -0.20%) $MACRO

を削除してみると

actual2 = re.sub(r"[^0-9.-]|.$","",marketnews_data[2])

actual2

の結果は

'-0.20--0.20'

となるので

少数を条件式に組み込んだ方がいいかもしれない

"ECB'S DE GUINDOS: EURO-ZONE INFLATION TO STAY ABOVE 8% IN COMING MONTHS."

を処理すると
-8 になる

数値とマッチする正規表現

を参考に小数点と不等号を含む数値のみ抽出する正規表現にする

しかし

[+-]?(?:\d*\.)?\d+(?:(?<!(\.\d+))\.\d*)?

だとエラ〜になる

actual2 = re.sub(r"[^\d.]|.$","",marketnews_data[2])

print(actual2)

にしたら

となった

Python の正規表現で . (ドット) を含む数値のみを抽出したい

を参考にした

ただしこれだと複数の数値を1つにしてしまうので

区切る必要がある

findall()

で試したが

actual2 = re.findall(r"\d+",marketnews_data[1])

print(actual2)

とすると

['53', '1', '52', '4', '53', '1']

となって小数点で区切ってしまう

文字列から浮動小数点数を抽出する方法

を参考に

actual2 = re.findall("\d+\.\d+",marketnews_data[1])

print(actual2[0])

としたら

53.1

が抽出できた

actual2 = re.findall("[-+]?\d*\.\d+|\d+",marketnews_data[1])

print(actual2)

とすることでマイナスの数値にも対応できた

しかし文字列なので

print(actual2+1)

としたらエラ〜となった

変換すればできそうだが小数点なので
Float になる

Vix を抽出した時
flag_vix の値は少数で比較もできた

flag_vix +1

としても演算し

+1 されている

【Python】型を確認・判定する(type関数、isinstance関数)

を参考に

type(flag_vix)

でデータ型を確認したら

numpy.float64

となった

なので float へ変換してみる

[解決!Python]文字列と数値を変換するには(int/float/str/bin/oct/hex関数)

を参考に

float(actual2)

としたがエラ〜

type(actual2)

で調べたら list だった

Python でリストを Float に変換する

を参考に

リスト内のアイテムを Python で numpy.float_() 関数を使用して Float に変換する

import numpy as np
actual2_float = np.float_(actual2)

print(actual2_float+1)

とすれば計算ができるようになった

 

Mac Jupyter notebook メモ

Mac Jupyter notebook メモ

Cmd + ←
で行頭へ移動後

Shift + cmd + →
で行を選択できる

単語ごとの選択は
Option + ←

単語の削除は
Option + backspace

これで
効率的にコードを書ける

[/python]
search_indicate[‘actual’] =search_indicate[‘actual’].str.replace(r”\D”, “”,regex=True)

search_indicate[‘forecast’] =search_indicate[‘forecast’].str.replace(r”\D”, “”,regex=True)

search_indicate[‘previous’] =search_indicate[‘previous’].str.replace(r”\D”, “”,regex=True)

search_indicate
[/python]

これで変換して

date2 =[]

for i in search_indicate['date']:

    new_date = datetime.datetime.strptime(i,"%d/%m/%Y").strftime("%Y-%m-%d")

    date2.append(new_date)

search_indicate['date']=search_indicate['date'].str.replace('/','-')

search_indicate['date'] = date2

search_indicate.fillna(0)

で日付を修正

あとは

actual =(

    alt.Chart(search_indicate)

    .mark_line(opacity=0.8,clip=True)

    .encode(

        x="date:T",

        y=alt.Y("actual:Q",stack=None)

    )

)



forecast =(

    alt.Chart(search_indicate)

    .mark_line(opacity=0.8,clip=True,color='red')

    .encode(

        x="date:T",

        y=alt.Y("forecast:Q",stack=None),      

    )

)



previous =(

    alt.Chart(search_indicate)

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

)

それぞれのチャートを表示

次に
indicatorの ( 以降を
削除する

まずは

# s = 'abcxyz-xyz('



# print(my_removesuffix(s, '-xyz'))

txt ="ANZ Job Advertisements (MoM)"

print(txt)

として ( 以降を削除

Pythonで文字列の先頭と末尾から空白や文字列を削除する:strip()

を参考にしたが
strip ではできなかった

Replace と正規表現で行う

0回以上の繰り返し
*

任意の英数字は
[a-zA-Z0-9_]

\w

txt.replace("(","")

だとできた

エスケープは不要

year_economic_data2['event']=year_economic_data2['event'].replace("\([a-zA-Z0-9_]+\)","",regex=True)

year_economic_data2

とすることで解決

あとは経済指標カレンダーも同様に処理

# dealing_calender['event']= dealing_calender['event'].str.replace('(','\(').str.replace(')','\)')

dealing_calender['event']=dealing_calender['event'].replace("\([a-zA-Z0-9_]+\)","",regex=True)

とすることで解決

ただし

search_indicate['actual'] =search_indicate['actual'].str.replace(r"\D", "",regex=True)

search_indicate['forecast'] =search_indicate['forecast'].str.replace(r"\D", "",regex=True)

search_indicate['previous'] =search_indicate['previous'].str.replace(r"\D", "",regex=True)

search_indicate

だと

小数点のものまで書き換えてしまい
マイナス、小数点まで削除してしまう

不等号などはそのままにして
%
英数字のみ
削除すればいけるはず

Python: 正規表現ライブラリを使って、グループ化による置換

を参考に

import re

print(re.sub(r'([A-Z][a-z]?)(\d{1,3})', r"\\Nuc{\1}{\2}{}", "He4"))

# \Nuc{He}{4}{}

print(re.sub(r'([A-Z][a-z]?)(\d{1,3})L', r"\\Nuc{\1}{\2}{\\Lambda}", "He4L"))

# \Nuc{He}{4}{\Lambda}

みたいに

search_indicate['actual'] =search_indicate['actual'].str.replace(r"[a-zA-Z%]", "",regex=True)

search_indicate['forecast'] =search_indicate['forecast'].str.replace(r"[a-zA-Z%]", "",regex=True)

search_indicate['previous'] =search_indicate['previous'].str.replace(r"[a-zA-Z%]", "",regex=True)

search_indicate

とすればできた

とりあえず問題はあるけど
経済指標の取得後の処理はできてきた

次はIMM ポジションの取得

https://www.gaitame.com/market/imm/imm_currency.xls

からダウンロードしたいが

Mac だとそのままだとできないらしい

と思ったが Jupiter notebook からだとファイルを開けないみたい

Finder からだと普通にひらけた

Wgetは Mac にはないけど
Curl で代用できる

curl コマンド 使い方メモ

を参考に

-O オプションを付けることでファイル取得と保存ができる

!curl  "https://www.gaitame.com/market/imm/imm_currency.xls" -O

これで取得はコマンドでできるけど
Excel ファイル読み込みでエラー

No module xlrd

のエラーが出たので

【Python エラー】No module xlrd の対処法。権限がなくてxlrdモジュールをインストールできないとき

を参考に

!pip3 install xlrd

でインストール

あと excel の操作もできるように

!pip3 install openpyxl

で追加

あとは notebook を再起動すると
普通にExcelファイルの取り扱いできた

とりあえず
データ取得関連はほぼできた

経済指標の取得その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])]

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