时间序列预测:某些数据本身与时间存在联系(趋势、周期性),如销售量、股票价格
这个网站相内容很好,推荐:第 7 章 时间序列回归模型 | 预测:方法与实践(第三版) (otexts.com)
一、朴素预测法、简单平均法
- 直接取前一天的数据/取前面所有天数的平均值
- 适用于数据随时间基本不变的情况
二、移动平均法、加权移动平均(MA)
- 如果数据变化较大,过久的数据对于未来预测已经无用了,甚至会因为求平均值而起反作用
- 只取前面n个点的平均值or前n个点的加权平均(考虑到前n个点对预测点的影响不同,给予近期更大的权重)
- 对方法一的改善,适用于数据随时间的变化存在一定的趋势
三、指数平滑法(AR)
- 下期=α*上期的实际值+(1-α)*上期的预测值(0时刻可用平均值代替预测值)
- α越大对数据变化反应越迅速,α越小,平滑作用越强
- 是对加权移动平均的进一步改善,将所有数据考虑在内,权重呈指数级下降
- 一次指数、二次指数、三次指数
四、霍尔特指数平滑法(Holts)
- 预测具有趋势的数据
- 季节性:Holt-Winters加法模型、Holt-Winters乘法模型
- 季节加法性:一个零售商在每个假日季节都会额外卖出100件商品;季节乘法性:一个零售商在假日季节的销售量是平时的两倍
import pandas as pd
from statsmodels.tsa.holtwinters import ExponentialSmoothing
# df = pd.DataFrame({
# 'date': pd.date_range(start='2000-01-01', periods=60, freq='Q'),
# 'Trips': [100, 120, 140, ...] # 假设的百万次旅行数据
# })
# 创建一个ETS模型,这里我们使用加法趋势和季节性
model_additive = ExponentialSmoothing(
df['Trips'], trend='add', seasonal='add', seasonal_periods=4
)
fit_additive = model_additive.fit()
# 创建一个ETS模型,这里我们使用乘法趋势和季节性
model_multiplicative = ExponentialSmoothing(
df['Trips'], trend='mul', seasonal='mul', seasonal_periods=4
)
fit_multiplicative = model_multiplicative.fit()
# 预测未来3年的数据
forecast_additive = fit_additive.forecast(12) # 假设每年有4个季度,3年共12个季度
forecast_multiplicative = fit_multiplicative.forecast(12)
五、ARIMA模型
- 数据具有复杂的自相关结构
- 既可以捕捉到数据的趋势变化,又可以处理突发的变化
- AR+I+MA
import pandas as pd
from statsmodels.tsa.arima.model import ARIMA
import matplotlib.pyplot as plt
# 假设df是包含时间序列数据的pandas DataFrame,并且已经转换为所需的格式
# 例如,df的索引是日期,列是时间序列数据
df = pd.read_csv('your_time_series_data.csv', index_col='Date', parse_dates=True)
# 检查数据的平稳性
# 这里需要你根据数据的实际情况来决定是否需要差分,以及差分的阶数d
# 例如,如果数据是非平稳的,你可能需要进行一次差分
df_diff = df.diff().dropna()
# 选择ARIMA模型的参数
# p:自回归项的阶数
# d:差分的阶数
# q:滑动平均项的阶数
# 这些参数的选择通常基于对数据的ACF和PACF图的分析
p, d, q = 1, 1, 1 # 举例参数,需要根据实际情况调整
# 创建ARIMA模型实例
model = ARIMA(df['Your_Time_Series_Column'], order=(p, d, q))
# 拟合模型
model_fit = model.fit()
# 进行预测
forecast_steps = 10 # 预测未来的时间步数
forecast = model_fit.forecast(steps=forecast_steps)