文系出身者、ゼロからプログラミングを学ぶ〜ドル円時系列解析
はじめに:
文系出身のしがない為替トレーダーです。トレーダーとしてプログラミング言語の一つくらいは扱えるようになりたいとの漠然とした想いから、Pythonの学習を始めました。
以下、このブログではAidemy Premiumコースにて学んだ、時系列解析モデルの一つであるSARIMAモデルを用いて、ドル円の時系列解析を行いました。
ご笑覧ください。
実行環境:
Google Colaboratory
Python 3
プログラムテーマと目的:
今回、上でも述べた通り、Aidemy Premiumコースにて学んだ、時系列解析モデルの一つであるSARIMAモデルを用いて、ドル円の時系列解析を行いました。
時系列解析とは、時間経過とともに変化するデータを扱い将来の予測を行う分析技術です。私のケースでは、過去のドル円の毎月末の水準を時系列データとし、将来のドル円の水準について予測を行いました。
分析の目的は、歴史的円安局面にある2023年7月現在において、将来も円安基調が継続するのか否かを予測する上で、判断の拠り所を得ることです。
プログラム概要:
1、ドル円データ取得
2、データ整備、可視化
3、SARIMAモデルの構築
4、予測の実行と予測データの可視化
1、ドル円データ取得
まず、時系列データとして、2000年1月1日から2023年6月30日までの毎日のマーケットクローズ時点のドル円の水準データを取得しました。
データ取得にはpandas-datareaderモジュールを使用することにしました。DataReader(stock_code, source, start, end)の形式でデータを取得します。
#ドル円データの取得
start = dt.datetime(2000,1,1)
end = dt.datetime(2023,6,30)
USDJPY = pdr.DataReader('DEXJPUS', 'fred', start, end)
2、データ整備
取得データにどのような傾向があるのか、下図の通り、折れ線チャートとして視覚化しました。本チャートにおいて、青線が上に行くほどドル高円安水準(反対はドル安円高)ということです。2022年に116円を上抜けて以降、150円にまで到達。2023年に入り、反転し、一時120円台までドル安円高となりましたが、足元では再び140円台までドル高円安基調が進んでいるのが視覚的に確認されます。
#可視化〜日足
import matplotlib.pyplot as plt
plt.title("USDJPY Daily Close")
plt.xlabel("DATE")
plt.ylabel("USDJPY")
plt.plot(USDJPY,color='darkblue', label="USDJPY")
plt.legend()
plt.show()
#データ整理〜月足へ
USDJPY1 = USDJPY.loc["2000-1-1":]
USDJPY1.columns = ["Exchange Rate"]
Monthly_USDJPY = USDJPY1.resample("M").last()["Exchange Rate"]
#可視化〜月足
plt.title("USDJPY Monthly Close")
plt.xlabel("DATE")
plt.ylabel("USDJPY")
plt.plot(Monthly_USDJPY, color='g', label="USDJPY")
plt.legend()
plt.show()
3、SARIMAモデルの構築
①SARIMAモデルとは?
SARIMAモデルの説明の前に、ARIMAモデルについて整理します。
ARIMAモデルとは「autoregressive integrated moving average」の略で、自己回帰モデル(ARモデル)、和分モデル(Iモデル)、移動平均モデル(MAモデル)の3モデルを組み合わせたモデルです。
本題のSARIMAモデルとは、「Seasonal AutoRegressive Integrated Moving Average」の略で、ARIMAモデルに「季節的な周期パターン」を加えたモデルです。
換言すると、季節変動があるデータに対してARIMAモデルを拡張した手法がSARIMAモデルです。具体的には、時系列方向にARIMAモデルを使い、かつ、周期方向にもARIMAモデルを使っているモデルです。
②SARIMAモデルのパラメーター:(p,d,q,sp,sd,sq,s)
次にSARIMAモデルに用いられるパラメーターについて説明します。まず、pは自己相関度です。モデルが直前p個の値を用いて予測されるのか示しています。 dは誘導といい、時系列データを定常にするためにd次の階差が必要だったことを示しますqは移動平均です。モデルが直前q個の値に影響を受けることを表しています。
sp,sd,sq も基本的な意味は同じです。しかし、 sp,sd,sqは、現在のデータはひとつ以上の季節期間を経た過去のデータに影響されます。例えば12ヶ月周期の季節変動を持つデータの場合、s のパラメーターは周期を表すため、s=12 となります。
Pythonにはこれらのパラメーターを自動で最も適切にしてくれる機能はありません。そのため情報量規準 (今回の場合は BIC(ベイズ情報量基準) )によって、どの値が最も適切なのか調べるプログラムを書きました。
BICの場合は、その値が低ければ低いほどパラメーターの値は適切であると判断します。パラメーターsに関しては、本来は事前に時系列データや偏自己相関の可視化を行うことによって調べておく必要があるのですが、今回は12ヶ月と仮定します。
#SARIMAモデルの適切なパラメーターをBIC (ベイズ情報量基準)で求める
import itertools
import statsmodels.api as sm
def selectparameter(DATA,s):
p = d = q = range(0, 2)
pdq = list(itertools.product(p, d, q))
seasonal_pdq = [(x[0], x[1], x[2], 12) for x in list(itertools.product(p, d, q))]
parameters = []
BICs = np.array([])
for param in pdq:
for param_seasonal in seasonal_pdq:
try:
mod = sm.tsa.statespace.SARIMAX(DATA,
order=param,
seasonal_order=param_seasonal)
results = mod.fit()
parameters.append([param, param_seasonal, results.bic])
BICs = np.append(BICs,results.bic)
except:
continue
return parameters[np.argmin(BICs)]
best_params = selectparameter(Monthly_USDJPY,12)
print(best_params)
結果、以下の最適なパラメーター(p,q,r)(sp,sq,sr,s)を得ました。
[(0, 1, 0), (0, 1, 1, 12), 1406.4681829712088]
4、予測の実行と予測データの可視化
モデル名.predict("予測開始時","予測終了時")とすることで予測データが得られます。今回は2022年末より2024年末までの2年間を予測しました。予測値は下図、赤線にて表記しました。
# モデルの当てはめ〜SARIMAモデル
SARIMA_Monthly_USDJPY = sm.tsa.statespace.SARIMAX(Monthly_USDJPY,order=best_params[0],seasonal_order=best_params[1]).fit()
# predに予測データを代入、可視化
pred = SARIMA_Monthly_USDJPY.predict("2022-12-31","2024-12-30")
plt.title("SARIMA USDJPY Monthly Model")
plt.xlabel("DATE")
plt.ylabel("USDJPY")
plt.plot(pred, color="r", label="USDJPY")
plt.plot(Monthly_USDJPY)
plt.legend()
plt.show()
結果と考察:
SARIMAによる分析結果は、上図赤線の通り、足元の円安状況と平仄が合っており、見た目はよくなりました。しかし一方で、1990年代以前の過去データを参照すると途端にハマりが悪くなり、時系列データのみでの将来予測力は、至極当然ながら限定的だと痛感しました。今後は、経常収支のデータや日米間の国債利回りの差等の変数も考慮した分析を行ってみたいです。
この3ヶ月を通して学んだ知識の今後の活用:
基礎的なことは習得できたと思うので、データ分析や日常作業の効率化に活用したいです。それ以上に、今回の受講を、今後のキャリアにおいて、ビジネスサイドとエンジニアサイドの架け橋になるきっかけとしたいと思います。
この記事が気に入ったらサポートをしてみませんか?