Advertisement

Deep Learning for Time Series Forecasting: StateoftheAr

阅读量:

作者:禅与计算机程序设计艺术

1.简介

时间序列预测问题(Time series forecasting)是基于历史数据(历史数据)预测未来某个特定时间点情况的一种问题。它在金融、经济、物联网以及医疗等多个领域中,其应用也非常广泛。伴随着互联网、传感器网络、智能手机等多种信息技术的发展,传统的静态模型已无法满足需求,因此,基于机器学习技术的时序预测技术不断涌现,涵盖深度学习、支持向量机、递归神经网络等多种模型。

本文主要基于金融市场背景,系统阐述了深度学习技术在时序预测领域的最新研究进展及其实际应用。首先,将介绍时序预测的相关理论基础和专业术语;其次,阐述深度学习在时序预测中的主要方法,包括ARIMA、LSTM、CNN、SVR等模型;随后,通过具体案例详细解析这些方法的操作步骤,并深入分析其数学推导过程,同时提供相应的代码实现;最后,探讨未来深度学习在时序预测技术的发展趋势及其面临的挑战。

2.基本概念和术语

2.1 时序数据

时间序列数据集(time series data),也可称为时间序列(time series)。它是由一维或二维数组构成,每个元素都与特定的时间点相关联,例如股价、销售额等。每个时刻的值通常由前一个时间点的值加上一个随机误差或其他影响因素形成,并且整个序列受到时间序列自身规律的影响,即近期时间点的数据对序列的影响更为显著。

时序数据具有时间序列特征,随着时间发展,其呈现出连续性特征,可通过图形或图像表示。时序数据主要分为趋势类数据和季节类数据两大类。趋势类数据主要表现为明显的周期性和趋势特征,例如股票价格数据;而季节类数据则呈现出固定的周期性特征,例如季度收入数据。

2.2 时序预测任务

时序预测任务旨在基于历史数据序列,推断出未来某一时间点的数值。该任务主要分为回归分析和分类分析两大类。回归分析的目标是估计连续型变量的具体数值,例如房价和销售额的预测。而分类分析的目标则是识别离散型变量的类别归属,例如判断股票价格是上涨还是下跌。

2.3 评估指标

在时序预测任务中,通常需要设定评估指标。常见的评估指标包括均方根误差(RMSE)、平均绝对百分比误差(MAPE)以及平均绝对偏差(MAD)等。

该模型的预测精度由三个关键指标量化评估,包括均方根误差、平均百分比误差和平均绝对偏差。其中,均方根误差(Root Mean Square Error,RMSE)的计算公式为:RMSE = \sqrt{\frac{1}{T}\sum_{t=1}^T(y_t-\hat{y}_t)^2},其中T代表测试集中样本的数量,y_t\hat{y}_t分别表示真实值和预测值。平均百分比误差(Mean Absolute Percentage Error,MAPE)的计算公式为:MAPE = \frac{1}{n}\sum_{i=1}^{n}|\frac{\hat{Y}_i-Y_i}{Y_i}|*100\%,其中n是测试集中样本的数量,Y_i\hat{Y}_i分别表示真实值和预测值的第i个样本。最后,平均绝对偏差(Mean Absolute Deviation,MAD)的计算公式为:MAD = \frac{1}{n}\sum_{i=1}^{n}|Y_i-\hat{Y}_i|,该指标同样用于评估预测结果与真实值之间的差距,但其计算方式与MAPE存在显著差异。

从这三个评估指标来看,它们主要关注的是预测值的准确性,但这些指标通常未能反映预测值的变化范围,这在一定程度上限制了它们对预测准确性的全面评估。为了更全面地评估预测效果,建议引入置信区间(confidence interval)和窗格法(rolling mean method)。

置信范围表示预测值在某一置信度水平下的可能范围,例如,95%置信区间可用于评估预测值的可信度。

窗格法通过将预测值汇总为一段时间内的平均值,从而降低了模型预测的波动幅度。

综上所述,时序预测任务一般可以分为三步:

  1. 数据收集与处理。获取并整理训练数据集和测试数据集,确保数据完整性、正确的时间标注以及统一的计量单位。
  2. 模型选择与训练过程。通过不同机器学习模型进行训练,选择最优模型参数组合,以最大化模型在测试集上的预测准确性为目标。
  3. 评估与分析环节。通过评估指标量化模型预测的准确性,并借助置信区间和滚动窗口法进一步分析模型预测的变化趋势。

3. 深度学习时序预测方法

3.1 ARIMA模型

ARIMA(AutoRegressive Integrated Moving Average),亦即自回归滑动平均模型。它是一种典型的定阶预测模型,其核心原理是基于历史数据中自回归和移动平均特性的表现,来推演未来数据的走向。

3.1.1 模型描述

ARIMA模型由3个部分组成:自回归(AR)、差分(I)、移动平均(MA)。如下图所示:

AR项:当前时刻的值与之前时刻的值之间存在线性关系。假设存在p个自相关系数r₁,…,r_p,则自回归系数为(φ₁,…,φ_p)。即,其中c为截距项。如果p=0,则不存在自回归项。

I项:该项与时间序列有关,用于消除季节性影响。当存在q个差分阶数时,其差分系数即为(d_1, \cdots, d_q)。其中,c为截距项,而(\delta_1, \cdots, \delta_q)则为移动平均项的系数。当q=0时,差分项不存在。

MA(Moving Average)项:计算历史数据的移动平均值。假设存在P个自相关系数R₁,…,R_P,那么MA的系数就为(θ₁,…,θ_P)。即,截距项为c。

注意,ARMA模型可作为ARIMA模型的扩展,即为自回归移动平均模型。ARMA模型仅包含AR和MA两个子模型,而ARIMA模型则包含I子模型。与ARIMA模型相比,ARMA模型相对更为简洁,其预测性能显著优于ARIMA模型。

3.1.2 模型训练

ARIMA模型的训练可通过多种方法实现。其中最简单的方式是通过手动调整参数,逐步提升模型复杂度,直至验证集预测准确率达到最佳水平。

3.1.3 模型预测

ARIMA模型的预测可通过两种方法实现:直接计算和模型拟合。直接计算的方法相对较为简便,它通过计算得出ARIMA模型的参数矩阵(AR, I, MA),即可预测任意时间点的值。而拟合方法则需要对ARIMA模型进行参数拟合,随后利用拟合出的模型参数进行预测。尽管两种方法均具备各自的优势与劣势,但直接计算方法在处理速度上更为迅速,然而在数据量较大时可能会导致较大的内存消耗。相比之下,拟合方法在面对异常值时更具鲁棒性,能够有效处理非平稳数据序列,但其模型的复杂度通常较高,需要更多的计算资源进行支持。

3.1.4 模型应用

ARIMA模型在金融领域有广泛的应用。其主要应用场景涵盖股票价格预测、债券价格预测、销售量预测、经济指标预测等多方面。该模型的应用领域不仅局限于时间序列数据,还可以应用于其他预测任务。

3.2 LSTM模型

LSTM(Long Short Term Memory)是一种具备时间序列数据建模能力的深度学习模型,其核心在于能够有效建模长期依赖关系。该模型由三个关键组件构成,分别负责更新记忆、遗忘信息以及生成输出。具体而言,输入门调控记忆细胞的更新机制,遗忘门负责舍弃不需要的记忆信息,而输出门则指导如何基于当前记忆状态生成输出结果。相较于传统序列模型,LSTM具备显著优势,主要体现在以下几个方面:一是具有明确的状态管理机制,二是能够有效捕捉长期依赖关系。

3.2.1 模型描述

LSTM模型由一个循环网络结构构成。该结构包含大量隐藏层单元,每个隐藏层单元均配备了一个记忆细胞。每个记忆细胞负责存储当前时刻的信息,同时整合了历史状态和当前输入数据。

LSTM模型的训练可以分为以下步骤:

  1. 初始化参数:为模型参数赋初值。
  2. 前向传播:输入与当前记忆细胞状态结合,逐步计算隐藏层输出、输入门、遗忘门及输出门,最终获得当前时刻的输出结果。
  3. 反向传播:通过反向传播算法更新模型参数。
  4. 小批量训练:采用分批训练方式,每个batch完成一次梯度更新任务。

3.2.2 模型训练

LSTM模型的训练包括以下几个步骤:

数据准备阶段:将数据集按照固定的长度比例划分为训练集、验证集和测试集。参数初始化步骤:通过设定初始值的方式,为模型的权重参数和偏置参数赋值。训练阶段:系统对模型进行训练,计算当前阶段的损失函数,根据训练结果调整模型的参数,持续进行迭代优化,直至达到收敛条件。测试环节:通过测试集对模型进行评估,计算其准确率、召回率以及F1分数等关键指标。

3.2.3 模型预测

LSTM模型的预测过程可以分为两步:

数据准备:导入需要预测的数据,并遵循数据格式要求进行处理。
推理过程:输入待预测的数据以及当前记忆细胞状态,依次计算隐藏层输出、输入门、遗忘门和输出门,从而得到当前时刻的输出,最终获得预测结果。

3.2.4 模型应用

LSTM模型在金融领域有着广泛的应用,主要应用场景涵盖股票价格预测、宏观经济指标预测以及行业指数预测等多个方面。尽管LSTM模型在长期依赖关系建模方面表现突出,但在短期预测任务方面仍展现出显著的能力。

3.3 CNN模型

基于卷积神经网络的CNN(Convolutional Neural Network)是一种用于表示或描述图像和时序信号的深度学习模型。该模型由卷积层和池化层构成,能够提取图像或时序信号的特征。

3.3.1 模型描述

CNN模型包含卷积层和池化层。

卷积层

卷积层通过提取图像或时序信号的局部特征来实现特征识别。卷积层由多个卷积核构成,每个卷积核专门负责提取特定类型的特征。对于时序信号,卷积核的内核函数与时间序列的位置无关,而是与空间位置相关。

池化层

池化层通过尺寸缩减特征图的空间维度,从而降低模型复杂度。通过提取图像或时序信号的全局特征,池化层的作用是进一步降低模型复杂度。池化层主要采用最大池化(Max Pooling)或者平均池化(Average Pooling)。

3.3.2 模型训练

CNN模型的训练过程如下:

数据准备:导入训练数据集,并对数据进行预处理过程,涵盖数据增强技术和归一化处理等步骤。模型构建:基于卷积神经网络架构构建模型,主要包含卷积层、池化层以及全连接层等结构。优化器设置:优化器配置采用Adam优化器等方法进行参数优化。损失函数设置:损失函数选择模型采用交叉熵损失函数和均方误差损失函数作为评估指标。训练过程:通过模型训练获取训练数据的特征表现。

3.3.3 模型预测

CNN模型的预测过程如下:

  1. 数据准备:获取待预测的数据样本,并规范格式进行处理。
  2. 模型推理:对输入的待预测数据进行预处理,然后将处理后的数据输入模型进行推理。
  3. 结果输出:模型生成预测结果。

3.3.4 模型应用

在计算机视觉领域,CNN模型的应用范围也十分广泛。其主要应用领域包括图像分类任务、图像识别技术、视频监控系统、图像/视频检索系统以及新闻评论情感分析技术等。

3.4 SVR模型

SVR(支持向量回归,Support Vector Regression)是一种主要用于建模回归任务的支持向量机。支持向量机通过求解最大间隔边界来处理线性不可分的数据,从而有效解决回归问题。

3.4.1 模型描述

与传统回归模型相比,SVR模型具有显著差异。其核心构建由特征映射和核函数计算两部分构成。特征映射操作旨在将原始输入数据空间转换至特征空间。核函数计算机制则用于评估不同特征间的关联程度。

3.4.2 模型训练

SVR模型的训练过程如下:

数据准备:获取训练数据集,并对数据进行预处理流程,主要包含数据增强技术和归一化处理步骤。
模型构建:基于支持向量机的方法构建模型,主要涉及特征提取和回归核函数的设定。
优化器配置:为模型选择优化算法,包括随机梯度下降法、Adagrad优化器和Adadelta优化器等。
损失函数选择:模型采用均方误差作为损失函数,该指标能够有效度量预测值与真实值之间的差异。
训练阶段:通过模型训练收集训练数据的关键指标,包括训练误差和验证误差等评估指标。

3.4.3 模型预测

SVR模型的预测过程如下:

数据准备:导入待预测的数据,并遵循模型格式进行预处理。模型推理:输入并进行预处理待预测的数据,通过模型进行推理。结果输出:生成预测结果。

3.4.4 模型应用

SVR模型被广泛应用于回归任务,展现了其强大的适用性。其主要应用领域涵盖商品价格预测、营销预测等多个方面。

4. 实操案例

本章节将介绍深度学习时序预测技术的具体应用。

4.1 时序数据预处理

时序数据预处理主要包含数据清洗和数据归一化两个主要环节。在数据清洗阶段,首先进行异常值检测,接着进行数据切分,最后进行缺失值填充等基本操作。数据归一化的主要目标是确保数据在不同尺度上的可比性,同时还能有效降低计算复杂度。

4.2 ARIMA模型案例

在ARIMA模型案例中,我们采用股票价格预测作为案例,具体说明如何应用ARIMA模型进行股票价格预测。

首先,我们下载数据。这里我使用了国内金融交易平台——新浪财经的股票数据。我们选取沪深300指数作为基准,然后爬取其近期的日K线数据。

复制代码
    import pandas as pd
    import numpy as np
    from statsmodels.tsa.arima_model import ARIMA
    from sklearn.metrics import mean_squared_error
    from math import sqrt
    import matplotlib.pyplot as plt
    
    
    def parser(x):
    return datetime.strptime('190'+x, '%Y-%m')
    
    df = pd.read_csv('data.csv', header=None, index_col=0, parse_dates=[0], squeeze=True, date_parser=parser)
    
      
      
      
      
      
      
      
      
      
      
      
    
    代码解读

接下来,我们查看一下数据集。由于数据集非常庞大,这里只显示了一部分。

复制代码
    print(df.head())
    
    
    代码解读
复制代码
    ^HSI       CAC    SP500     NASDAQ      NYSE      AMEX
    1901-01-03   NaN         NaN          NaN        NaN        NaN
    1901-01-04   NaN         NaN          NaN        NaN        NaN
    1901-01-05   NaN         NaN          NaN        NaN        NaN
    1901-01-06   NaN         NaN          NaN        NaN        NaN
    1901-01-07   NaN         NaN          NaN        NaN        NaN 
    
      
      
      
      
      
    
    代码解读

接着,我们将数据按照月份分组,并计算均值,去掉包含缺失值的数据。

复制代码
    df_group = df.groupby([pd.Grouper(freq='M')]).mean()
    df_group.dropna(inplace=True)
    
      
    
    代码解读

随后,我们建立ARIMA模型。在此,我们选择参数p=2、d=1、q=2,并将时间序列划分为年度、半年度、季度和月度四个子序列。当然,您也可以尝试其他的参数组合。

复制代码
    train_size = int(len(df_group)*0.7)
    train_df = df_group[:train_size]
    
    history = [x for x in train_df]
    predictions = []
    
    for i in range(test_size):
    model = ARIMA(history, order=(2,1,2))
    model_fit = model.fit(disp=-1)
    output = model_fit.forecast()
    yhat = output[0]
    predictions.append(yhat)
    obs = test_df[i]
    history.append(obs)
    
    rmse = sqrt(mean_squared_error(test_df, predictions))
    print('Test RMSE: %.3f' % rmse)
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    
    代码解读

最后,我们可视化模型预测结果和实际结果。

复制代码
    plt.plot(df_group.index[-test_size:], test_df, color='blue', label='Actual Price')
    plt.plot(df_group.index[-test_size:], predictions, color='red', label='Predicted Price')
    plt.title('ARIMA Prediction Chart')
    plt.xlabel('Date')
    plt.ylabel('Price ($)')
    plt.legend()
    plt.show()
    
      
      
      
      
      
      
    
    代码解读

从图表分析可知,ARIMA模型的预测能力尚可。然而,目前模型仅适用于对一个月内股票价格的预测。仍需进一步优化。

4.3 LSTM模型案例

在LSTM模型案例中,我们选取股票价格预测作为示例,演示其应用。具体而言,该模型通过分析历史数据,实现对股票价格走势的预测。

首先,我们导入必要的库。

复制代码
    import pandas as pd
    import tensorflow as tf
    import keras
    from sklearn.preprocessing import MinMaxScaler
    from sklearn.metrics import mean_squared_error
    import numpy as np
    import matplotlib.pyplot as plt
    from datetime import datetime
    
      
      
      
      
      
      
      
    
    代码解读

然后,我们载入股票价格数据,并按日期排序。

复制代码
    stock_prices = pd.read_csv("stock_price.csv")
    stock_prices['date'] = pd.to_datetime(stock_prices['date'])
    stock_prices.sort_values(['date'], inplace=True, ascending=True)
    
      
      
    
    代码解读

接着,我们按照日期、股价对数据进行归一化。

复制代码
    scaler = MinMaxScaler(feature_range=(0, 1))
    scaled_data = scaler.fit_transform(np.array(stock_prices["price"]).reshape(-1,1))
    
      
    
    代码解读

最后,我们创建训练集、验证集和测试集。

复制代码
    training_set = scaled_data[:int(len(scaled_data)*0.7)]
    validating_set = scaled_data[int(len(scaled_data)*0.7):int(len(scaled_data)*0.85)]
    testing_set = scaled_data[int(len(scaled_data)*0.85):]
    
      
      
    
    代码解读

之后,我们定义LSTM模型。

复制代码
    inputs = keras.layers.Input(shape=(window_size,))
    lstm_layer = keras.layers.LSTM(units=hidden_size, activation="tanh")(inputs)
    outputs = keras.layers.Dense(units=1)(lstm_layer)
    model = keras.Model(inputs=inputs, outputs=outputs)
    model.compile(loss="mse", optimizer="adam")
    
      
      
      
      
    
    代码解读

接着,我们训练模型。

复制代码
    model.fit(x=np.array(training_set[:-window_size]), y=np.array(training_set[window_size:]), epochs=epochs,
          validation_data=(np.array(validating_set[:-window_size]), np.array(validating_set[window_size:])))
    
      
    
    代码解读

最后,我们预测测试集股价。

复制代码
    predicted_stock_prices = model.predict(x=np.array(testing_set[:-window_size]))
    predicted_stock_prices = scaler.inverse_transform(predicted_stock_prices).flatten().tolist()[window_size:]
    actual_stock_prices = testing_set.flatten().tolist()[window_size:]
    
      
      
    
    代码解读

为了评估模型的预测性能,我们计算RMSE。

复制代码
    rmse = np.sqrt(mean_squared_error(actual_stock_prices, predicted_stock_prices))
    print("The root mean squared error is:", rmse)
    
      
    
    代码解读

为了可视化模型的预测结果,我们绘制预测曲线。

复制代码
    plt.plot(actual_stock_prices, color='blue', label='Actual Stock Prices')
    plt.plot(predicted_stock_prices, color='orange', label='Predicted Stock Prices')
    plt.title('Stock Price Prediction using LSTM Model')
    plt.xlabel('Days')
    plt.ylabel('Prices')
    plt.legend()
    plt.show()
    
      
      
      
      
      
      
    
    代码解读

通过图形分析,LSTM模型的预测能力表现尚可。然而,目前模型仅适用于对未来一个月的股票价格进行预测。仍需进一步优化。

全部评论 (0)

还没有任何评论哟~