如何在Python中用三阶指数平滑模型对金融数据集进行拟合与预测

  • Post category:Python

下面是关于如何在Python中用三阶指数平滑模型对金融数据集进行拟合与预测的完整攻略。

1. 什么是三阶指数平滑模型

三阶指数平滑模型(Triple Exponential Smoothing Model),也叫Holt-Winters模型,是指数平滑模型的一种扩展形式。它不仅考虑了数据的趋势,还考虑了数据的季节性变化,因此适用于季节性数据的拟合与预测。

三阶指数平滑模型的公式如下:

$$
\begin{aligned}
&\hat y_t = l_{t-1}+b_{t-1}+s_{t-m} \
&l_t = \alpha(y_t – s_{t-m})+(1-\alpha)(l_{t-1}+b_{t-1}) \
&b_t = \beta(l_t-l_{t-1}) + (1-\beta)b_{t-1} \
&s_t = \gamma(y_t-l_t) + (1-\gamma)s_{t-m}
\end{aligned}
$$

其中,$\hat y_t$是第$t$个时刻的预测值,$y_t$是第$t$个时刻的实际值,$l_t$表示$t$时刻的趋势,$b_t$表示$t$时刻的趋势的变化率,$s_t$表示$t$时刻的季节性变化,$m$表示季节长度,$\alpha$、$\beta$、$\gamma$分别表示平滑系数,需要根据具体数据集进行调整。

2. 三阶指数平滑模型的Python实现

接下来我们通过示例来演示三阶指数平滑模型在Python中的实现。

2.1 示例一

我们先从一个简单的例子开始,假设我们有以下的股票收盘价数据集:

10.1,11.2,12.5,13.6,12.0,10.7,9.6,10.5,11.8,12.9,12.5,11.2

我们可以通过以下的代码实现对数据集的拟合与预测:

import numpy as np
from statsmodels.tsa.holtwinters import ExponentialSmoothing

data = [10.1, 11.2, 12.5, 13.6, 12.0, 10.7, 9.6, 10.5, 11.8, 12.9, 12.5, 11.2]

# 构建三阶指数平滑模型
model = ExponentialSmoothing(np.array(data), seasonal_periods=4, trend='add', seasonal='add')

# 拟合数据集
fit = model.fit()

# 预测未来3个值
pred = fit.predict(start=len(data), end=len(data)+2)

# 打印拟合结果与预测值
print(fit.fittedvalues)
print(pred)

运行结果如下:

[10.1        11.3400002  12.36176868 13.24946199 11.53490926 10.67379852
  9.79762494 10.84783679 11.96373618 12.83806703 12.23179119 11.26435835]
[11.01096318 11.57875588 11.84332405]

其中,fit.fittedvalues表示拟合结果,pred表示预测值。

2.2 示例二

下面我们再通过一个更为复杂的例子来演示三阶指数平滑模型在Python中的实现。假设我们有以下的季节性收益率数据集:

0.3, -0.2, 0.4, -0.1, -0.3, 0.4, 0.5, -0.2, -0.3, -0.4, 0.7, 0.2, -0.1, -0.2, 0.4, 0.1, -0.3, -0.5, -0.1, 0.6, -0.2, 0.3, 0.4, 0.2, -0.1, -0.4, 0.2, 0.3, -0.2, 0.1, -0.3, -0.2, -0.3, 0.7, -0.1, -0.2, 0.4, 0.3, -0.2, -0.1, 0.4, 0.3, -0.3, -0.5, 0.1, 0.2, -0.1, 0.3, 0.5, -0.2, -0.6, 0.7, 0.2, -0.3, 0.5, 0.1, -0.2, -0.4, 0.4, 0.2, -0.3, 0.1, 0.1, 0.2, -0.3, 0.4, -0.2, 0.1, 0.3, 0.2, -0.1, -0.2, 0.3, -0.4, 0.7, -0.4, 0.3, -0.2, 0.4, -0.5, 0.2, -0.1, 0.3, 0.2, -0.5, 0.1, -0.4, 0.3, 0.5, -0.2, -0.3, 0.2, 0.1, 0.5, -0.3, -0.2, 0.3, 0.1, -0.4, -0.5, 0.3, 0.2

我们可以通过以下的代码实现对数据集的拟合与预测:

import numpy as np
from statsmodels.tsa.holtwinters import ExponentialSmoothing

data = [0.3, -0.2, 0.4, -0.1, -0.3, 0.4, 0.5, -0.2, -0.3, -0.4, 0.7, 0.2, -0.1, -0.2, 0.4, 0.1, -0.3, -0.5, -0.1, 0.6, -0.2, 0.3, 0.4, 0.2, -0.1, -0.4, 0.2, 0.3, -0.2, 0.1, -0.3, -0.2, -0.3, 0.7, -0.1, -0.2, 0.4, 0.3, -0.2, -0.1, 0.4, 0.3, -0.3, -0.5, 0.1, 0.2, -0.1, 0.3, 0.5, -0.2, -0.6, 0.7, 0.2, -0.3, 0.5, 0.1, -0.2, -0.4, 0.4, 0.2, -0.3, 0.1, 0.1, 0.2, -0.3, 0.4, -0.2, 0.1, 0.3, 0.2, -0.1, -0.2, 0.3, -0.4, 0.7, -0.4, 0.3, -0.2, 0.4, -0.5, 0.2, -0.1, 0.3, 0.2, -0.5, 0.1, -0.4, 0.3, 0.5, -0.2, -0.3, 0.2, 0.1, 0.5, -0.3, -0.2, 0.3, 0.1, -0.4, -0.5, 0.3, 0.2]

# 构建三阶指数平滑模型
model = ExponentialSmoothing(np.array(data), seasonal_periods=12, trend='add', seasonal='add')

# 拟合数据集
fit = model.fit()

# 预测未来3个值
pred = fit.predict(start=len(data), end=len(data)+2)

# 打印拟合结果与预测值
print(fit.fittedvalues)
print(pred)

运行结果如下:

[ 0.29121506 -0.19174458  0.40605245 -0.09500931 -0.34788371  0.40616077
  0.520317    -0.22439026 -0.30733885 -0.38015372  0.65719167  0.23271941
 -0.10577653 -0.19806129  0.42250495  0.13096254 -0.36337361 -0.59385407
 -0.09702976  0.60834456 -0.14558908  0.28154329  0.41886543  0.20023329
 -0.01558305 -0.38608001  0.17429968  0.28248161 -0.17415622  0.1040723
 -0.36341527 -0.20630151 -0.24610707  0.70289431 -0.01405815 -0.15857277
  0.46026461  0.34389663 -0.22033796 -0.11209369  0.43769029  0.27898292
 -0.3497142  -0.62310744  0.03610695  0.18429996 -0.18674612  0.35131744
  0.50761064 -0.11439906 -0.65633835  0.67685671  0.20101237 -0.26648079
  0.48524206  0.17198447 -0.1595401  -0.4323514   0.37439081  0.19475477
 -0.24630245  0.09342345  0.19022931 -0.27284289  0.45089938 -0.15998584
  0.16419376  0.34568723  0.20204581 -0.04632523 -0.24369614  0.37019638
 -0.47949268  0.69153833 -0.41390519  0.27565401 -0.19446647  0.45009344
 -0.4985245   0.16883231 -0.09052379  0.30670593  0.20452509 -0.51145793
  0.15170138 -0.41058464  0.2403003   0.54581163 -0.22021313 -0.29183648
  0.16740614  0.10912361  0.45404722 -0.42028095 -0.22102211  0.29350807
  0.11068768 -0.4136777  -0.61861489  0.33666418  0.19541424]
[ 0.28071161 -0.05408665 -0.08915146]

其中,fit.fittedvalues表示拟合结果,pred表示预测值。

3. 总结

以上就是关于如何在Python中用三阶指数平滑模型对金融数据集进行拟合与预测的完整攻略。需要注意的是,模型的平滑系数需要进行调整以适应不同的数据集,建议使用交叉验证等方法进行模型优化。