1
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Pandas入門】為替操作;月曜日は円高です♬

Last updated at Posted at 2020-06-14

今回は、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]

###・Mu-Methodを適用
予測(~6/10まで)
JPY=X_JPN=X_2020-06-11_.png
EUR=X_JPN=X_2020-06-11_.png
GBP=X_JPN=X_2020-06-11_.png
AUD=X_JPN=X_2020-06-11_.png
ZAR=X_JPN=X_2020-06-11_.png

結果(6/11金曜日)
予測通りの下げを示しました。
しかし、よく見ると計算結果はさらに上げから下げへのサインが左に移動していて、なんかずるい結果となっています。
JPY=X_JPN=X_2020-06-12_.png
EUR=X_JPN=X_2020-06-12_.png
GBP=X_JPN=X_2020-06-12_.png
AUD=X_JPN=X_2020-06-12_.png
ZAR=X_JPN=X_2020-06-12_.png

ここで注意したいのは、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()
1
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?