逆傅立叶变换系数

信息处理 傅里叶变换 Python 时间序列 倒谱分析
2022-02-03 11:37:25

语境

我想在股票数据(例如MSFT stock )上实现(真实)倒谱并实现这个时间序列的倒谱系数。

“基于谱的金融时间序列聚类”中所述(实)倒谱被定义为时间序列傅立叶变换的(实)对数的傅立叶逆变换”

因此,通过此参考,应采取以下步骤:

  1. 计算时间序列的傅里叶变换
  2. 从第 1 步结果中取(实)对数
  3. 最后计算上一步的傅里叶逆变换

这些是计算时间序列倒谱的步骤。

代码

在 python 中实现这样的过程应该不难:

# Import Packages
from scipy.fft import rfft , irfft
import numpy as np
# pandas_datareader for reading MSFT stock data
from pandas_datareader import data as web

# ------------------------------------------

# read MSFT stock data and store it as pandas.DataFrame
df = pd.DataFrame(web.get_data_yahoo('MSFT' , start='01-03-2013' , end='12-06-2018')['Adj Close'])

# ------------------------------------------

# define a function to calculate cepstrum of time series
def cepstrum(x: np.array):
    """
    This Function calculate cepstrum of a time series
    """
    return irfft(np.log(rfft(x)))

# ------------------------------------------

# run cepstrum function
cepstrum(df['Adj Close'].to_numpy())

输出:

array([-0.86680682, -0.0558877 , -0.03134206, ..., -0.01719479, 0.01535661, -0.00099603])

正如我一开始所说,我想实现倒谱系数。我认为倒谱系数是时间序列傅里叶变换的(实)对数的傅里叶逆变换的系数那么我怎样才能抓住这个过程的系数呢?irfft(np.log(rfft(x)))例如,我想获取此过程的前 5 个系数。但我不知道如何访问它们!因为scipy在后台做事!

附加说明:

“基于倒谱的金融时间序列聚类”中所述:

倒谱分析是一种非线性信号处理技术。实)倒谱定义为时间序列傅里叶变换的(实)对数的傅里叶逆变换为了定义倒谱,我们将首先考虑自回归移动平均 (ARMA) 过程。特别是 ARMA(p, q) 过程定义为:

在此处输入图像描述

其中 ,r = 1, 2, . . . . p 是自回归 (AR) 参数,,r = 1, 2, 。. . , q 是移动平均 (MA) 参数,而是白噪声过程。ARMA(p, q) 过程的谱密度定义为:ϕrθrϵt

在此处输入图像描述

其中的方差。估计的谱密度函数的对数可以使用对数谱密度函数的指数形式来近似,即:σ2ϵt

在此处输入图像描述

其中 0 < <,其中 r2 和, . . . , 是未知参数。Savvides 等人。(2008) 介绍了对数谱密度函数的对数的以下近似,即对数谱密度函数的谱,的倒谱。ωπψ1ψpXt

在此处输入图像描述

其中 =是白噪声过程的方差的对数。在 log\lambda_x(\omega) 的 (0,1) 上的绝对可积性下,的傅里叶系数 定义为:ψ001logλx(ω)dωϵtlogλx(ω)logλx(ω)

在此处输入图像描述

对于 k = 0, 1, 2, . . . 和被称为倒谱系数由于 的均方随着的增加而收敛,因此只有少数倒谱系数可以描述时间序列的二阶特征。logλx(ω)p

我不熟悉信号处理知识。所以有可能我推断出整个过程有问题。任何帮助,将不胜感激。

1个回答

我认为您的代码大部分都可以,但我不明白您的问题。只需打印它们,您就会得到系数print(ifft(np.log(fft(x)))[:5])

需要纠正的一件事是,您不能使用rfftirfft因为会破坏共轭对称性,因此倒谱不再是实数序列。lnF[x(n)]

至于真正的倒谱,它由 你可以通过. 在这种情况下很好。

cr(n)=F1{ln|F[x(n)]|}
irfft(np.log(abs(rfft(x))))rfftirfft