当前位置:   article > 正文

ARIMA时间序列预测MATLAB代码模板(无需调试)_arima模型matlab代码

arima模型matlab代码

小白专用,直接改成自己的数据运行即可完成预测并画图

我的数据在评论区自取,

  1. clear; clc
  2. %小白专用,"*********《需要自己输入》**********"仅在有这种注释的地方改成自己的数据即可,一共有4个地方
  3. DD=readmatrix("B.xlsx");%这里输入自己的单序列数据,要求行向量*********《需要自己输入》**********
  4. P=DD(1:500,2)';
  5. N=length(P);
  6. n=490;%自己选取训练集个数*********《需要自己输入》**********
  7. F = P(1:n+2);
  8. %----------------------由于时间序列有不平稳趋势,进行两次差分运算,消除趋势性----------------------%
  9. Yt=[0,diff(P,1)];
  10. L=diff(P,2);%全体,比原始数据少2个,因为做了差分
  11. Y=L(1:n); %输入
  12. a=length(L)-length(Y);%单步预测步数
  13. aa=a;%多步预测步数
  14. % %画图
  15. % figure;
  16. % plot(P);
  17. % title('原数据序列图');
  18. % hold on;
  19. % figure;
  20. % plot(Y,'*');
  21. % title('两次差分后的序列图和原数对比图');
  22. %%
  23. %--------------------------------------对数据标准化处理----------------------------------------------%
  24. %处理的算法 : (data - 期望)/方差
  25. Ux=sum(Y)/n ; % 求序列均值
  26. yt=Y-Ux;
  27. b=0;
  28. for i=1:n
  29. b=yt(i)^2/n+b;
  30. end
  31. v=sqrt(b); % 求序列方差
  32. % Y=yt/v; % 标准化处理公式
  33. Y=zscore(Y);
  34. f=F(1:n);
  35. t=1:n;
  36. %画图
  37. % figure;
  38. % plot(t,f,t,Y,'r')
  39. % title('原始数据和标准化处理后对比图');
  40. % xlabel('时间t'),ylabel('油价y');
  41. % legend('原始数据 F ','标准化后数据Y ',"Location","best");
  42. %%
  43. %--------------------------------------对数据标准化处理----------------------------------------------%
  44. %------------------------检验预处理后的数据是否符合AR建模要求,计算自相关和偏相关系数---------------%
  45. %---------------------------------------计算自相关系数-----------------------------------%
  46. %%
  47. R0=0;
  48. for i=1:n
  49. R0=Y(i)^2/n+R0; %标准化处理后的数据的方差
  50. end
  51. for k=1:20
  52. %R 协方差
  53. R(k)=0;
  54. for i=k+1:n
  55. R(k)=Y(i)*Y(i-k)/n+R(k);
  56. end
  57. end
  58. x=R/R0 ; %自相关系数x = 协方差/方差
  59. %画图
  60. % figure;
  61. % plot(x)
  62. % title('自相关系数分析图');
  63. %%
  64. %-----------------------------------计算自相关系数-------------------------------------%
  65. %-----------------------解Y-W方程,其系数矩阵是Toeplitz矩阵(多普里兹矩阵)。求得偏相关函数X-------------------
  66. X1=x(1);xx(1,1)=1;X(1,1)=x(1);B(1,1)=x(1);
  67. K=0;T=X1;
  68. for t=2:n
  69. at=Y(t)-T(1)*Y(t-1);
  70. K=(at)^2+K;
  71. end
  72. U(1)=K/(n-1) ; % 1阶模型残差方差
  73. for i =1:19
  74. B(i+1,1)=x(i+1);
  75. xx(1,i+1)=x(i);
  76. A=toeplitz(xx);
  77. XX=A\B; %x=a\b是方程a*x =b的解
  78. XXX=XX(i+1);
  79. X(1,i+1)=XXX;
  80. K=0;T=XX;
  81. for t=i+2:n
  82. r=0;
  83. for j=1:i+1
  84. r=T(j)*Y(t-j)+r;
  85. end
  86. at= Y(t)-r;
  87. K=(at)^2+K;
  88. end
  89. U(i+1)=K/(n-i+1); %计算20阶以内的模型残差方差
  90. end
  91. %-----------------------------------解Y-W方程,得偏相关函数X-------------------------------------%
  92. % figure;
  93. % plot(X);
  94. % title('偏相关函数图');%自己要根据图先判断阶次
  95. %%
  96. q=20;%猜测阶数,通过看上面偏相关图,*********《需要自己输入》**********
  97. %-----根据偏相关函数截尾性,初判模型阶次为5。用最小二乘法估计参数,计算20阶以内的模型残差方差和AIC值,应用AIC准则为模型定阶--%
  98. S(1,1)=R0;
  99. for i = 1:q-1
  100. S(1,i+1)=R(i);
  101. end
  102. G=toeplitz(S);
  103. %inv(G)返回G的反函数
  104. W=inv(G)*[R(1:q)]' ; % 参数W(i) 与X5相同 G*W = [R(1:5)]'
  105. U=20*U ;
  106. for i=1:20
  107. AIC2(i)=n*log(U(i))+2*(i) ;
  108. end
  109. % 比如AIC2值为:172.6632 165.4660 153.2087 145.1442 140.7898 141.6824 142.9944 144.5601 146.3067 148.7036
  110. %-----------------取使AIC值为最小值的阶次,判断模型阶次为5。用最小二乘法估计参数--------------------%
  111. %%
  112. q=20;%确定阶数 ,通过看AIC2值最小的位置,*********《需要自己输入》**********
  113. %------------------检验{at}是否为白噪声。求{at}的自相关系数,看其是否趋近于零-----------------------%
  114. C=0;K=0;
  115. for t=q+2:n
  116. at=Y(t)+Y(q+1);
  117. for i=1:q
  118. at=-W(i)*Y(t-i)-W(i)*Y(q-i+1)+at;
  119. end
  120. at1=Y(t-1);
  121. for i=1:q
  122. at1=-W(i)*Y(t-i-1)+at1;
  123. end
  124. %at1=Y(t-1)-W(1)*Y(t-2)-W(2)*Y(t-3)-W(3)*Y(t-4)-W(4)*Y(t-5)-W(5)*Y(t-6);
  125. C=at*at1+C;
  126. K=(at)^2+K;
  127. end
  128. p=C/K ; %若p接近于零,则{at}可看作是白噪声
  129. %--------------------------------{at}的自相关系数,趋近于零,模型适用---------%
  130. %%
  131. %------------AR(5)模型方程为-----------------------------------------------%
  132. % X(t)=W(1)*X(t-1)-W(2)*X(t-2)-W(3)*X(t-3)-W(4)*X(t-4)-W(5)*X(t-5)+at
  133. %------------------------------------------后六年的数据 进行预测和效果检验------------------------------------%
  134. %注意注意注意a为测试集的元素个数
  135. %-----------------------------单步预测 预测当前时刻后的a个数据---------------%
  136. XT=[L(n-q+1:n+a)];
  137. for t=q+1:q+a
  138. m(t)=0;
  139. for i=1:q
  140. m(t)=W(i)*XT(t-i)+m(t);
  141. end
  142. end
  143. m=m(q+1:q+a);
  144. %-------------预测值进行反处理---------------%
  145. for i =1:a
  146. m(i)=Yt(n+i+1)+m(i); %一次反差分
  147. z1(i)=P(n+i+1)+m(i);%二次反差分
  148. end
  149. % z1 ; % 单步预测的向后6个预测值
  150. %---------------------------绘制数据模型逼近曲线----------------------------%
  151. for t=q+1:n
  152. r=0;
  153. for i=1:q
  154. r=W(i)*Y(t-i)+r;
  155. end
  156. at= Y(t)-r;
  157. end
  158. figure;
  159. for t=q+1:n
  160. y(t)=0;
  161. for i=1:q
  162. y(t)=W(i)*Y(t-i)+y(t);
  163. end
  164. y(t)=y(t)+at;
  165. y(t)=Yt(t+1)-y(t);
  166. y(t)=P(t+1)-y(t); %反差分的过程
  167. end
  168. plot(y,'r.'); % 样本数据模型逼近曲线
  169. hold on;
  170. plot(n+2:n+a+1,z1,'r-*'); %向后a布预测
  171. hold on;
  172. plot(P,"--"); % 原样本曲线
  173. title('AR(q)模型样本逼近预测曲线');
  174. legend("训练样本预测值","测试集预测值","真实值","Location","best");
  175. %-------------------------检测单步预测误差
  176. D_a=P(n+2:end-1);
  177. for i=1:a
  178. e6_a(i)=D_a(i)-z1(i);
  179. PE6_a(i)= (e6_a(i)/D_a(i))*100;
  180. end
  181. e6_a; % 多步预测的绝对误差
  182. PE6_a; % 多步预测的相对误差
  183. 1-abs(PE6_a); % 准确率
  184. %------多步预测平均绝对误差
  185. mae6_a=sum(abs(e6_a)) /6 ;
  186. %------多步预测平均绝对百分比误差
  187. MAPE6_a=sum(abs(PE6_a))/6
  188. %------绘制预测结果和实际值的比较图
  189. figure;
  190. plot(1:a,D_a,'-+')
  191. hold on;
  192. plot(z1,'r-*');
  193. title('单步,向后a步预测值和实际值对比图');
  194. legend("真实值","预测值","Location","best");
  195. hold off;
  196. %%
  197. %-----------------------------绘制数据模型逼近曲线--------------------------%
  198. %-------------------------预测误差分析(多步)------------------------%
  199. %----------------------------------多步预测 目的是向后aa步预测--------------%
  200. Z(1)=0;Xt=0;
  201. for i =1:q
  202. Xt(1,i)=Y(n-q+i);
  203. end
  204. %Xt=[ Y(n-4) Y(n-3) Y(n-2) Y(n-1) Y(n)]; %取当前时刻之前的q个数据
  205. for i =1:q
  206. Z(1)=W(i)*Xt(q-i+1)+Z(1);
  207. end
  208. %Z(1)=W(1)*Xt(5)+W(2)*Xt(4)+W(3)*Xt(3)-W(4)*Xt(2)-W(5)*Xt(1) ;
  209. %------求向前l步的预测值
  210. %预测步数小于q时
  211. for l=2:q
  212. K(l)=0;
  213. for i=1:l-1
  214. K(l)=W(i)*Z(l-i)+K(l);
  215. end
  216. G(l)=0;
  217. for j=l:q
  218. G(l)=W(j)*Xt(q+l-j)+G(l);
  219. end
  220. Z(l)=K(l)+G(l);
  221. end
  222. %预测步数大于q时(向前aa步预测)
  223. for l=q+1:aa
  224. K(l)=0;
  225. for i=1:q
  226. K(l)=W(i)*Z(l-i)+K(l);
  227. end
  228. Z(l)=K(l);
  229. end
  230. %----预测值进行反标准化处理
  231. r=Z*v+Ux ;
  232. r(1)=Yt(n+2)+r(1); %一次反差分
  233. z(1)=P(n+2)+r(1) ; %二次反差分
  234. for i=2:aa
  235. r(i)=r(i-1)+r(i);
  236. z(i)=z(i-1)+r(i) ;
  237. end
  238. %%
  239. %---------------------------- 预测误差分析 ------------------------------%
  240. %-------计算绝对误差和相对误差
  241. D=P(n+2:end-1);
  242. for i=1:aa
  243. e6(i)=D(i)-z(i);
  244. PE6(i)= (e6(i)/D(i))*100;
  245. end
  246. e6 ; % 多步预测的绝对误差
  247. PE6 ; % 多步预测的相对误差
  248. 1-abs(PE6) ; % 准确率
  249. %------多步预测平均绝对误差
  250. mae6=sum(abs(e6)) /6 ;
  251. %------多步预测平均绝对百分比误差
  252. MAPE6=sum(abs(PE6))/6
  253. %------绘制预测结果和实际值的比较图
  254. figure;
  255. plot(1:aa,D,'-+')
  256. hold on;
  257. plot(z,'r-*');
  258. title('多步,向后aa步预测值和实际值对比图');
  259. legend("真实值","预测值","Location","best");
  260. hold off;

原程序运行图窗结果:

命令行输出结果:

MAPE6_a =

    3.6147


MAPE6 =

   12.5103

由上可知:单步预测准确率约为96.4%

多步(这里是8步)预测准确率约为87.5% 

方法2:用arima函数实现时间序列预测

  1. clc;clear;
  2. % 1. 读取数据 - 请将'B.xlsx'替换为您的数据文件名,并将'data(:,2)'根据要预测的列确定
  3. data = readmatrix('B.xlsx');
  4. time_series_data = data(:,2);
  5. % 2. 划分训练集和测试集 - 这里使用80%的数据作为训练集,您可以根据需要调整比例
  6. train_size = round(length(time_series_data) * 0.8);
  7. train_data = time_series_data(1:train_size);
  8. test_data = time_series_data(train_size+1:end);
  9. % 3. 初始化最小AIC和BIC以及最优参数 - 选择模型参数的范围(p、d、q的最大值)
  10. max_p = 5;
  11. max_d = 2;
  12. max_q = 5;
  13. min_aic = Inf;
  14. min_bic = Inf;
  15. best_p = 0;
  16. best_d = 0;
  17. best_q = 0;
  18. % 4. 循环遍历不同的p, d, q值,尝试拟合ARIMA模型,并计算AIC和BIC
  19. for p = 0:max_p
  20. for d = 0:max_d
  21. for q = 0:max_q
  22. % 创建ARIMA模型
  23. Mdl = arima(p, d, q);
  24. % 拟合模型,并计算AIC和BIC
  25. try
  26. [EstMdl,~,logL] = estimate(Mdl, train_data, 'Display', 'off');
  27. [aic, bic] = aicbic(logL, p + q + 1, length(train_data));
  28. catch
  29. continue;
  30. end
  31. % 更新最优参数
  32. if bic < min_bic
  33. min_aic = aic;
  34. min_bic = bic;
  35. best_p = p;
  36. best_d = d;
  37. best_q = q;
  38. end
  39. end
  40. end
  41. end
  42. % 5. 使用最优参数创建ARIMA模型
  43. best_mdl = arima(best_p, best_d, best_q);
  44. % 6. 拟合模型
  45. EstMdl = estimate(best_mdl, train_data);
  46. % 7. 对测试集数据后的值进行预测 - 设定预测步长
  47. num_steps = 20; % 预测测试集之后的20天数据
  48. [forecast,forecast_RMSE] = forecast(EstMdl, num_steps, 'Y0', train_data);
  49. % 计算 95% 置信区间
  50. z = norminv(0.975);
  51. forecast_CI = [forecast - z * forecast_RMSE, forecast + z * forecast_RMSE];
  52. % 8. 输出预测结果
  53. disp(['预测结果(', num2str(num_steps), '个步长):']);
  54. disp(forecast);
  55. disp(['预测置信区间(', num2str(num_steps), '个步长):']);
  56. disp(forecast_CI);
  57. % 9. 可视化预测结果
  58. figure;
  59. hold on;
  60. plot(time_series_data, 'k', 'LineWidth', 1);hold on
  61. plot(train_size+1:train_size+length(test_data), test_data, 'b', 'LineWidth', 1); hold on% 绘制测试集数据
  62. plot(train_size+1:train_size+num_steps, forecast, 'r', 'LineWidth', 1);hold on
  63. xlim([1, length(time_series_data) + num_steps]);
  64. title('ARIMA 时间序列预测');
  65. xlabel('时间');
  66. ylabel('值');
  67. legend('实际数据', '测试集数据', '预测', 'Location', 'best');
  68. % 10. 输出模型参数
  69. disp(['最优模型参数: p = ', num2str(best_p), ', d = ', num2str(best_d), ', q = ', num2str(best_q)]);
  70. disp(['最小 AIC: ', num2str(min_aic)]);
  71. disp(['最小 BIC: ', num2str(min_bic)]);

这个代码将首先使用AIC和BIC选择最优ARIMA模型参数,然后使用这些参数拟合训练集数据。接下来,它将预测测试集数据后的10个步长。预测结果和预测置信区间将分别输出。您可以根据需要调整预测步长。

以下参数可以根据您的实际情况进行设定:

  1. 数据文件名和数据列名: 将your-data.csv替换为您的实际数据文件名,并将your_column替换为您的数据列名。

  2. 训练集和测试集的划分比例: 代码中使用train_size = round(length(time_series_data) * 0.8);将数据划分为80%的训练集和20%的测试集。您可以根据需要更改0.8这个比例。

  3. ARIMA模型参数: 代码中使用Mdl = arima(p,d,q);创建一个ARIMA(p,d,q)模型。这里的数字分别代表AR(自回归)、I(差分)和MA(移动平均)的阶数。您可以根据您的时间序列数据特点选择不同的参数。

  4. 预测步数: 代码中使用forecast_steps = 10;设定未来预测的步数。您可以根据需要更改这个数字。

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号