こんにちは。こゆき(@yukilog00)です。
「為替レートに季節性アノマリーはあるか?」
これ、ずっと気になっていました。
「季節性アノマリーがあるなら、そのアノマリーに従ってループイフダンの開始・停止を切り替えればいいのでは?」と思っていたのです。相場観ゼロのいかにも初心者的な思考ですが…。
そこでpythonで過去10年の為替チャートを並べることで、自分の目で確認してみました。
チャートだけではイマイチわかりづらかったので、各月の騰落率をヒートマップ化してみました。
特にオチはありませんが、せっかく調べたので記事にします。
- データソース
- 通貨ペア
- ソースコード(python)
- 結果
- ドル円(USD/JPY)
- ユーロ円(EUR/JPY)
- ポンド円(GBP/JPY)
- 豪ドル円(AUD/JPY)
- NZドル円(NZD/JPY)
- カナダドル円(CAD/JPY)
- フラン円(CHF/JPY)
- ユーロ豪ドル(EUR/AUD)
- ユーロカナダドル(EUR/CAD)
- ユーロフラン(EUR/CHF)
- ユーロポンド(EUR/GBP)
- ユーロNZドル(EUR/NZD)
- ユーロドル(EUR/USD)
- ポンド豪ドル(GBP/AUD)
- ポンドフラン(GBP/CHF)
- ポンドNZドル(GBP/NZD)
- ポンドドル(GBP/USD)
- 豪ドルフラン(AUD/CHF)
- 豪ドルNZドル(AUD/NZD)
- 豪ドルドル(AUD/USD)
- NZドルドル(NZD/USD)
- ドルカナダドル(USD/CAD)
- ドルフラン(USD/CHF)
データソース
Alpha Vantageの日足データを使います。
以前投稿した為替レートの相関係数をヒートマップ化した記事ではyahoo Financeから取得していましたが、yahoo Financeで取得できなくなっていたのでAlpha Vantageに変えました。yahoo Financeはスクレイピングも禁止しているし、この辺厳しいのかも。
通貨ペア
対象通貨ペアはループイフダンで取り扱いのある通貨ペアのうち、新興国通貨(ZAR/JPY、MXN/JPY、TRY/JPY)以外です。
この新興国通貨3つはAlpha Vantageで取り扱っていなかったため。
また、NZD/JPYのみ2015年~2020年を対象としています。古いデータがAlpha Vantageになかったため。
ソースコード(python)
Jupyter Notebook(python)でやります。
Alpha Vantageからデータ取得するには無料のAPIキー発行が必要ですが、メールアドレスさえあれば30秒で発行できました。
チャート表示
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
import pandas_datareader.data as pdd import pandas as pd import datetime import calendar import matplotlib.pyplot as plt import matplotlib.dates as mdates %matplotlib inline import numpy as np import os def get_firstday(year, month): return datetime.datetime(year, month, 1) def get_lastday(year, month): return datetime.datetime(year, month, calendar.monthrange(year, month)[1]) def get_data(s_year, e_year, symbol): start = get_firstday(s_year, 1) end = get_lastday(e_year, 12) # AlphaVantageからデータ取得、APIキーは環境変数から取得 df = pdd.DataReader(symbol, 'av-forex-daily', start, end, api_key=os.getenv('ALPHAVANTAGE_API_KEY')) df = df.dropna() return df def fig(s_year, e_year, symbol): # API利用回数に制限があるため、一回で全量取得 df_all = get_data(s_year, e_year, symbol) # Datetimeインデックスに変換 df_all = df_all.set_index(pd.to_datetime(df_all.index)) # グラフの数 n = e_year - s_year + 1 fig = plt.figure(figsize=(16, 25)) df = {} ax = {} for year in range(s_year, e_year+1): [year] = pd.DataFrame() [year] = df_all[get_firstday(year, 1):get_lastday(year, 12)] [year] = fig.add_subplot(n ,1 ,year - s_year + 1) [year].plot(df[year]['close'], label=str(year)) [year].xaxis.set_major_locator(mdates.MonthLocator(interval=1)) [year].xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m-%d')) [year].xaxis.set_minor_locator(mdates.WeekdayLocator(interval=1)) [year].grid(which='major',axis='both',color='#999999',linestyle='--') [year].set_title(str(year)+'年', loc='left', fontsize='large') [year].legend fig.suptitle(symbol+'('+str(s_year)+'-'+str(e_year)+')', fontsize=16, y=0.98) fig.tight_layout(rect=[0,0,1,0.98]) #グラフ同士の重なりを防ぐ、タイトルと被らないよう上2%空ける # チャート表示 fig(2011, 2020, 'USD/JPY') |
ヒートマップ表示
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
import pandas_datareader.data as pdd import pandas as pd import datetime import calendar import matplotlib.pyplot as plt import matplotlib.dates as mdates %matplotlib inline import numpy as np import os def get_firstday(year, month): return datetime.datetime(year, month, 1) def get_lastday(year, month): return datetime.datetime(year, month, calendar.monthrange(year, month)[1]) # ここまではチャート表示と同じ def get_data_monthly(s_year, e_year, symbol): start = get_firstday(s_year, 1) + datetime.timedelta(weeks=-1) # 騰落率計算に先月データを使用するため、-1週 end = get_lastday(e_year, 12) # AlphaVantageからデータ取得、APIキーは環境変数から取得 df = pdd.DataReader(symbol, 'av-forex-daily', start, end, api_key=os.getenv('ALPHAVANTAGE_API_KEY')) # Datetimeインデックスに変換 df = df.set_index(pd.to_datetime(df.index)) # 月毎に集計(最終データ取得) df = df.resample('M').last() return df import seaborn as sns def heatmap(s_year, e_year, symbol): n = e_year - s_year + 1 index = range(s_year, e_year+1) cols = ['1月','2月','3月','4月','5月','6月','7月','8月','9月','10月','11月','12月'] df = get_data_monthly(s_year, e_year, symbol) df = df['close'].pct_change()*100 # 終値の騰落率(%) df = df.drop(df.index[0]) # 騰落率計算後は不要となった前月行削除 a = df.values # 行列変形のために一旦ndarrayに変換 b = np.reshape(a, (n, 12)) # n×12の2次元配列に変形 df2 = pd.DataFrame(b, index=index, columns=cols) # 行列変形後にpandas.DataFrameに戻す plt.figure(figsize = (15,6)) plt.title(symbol+'騰落率('+str(s_year)+'-'+str(e_year)+')', fontsize=20) cmap = sns.diverging_palette(10, 130, n=24, as_cmap=True) sns.heatmap(data=df2, annot=True, cmap=cmap, vmin=-5, vmax=5) # ヒートマップ表示 heatmap(2011, 2020, 'USD/JPY') |
結果
ドル円(USD/JPY)


11月は上がりやすい?大統領選挙?
ユーロ円(EUR/JPY)


つい最近までユーロ高に苦しめられましたが、ここ数年の値動きはマイルド(ヒートマップの色が淡い)で、2011年~2016年はボラが大きかった(色が濃い)んですね。
11月は上がりやすい?
ポンド円(GBP/JPY)


7月は下がりやすく、11月は上がりやすい?
豪ドル円(AUD/JPY)


5月・8月はさがりやすく、11月は上がりやすい?
NZドル円(NZD/JPY)
NZドル円のみ2014年の途中からしかデータがなかったので、2015年~2020年の6年分。


2月・3月は下がりやすく、11月・12月は上がりやすい?
カナダドル円(CAD/JPY)


傾向なし?
フラン円(CHF/JPY)


傾向なし?
ユーロ豪ドル(EUR/AUD)


傾向なし?
ユーロカナダドル(EUR/CAD)


傾向なし?
ユーロフラン(EUR/CHF)


欧州通貨同士、基本的には値動き小さめ。
2月は下がりやすい?
ユーロポンド(EUR/GBP)


傾向なし?
ユーロNZドル(EUR/NZD)


8月は上がりやすく、11~12月は下がりやすい?
ユーロドル(EUR/USD)


5月は下がりやすく、12月は上がりやすい?
ポンド豪ドル(GBP/AUD)


傾向なし?
ポンドフラン(GBP/CHF)


4月は上がりやすい?
ポンドNZドル(GBP/NZD)


傾向なし?
ポンドドル(GBP/USD)


4月は上がりやすく、5月は下がりやすい?
豪ドルフラン(AUD/CHF)


傾向なし?
豪ドルNZドル(AUD/NZD)


6月、12月は下がりやすい?
豪ドルドル(AUD/USD)


6月は上がりやすく、8月は下がりやすい?
NZドルドル(NZD/USD)


8月は下がりやすい?
ドルカナダドル(USD/CAD)


4月・6月は下がりやすく、11月は上がりやすい?
ドルフラン(USD/CHF)


6月・12月は下がりやすい?
コメント
こんばんは。
確かに春下げて秋に上げるイメージですね。
今年は個人的に秋にも下げてほしいですがw
ポチっと応援完了です。
かいりさん、こんばんは。
クロス円ですか?
同じく個人的には円高待ち望んでます。。!
ポチっとありがとうございます。