使用傅里叶变换的代理时间序列

机器算法验证 时间序列 Python 傅里叶变换
2022-04-05 07:05:39

代理时间序列 (Schreiber, Schmitz)论文中,作者声称可以通过对序列进行傅里叶变换,将随机相位乘以系数,然后再进行变换来生成二阶平稳时间序列的代理。此过程应保留自相关函数。我正在尝试使用 numpy 在 python 中实现这一点。

import numpy
import pandas
import matplotlib.pyplot as plt

numpy.random.seed(0)
ts = numpy.random.normal(0, 1, 1000)

pandas.tools.plotting.autocorrelation_plot(ts)
plt.ylim([-0.1,0.1])
plt.title('Autocorrelation function of random time series')

随机时间序列自相关

上述程序的尝试:

ts_fourier = numpy.fft.fft(ts)
ts_fourier_new = [x*numpy.exp(numpy.random.uniform(0,2*numpy.pi)*1.0j) for x in ts_fourier]
new_ts = numpy.fft.ifft(ts_fourier_new)

pandas.tools.plotting.autocorrelation_plot(new_ts)
plt.ylim([-0.1,0.1])
plt.title('Autocorrelation function of surrogate time series')

代理自相关

可以看出,代理的自相关函数与原始时间序列不同。我的实施中有什么错误?

1个回答

您需要将傅里叶变换(和逆变换)分别用于实时序列,即rfftirfft这样您就可以确保您的代理人是真实的。您可以通过将代码的相应行替换为以下内容来执行此操作:

ts_fourier  = numpy.fft.rfft(ts)
random_phases = numpy.exp(numpy.random.uniform(0,numpy.pi,len(ts)/2+1)*1.0j)
ts_fourier_new = ts_fourier*random_phases
new_ts = numpy.fft.irfft(ts_fourier_new)

(或者,您可以采用常规傅立叶变换并以反对称的方式对相位进行混洗。)

其余偏差源于时间序列的有限性:自相关函数的标识基于以下事实:原始时间序列和代理项具有每个构造相同的功率谱,而功率谱又通过以下方式链接到自相关函数维纳-欣钦定理然而,后者仅适用于有限时间序列,因为它实际上是关于过程的。

如果您查看具有“实际”突出频率分量而不仅仅是噪声的时间序列,这种影响会有所缓解。