如何通过应用汉明 window 使波形更平滑?

How to make smoother wave by apply hamming window?

我试着让波浪更平滑(从股价来看) 但我不知道如何将它应用到我的 wave 中。

import numpy as np
wave = [1575.7918235085228, 1574.2183726917613, 1571.9212868430398, 1569.5071067116478, 1568.4249178799716, 1567.4649192116478, 1566.7141801313921, 1565.9849054509943, 1565.4699951171874, 1566.766004527699, 1567.222733931108, 1567.4478271484375, 1566.3074729225852, 1563.4207475142045, 1559.6012806285512, 1555.0241965553978, 1552.6043723366477, 1550.9003773082386, 1549.0460116299716, 1548.2069202769887, 1549.2643687855114, 1551.792538174716, 1554.6467240767045, 1557.9874578302556, 1560.9547341086648, 1563.2614679509943, 1565.0818204012785, 1565.241825727983, 1565.4223677201705, 1566.1059992009943, 1566.3267223011364, 1566.7634410511364, 1566.691796875, 1567.2850763494318, 1567.2025368430398, 1566.6512761896306, 1567.7338201349432, 1569.591093306108, 1570.538554243608, 1571.8510919744317, 1573.8294588955966]
hamm = np.hamming(len(wave))

这是示例图片 Reference of hamming moving average from aspen program

我的波形变量是绘制后的绿线。 该程序具有对其应用汉明然后绘制红线的功能

所以我只想知道这个程序是怎么做的。

谢谢。

通常情况下,股票价格 "smoothed" 使用滑动 window 技术。 window 持续时间通常为 10-100 天左右。从第 1 天开始,抓取接下来 N 天的数据并计算平均值(这里的 window 时间是第 1 天到第 1 + N 天)。这是第 1 天的新 "smoothed" 值。然后转到第 2 天并执行相同的操作,但现在您的 window 是第 2 天到 2+N,并且您有第 2 天的平滑值。重复直到 运行 数据不足。

每次执行此操作时,您都在不知不觉中应用了一个矩形 window 函数。矩形 window 函数在 window 中始终为 1,在其他任何地方都为 0。当您将原始数据乘以 window 时,您实际上只对落入 window 的数据点进行了采样。数据点的值没有改变,因为矩形 window 你乘以 1。

矩形 window 函数有一些不理想的特性。如果对其进行傅立叶变换,您会发现它具有非常高的旁瓣。这具有拓宽或 "smearing" 原始数据中的频率尖峰的效果。因此人们使用其他 windowing 函数,例如 hamming、hanning 等。这些 window 函数对于 window 函数中的每个点都没有常数值 1。

所以你需要在你的代码中做的是使用你的原始波数组并设置一个循环来提取 N 个样本,将它们乘以一个长度为 N 的汉明 window 数组,然后计算平均值和将其存储在一个新数组中。

来自@Tom Johnson 的建议。

df['wma'] = WMA(df['close'].values,N)
h_win = np.hamming(N)
close = df['close'].values

hma = [ np.nan for i in range(N-1) ]
sum_h = sum(h_win)

for i in range(N-1, len(close)) :
    summation = 0

    for j in range(N) :
        summation += h_win[j]*close[i-j]
    average = summation / sum_h

    hma.append(average)

df['hma'] = pd.Series(hma, index=df.index)

如果有人正在寻找它,它现在存在于 win_type 下 pandas 的滚动函数中。

pandas.DataFrame.rolling