量化研究 | 将数据下采样作为平滑技术

财富   2024-09-02 15:06   山西  

量化策略开发,高质量社群,交易思路分享等相关内容


将数据下采样作为平滑技术




为了避免虚假信号,交易者通过平滑市场数据来获得更好且更少的交易信号。但平滑滤波器有缺点,比如引入滞后。这里有一个有效的解决方案,它比你想象的要简单。

数据频谱中的高频分量,即数据或所有这些来自价格方向的额外波动,被交易者视为祸根,因为它们经常导致虚假交易。通常的方法是通过使用平滑滤波器(例如移动平均线)来减少它们对交易规则的影响。在过去,我引入了更有效的平滑滤波器,如SuperSmoother、有限脉冲响应(IIR)滤波器和Hann窗有限脉冲响应(FIR)滤波器。

现在我提议通过一种新方法来消除这些高频分量。









数据采样率




市场数据是采样的。例如,使用每日数据,我们每天只获得一个样本。无论这个样本是代表当天的收盘价、平均最高价、最低价和收盘价,还是其他可用统计数据的任意组合。我们每天仍然只能获得一个样本。可以提高采样率。例如,交易时段内每15分钟获取一次样本并不罕见。有时会有增加采样率的冲动,比如使用五分钟的K线、一分钟的K线,甚至每tick采样一次。这样的陷阱在于将分辨率与准确性混淆。更复杂的市场活动通过更高的采样率被揭示,但增加的分辨率并不一定会带来更高的交易利润。原因是市场数据是分形的,具有粉红噪声的频谱密度。也就是说,频谱中的周期分量的幅度与它们的波长直接相关。如果将波长缩短一半,则可以预期周期幅度将减半。因此,增加采样率必然会导致每笔交易的毛利润下降,因为数据波动减少了,其他条件保持不变。当执行足够的时间后,滑点和佣金的交易成本可能超过每笔交易的平均毛利润。

底线是,采样率的“最佳点”取决于交易者的技术。



一种新的平滑方法






无论采样率如何,我们仍然必须摆脱那些讨厌的高频分量。我的激进建议是:忽略它们。但忽略高频分量的做法并不意味着它们会消失。

采样数据与连续数据不同,因为它的最短可能波长恰好有两个样本每个周期。这称为奈奎斯特频率。采样数据根本不包含比奈奎斯特频率更短的波长信息。当然,那些频谱分量仍然存在于连续数据中。采样过程通过混叠处理这些较短的波长分量。也就是说,较短的波长分量被简单地折回可观察的频谱。

图1说明了混叠的原理,其中青色线每1.25周期被采样一次。青色线的波长短于奈奎斯特频率,因此信号看起来像蓝色线一样。采样确实准确地适合了青色和蓝色正弦波,但蓝色线的波长长于奈奎斯特频率。因此,在这种情况下,可观察的频谱分量是蓝色线,因为它是青色线的混叠版本。

图 1:混叠。这里演示了混叠的原理。也就是说,信号在采样时变得彼此无法区分。这里,青色线每 1.25 个市场数据周期进行采样采样数据与蓝色正弦波完全匹配,但蓝色线的波长比奈奎斯特频率更长。在采样数据中,与连续数据相反,最短的可能波长正好是每个周期两个样本。



市场数据是分形的




我们可以忽略市场数据中的高频分量的原因是市场数据是分形的。

波长每翻一番,循环分量的周期幅度就减半。因此,如果我们每五天采样一次数据,则五天周期分量被混叠回我们可观察的频谱中,幅度减半,而2.5天周期分量被混叠回可观察的频谱中,幅度减至四分之一,依此类推。因此,混叠的能量迅速减少到所需的信号能量。

此外,市场数据是非平稳的,因此混叠的能量不会一致地折叠回去。相反,它只是在已经存在的噪声信号中稍微增加了一些噪声。最终结果是,混叠在实际中几乎不会被注意到。



更少的滞后






下采样数据也经历了量化滞后,这是量化步长的一半。(“量化”意味着将其细分为小但可测量的增量。)如果日数据每五天采样一次,那么它的滞后为2.5天。这个滞后时间比使用平滑滤波器时要短得多,因为如果我们使用的是每日样本,平滑滤波器会拒绝比奈奎斯特速率(10天)更长的周期分量。

图2中的一个实际应用显示了通过下采样进行平滑处理。下采样数据进一步通过6周期Hann滤波器和12周期Hann滤波器进行平滑,相当于双移动平均值。显然,数据中的高频分量已通过下采样和平滑处理去除。

图2:平滑采样(每日市场数据)。这里的数据实际上每五个条形进行一次采样。未采样的数据通过六周期汉纳滤波器和二周期汉纳滤波器进一步平滑,相当于双移动平均线。通过未采样和汉纳窗 FIR滤波器的组合,数据中的高频分量被去除。您可以看到,两个移动平均值,蓝色和紫色线,都非常平滑。



实现这个概念




采样值与前一个样本条的值相同,除了当前条的整数部分除以5后恰好等于当前条除以5的余数。在这种情况下,将分配收盘价值。因此,数据实际上是每五个bars采样一次。Hann滤波器被写成一个函数。

期货的日内数据可以作为“日间交易时段”使用,时间从太平洋时间上午6:30到下午1:15(你需要根据你的时区进行调整)。我假设使用的是15分钟的K线图,因此一天中的第一个条形图是在6:45。当天第一个bar收盘时,缺口值计算为收盘价与之前的degap值之差。

然后,缺口值从每个样本中数学移除。这种技术消除了开盘价格差距对前一周期的影响,并为分析提供了“无缺口”的样本数据。采样分析每小时和会话时段结束时进行。否则,将保留前一周期的缺口数据。因此,数据实际上每四个条形图采样一次。由于第一条和最后一条之间的小波动时间偏差,导致一天的首尾数据并不一致,因为数据并不相干。

指标的开始日期作为一个输入参数提供。这是必要的,因为开盘缺口的影响是累积的,并且去除了缺口的下采样数据可能会偏离价格的绝对值。

为了展示下采样的平滑处理过程,图3中显示了一种使用Hann窗FIR滤波器的双移动平均线类型的指标。

图3:通过下采样进行平滑处理(日内市场数据)。在此处使用的下采样技术也可以用于日内数据,如图所示。数据在此处每四个条形图中有效地采样一次。因为开盘缺口已从数据中移除,并且缺口移除是累积的,因此日内下采样数据与价格有一定的偏移。

结论



我已经展示了下采样如何去除数据中的高频分量。消除这些分量的过程比传统的平滑滤波器引入的滞后要少。量化滞后只是下采样步长的一半。这种神奇的原因是市场数据是分形的,因此混叠的分量具有较小的幅度,对期望的信号分量的影响较小。此外,混叠分量折叠回可观察频谱中的过程是非相干的。

下采样还可以应用于日内数据,同样可以消除隔夜开盘缺口。

下采样的程度由设计者自行决定。




代码






1、Hann函数


加小松鼠Vviquant01 领取核心函数代码Hann函数




2、下采样双均线代码

Params

    Numeric FastLength(6);   // 快周期 参数范围及步长:1-100,1

    Numeric SlowLength(12);  // 慢周期 参数范围及步长:1-100,1


Vars

    Seriessample(0);

    Numeric FastAvg(0);

    Numeric SlowAvg(0);


Events

    OnBar(ArrayRefindexs)

    {

        // 每五天采样一次

        Sample = Sample[1];

        If (mod(CurrentBar, 5) == 0 )

            {Sample = Close;}


        // 使用Hann FIR滤波器计算快均线

        FastAvg = hann2304(Sample, FastLength);


        // 使用Hann FIR滤波器计算慢均线

        SlowAvg = hann2304(Sample, SlowLength);


        PlotNumeric("FastAvg", FastAvg);

        PlotNumeric("SlowAvg", SlowAvg);

}




3、缺口处理双均线代码

Params

    Numeric BegDate(20230101);   // 起始日期

    Numeric FastLength(20);     // 快周期 参数范围及步长:1-100,1

    Numeric SlowLength(40);     // 慢周期 参数范围及步长:1-100,1

    Numeric cycle(5);     // 周期,单位分钟


Vars

    SeriesGap(0);

    SeriesDegap(0);

    Numeric FastAvg(0);

    Numeric SlowAvg(0);


Events

    OnBar(ArrayRefindexs)

    {


        Degap = Degap[1];

        /*Print("Date:" + Text(Date()));*/

        Print("time:" + Text(time));

        If (Time == (0.21+cycle*0.0001)) //国内期货开盘时间

        {

            Gap = Close - Degap[1];

            Degap = Close - Gap;

        }


        If (Time == (0.090+cycle*0.0001) or Time ==(0.130+cycle*0.0001))

            {Degap = Close - Gap;}


        If (Date < BegDate)

            Degap = Close;


        // 使用Hann FIR滤波器计算快均线

        FastAvg = hann2304(Degap, FastLength);


        // 使用Hann FIR滤波器计算慢均线

        SlowAvg = hann2304(Degap, SlowLength);


        PlotNumeric("Fast Avg", FastAvg);

        PlotNumeric("Slow Avg", SlowAvg);

    }


松鼠Quant
量化研究,原创策略,源码教学,程序化交易。分享量化交易相关内容,高质量原创内容生产。
 最新文章