快速傅里叶滤波侵入/外汇即时报价数据去噪

Fast fourier filtering treshold / forex tick data denoising

提问人:Vinicento 提问时间:11/6/2023 最后编辑:maddes8chtVinicento 更新时间:11/8/2023 访问量:63

问:

我有一个大型的货币对分时数据数据集,我想使用傅里叶对其进行降噪。问题是我想自动找到一个用于过滤的侵扰点,它将成为更大系统的一部分,不断获取新数据并对其进行预处理。

感谢您抽出宝贵时间:)

这是我的代码,很容易找到这个阈值,绘制数据并尝试不同的值,但这不是一个选项


market_data=market_data["<BID>"]
market_data=market_data.fillna(method="ffill")
market_data=market_data.fillna(method="bfill")
market_data=market_data - market_data.mean()


fourier = np.fft.fft(market_data)
amplitude_filter=fourier.copy()

amplitude_filter[(np.abs(amplitude_filter) < treshold)] = 0 # part where i apply treshold

amplitude_filtered_back=np.fft.ifft(amplitude_filter)

以 Treshold 8000 为例example with treshold 8000

聊天频率过滤器示例example with frequency filter from chat

amplitude_filter=amplitude_filter[-80:]

原始数据original data,但我仍然需要决定选择哪些索引或什么 Treshold,我需要自动获得此结果

Python 信号 FFT 数据预处理 外汇

评论

2赞 lastchance 11/6/2023
您确定只去除高频分量而不是处理单个分量的振幅不是更好吗?例如,您可能希望删除频率高于“每天一次”的任何组件。至少,这在物理上是有道理的。
0赞 Vinicento 11/7/2023
是的,绝对是更合乎逻辑的方法,谢谢你。结果是相似的,但最后我仍然必须每天决定一次,我添加了一些屏幕截图,其中包含您的解决方案和我的绘图
0赞 pjs 11/7/2023
我认为标记这个会比使用更通用的受众更合适。fftalgorithm
0赞 Vinicento 11/7/2023
好点我换了标签

答:

0赞 Lourenço Monteiro Rodrigues 11/8/2023 #1

如果您绝对没有考虑带通滤波,我会继续思考:“我想保留多少变化?

这意味着,在计算FFT后,您可以选择对信号总功率的贡献小于X%的频率分量。

您可以使用以下方法执行此操作:

amplitudes = np.abs(fft)
amp_sorted_index = np.argsort(amplitudes) # save correspondence between original and sorted elements
sorted_amplitudes = amplitudes[amp_sorted_index] # sort amplitudes in ascending

contributions = np.cumsum(sorted_amplitudes)/np.sum(sorted_amplitudes)
threshold = 0.1 # if you chose to keep 90% of most contributing

to_delete = amp_sorted_index[contributions < threshold]

fft[to_delete] = 0

filtered_data = np.fft.ifft(fft)

但同样,这种滤波是不寻常的,它定义了一个截止频率,并有一个滤波器来实现直接的物理读数,正如@lastchance评论的那样。