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