SARIMA 模型用于货币汇率预测

介绍

汇率预测是指预测一种货币相对于另一种货币的价值未来变化的实践。货币预测可以帮助人们、企业和金融机构做出明智的金融决策。其中一种可以使用的预测技术是SARIMA。 SARIMA是一种出色的时间序列预测技术,用于估计具有季节性模式的时间序列数据。

它通过建立时间序列的过去和现在值之间的联系并识别数据中的模式来工作。 SARIMA利用各种自回归(AR)和移动平均(MA)模型以及差分来捕获数据中的趋势和季节性。“季节性”是指在指定的时间段内定期和可预测地发生的数据变化,例如每日、每周或每年的周期。通过预测汇率,我们可以更好地了解货币价值的变化。现在,让我们通过本文中的步骤进行预测。

学习目标

  1. 通过识别历史数据中的模式和趋势,帮助个人、企业和金融机构预测市场趋势。
  2. 通过识别与货币波动相关的潜在风险,降低风险。
  3. 通过确定最佳的货币转换时间,优化货币转换。
  4. 通过向企业和个人提供有关货币汇率未来方向的信息,提高决策能力。

基于这些目标,我们将使用SARIMA来开发一个模型,通过聚合季节性数据模式来更准确地预测未来的货币汇率。

本文作为数据科学博客马拉松的一部分发表。

步骤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模型,并根据所提供的数据自动确定适当的模型参数。

步骤2:读取数据

我们需要关于两种货币之间的汇率的历史数据来预测汇率。因此,我们可以在雅虎财经网站上下载包含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美元兑换印度卢比的价值。以下是数据中的所有特征:

  1. 日期表示汇率数据的具体日期。
  2. 开盘价是指特定交易期间(如当天或当周的开盘价)的汇率。
  3. 高价表示在特定交易期间观察到的最高汇率。
  4. 低价表示在特定交易期间观察到的最低汇率。
  5. 收盘价显示特定交易期结束时的货币汇率。
  6. 调整后的收盘价考虑可能影响收盘价的任何商业活动,例如股票拆分或股息。
  7. 成交量指在特定时间段内交易的USD-INR货币对的数量。

步骤三:转换率分析

让我们分析两种货币之间多年的兑换率。通过检查历史趋势,我们可以获取有价值的见解,了解汇率动态并可能发现影响这些汇率的重要模式或事件。为了可视化这种分析,我们将使用线性图来说明随着时间变化 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 强化,降低了兑换率。与此同时,在第二季度,USD 每年都会对 INR 提升。USD 对 INR 的价值在 8 月达到峰值,但在 9 月下降,在第四季度每年都会上升,再次在 12 月下降。

步骤四:构建 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='Training Data',
    line=dict(color='blue')
))

# 添加预测线图
fig.add_trace(go.Scatter(
    x=predictions.index,
    y=predictions,
    mode='lines',
    name='Predictions',
    line=dict(color='red')
))

fig.update_layout(
    title="Training Data VS Predictions",
    xaxis_title="Date",
    yaxis_title="Close",
    legend_title="Data",
    width=1000,
    height=600
)

pio.show(fig)

结论

本文首先检查数据集中是否存在缺失值,并使用描述性统计分析数据。然后在预测货币汇率之前,按年和按月汇总探索两种货币之间的兑换率,使用 SARIMA 模型。我们讨论了以下内容:

  • SARIMA 模型是一种统计模型,它捕捉数据过去值的季节性趋势,以预测未来的折扣。
  • SARIMA 模型可以预测各种货币的汇率。
  • SARIMA 模型有助于做出与货币交易、财务规划或国际业务运营相关的明智决策。
  • 模型的准确性取决于多种因素,包括数据质量和货币市场的稳定性。

本文提供了使用 Python 进行 SARIMA 货币汇率预测的全面指南。

常见问题

本文中显示的媒体不属于 Analytics Vidhya,仅由作者自行决定使用。