【FinE】EMD/EEMD方法及金融数据分解

EMD

经验模型分解是以傅里叶变换为基础的线性和稳态频谱分析,该方法根据自身时间尺度进行信号分解,不需要设置基函数,这种特性使得EMD方法可以在理论上适合任何信号的分解。
EMD方法的核心在于经验模式分解,可以使复杂信号分解为有限个本征模函数(intrinsic mode function, IMF),分解得到的信号包含了原始信号中不同时间尺度的局部特征信号,经验模态分解法可以使得非平稳数据进行平稳化处理,然后进行Hilbert变换得到时频谱图.

本征模函数

如果瞬时频率有意义,那么函数需要对称,局部均值为零,并且有着相同的过零点和极值点的数目,本征模函数的任何一点的瞬时频率都是有意义的. EMD分解的目的就是为了获得本征模函数,然后对各本征模函数进行希尔伯特变换,得到Hilbert谱.
Huang给出本征模函数需要满足的条件

  1. 函数在整个时间范围内,局部极值点和过零点的数量必须相等或者最多相差一个.
  2. 在任意时刻点,局部最大值的包络和局部最小值的包络平均值为0.

EMD分解

在任意时间点上,数据可能包含多个波动模式,所以需要分解处理
分解的基本假设为:

  1. 数据至少两个极值,一个极大值和一个极小值
  2. 数据的局部时域特性是由极值点的时间尺度唯一确定
  3. 如果数据没有极值点但是存在拐点,可以进行微分求出极值,然后通过积分得到分解结果,sifting过程

对于信号 x ( t ) x(t) x(t)的EMD分解步骤如下:

  1. 找到 x ( t ) x(t) x(t)的所有极值点
  2. 使用插值方法得到极小值点形成的下包络emint(t)以及极大值形成的上包络emax(t)
  3. 计算均值 m ( t ) = ( e m i n t ( t ) + e m a x ( t ) ) / 2 m(t)=(emint(t)+emax(t))/2 m(t)=(emint(t)+emax(t))/2
  4. 剥离均值 d ( t ) = x ( t ) − m ( t ) d(t)=x(t)-m(t) d(t)=x(t)m(t)
  5. 对残余部分继续使用以上步骤

EMD steps

EMD分解存在的问题

  1. EMD分解得到的IMF存在模态混合现象
  2. 末端效应影响分解结果

EEMD(ensembled EMD)

Handrin等人用EMD对白噪声进行分解后对结果进行统计,提出了基于噪声辅助分析改进EMD的方法,根据白噪声的均匀分布的特性,在信号中加入白噪声可以将不同时间尺度的信号自动分离到其相适应的参考尺度上,即EEMD方法.

EEMD原理

如果信号的极值点分布不均与会出现模态混叠,由于白噪声的零均值特性,经过多次均值计算后噪音会相互抵消,集成计算的结果可以看做最终结果.
EEMD的计算步骤如下:

  1. 将白噪声加入到原始信号中
  2. 新的信号进行EMD分解
  3. 重复进行步骤1,2,每次加入新的White Noise
  4. 将每次循环得到IMF进行集成平均处理综合结果

EEMD

收盘价格序列分解:EMD

读取期货收盘价数据进行EMD分解得到分解图像如下

from PyEMD import EMD
import matplotlib.pyplot as plt

def emd_demo():
    emd = EMD()
    y = closep.values
    t = np.arange(len(y))
    IMF = emd.emd(y)
    n = IMF.shape[0]+1
    plt.subplot(n, 1, 1)
    plt.plot(t, y)
    plt.title('close price')
    # plt.xlabel('# of obs')

    for i, imf in enumerate(IMF):
        plt.subplot(n, 1, i+2)
        plt.plot(t, imf, 'g', lw=0.8)
        plt.title(f'IMF{i+1}')
        plt.xlabel('# of obs')

    plt.tight_layout()
    plt.show()

EMD

收盘价格序列分解:EEMD

def eemd_demo():
	eemd = EEMD()
    emd = eemd.EMD
    emd.extrema_detection='parabol'
    y = closep.values
    t = np.arange(len(y))
    IMF = eemd.eemd(y)
    n = IMF.shape[0]+1
    plt.figure(figsize=(12, 9))
    plt.subplot(n, 1, 1)
    plt.plot(t, y)
    plt.title('close price')
    # plt.xlabel('# of obs')

    for i, imf in enumerate(IMF):
        plt.subplot(n, 1, i+2)
        plt.plot(t, imf, 'g', lw=0.8)
        plt.ylabel(f'IMF{i+1}')
        # plt.xlabel('# of obs')
        plt.locator_params(axis='y', nbins=5) # 设置子图之间的上下间距

    plt.tight_layout()
    plt.show()
if __name__ == '__main__': # 多线程模块需要设置主线程
	eemd_demo()

EEMD

参考资料

PyEMD docs
EMD方法
Decomposing Signal Using Empirical Mode Decomposition
EMD算法python实现
EMD matlab toolbox
EEMD详解

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Quant0xff

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值