知识库 > 数学方法 > 小波去噪

基于小波分析的金融时间序列消噪方法及应用    

  •     选取2009年4月20日~2003 年5 月19 日期间800个交易日的沪深市场沪深300日综合指数收盘价信号作为原始序列(图10-1)进行去噪实验(参加平台下的wavelet_Demo函数)。
        

        SetSysParam(PN_Stock(),"SH000300");
        SetSysParam(pn_date(),inttodate(20120731));
        close300 := nday(800,"时间",DateTimeToStr(sp_time(1)),"收盘价",close());
        

        
        上证综指800个交易日收盘价数据
        根据上述理论分析,将进行多分辨率分解到第3层,其中采用 Daubechies 小波系的db3小波(Tinysoft现有小波如表所示)和Sqtwolog阈值估计准则,进行消噪处理.分解示意图如图10-2所示,得到最后一次的低频信号,以及每次分解的高频信号.
         Tinysoft现有小波
    小波类小波
    Daubechies'db1' or 'haar', 'db2', ... ,'db45'
    Coiflets'coif1', ... , 'coif5'
    Biorthogonal'bior1.1','bior1.3','bior1.5','bior2.2','bior2.4','bior2.6','bior2.8','bior3.1','bior3.3','bior3.5', 'bior3.7','bior3.9','bior4.4','bior5.5','bior6.8'
    Reverse Biorthogonal'rbio1.1','rbio1.3','rbio1.5','rbio2.2','rbio2.4','rbio2.6','rbio2.8','rbio3.1','rbio3.3','rbio3.5','rbio3.7','rbio3.9','rbio4.4','rbio5.5', 'rbio6.8'

        
        Ret := Wavedec(close3,3,"db3");//函数输出图10-2中的C和L.
        

        定义:wavedec(X:Array,N: Integer,Wname:String):Array;
        说明:使用给定的小波wname进行一维多尺度离散小波分析,返回信号xin在n层上的小波分解。输出分解结构包含小波分解向量C和相应的记录向量L.分解示意参
        见图10-2
        参数:
        X:一维序列,一维数字数组
        N:小波分解层数,正整数 
        Wname:基础小波函数,字符串类型,输入参见表
        

        CA2CA2CD2XCA1CD1CA3CD3CA3CD3CD2CD1Length ofCA3Length ofCD3Length ofCD2Length ofCD1Length ofXCL
        小波分解示意图
        
        wavedec函数输出结果
        第一行是小波分解向量C,第二行是相应的记录向量L
        
        
        依次是是CA3/CD3/CD2/CD1
        然后提取CA3低频信号及根据固定阈值处理的高频信号CD1,CD2,CD3,  利用重构公式进行小波重构,就可以得到小波去噪后的序列了.
        

        定义:wavelet(s:Array,wname:String,n:Integer,options:Array):Array;
        说明:一维序列小波消噪
        参数:
        s : 一维序列,一维数字数组
        wname:基础小波函数,字符串类型,取值参见11-1
        n : 小波分解层数,正整数 
        options:选项,参见表11-2
        

        wavelet函数options字段
    'brief'默认为1 采用简单剔除高频谐波 达到消噪的目的,如果为 0 采用估计序列噪音标准差剔除噪音
    'sigma'实数为0 默认采用序列的高阶谐波估计标准差;也可自己输入值
    'which'整数,以 某一层谐波作为噪音估计的数据,默认第一层
    'alpha'实数,阈值惩罚系数,默认为2
    "thr"字符串,阈值大小,默认0 采用谐波估计,也可以直接给出
    'sorh'字符串,阈值方式设置,'s' 软阈值,'h'硬阈值 默认为's'

        

        options := array('brief':0,'sigma':0,'which':1,'alpha':2,"thr":0,'sorh':'s');// 参数字段参见表10-2
        qvzao_close3:=wavelet(close3,"db3",3,options) ;
        return qvzao_close3|close3;
        

        
        去噪后的数据和原始数据的对比
        将去噪后的序列与原始收盘价序列进行比较后,可以发现大部分的小幅波动被去除,  而信号的主要特征均被保留, 得到1组消噪的时间序列.由于小幅干扰的噪声已被去除, 对于以下金融时间序列的建模可以更为方便,  而且更能反映序列的主要特征.为了验证消噪的结果,  可以将原始序列与消噪后的新序列进行时间序列的建模, 使用ARIMA模型来拟合序列,经过差分平稳化过程,观察其自相关和偏自相关分析图定阶,AIC从备选模型中选出最佳模型, 最终我选择 ARIMA(6,1,0)模型进行建模,得到相应的估计序列图分别为图10-5以及图10-6.为了更清晰的说明问题,我们得到800个完整数据在2种方法建模下的预测误差均方根值:原始序列建模预测方法为1764719, 
        

        //ADF检验与差分
        //return Times_ADFTest(qvzao_close3,0,0,"AIC",0,0.05);
        chafen := array();
        chafen2 := array();
        for i := 1 to length(qvzao_close3)-1 do
        chafen[i-1] := qvzao_close3[i]-qvzao_close3[i-1];
        //return  Times_ADFTest(chafen,0,0,"AIC",0,0.05);
        for i := 1 to length(qvzao_close3)-1 do
        chafen2[i-1] := close3[i]-close3[i-1];
        //中心化
        a := mean(chafen);
        a2 := mean(chafen2);
        chafen := chafen -a;
        chafen2 := chafen2 -a2;
        //拟合AR模型
        coff := -ARMA(chafen,6,0)["AR"][1:];
        coff2 := -ARMA(chafen2,6,0)["AR"][1:];
        coff := coff[array(5,-1)->0];
        coff2 := coff2[array(5,-1)->0];
        //差分序列预测
        chafen_fore := chafen;
        chafen_fore2 := chafen2;
        for i:=6 to length(chafen)-1 do
        begin
        chafen_fore[i] := sum(coff*chafen[(i-6):(i-1)]);
        chafen_fore2[i] := sum(coff2*chafen2[(i-6):(i-1)]);
        end
        chafen_fore += a;
        chafen_fore2 += a2;
        //收盘价序列预测
        close_fore := qvzao_close3;
        close_fore2 := close3;
        for i:=1 to length(close3)-1 do
        begin
        close_fore[i] := qvzao_close3[i-1]+chafen_fore[i-1];
           close_fore2[i] := close3[i-1]+chafen_fore2[i-1];
        end
        //比较两者的残差平方和
        return array(sum((close_fore-close3)^2),sum((close_fore2-close3)^2));
        

        消噪序列建模预测误差平方和为1065984,不去除噪声拟合预测的误差平方和是1764719。从中可以看出,用消噪后的信号进行建模预测得到的估计值误差更小,也更能反映原始信号的波动情形,而如果不做处理直接进行建模,那么在预测的序列中增加了许多随机干扰,也就是随机误差比较多,这样会影响预测的结果.
        
        去噪数据估计模型的预测序列      原始数据估计模型的预测序列
        最后在补充个一维离散小波单支重构的函数:
        

        定义:wrcoef(O:String,C:Array,L:Array,Wname:String,N:Integer):Array;
        说明:一维离散小波单支重构,小波分析,小波重构中间函数或者细节系数(高频)提取
        参数:
        O:为字符串类型,'a' 一维离散小波单支重构,'d' 细节系数提取
        C:小波分解向量C,数组类型,参见Wavedec函数的输出
        L:相应的记录向量L,数组类型,参见Wavedec函数的输出
        Wname:基础小波函数,字符串类型, 输入参见表10-1 
        N : 小波分解层数,正整数 
        

        举例:
        使用Wavedec中的输出,输入该函数中:
        

        wave := Wavedec(close3,3,"db3");
        C := wave[0];
        L := wave[1];
        //return  wrcoef('a',c,l,'db3',3); //去除前3层高频谐波,图10-7
        Return wrcoef('d',c,l,'db3',3);  //第3次分解得到的高频,图10-8
        

        
        图:去除前3层高频谐波             图:第3次分解得到的高频