今回は、USのYahooFinanceがデータ取得禁止解除らしいということで、昨日のMu-Method(MACD2)を為替に応用する。
しかし、USサイトではドルベースのデータ配信のみらしい。
やってみたらおまけのコードで配信していましたがデータの演算は同じように利用可能なので、記事本文の変更はしません
ということで、Pandas使うと簡単にUSD/JPYなどのデータ処理ができて、お望みのデータ分析ができるというお話です。
一方、Yahoo!ファイナンス掲載情報の自動取得(スクレイピング)は禁止していますは広報されています。
【参考】
・Yahoo Finance USから株価をダウンロードしてみた
・USD/JPY (JPY=X)@YahooFinance
###やったこと
・データ取得して検証
・Mu-Methodを適用
###・データ取得して検証
取り合えず期間を設定
stock0 = 'EUR=X' #JPY EUR GBP ZAR AUD
start = dt.date(2020,1,1)
end = dt.date(2020,6,11)
最初に定番ドル/円を取得
import pandas_datareader.data as DataReader
df0=DataReader.get_data_yahoo("{}".format("JPY=X"),start,end)
print(df0)
High Low Open Close Volume Adj Close
Date
2019-12-31 108.867996 108.469002 108.867996 108.873001 0 108.873001
2020-01-01 111.410004 108.629997 108.680000 108.681000 0 108.681000
2020-01-02 108.860001 108.221001 108.713997 108.712997 0 108.712997
2020-01-03 108.551003 107.915001 108.540001 108.542999 0 108.542999
2020-01-06 108.410004 107.921997 107.999001 107.963997 0 107.963997
... ... ... ... ... ... ...
2020-06-04 109.846001 109.047997 109.120003 109.150002 0 109.150002
2020-06-07 109.599998 108.413002 109.589996 109.634003 0 109.634003
2020-06-08 108.369003 107.646004 108.369003 108.408997 0 108.408997
2020-06-09 107.866997 107.177002 107.817001 107.796997 0 107.796997
2020-06-10 107.226997 106.598000 107.014999 106.981003 0 106.981003
[118 rows x 6 columns]
次に、ターゲットとしているドル/€を取得。
df1=DataReader.get_data_yahoo("{}".format(stock0),start,end)
print(df1)
High Low Open Close Volume Adj Close
Date
2019-12-31 0.89280 0.88960 0.89250 0.892674 0 0.892674
2020-01-01 0.89610 0.89060 0.89120 0.891200 0 0.891200
2020-01-02 0.89551 0.89070 0.89135 0.891200 0 0.891200
2020-01-03 0.89882 0.89440 0.89519 0.895140 0 0.895140
2020-01-06 0.89621 0.89220 0.89586 0.895900 0 0.895900
... ... ... ... ... ... ...
2020-06-04 0.88608 0.87843 0.88205 0.882000 0 0.882000
2020-06-07 0.88735 0.88349 0.88370 0.883430 0 0.883430
2020-06-08 0.88939 0.88002 0.88473 0.884520 0 0.884520
2020-06-09 0.88229 0.87805 0.88229 0.882440 0 0.882440
2020-06-10 0.88292 0.87718 0.87961 0.879860 0 0.879860
[118 rows x 6 columns]
そして、双方の割り算実施。
すると、以下のように正しく€/円が計算できました。
※計算式=(ドル/円)/(ドル/€)=€/円
※注意;HighとLowは正しいとは限らない
ただし、利用はCloseなので影響ない
df=df0/df1
print(df)
High Low Open Close Volume Adj Close
Date
2019-12-31 121.939964 121.930086 121.980950 121.962774 NaN 121.962774
2020-01-01 124.327648 121.973944 121.947935 121.949056 NaN 121.949056
2020-01-02 121.562013 121.501070 121.965558 121.984960 NaN 121.984960
2020-01-03 120.770571 120.656307 121.248004 121.258127 NaN 121.258127
2020-01-06 120.964954 120.961665 120.553433 120.508980 NaN 120.508980
... ... ... ... ... ... ...
2020-06-04 123.968487 124.139653 123.711814 123.752832 NaN 123.752832
2020-06-07 123.513828 122.709933 124.012668 124.100384 NaN 124.100384
2020-06-08 121.846439 122.322221 122.488223 122.562517 NaN 122.562517
2020-06-09 122.257983 122.062523 122.201318 122.157881 NaN 122.157881
2020-06-10 121.445877 121.523521 121.661872 121.588667 NaN 121.588667
[118 rows x 6 columns]
結果(6/11金曜日)
予測通りの下げを示しました。
しかし、よく見ると計算結果はさらに上げから下げへのサインが左に移動していて、なんかずるい結果となっています。
ここで注意したいのは、Mu-Methodでは生データで計算しているのではなく、Decomposeされたノイズ無しのデータを使っています。その下げがDecomposeのTrendいわば平均線より下がってきたということは、さらなる下げが予測できるということだと思います。
※予測は自己責任で判断してください
###まとめ
・Pandasで為替操作してみた
・Mu-Methodは予測に役立つ可能性がありそう
・短期予測に適用してみよう
###おまけ
####ドルベース以外の場合の引数
AUDJPY=X JPYAUD=Xの対で提供されていた。
HighとLowなどを使う場合に便利です。
stock0='EURJPY=X' #AUDJPY=X JPYAUD=X ZARJPY=X GBPJPY=X JPYUSD=X
df=DataReader.get_data_yahoo("{}".format(stock0),start,end)
####コード全体
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import datetime as dt
import statsmodels.api as sm
from statsmodels.tsa.seasonal import STL
import pandas_datareader.data as DataReader
stock0 = 'ZAR=X' #JPY EUR GBP ZAR AUD
bunseki = "trend"
start = dt.date(2020,1,1)
end = dt.date(2020,6,11)
df0=DataReader.get_data_yahoo("{}".format("JPY=X"),start,end)
df1=DataReader.get_data_yahoo("{}".format(stock0),start,end)
df=df0/df1
print(df0)
print(df1)
print(df)
series=df['Close']
cycle, trend = sm.tsa.filters.hpfilter(series, 144)
df['trend']= trend
def EMA1(x, n):
a= 2/(n+1)
return pd.Series(x).ewm(alpha=a).mean()
series2 = df['trend'].values.tolist()
print(series2[len(series2)-10:len(series2)])
df['Close']=series #series" #cycle" #trend
df['Close2']=series2
df['y12'] = EMA1(df['Close2'], 12)
df['y26'] = EMA1(df['Close2'], 26)
df['MACD'] = df['y12'] -df['y26']
df['MACD2'] = df['Close2'] -df['y26']
df['signal2'] = EMA1(df['MACD2'], 9)
df['signal'] = EMA1(df['MACD'], 9)
df['hist_']=df['MACD2']-df['signal2']
date_df=df['Close'].index.tolist()
print(df[len(series)-10:len(series)])
fig, (ax1,ax2) = plt.subplots(2,1,figsize=(1.6180 * 8, 4*2),dpi=200)
ax1.plot(df['Close'],label="series")
ax1.plot(df['Close2'],label="series2")
ax1.plot(df['y12'],label="y12")
ax1.plot(df['y26'],label="y26")
ax2.plot(df['MACD2'],label="MACD2")
#ax2.plot(df['MACD'],label="MACD")
ax2.plot(df['signal2'],label="signal2")
#ax2.plot(df['signal'],label="signal")
ax2.bar(date_df,df['hist_'])
ax1.set_title("{}/{}".format(stock0,"JPY"))
ax1.legend()
ax2.legend()
ax1.grid()
ax2.grid()
plt.savefig("./fx/fx_{}_{}_ema_df_decompose_%5K%25D_.png".format(stock0,"JPN=X"))
plt.pause(1)
plt.close()