経済指標の値の取得と計算
とりあえず経済指標の基準値は調べたので
まずは売買するロジックを作成する
経済指標で結果が予測値より悪いなら売り
結果が予想より良いのなら書い
という簡単なロジックを実装する
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)
にしたら
8
となった
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)
とすれば計算ができるようになった