通貨為替レートの予測のためのSARIMAモデル
SARIMA model for predicting currency exchange rates.
はじめに
通貨の為替レート予測とは、ある通貨の価値が他の通貨に対して将来的にどのように変化するかを予測することです。通貨の予測は、人々、企業、そして金融機関が賢明な金融判断を下すのに役立ちます。使用できる予測技術の1つはSARIMAです。 SARIMAは、季節的なパターンを持つ時系列データを推定するための優れた時系列予測技術です。 SARIMAは、過去と現在の時系列データの関連性をモデル化し、データ内のパターンを認識することによって機能します。 SARIMAは、傾向や季節性を捉えるためのさまざまな自己回帰(AR)モデルや移動平均(MA)モデル、および差分を利用します。 「季節性」とは、日々、週次、年次など、一定期間にわたって規則的に予測可能なデータの変動を指します。 為替レートの変化を予測することで、通貨価値の変化についてより正確な情報を得ることができます。 では、この記事の手順に従って予測を行いましょう。
学習目標
- 歴史データのパターンとトレンドを特定することにより、個人、企業、金融機関が市場動向を予測するのに役立ちます。
- 通貨の変動に関連する潜在的なリスクを特定することにより、リスクを軽減することができます。
- 通貨変換を最適化するために、最適な通貨変換時期を特定することができます。
- 将来の為替レートの方向性に関する情報を提供することにより、意思決定を改善することができます。
これらの目的に基づいて、SARIMAを使用してモデルを開発し、季節的なデータのパターンを集計して将来的な値のより正確な予測を行います。
この記事は、Data Science Blogathonの一部として公開されました。
ステップ1:ライブラリのインポート
!pip install pmdarima
from pmdarima.arima import auto_arima
from statsmodels.tsa.statespace.sarimax import SARIMAX
from statsmodels.tsa.seasonal import seasonal_decompose
import pandas as pd
import matplotlib.pyplot as plt
import plotly.express as px
import plotly.graph_objs as go
import plotly.io as pio
‘pmdarima’ライブラリをインストールして、auto_arima関数を使用する必要があります。この関数は、時系列データを使用してARIMAモデルを適合させ、提供されたデータに基づいて適切なモデルパラメータを自動的に決定します。
- Snowflakeにおけるクエリ性能の向上と関連コストの改善
- 機械学習において決定木とランダムフォレストを使い分けるタイミング
- AIOpsの力を解き放つ:最適化されたITオペレーションのための知的自動化によるDevOpsの強化
ステップ2:データの読み込み
為替レートの予測には、2つの通貨間の過去のデータが必要です。したがって、yahoo finance webのINRとUSDの週間為替レートを含む過去のデータをダウンロードすることができます。そして、2003年12月1日から2023年6月15日までの期間を利用することができます。幸いなことに、これはGitHubで公開されています。
alamat = 'https://raw.githubusercontent.com/ataislucky/Data-Science/main/dataset/USD-INR_Weekly.csv'
data = pd.read_csv(alamat)
print(data.sample(11))
さらに進む前に、データセットに欠損値が含まれていないか確認する必要があります。
print(data.isna().sum())
データセットにいくつかの欠損値が含まれていることが判明しました。そのため、これらを除去する必要があります。
data = data.dropna()
記述統計を調べることで、データセットの特性やその基盤となる要因をよりよく理解し、データセットの特性を洞察することができます。データ分布要素を掴んだり、将来の探索的データ分析やモデリングのためのフレームワークを確立するために、重要な洞察を得ることができます。このデータセットの記述統計を見てみましょう。
print(data.describe())
データセットには、ある時点での1 USDあたりのINRの値が含まれています。以下は、データ内のすべての機能です。
- 日付は、為替レートデータの特定の日を表します。
- オープンは、特定の取引期間の開始時の為替レートを示します。たとえば、その日またはその週の始まりの価格を示します。
- 高は、特定の取引期間中に観測された最高為替レートを示します。
- 低は、特定の取引期間中に観測された最低為替レートを示します。
- クローズは、特定の取引期間の終わりにおける通貨レートを示します。
- 調整後終値は、株式分割や配当などの影響を考慮したクロージング価格を示します。
- ボリュームは、特定の期間中に取引されたUSD-INR通貨ペアの数を示します。
ステップ3:為替レート分析
通貨間の変換レートを年代別に分析してみましょう。歴史的なトレンドを調べることで、為替レートのダイナミクスに関する有益な洞察を得ることができ、これらの為替レートに影響を与える重要なパターンやイベントを発見することができます。この分析を視覚化するために、時間の経過に伴うUSD-INRの変換レートのトレンドを示すラインチャートを使用します。
figure = px.line(data, x="Date",
y="Close",
title='Conversion Rate over the years (USD/INR)')
figure.show()
年および月のフィールドをデータに追加して、より深い時系列分析を可能にします。
data["Date"] = pd.to_datetime(data["Date"], format = '%Y-%m-%d')
data['Year'] = data['Date'].dt.year
data["Month"] = data["Date"].dt.month
print(data.head())
INR-USDの交換レートの複利年間増加を調べ、経済的な強さや弱さの時期、通貨レートに影響を与える重要なイベント、またはINR-USD変換レートの長期的なパターンを発見しましょう。
growth = data.groupby('Year').agg({'Close': lambda x: (x.iloc[-1]-x.iloc[0])/x.iloc[0]*100})
fig = go.Figure()
fig.add_trace(go.Bar(x=growth.index,
y=growth['Close'],
name='Yearly Growth'))
fig.update_layout(title="Yearly Growth of Conversion Rate (USD/INR)",
xaxis_title="Year",
yaxis_title="Growth (%)",
width=900,
height=600)
pio.show(fig)
次に、INRとUSDの月間変換レートの成長を合計して分析してみましょう。
import warnings
warnings.simplefilter(action='ignore', category=FutureWarning)
# Calculate monthly growth
data['Growth'] = data.groupby(['Year', 'Month'])['Close'].
transform(lambda x: (x.iloc[-1] - x.iloc[0]) / x.iloc[0] * 100)
# Group data by Month and calculate average growth
grouped_data = data.groupby('Month').mean().reset_index()
fig = go.Figure()
fig.add_trace(go.Bar(
x=grouped_data['Month'],
y=grouped_data['Growth'],
marker_color=grouped_data['Growth'],
hovertemplate='Month: %{x}<br>Average Growth: %{y:.2f}%<extra></extra>'
))
fig.update_layout(
title="Aggregated Monthly Growth of Conversion Rate (USD/INR)",
xaxis_title="Month",
yaxis_title="Average Growth (%)",
width=900,
height=600
)
pio.show(fig)
グラフからわかるように、USDの価値は1月と3月に一貫して低下しています。これは、これらの月にINRがUSDに対して強くなり、変換レートが低下する傾向があることを示しています。一方、2四半期では、USDは毎年INRに対して上昇しました。USDのINRに対する価値は8月にピークに達しましたが、9月には下落し、4四半期に年間で上昇し、12月に再び下落しました。
ステップ4:SARIMAモデルを構築し、予測を行う
USD – INR為替レートデータの季節性分解を実行する必要があります。この方法では、トレンド、季節性、残差またはランダムな変動など、異なるデータ要素が分離されます。
result = seasonal_decompose(data["Close"], model='multiplicative', period=24)
fig = plt.figure()
fig = result.plot()
fig.set_size_inches(8, 6)
fig.show()
このデータには季節性のパターンがあるため、最も適切なアルゴリズムとしてSARIMAを使用します。SARIMAを使用する前に、まずp、d、qの値を見つける必要があります。pmdarimaライブラリを使用して、これらの値を自動的に見つけることができます。
model = auto_arima(data['Close'], seasonal=True, m=52, suppress_warnings=True)
print(model.order)
パラメータseasonal=Trueは、時系列が季節的なパターンを示していることを示します。一方、パラメータm=52は、週次データの季節的周期性を示します。そして、2、1、0はp、d、qの値です。
SARIMAを使用して、通貨交換レートを推定するためにモデルをトレーニングする準備ができています。
from statsmodels.tools.sm_exceptions import ValueWarning
warnings.simplefilter('ignore', ValueWarning)
p, d, q = 2, 1, 0
model = SARIMAX(data["Close"], order=(p, d, q),
seasonal_order=(p, d, q, 52))
fitted = model.fit()
print(fitted.summary())
ここでは、適合したARIMAモデルから未来の通貨レートを予測します。
predictions = fitted.predict(len(data), len(data)+90)
print(predictions)
予測値をグラフに表示して、より魅力的にします。
fig = go.Figure()
# 訓練データのラインプロットを追加
fig.add_trace(go.Scatter(
x=data.index,
y=data['Close'],
mode='lines',
name='訓練データ',
line=dict(color='blue')
))
# 予測のラインプロットを追加
fig.add_trace(go.Scatter(
x=predictions.index,
y=predictions,
mode='lines',
name='予測',
line=dict(color='red')
))
fig.update_layout(
title="訓練データ VS 予測",
xaxis_title="日付",
yaxis_title="Close",
legend_title="データ",
width=1000,
height=600
)
pio.show(fig)
結論
この記事では、データセットに欠損値があるかどうかを確認し、記述統計でデータを分析しました。その後、年次および月次に集計された2つの通貨間の換算レートを探索し、SARIMAを使用して通貨の為替レートを予測しました。以下を議論しました:
- SARIMAモデルは、過去のデータの季節的な傾向を捉えて未来の値を予測する統計モデルです。
- SARIMAモデルは、様々な通貨の為替レートを予測することができます。
- SARIMAモデルは、通貨取引、財務計画、国際ビジネスに関連する情報を提供するのに役立ちます。
- モデルの精度は、データの品質や通貨市場の安定性など、いくつかの要因に依存します。
この記事は、Pythonを使用したSARIMAを使った通貨為替レート予測の包括的なガイドを提供しています。
よくある質問
この記事で表示されているメディアはAnalytics Vidhyaに所属しておらず、著者の裁量で使用されています。
We will continue to update VoAGI; if you have any questions or suggestions, please contact us!
Was this article helpful?
93 out of 132 found this helpful
Related articles