资源描述
目 录
摘要…………………………………………………………………………………1
1 引言……………………………………………………………………………1
1.1 开发人员………………………………………………………………1
1.2 系统环境和限制…………………………………………………………1
1.3 系统主要功能 …………………………………………………………1
1.4 开发目的及意义 ………………………………………………………1
2 系统分析………………………………………………………………………2
2.1 系统目标…………………………………………………………………2
2.2 系统数据流程图…………………………………………………………2
3 系统设计原理……………………………………………………………………3
3.1 移动平均预测法………………………………………………………3
3.2 指数平滑预测法…………………………………………………………5
3.3 季节周期预测法…………………………………………………………7
3.3.1加法模型(季节变差法)…………………………………………7
3.3.2乘法模型(季节指数法)…………………………………………8
3.4 误差分析…………………………………………………………………9
3.4.1绝对误差与平均绝对误差…………………………………………9
3.4.2相对误差与平均相对误差…………………………………………9
3.4.3 标准差 ……………………………………………………………10
3.5 四种预测方法适用范围…………………………………………………10
4 系统设计……………………………………………………………………11
4.1 模块设计………………………………………………………………11
4.2 代码设计………………………………………………………………11
4.3 输入设计………………………………………………………………12
4.4 输出窗体的设计………………………………………………………13
4.5 主窗体设计……………………………………………………………13
5 系统实施和运行结果…………………………………………………………13
致谢…………………………………………………………………………………18
附录:主要源代码…………………………………………………………………19
参考文献……………………………………………………………………………50
确定性时间序列预测分析系统
摘要:本系统将经济预测中几种典型的时间序列分析方法模型(移动平均模型、指数平滑模型、季节周期模型)通过算法实现,能够对已知的数据进行检验、分析处理,得出预测数据和图形,为决策者提供依据。
关键词:确定性时间序列、影响因素、权向量、移动平均、指数平滑、季节指数、季节变差
Abstract:This system realize several typical time array analytical method model of economic forecasting through algorithm, examine, analyse and deal with to data that know already, Draw and predict the data and figure . Offer the data in the future to policymaker .
Key Words: Determinacy time array, influence factor, right vectorial, rolling average, index level and smooth, Season index, Season difference.
1.引言
1.1 开发人员:
1.2 系统环境和限制:
硬件、软件和运行环境方面的限制:
运行环境:
软件:Windows95 以上
硬件:486以上、彩色图形显示器
开发软件:
Delphi中文企业版5.0
Microsoft Access
1.3 系统主要功能
通过系统提供的几种经济预测模型,实现对预测项目自身的历史样本数据的分析和处理,快捷直观地显示预测项目的变化规律,为预测者提供未来的未知数据,并配合以误差分析,辅助决策者的预测决策工作。
1.4 开发目的及意义
由于经济变量的统计资料大多是时间序列,因而研究时间序列的发展变化的规律对经济预测和分析有非常重要的意义。它不考虑、不研究影响因素对预测目标的影响如何,只研究作为各个影响因素综合影响的结果,只需用预测目标的历史统计数据即可进行预测。因此当无法找到或确定预测目标的主要影响因素时,或者是能确定但是却不能获得相关数据,就适宜运用时间序列预测法。由于它只用到预测目标过去的历史资料,故比较容易收集,且费用较低,是一种比较经济适用,应用广泛的预测方法。本系统利用可视化Windows应用程序开发工具——Delphi5.0开发完成,使界面更友好,操作更方便。
2. 系统分析
2.1 系统目标
2.1.1提供与操作系统的接口。
2.1.2系统必须的数据输入。
2.1.3提供四种经济预测模型。
2.1.4输出各种预测未来的数据,以及事前的样本数据,事后预测数据的趋势图和预测数据值等信息。
2.1.5误差分析,选择精度最高的最优模型。
2.2 系统数据流程图
确定性时间序列预测分析系统
数据
存档
用 户
输入数据 数据保存
预测值 数据读取
预测图
存储数据
数据录入
输入样本数据
读取数据
设置查询条件
数据查询
获得查询结果
用户
(预测人员)
预测图形
数据文件
预 测
预测值
误差分析
读取数据
读取数据
获取预测结果
设置预测条件
选择预测模型
选取最优预测模型
如图1:确定性时间序列预测分析系统数据流程图
3. 系统设计原理
3.1 移动平均预测法
移动平均预测法使实际中常用的一种预测方法,它是利用时间序列的
移动平均序列构造预测模型而进行预测的。
3.1.1 简单移动平均
若时间序列{}则算术平均值为:
(≥)
称为时段长为N的移动平均。
由时间序列{}用移动平均公式得到的序列称为移动平均序列,并且将第t期的移动平均值作为t+1期序列的预测值。由于移动平均序列的值滞后于原时间序列值,所以简单移动平均预测法适用于预测目标的基本趋势是在某一水平上下波动的情形,并且只适用于短期预测。它另外一个作用是对原来的预测变量序列进行修匀,消除不规则影响。并且当越大时,对预测变量的修匀作用越大,所得到的移动平均序列越平稳,但的值也滞后越大,对经济现象的反映速度越不灵敏;反之,越小,修匀也作用越小,灵敏度则越高。
将公式变形为如下递推形式:
称为一次移动平均序列。
为二次移动平均序列。
3.1.2 趋势移动平均预测法
趋势移动平均预测模型为:
式中为当前日期,为预测时段长,分别为线形趋势方程的截距和斜率。
其中
此模型是根据一次移动平均序列及二次移动平均序列 建立的。
3.2 指数平滑预测法
指数平滑法对各期数据按时间顺序加权,体现了近期数据比远期数据有更大的作用,因而更能刻画出经济现象变化的情况;指数平滑法可以利用全部的数据,不需要存储很多历史数据,而且计算简单,适用于中、短期预测。它对时间序列有进行平滑修匀的作用。
3.2.1 指数平滑公式:
设时间序列由一次指数平滑公式
为加权系数,
可以计算出各期平滑预测值,若用第期的一次平滑预测值作为第期的预测值,则可由下述公式计算:
式中()成为第期预测误差,因此上述公式也可以写为
后期预测值=前期预测值+前期预测误差
若在上述公式中分别以依次代替,则可以化为
……
可见加权系数是首项为的公比数列,公比为,当 时,其和为
体现了权数的大小,越是近期的数据,加权系数越大,反之,越是远期数据,加权系数越小。一般来说,取0.01-0.3之间。
3.2.1.1 一次指数平滑
由得
其中
3.2.1.2 二次指数平滑
将一次指数平滑序列再进行指数平滑,则得到二次平滑指数:
3.2.1.3 三次指数平滑
同上理,由二次指数平滑序列进行指数平滑,可得
3.2.2 指数平滑预测模型
由于指数平滑同样存在滞后问题,因而指数平滑值不宜直接作为预测结果,一般用它来修匀时间序列,获得时间序列的变化趋势,从而建立预测模型。
3.2.2.1 线性趋势模型
利用一次、二次指数平滑序列建立如下指数平滑线性趋势预测模型:
式中为当前时点处的一次、二次指数平滑值,为预测时段长。
3.2.2.2 二次曲线趋势模型
当时间序列存在非线性趋势变化时,则利用一次、二次、三次指数平滑序列建立如下指数平滑二次曲线趋势预测模型:
3.3 季节周期预测法
在实际问题中,时间序列除了具有变化趋势外,往往还有周期波动,本预测方法就是先分离出时间序列的变化趋势和季节波动,然后按加法、乘法模型进行组合,而得到预测模型。
3.3.1加法模型(季节变差法)
如果时间序列消除了趋势变化影响后的季节波动,按时间先后,在各周期相应的同一季节的振幅变化不大,比较稳定,宜用此方法。
设季节周期波动预测模型为 j=1,2,…T
为趋势变动函数,为第j个季节段的季节变差,它表示季节性变动幅度的大小(即以为中心上下波动的振幅)。
3.3.1.1 求长期趋势变动函数
可用趋势移动平均法或时间回归法,设趋势方程为
可求得t=1,2,…n时的趋势值,,…。
3.3.1.2 估计季节变差
a.计算各期样本季节变差值 (t=1,2,…n)
b.计算平均季节变差
j=1,2,…T
c.计算正规化平均季节变差
正规化平均季节变差为季节变差的估计值
3.3.1.3 预测模型
所对应的季节段为第j个季节段。
3.3.2乘法模型(季节变差法)
如果时间序列消除了趋势变化影响后的季节波动,按时间先后,在各周期相应季节的振幅,随趋势值的增加(减少)而增加(减少),宜用此方法。
设季节周期波动预测模型为 j=1,2,…,T
是时间序列的长期趋势变动函数,T是一个完整周期所包含的季节段的个数(如以一年为一个周期,则当以月为季节段时,T=12;以季为季节段时,T=4),是第j个季节段的季节指数,表示季节性变动的幅度。
3.3.2.1 求长期趋势变动函数
可用趋势移动平均法或时间回归法,设趋势方程为
可求得t=1,2,…n时的趋势值,,…。
3.3.2.2 估计季节指数
a.计算各期的样本季节指数值 (t=1,2,…n)
b.计算平均季节指数
j=1,2,…T
c.计算正规化平均季节指数
则
正规化平均季节指数为季节指数 的估计值。
3.3.2.3 预测模型为
所对应的季节段为第j个季节段。
3.4 误差分析
误差分析是衡量一个预测模型预测精度得重要步骤,通过误差分析用户能准确的找出误差值最小、精度最高的最优预测模型对预测项目进行预测。常见的有以下三种误差分析方法:
3.4.1 绝对误差与平均绝对误差
绝对误差:
绝对误差S.D表示在时点t的实际值与预测值的偏差,反映了预测模型在时点t的预测精度。
平均绝对误差:
平均绝对误差M.S.D表示在时点1至N这段时间间隔内各时点绝对误差的平均值,反映了模型的预测精度。
3.4.2 相对误差与平均相对误差
相对误差:
相对误差S.R表示预测模型在时点t的绝对误差占预测变量实际值的百分比。
相对误差S.R比绝对误差S.D更能反映出预测模型的精度。
平均相对误差:
平均相对误差M.S.R表示在时点1至N这段时间间隔内各时点相对误差的平均值,它比平均绝对误差M.S.D更能反映出预测模型的精度。
3.4.3 标准差
标准差计算公式:
标准差S.M是表示预测模型预测精度的常用指标,其值越小,预测精度越高。
3.5 四种预测方法适用范围
简单移动平均预测法存储数据量较大,适用于预测目标的基本趋势是在某一水平上下波动的情形,并且只适用于短期预测,预测精度有限。
指数平滑法不需要存储很多历史数据,可以利用全部的数据,而且计算简单,适用于中、短期预测,预测精度相对高。
季节周期法只适用于季节性数据的预测。
4. 系统设计
4.1 模块设计
确定性时间序列预测分析系统
数 据 输 入
数 据 查 询
数据修改
系统主窗体
误 差 分 析
预测值与预测图形输出
预 测 模 型
乘 法 模 型
加 法 模 型
指数平滑法
移动平均法
如图2 :系统模块结构图
4.2 代码设计
4.2.1 系统所用数据均为一维数组:
样本数据以swatchdata[]为变量名,样本数据以“字符型”数据存入数据库中,以“实型”数据调出数据库用于计算和图形显示。
SwatchDate[]: 样本日期
SwatchYCZ[]: 预测值
SwatchWC []: 误差
4.2.2 创建一个MS ACCESS数据库:
数据库:sample.mdb
数据表:projoct,swatch
通过Delphi5.0所支持的ADO技术把XYADODataSet控件与数据源连接,将数据库绑定在控件上,实现其后台更改数据表,将预测结果放入其中。
4.2.3 输入检测:
任何可输入的地方,均实现对输入内容的检测,包括字符校验和数据范围校验,并有提示窗口弹出。
4.3 输入设计
4.3.1 手动输入数据
在项目窗体的“样本数据”页左边“样本数据”中可手动输入原始样本数据值,最多可输入1000个,点击按钮,数据被添加到右边数据表格中,同时可对右边表格中的数据进行修改、添加、删除等操作。点击“保存样本数据”按钮可将以上输入的数据录入MS ACCESS数据库中。
如图3:输入窗体设计
4.3.2 从数据库中录入数据
在查询窗口中输入查询条件,通过XYADODataSet控件与数据源连接,从sample.mdb数据库中读取数据。
如图4:查询窗体
4.4 输出设计
利用多页面组件swatchpage的多页面窗口实现四种预测模型的预测图形和预测值的输出,直观,易比较。
如图5:输出窗体
4.5 主窗体设计
如图6:主窗体
5. 系统实施与运行结果
5.1 启动系统
启动本系统,编译为bs.exe文件,点击进入系统主窗体。
5.2 调入数据
选择“查询”菜单项,输入查询条件:项目名称、建立日期等,再点击弹出窗口的“查看明细”按钮,可从数据库中调入以存的预测项目的数据。
例1:项目名称:副食品销售预测
建立日期:2002-5-26
客户名称:成都副食品公司
该例子为成都地区副食品公司1990年1季度至1993年2季度副食品销售额(万元)的历年数据,样本数据为季节性数据,若对其进行趋势分析与预测,则系统中的四个预测模型均可使用。
从数据库中获取以下数据:
如图7:“副食品销售预测”示例
5.3 移动平均预测模型演示
用户只需选择“移动平均”页面窗体,输入移动平均时段长N,及需要预测的时段长l,系统立即利用系统设计原理(相应的预测模型)对数据进行计算,先算出一次、二次移动平均序列、,再求出线性预测方程系数a、b构成预测方程,最后只输出预测值,并显示预测图形,其过程对用户是完全透明的,避免繁杂数据对预测人员的干扰。
例1中:
由于样本数据是季节性数据,则移动平均的时段长N应取4,才能符合数据变化规律。
预测1993年第3季度副食品销售额,即预测时段长为l=1,可得如图8的结果,预测值为2661.94万元。
预测1994年第2季度副食品销售额,即预测时段长为l=4,可得如图9的结果,预测值为2937.56万元。
随着输入得预测时段长l的不同,可预测不同时期的预测值。
如图8:L=1时
如图9:L=4时
5.4 指数平滑预测模型演示
选择“指数平滑”页面窗体,预测人员可输入加权系数,通常的选取为0.01-0.3之间,确定预测时段长l后即可求得线性预测模型的预测值、二次曲线预测模型的预测值和预测图形。
例1中:输入=0.3,l=1,点击按钮,可求得1993年3季度副食品销售额, 即:
线性预测模型预测值为2661.87万元
二次曲线预测模型预测值为2718.85万元(如图10)
同理:改变预测时段长l,可求出未来各期的预测值。
如图10
5.5 加法模型(季节变差法)演示
选择“加法模型”窗体,输入季节段数N=4(一般取4),再确定预测时段长l,即可求的预测值和预测图形。
例1中:输入N=4,l=1
可求得:
1993年3季度副食品销售额为2412.83万元(如图11)
同理:改变预测时段长l,可求出未来各期的预测值。
如图11
5.6 乘法模型(季节指数法)演示
选择“乘法模型”窗体,输入季节段数N=4(一般取4),再确定预测时段长l,即可求的预测值和预测图形。
例1中:输入N=4,l=1
可求得:1993年3季度副食品销售额为2332.76万元(如图12)
同理:改变预测时段长l,可求出未来各期的预测值。
如图12
5.7 误差分析
选择“误差分析”窗体,可比较四种预测模型得三种平均误差:平均绝对误差、平均相对误差、标准差。
如上所述,例1可用于四种预测模型,但要找出那种模型最适合这一预测项目,就需要使用误差分析,通过对四种模型的三种平均误差的分析比较,可选出误差最小,精度最高的最优模型。
各预测模型平均误差显示如图13,比较可得出加法模型是精度最高的最优预测模型,因此预测人员可选择该模型对该预测项目进行预测。
例1中移动平均预测法和指数平滑预测法侧重于体现预测项目的变化趋势,而不适用于预测样本值。
如图13
致谢:
在整个程序的设计过程中,衷心感谢我的指导老师和我的朋友们给予的大力支持和热情帮助,使我能够顺利完成毕业设计!
附录:主要源程序
程序名:bs
系统名:确定性时间序列预测分析系统——version1.0
作 者:郭 媛
Ø 预测窗体源代码
procedure Tfrmforecast.FormCreate(Sender: TObject);
begin
SwatchTable.Cells[0,0] := '样本时间';
SwatchTable.Cells[1,0] := '样本数据';
ADOConnection1.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+ MainForm.MyCurrentDir +'\sample.mdb;Persist Security Info=False';
end;
procedure Tfrmforecast.SwatchDeleteClick(Sender: TObject);
var
BeginRow,i,j :integer;
begin
BeginRow :=SwatchTable.Selection.Top;
for i:= BeginRow to SwatchTable.RowCount-1 do
begin
for j:= 0 to SwatchTable.ColCount do
SwatchTable.cells[j,i] := SwatchTable.cells[j,i+1];
end;
end;
procedure Tfrmforecast.BtnSaveClick(Sender: TObject);
var
i ,j:integer;
QueryString,UnitNo :string;
SwatchData,SwatchDate:string;
begin
if ProjectNo.Text = '' then
begin
showmessage('请输入项目名称');
SwatchPage.ActivePage := SwatchPage.Pages[0];
exit;
end;
if CustomerName.Text = '' then
begin
showmessage('请输入客户名称');
SwatchPage.ActivePage := SwatchPage.Pages[0];
exit;
end;
if DateUnit.Text = '' then
begin
showmessage('请输入时间序列单位');
SwatchPage.ActivePage := SwatchPage.Pages[0];
exit;
end;
if SwatchUnit.Text = '' then
begin
showmessage('请输入样本数据单位');
SwatchPage.ActivePage := SwatchPage.Pages[0];
exit;
end;
UnitNo:=ProjectNo.Text;
XYADODataSet.close;
QueryString := 'select ProjectID from project where ProjectID=''' + UnitNo +'''';
XYADODataSet.CommandText := QueryString;
XYADODataSet.Open;
if XYADODataSet.RecordCount >0 then
begin
if MessageDlg('『'+UnitNo + '』项目已经存在,是否替换?',
mtConfirmation, [mbYes, mbNo], 0) = mrYes then
begin
QueryString := 'delete * from Project where ProjectID=''' + UnitNo + '''';
ADOConnection1.Execute(QueryString);
QueryString := 'delete * from Swatch where ProjectID=''' + UnitNo + '''';
ADOConnection1.Execute(QueryString);
end
else
begin
UnitNo := '';
exit;
end;
end;
QueryString:= 'insert into Project(ProjectID,CustomerName,DateUnit,SwatchUnit,Pmemo,TDate) values(''' + unitno + ''',''' + CustomerName.text + ''' ,'''+ SwatchUnit.text + ''','''+ DateUnit.Text + ''','''+ UnitMemo.Text + ''',#'+ DateToStr(Date)+ '#);';
ADOConnection1.Execute(QueryString);
for i:=1 to SwatchTable.RowCount do
begin
if SwatchTable.cells[0,i] <> '' then
begin
SwatchDate := SwatchTable.cells[0,i];
SwatchData := SwatchTable.cells[1,i];
QueryString:= 'insert into Swatch(ProjectID,SwatchDate,SwatchData)'
+ 'values(''' + unitno + ''',''' + SwatchDate + ''',' + SwatchData +')';
ADOConnection1.Execute(QueryString);
end;
end;
showmessage('『'+ProjectNo.Text+'』保存成功');
end;
procedure Tfrmforecast.BtnAddClick(Sender: TObject);
var
i :integer;
littlesum :single;
begin
if SwatchDate.Text = '' then
begin
showMessage('请输入样本数据日期');
exit;
end;
if Swatch.Text = '' then
begin
showMessage('请输入样本数据');
exit;
end;
for i:=1 to SwatchTable.RowCount do
begin
if SwatchTable.cells[0,i] = '' then
begin
SwatchTable.cells[0,i] := SwatchDate.Text;
SwatchTable.cells[1,i] := Swatch.Text;
Swatch.Text := '';
SwatchDate.Text := '';
SwatchTable.RowCount := i+1;
exit;
end;
end;
end;
procedure Tfrmforecast.FormShow(Sender: TObject);
var
QueryString,typename,name:string;
j,rscount:integer;
littlesum:single;
begin
if ReSearchNO<>'' then
begin
XYADODataSet.close;
QueryString := 'select ProjectID,CustomerName,TDate,DateUnit,SwatchUnit from project where ProjectID=''' + ReSearchNO +'''';
XYADODataSet.CommandText := QueryString;
XYADODataSet.Open; ProjectNo.text:=XYADODataSet.Fields.FieldByName('ProjectID').value; CustomerName.text:=XYADODataSet.Fields.FieldByName('CustomerName').value;
DateUnit.text:=XYADODataSet.Fields.FieldByName('DateUnit').value;
SwatchUnit.text:=XYADODataSet.Fields.FieldByName('SwatchUnit').value;
XYADODataSet.close;
QueryString := 'select ProjectID,SwatchDate,SwatchData from Swatch where ProjectID=''' + ReSearchNO +'''';
XYADODataSet.CommandText := QueryString;
XYADODataSet.Open;
RSCount := XYADODataSet.RecordCount;
littlesum := 0;
if RSCount>0 then
begin
for j:=1 to rscount-1 do
begin
SwatchTable.cells[0,j]:=XYADODataSet.Fields.FieldByName('SwatchDate').value; SwatchTable.cells[1,j]:=floattostrf(XYADODataSet.Fields.FieldByName('SwatchData').value,ffFixed,18,2);
XYADODataSet.FindNext ;
end;
SwatchTable.cells[0,RSCount]:=XYADODataSet.Fields.FieldByName('SwatchDate').value;
SwatchTable.cells[1,RSCount]:=XYADODataSet.Fields.FieldByName('SwatchData').value;
end;
XYADODataSet.close;
end;
SwatchPage.Pages[0].Show;
end;
procedure Tfrmforecast.MAPaintBoxPaint(Sender: TObject);
var
i,j,num :integer;
MinSwatchData,MaxSwatchData,HighSwatchData : real;
ImageWidth,ImageHigh,N : integer;
a,b,Mt1,Mt2,SumWC,AvgWC: real;
SwatchData : array[1..1000] of real; //样本数据
SwatchDate : array[1..1000] of String; //样本日期
SwatchMa : array[1..1000] of real; //移动平均
SwatchWC : array[1..1000] of real; //误差
begin
//画矩形
MaPaintBox.Canvas.Pen.Color := TColor($00000000);
MaPaintBox.Canvas.Brush.Color := TColor($00000000);
MaPaintBox.Canvas.Rectangle(0,0,MAPaintBox.Width,MAPaintBox.Height);
//画包含图形的矩形框
MaPaintBox.Canvas.Pen.Color := clRed;
MaPaintBox.Canvas.Pen.Style := PsSolid;
MapaintBox.Canvas.MoveTo(55,20);
MapaintBox.Canvas.LineTo(55,MAPaintBox.Height-20);
MapaintBox.Canvas.LineTo(MAPaintBox.Width-5,MAPaintBox.Height-20);
MapaintBox.Canvas.LineTo(MAPaintBox.Width-5,20);
MapaintBox.Canvas.LineTo(55,20);
//画矩形框架中的虚线
MaPaintBox.Canvas.Pen.Style := PsDot;
MapaintBox.Canvas.M
展开阅读全文