时间序列模型(Time Series Model)
AR(Auto Regressive Model)自回归模型
- 自回归模型,顾名思义,就是使用一个变量的过去值来预测其未来值的模型。
- 例如,明天的天气可能会受到今天天气的影响,股票的明天价格可能会受到过去几天价格的影响。
- 今天的结果一定依赖于过去的积累,因此AR模型相信:一个时间点上的标签值一定是依赖于之前的时间点上的标签值而存在的。
公式如下:
- 公式: \(y_{t} = c + \phi_{1}y_{t-1} + \phi_{2}y_{t-2} + \dots + \phi_{p}y_{t-p} + \varepsilon_{t},\)
- c 是截距,常量
- theta表示自回归系数( \(\phi_{t}\) )
- \(ε_t\) 表示不同时间点的白噪声(与时间的相关系数为0的常量值)
- 机器学习模型:例如 AR(3) 就是用过去3天的数据X,预测今天的结果Y,构造的线性回归模型
- 区别就是从原来不同特征的数据,换成是不同时间维度的价格数据,所以叫自回归模型
MA(Moving Average Model) 移动平均模型
- 等权移动平均
- pandad.rolling(window=n).mean()
At=(At-1+At-2+At-3+…+At-n)/ n
- At的值等于离他最近的N个值求平均,得到的等权平均值
- 加权移动平均
- 就是 pandas ewm 函数,可以下看下面的
指数加权移动平均 pandas ewm
At=w1*At-1+w2*At-2+w3*At-3+…+wn*At-n
- 远离目标期的变量值的影响力相对较低,故应给予较低的权重。
- At的值等于离他最近的N个值,通过配置不同权重,得到的加权平均值
- 就是 pandas ewm 函数,可以下看下面的
公式如下:
- 公式: \(y_{t} = c + \varepsilon_t + \theta_{1}\varepsilon_{t-1} + \theta_{2}\varepsilon_{t-2} + \dots + \theta_{q}\varepsilon_{t-q},\)
- c 是截距,常量
- theta表示移动回归系数( \(\theta_{t}\) )
- \(\varepsilon_{t}\) 为特征,表示
真实值 - 均值
得到的误差 - \(ε_t\) 表示不同时间点的白噪声(与时间的相关系数为0的常量值)
- 机器学习模型:就是用 移动平均值为X,当前值为Y,是一个一元一次的线性方程。
优点:
- “白噪声”是一个对所有时间其自相关系数为零的随机过程。
- 移动平均法能有效地消除预测中的随机波动,是非常有用的
缺点:
- 加大移动平均法的期数(即加大n值)会使平滑波动效果更好,但会使预测值对数据实际变动更不敏感;
- 移动平均值并不能总是很好地反映出趋势。由于是平均值,预测值总是停留在过去的水平上而无法预计会导致将来更高或更低的波动;
- 移动平均法要由大量的过去数据的记录。
指数加权移动平均 pandas ewm
short_ema = df['price'].ewm(span=12, adjust=False).mean()
实现过程:
alpha = 2 / (span + 1) = 2/13 # 计算平滑系数 alpha
average = [data[0]]
for i in data[1:]:
if adjust:
w = alpha # 进行偏差校正, w不变,一直保持当前值是一个持续保持的过程。
else:
w = w * (1 - alpha) # 不进行偏差校正,w是一个持续衰减的过程
a = (1 - w) * average[-1] + w * data[i] # 计算加权平均值
average.append(a)
# 求平均值
average.mean()
ARMA 模型是自回归 和 移动平均模型的结合
拟合 ARMA 模型
from statsmodels.tsa.arima.model import ARIMA
ARIMA(df['Temperature'], order=(2, 0, 1)) # ARMA(p=2, q=1)
- 特征(自变量):过去两个时间点的气温数据 和 过去一个时间点的预测误差。
- 目标变量(因变量):当前时刻的气温数据。
日期 气温
2024-01-01 20
2024-01-02 22
2024-01-03 21
2024-01-04 23
2024-01-05 25
对于日期为 2024-01-05 的数据,
特征: - 我们的特征可以是过去两个时间点的气温数据 [21, 23] - 过去一个时间点的预测误差 [2](实际值减去预测值 -> 2=25-23)
目标变量: - 就是当前时刻的气温 25。
目前有专门的模型库
ARIMA 模型是 ARMA 模型的延伸
- ARIMA 模型是 ARMA 模型的延伸,其中的 I(Integrated,差分整合)部分表示对时间序列数据进行差分处理。
- 差分处理的目的是使非平稳的时间序列数据转化为平稳的时间序列数据,进而更容易应用 ARMA 模型进行建模和预测。
== ARIMA 在特征充分的情况下,是完全重合的
# ARIMA(df_diff['Temperature'], order=(1, 0, 0)) -> 特征越少,越适合
# ARIMA(df['Temperature'], order=(1, 1, 0)) -> 特征越多,越适合
一阶差分 df_diff = df - df.shift(1)
- 仅作参考,很多解释不够清楚: https://otexts.com/fppcn/AR.html