R语言构建丹麦电力价格季节性ARIMA模型问题咨询
丹麦小时级电价季节性ARIMA模型解决方案
1 序列频率设置修正
你当前将ts对象的frequency设为24*7仅能捕获周度季节性,而小时级电价存在双重季节性特征:24小时的日度周期、168小时的周度周期,普通ts对象仅支持单季节周期,无法同时匹配两类规律,属于电力价格预测的常见误区。
建议替换为forecast包的多季节时间序列对象msts,代码示例:
library(lubridate) library(forecast) y <- msts(El_spot$c1, seasonal.periods = c(24, 168), start = ymd_hms("2021-09-01 00:00:00"))
2 平稳性与自相关问题说明
ADF检验p=0.01仅能证明序列不存在单位根、符合弱平稳要求,你观测到的明显自相关是未被捕获的季节性规律导致的,属于电力价格序列的正常特征,不需要额外做差分处理,仅需在ARIMA模型中加入季节项即可覆盖该规律。从你提供的ACF图也能看到明显的24小时周期尖峰,进一步验证了日度季节性的存在。
3 季节性ARIMA(SARIMA)模型推荐
你无需手动遍历调参,可通过auto.arima自动完成模型阶数选优,也可根据行业通用经验手动配置参数:
通用参数参考
- 非季节阶数:d=0(序列已平稳),p取值范围27(参考PACF截尾位置),q取值范围13(参考ACF拖尾特征)
- 季节阶数:D=1(消除季节非平稳),P=1,Q=1,分别对应24、168两个季节周期
代码示例
# 自动选优双季节SARIMA,遍历所有可能阶数得到最优结果 auto_sarima <- auto.arima(y, seasonal = TRUE, stepwise = FALSE, approximation = FALSE) # 查看模型参数与拟合效果 summary(auto_sarima) # 预测未来7天的小时级电价 pred_result <- forecast(auto_sarima, h = 24*7) # 绘制预测结果 plot(pred_result)
4 自定义滚动预测函数优化
你原有的expforecast函数未加入季节参数适配,修改后可支持SARIMA模型的滚动误差计算:
expforecast_sarima = function(yt, ar, d, ma, P, D, Q, period, ini, n){ t <- length(yt) n_for <- t-n-ini+1 e_arma <- rep(0, n_for) for(z in 1:n_for){ y_t=yt[1:(ini+z-1)] model1 <- Arima(y_t, order=c(ar,d,ma), seasonal = list(order = c(P,D,Q), period = period), method="ML") y1_hat <- predict(model1, h=n) e_arma[z] <- yt[(ini+z+n-1)] - y1_hat$pred[1] } return(e_arma) }
内容的提问来源于stack exchange,提问作者Mark F
相关产品推荐
相关产品推荐

