转自https://blog.csdn.net/qq_29831163/article/details/89440215
人家写的真好啊。。。。
时间序列
时间序列预测技术就是通过对预测目标自身时间序列的处理,来研究其变化趋势 的。一个时间序列可以分解为:
(1)长期趋势变动。它是指时间序列朝着一定的方向持续上升或下降,或停留在 某一水平上的倾向,它反映了客观事物的主要变化趋势。
(2)季节变动。
(3)循环变动。通常是指周期为一年以上,由非季节因素引起的涨落起伏波形相 似的波动。
(4)不规则变动。通常它分为突然变动和随机变动。
移动平均法
移动平均法是根据时间序列资料逐渐推移,依次计算包含一定项数的时序平均数, 以反映长期趋势的方法。当时间序列的数值由于受周期变动和不规则变动的影响,起伏 较大,不易显示出发展趋势时,可用移动平均法,消除这些因素的影响,分析、预测序列的长期趋势。
简单移动平均法只适合做近期预测,而且是预测目标的发展趋势变化不大的情况。 如果目标的发展趋势存在其它的变化,采用简单移动平均法就会产生较大的预测偏差和滞后。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gLU1kprL-1617109063596)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210330192218920.png)]
clc,clear
y=[533.8 574.6 606.9 649.8 705.1 772.0 816.4 892.7 963.9 1015.1 1102.7]; m=length(y);
n=[4,5]; %n 为移动平均的项数
for i=1:length(n)
%由于 n 的取值不同,yhat 的长度不一致,下面使用了细胞数组
for j=1:m-n(i)+1
yhat{i}(j)=sum(y(j:j+n(i)-1))/n(i);
end
y12(i)=yhat{i}(end);
s(i)=sqrt(mean((y(n(i)+1:m)-yhat{i}(1:end-1)).^2));
end
y12,s
加权移动平均法
在简单移动平均公式中,每期数据在求平均时的作用是等同的。但是,每期数据所包含的信息量不一样,近期数据包含着更多关于未来情况的信心。因此,把各期数据等同看待是不尽合理的,应考虑各期数据的重要性,对近期数据给予较大的权重,这就 是加权移动平均法的基本思想。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nyzRHXCH-1617109063598)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210330192446726.png)]
y=[6.35 6.20 6.22 6.66 7.15 7.89 8.72 8.94 9.28 9.8];
w=[1/6;2/6;3/6];
m=length(y);n=3;
for i=1:m-n+1
yhat(i)=y(i:i+n-1)*w;
end
yhat
err=abs(y(n+1:m)-yhat(1:end-1))./y(n+1:m) # 计算各年的相对误差 %
T_err=1-sum(yhat(1:end-1))/sum(y(n+1:m)) # 总的平均相对误差
y1989=yhat(end)/(1-T_err) # 修正预测值
**近期 数据的权数大,远期数据的权数小。**至于大到什么程度和小到什么程度,则需要按照预 测者对序列的了解和分析来确定。
趋势移动平均法
简单移动平均法和加权移动平均法,在时间序列没有明显的趋势变动时,能够准确 反映实际情况。但当时间序列出现直线增加或减少的变动趋势时,用简单移动平均法和 加权移动平均法来预测就会出现滞后偏差。因此,需要进行修正,修正的方法是作二次 移动平均,利用移动平均滞后偏差的规律来建立直线趋势的预测模型。这就是趋势移动平均法。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WKg4jqMl-1617109063602)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210330193501616.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-x0AYBAHL-1617109063606)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210330193529864.png)]
clc,clear
load y.txt %把原始数据保存在纯文本文件 y.txt 中
m1=length(y);
n=6; %n 为移动平均的项数
for i=1:m1-n+1
yhat1(i)=sum(y(i:i+n-1))/n;
end
yhat1
m2=length(yhat1);
for i=1:m2-n+1
yhat2(i)=sum(yhat1(i:i+n-1))/n;
end
yhat2
plot(1:21,y,'*')
a21=2*yhat1(end)-yhat2(end)
b21=2*(yhat1(end)-yhat2(end))/(n-1)
y1986=a21+b21
y1987=a21+2*b21
指数平滑法
对各期观测值依时间顺序进行加权平均作为预测值。指数平滑法可满足这一要求,而且具有简单的递推形式。
一次指数平滑法
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2QYO60v0-1617109063608)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210330195646744.png)]
clc,clear
load dianqi.txt %原始数据以列向量的方式存放在纯文本文件中
yt=dianqi;
n=length(yt);
alpha=[0.2 0.5 0.8];
m=length(alpha);
yhat(1,1:m)=(yt(1)+yt(2))/2;
for i=2:n
yhat(i,:)=alpha*yt(i-1)+(1-alpha).*yhat(i-1,:);
end
yhat
err=sqrt(mean((repmat(yt,1,m)-yhat).^2))
xlswrite('dianqi.xls',yhat)
yhat1988=alpha*yt(n)+(1-alpha).*yhat(n,:)
二次指数平滑法
clc,clear
load fadian.txt %原始数据以列向量的方式存放在纯文本文件中
yt=fadian;
n=length(yt);
alpha=0.3;
st1(1)=yt(1);
st2(1)=yt(1);
for i=2:n
st1(i)=alpha*yt(i)+(1-alpha)*st1(i-1);
st2(i)=alpha*st1(i)+(1-alpha)*st2(i-1);
end
xlswrite('fadian.xls',[st1',st2'])
a=2*st1-st2 b=alpha/(1-alpha)*(st1-st2)
yhat=a+b;
xlswrite('fadian.xls',yhat','Sheet1','C2')
str=char(['C',int2str(n+2)]);
xlswrite('fadian.xls',a(n)+2*b(n),'Sheet1',str)
三次指数平滑法
clc,clear
load touzi.txt %原始数据以列向量的方式存放在纯文本文件中
yt=touzi;
n=length(yt);
alpha=0.3;
st1_0=mean(yt(1:3));
st2_0=st1_0;
st3_0=st1_0;
st1(1)=alpha*yt(1)+(1-alpha)*st1_0;
st2(1)=alpha*st1(1)+(1-alpha)*st2_0;
st3(1)=alpha*st2(1)+(1-alpha)*st3_0;
for i=2:n
st1(i)=alpha*yt(i)+(1-alpha)*st1(i-1);
st2(i)=alpha*st1(i)+(1-alpha)*st2(i-1);
st3(i)=alpha*st2(i)+(1-alpha)*st3(i-1);
end
xlswrite('touzi.xls',[st1',st2',st3'])
st1=[st1_0,st1];
st2=[st2_0,st2];
st3=[st3_0,st3];
a=3*st1-3*st2+st3;
b=0.5*alpha/(1-alpha)^2*((6-5*alpha)*st1-2*(5-4*alpha)*st2+(4-3*alpha)*st3); c=0.5*alpha^2/(1-alpha)^2*(st1-2*st2+st3);
yhat=a+b+c;
xlswrite('touzi.xls',yhat','Sheet1','D1')
plot(1:n,yt,'*',1:n,yhat(1:n),'O')
legend('实际值','预测值',2)
xishu=[c(n+1),b(n+1),a(n+1)];
yhat1990=polyval(xishu,2)
指数平滑预测模型是以时刻t为起点,综合历史序列的信息,对未来进行预测的。 选择合适的加权系数 α 是提高预测精度的关键环节。根据实践经验,α 的取值范围一 般以 0.1~0.3 为宜。 α 值愈大,加权系数序列衰减速度愈快,所以实际上 α 取值大小 起着控制参加平均的历史数据的个数的作用。 α 值愈大意味着采用的数据愈少。因此, 可以得到选择 α 值的一些基本准则。
序列趋势稳,预测偏差由随机因素造成,值小,减少修正幅度,使预测模型能包含更多历史数据的信息。如果预测目标的基本趋势已发生系统地变化,则 α 值应取得大一些。这样, 可以偏重新数据的信息对原模型进行大幅度修正,以使预测模型适应预测目标的新变 化。
指数平滑递推公式需要确定初始值S_0^1 S_0^2 S_0^3。
差分指数平滑法
当时间序列的变动具有直线趋势时,用一次指数平滑法会出现滞后偏差,其原因在于数据不满足模型要求。因此,我们也可以从数据变换的角度来考虑改进措施,即在运用指数平滑法以前先对数据作一些技术上的处理,使之能适合于 一次指数平滑模型,以后再对输出结果作技术上的返回处理,使之恢复为原变量的形态。 差分方法是改变数据变动趋势的简易方法。下面我们讨论如何用差分方法来改进指数平滑法。
一阶差分指数平滑法
指数平滑值实际上是一种加权平均数。因此把序列中逐期增 量的加权平均数(指数平滑值)加上当前值的实际数进行预测,比一次指数平滑法只用 变量以往取值的加权平均数作为下一期的预测更合理。从而使预测值始终围绕实际值上 下波动,从根本上解决了在有直线增长趋势的情况下,用一次指数平滑法所得出的结果 始终落后于实际值的问题。
α=0.4,差分指数平滑值即(26)
二阶差分指数平滑模型
差分方法和指数平滑法的联合运用,除了能克服一次指数平滑法的滞后偏差之外, 对初始值的问题也有显著的改进。因为数据经过差分处理后,所产生的新序列基本上是平稳的。这时,初始值取新序列的第一期数据对于未来预测值不会有多大影响。其次, 它拓展了指数平滑法的适用范围,使一些原来需要运用配合直线趋势模型处理的情况可用这种组合模型来取代。但是,于指数平滑法存在的加权系数 α 的选择问题,以及只能逐期预测问题,差分指数平滑模型也没有改进。
自适应滤波法
也是以时间序列的历史观测值进行 某种加权平均来预测的,它要寻找一组“佳”的权数,其办法是先用一组给定的权数 来计算一个预测值,然后计算预测误差,再根据预测误差调整权数以减少误差。这样反 复进行,直至找出一组“佳”权数,使误差减少到低限度。由于这种调整权数的过 程与通讯工程中的传输噪声过滤过程极为接近,故称为自适应滤波法。
clc,clear
yt=0.1:0.1:1;
m=length(yt);
k=0.9; N=2; Terr=10000;
w=ones(1,N)/N;
while abs(Terr)>0.00001
Terr=[];
for j=N+1:m-1
yhat(j)=w*yt(j-1:-1:j-N)';
err=yt(j)-yhat(j);
Terr=[Terr,abs(err)];
w=w+2*k*err*yt(j-1:-1:j-N);
end
Terr=max(Terr);
end
w, yhat
在开始调整权数时,首先要确定权数个数 N 和学习常数k 。一般说来,当时间序 列的观测值呈季节变动时, N 应取季节性长度值。如序列以一年为周期进行季节变动 时,若数据是月度的,则取 N =12 。若季节是季度的,则取N=4 。如果时间序列无 明显的周期变动,则可用自相关系数法来确定,即取 N 为高自相关系数的滞后时期。
k 的取值一般可定为1 / N,也可以用不同的k 值来进行计算,以确定一个能使S 小的k 值。
自适应滤波法有两个明显的优点:一是技术比较简单,可根据预测意图来选择权数 的个数和学习常数,以控制预测。也可以由计算机自动选定。二是它使用了全部历史数 据来寻求佳权系数,并随数据轨迹的变化而不断更新权数,从而不断改进预测。
趋势外推预测方法
趋势外推法是根据事物的历史和现时资料,寻求事物发展规律,从而推测出事物 未来状况的一种比较常用的预测方法。利用趋势外推法进行预测,主要包括六个阶段:
(a)选择应预测的参数; (b)收集必要的数据; (c)利用数据拟合曲线;
(d)趋势外 推;(e)预测说明;(f)研究预测结果在进行决策中应用的可能性。
趋势外推法常用的典型数学模型有:指数曲线、修正指数曲线、生长曲线、包络 曲线等。
指数曲线法
一般来说,技术的进步和生产的增长,在其未达饱和之前的新生时期是遵循指数 曲线增长规律的,因此可以用指数曲线对发展中的事物进行预测。
修正
任何事物的发展都是有一定限度的。例如某种畅销产 品,在其占有市场的初期是呈指数曲线增长的,但随着产品销售量的增加,产品总量接 近于社会饱和量时。这时的预测模型应改用修正指数曲线。
三和法
function chanliang
clc,clear
global a b k
load xsh.txt %原始数据存放在纯文本文件 xsh.txt 中
yt=xsh; n=length(yt);m=n/3
cf=diff(yt);
for i=1:n-2
bzh(i)=cf(i+1)/cf(i);
end
range=minmax(bzh)
s1=sum(yt(1:m)), s2=sum(yt(m+1:2*m)), s3=sum(yt(2*m+1:end))
b=((s3-s2)/(s2-s1))^(1/m) a=(s2-s1)*(b-1)/(b*(b^m-1)^2)
k=(s1-a*b*(b^m-1)/(b-1))/m
y=yuce(1:18)
%************************************
%定义预测函数
%************************************
function
y=yuce(t)
global a b k
y=k+a*b.^t;
Compertz 曲线
function chanliang2
clc,clear
global a b k
load xsh.txt %原始数据存放在纯文本文件 xsh.txt 中
yt=log(xsh); n=length(yt);m=n/3;
s1=sum(yt(1:m)), s2=sum(yt(m+1:2*m)), s3=sum(yt(2*m+1:end))
b=((s3-s2)/(s2-s1))^(1/m)
a=(s2-s1)*(b-1)/(b*(b^m-1)^2)
k=(s1-a*b*(b^m-1)/(b-1))/m a=exp(a)
k=exp(k)
y=yuce(1:18)
%************************************ %定义预测函数 %************************************ function y=yuce(t);
global a b k
y=k*a.^(b.^t);
Logistic 曲线(生长曲线)
在发展时期则突然加快, 而到了成熟期又趋减慢,形成一条 S 形曲线,这就是有名的 Logistic 曲线(生长曲线)
function chanliang3
clc,clear
global a b k
load xsh.txt %原始数据存放在纯文本文件 xsh.txt 中
yt=1./xsh; n=length(yt);m=n/3;
s1=sum(yt(1:m)), s2=sum(yt(m+1:2*m)), s3=sum(yt(2*m+1:end))
b=((s3-s2)/(s2-s1))^(1/m)
a=(s2-s1)*(b-1)/(b*(b^m-1)^2)
k=(s1-a*b*(b^m-1)/(b-1))/m
y=yuce(1:18)
%************************************ %定义预测函数 %************************************ function y=yuce(t);
global a b k
y=1./(k+a*b.^t);
当有几种趋势线可供选择时,应选择S 小的趋势线。
平稳时间序列模型
序列的统计特性不随时间的平移而变化,即均值和协方差不随时间的平移而变化。
自回归模型(Auto Regressive Model)简称 AR 模型,移动平均模型(Moving Average Model)简称 MA 模型,
自回归移动平均模型(Auto Regressive Moving Average Model)简称 ARMA 模型。
X(t) 为零均值(即中心化处理的)平稳序列。
一般自回归模型 AR(n)
白噪声序列
使X_t消去后边的依赖性,转换为独立的序列a_t ,拟合AR(n)模型就是让序列X_t独立化。
移动平均模型 MA(m)
移动平均法预测明天的气温Xt,它可以等于过去5天气温[25,26,27,28,29]的加权和,权重W = [0.4,0.25,0.2,0.1,0.05],那么Xt = 250.4 + 260.25 +270.2+ 280.1+ 29*0.05 ;移动平均模型求当前时刻t的课堂学习效率Xt; 它的模型逻辑是Xt与之前的线性无关,与过去的扰动线性相关,比如 t-1时窗外传来了巨大的噪音,t-2时老师讲了个笑话之类的,,这些是独立的扰动因素。
自回归移动平均模型 ARMA
在时间序列的时域分析中,线性差分方程是极为有效的工具。事实上,任何一个 ARMA 模型都是一个线性差分方程。
AR(1)系统的格林函数
格林函数就是描述系统记忆扰动程度的函数。
后移算子
由于格林函数就是差分方程解的系数函数,格林函数的意义可概括如下: