![Фильтрация и извлечение признаков в частотной области](https://c.mql5.com/2/62/midjourney_image_13881_47_423_2_600x314.jpg)
Фильтрация и извлечение признаков в частотной области
Введение
В сфере финансовых рынков особенным спросом пользуются точные модели прогнозирования. При этом надежные прогностические модели требуют значимой и актуальной информации. В этой статье мы рассмотрим использование различных цифровых фильтров, применяемых в частотной области, в качестве инструментов для извлечения признаков. Мы рассмотрим некоторые преимущества и недостатки анализа временных рядов, преобразованных в частотную область, с использованием Дискретного преобразования Фурье (ДПФ). В частности, мы рассмотрим три типа цифровых фильтров: синфазные, квадратурные и квадратурные зеркальные. Для каждого типа рассмотрим, в чем же их польза для анализа временных рядов. И наконец, представим код, реализующий примеры каждого типа.
Фильтрация в частотной области
В статье "Практическая реализация цифровых фильтров на MQL5 для начинающих" автор представил цифровые фильтры применительно ко временной области. В статье ряд умножается на уникальный набор весов различной длины в зависимости от типа фильтра и его параметров. Количество весов определяет скользящее окно, которое свертывается с соответствующими значениями ряда данных при применении фильтра в течение всего объема данных. Скользящие средние работают схожим образом.
В этой статье мы будем применять фильтры в частотной области. Основные этапы работы при применении фильтров:
- Сначала ряд предварительно обрабатывается при подготовке к операции ДПФ.
- ДПФ применяется к ряду с помощью алгоритма Быстрого преобразование Фурье (БПФ, FFT).
- Далее мы изменяем форму волны ряда данных любым образом, который мы считаем необходимым. Другими словами, применяется фильтр, тем самым изменяя исходную форму сигнала серии.
- Над измененной формой сигнала выполняется обратная операция ДПФ, преобразующая ее обратно в привычную временную область.
- В конце мы отменяем любые эффекты, вызванные операциями, выполненными на начальном этапе предварительной обработки.
Подобно свертке во временной области, члены ряда ДПФ умножаются на коэффициенты, которые определяют конкретный фильтр. Из-за большого количества шагов может показаться, что фильтрация в частотной области требует гораздо больше вычислительных затрат. Но это не всегда так.
При работе с большими наборами данных использование алгоритма быстрого преобразования Фурье (БПФ) на самом деле может быть намного быстрее, чем свертка ряда во временной области. Особенно когда применяются передовые методы и "лучшие практики", которые мы рассмотрим позже.
Фильтрация форм и функций
Фильтр определяется функцией, выходные данные которой можно изменять в соответствии со спецификацией фильтра. Изменение вывода функции меняет форму фильтра. Форма фильтра представляет собой кривую отклика фильтра. Она определяет поведение фильтра в частотной области. Существует множество форм фильтров, используемых при обработке сигналов в различных областях исследований. При анализе временных рядов предпочтительны фильтры с закругленными углами.
Фильтры с закругленными углами обладают уникальными характеристиками, которые очень важны применительно к анализу временных рядов. Во-первых, закругленные углы обеспечивают более плавные частотные характеристики. Это помогает минимизировать искажения, возникающие при переходах между частотными компонентами. Также закругленные углы формы фильтра облегчают его практическую реализацию в реальном мире. Поскольку их конструкции основаны на математических аппроксимациях, они часто обеспечивают более высокую производительность. Таким образом, достигается хороший баланс между способностью различать полезные и нежелательные частотные компоненты и минимизацией искажений.
В данном случае в качестве функции фильтрации используется функция фильтрации Гаусса. Согласно ее форме, фильтр концентрируется во временной области. То есть длится относительно более короткое время по сравнению с другими функциями фильтра. Существует множество факторов, которые необходимо учитывать при выборе функции для фильтрации. Приоритет имеют требования конкретной области применения.
Спецификация фильтра
Все фильтры, встречающиеся в этой статье, задаются двумя параметрами. Центральная частота и параметр ширины, иногда называемый масштабом. Оба значения должны быть выражены в количестве частотных циклов на выборку. Центральная частота может принимать значения в диапазоне от 0 до 0,5. Параметр ширины определяет диапазон частот выше и ниже центральной частоты в полосе пропускания, который будет пропущен через функцию фильтра без существенного искажения его формы. Ширина должна принимать значения от 0,01 и выше.
Синфазные фильтры
Начнем изучение типов с синфазных фильтров. Положение сигнала во времени называется его фазой. Синфазные фильтры поддерживают соотношение фаз входного сигнала с выходным. Это означает, что, когда входной сигнал проходит через синфазный фильтр, отфильтрованный выходной сигнал сохранит те же временные отношения, что и входной, в пределах разрешенного диапазона частот.
Полосовый фильтр — это базовый тип синфазного фильтра, блок, из которого можно построить разные другие фильтры. Фильтр пропускает определенный диапазон частот, ослабляя или подавляя частоты за пределами этого диапазона. Он уменьшает сигналы с частотами ниже или выше полосы пропускания.
Фильтры нижних и верхних частот реализуются путем модификации полосового фильтра. Фильтр нижних частот дает приоритет низким частотам в сигнале. Чаще всего используется для обнаружения общей тенденции процесса. Чем ниже центральная частота, тем более сглаженным будет отфильтрованный выходной сигнал. Используя функцию полосового фильтра, мы умножаем все частоты, которые меньше или равны центральной частоте, на константу 1.0 и соответственно ослабляем все остальные частоты, которые выше.
Фильтр верхних частот удаляет все медленные изменения сигнала, оставляя только информацию о быстрых изменениях. В этом случае все частоты ниже нижней полосы пропускания центральной частоты уменьшаются. Проходят только частоты в более высоких диапазонах.
Существует множество разновидностей синфазных фильтров, некоторые, возможно, работают лучше тех, о которых мы упомянули. Все обсуждаемые здесь фильтры имеют общее основное свойство — достаточно круглую форму фильтров, что является важным качеством.
Инквадратурные фильтры
Эти фильтры (также называемые квадратурными фильтрами) предназначены для обработки сигналов путем применения фазового сдвига на 90 градусов (Pi/2 радиан) относительно входного сигнала. Они чаще используются в сочетании с синфазными фильтрами, редко используются самостоятельно. В определенных ситуациях они позволяют обнаруживать фазовые взаимосвязи во временных рядах.
Чтобы понять, в чем преимущества квадратурного фильтра, давайте рассмотрим пример. Ниже представлен ряд, изображенный короткой периодической составляющей.
Следующий график представляет собой выходной сигнал серии с полосовым фильтром, показанной выше. На нем показана синфазность полосового фильтра. Движения отфильтрованного сигнала совпадают с движениями исходного ряда.
Следующий график показывает отфильтрованный выходной сигнал от квадратурной версии полосового фильтра. При внимательном рассмотрении можно увидеть, что пики отфильтрованного сигнала соответствуют переходам через ноль в исходном сигнале. По сути, выходной сигнал в квадратурной фильтрации выравнивается со сдвигом, примененным к выходному сигналу синфазной полосы пропускания.
Пики квадратурного выходного сигнала указывают на значительное изменение входного ряда. Пики и впадины квадратурного фильтра указывают на быстрые изменения, происходящие во входном сигнале. А когда входной сигнал устойчив, выходной сигнал будет равен или близок к нулю. Это означает, что квадратурные фильтры чувствительны к изменениям, происходящим с определенной скоростью.
Давайте посмотрим на другой пример. Серия ниже характеризуется резким движением вверх.
Далее следуют синфазно и квадратурно отфильтрованные результаты. Опять же, обратите внимание на положение пиков и впадин относительно резкого движения вверх. И если определить движение по синфазному выходному сигналу сложно, то серия с инквадратурной фильтрацией обнаруживает взрывное движение.
Таким образом, целесообразным может быть совместное использование этих двух типов фильтров. Совместное использование синфазного и квадратурного фильтр с одинаковыми параметрами называется квадратурно-зеркальным фильтром (QM-фильтром).
Квадратурные зеркальные фильтры
QM-фильтры позволяют обнаруживать локализованные экземпляры периодических компонентов. При использовании этого фильтра мы анализируем синфазный выходной сигнал относительно квадратурного выходного сигнала. Оба сигнала будут равны нулю, когда определенное периодическое событие отсутствует. Выходные сигналы обоих сигналов можно объединить, рассматривая синфазный выходной сигнал как действительную часть, а квадратурный — как мнимую. Включение расчета амплитуды и фазы отфильтрованного сигнала.
Прежде чем мы перейдем к рассмотрению реализации кода, нам нужно разобраться с одним из наиболее важных аспектов любой процедуры анализа временных рядов.
Предварительная обработка серии перед преобразованием
Тот факт, что временные ряды имеют конечную длину, создает проблемы при их преобразовании в частотную область с помощью ДПФ. ДПФ предполагает, что необработанный ряд является периодическим и, следовательно, повторяется бесконечно. Применение ДПФ к непериодическому сигналу может вызвать искажения формы выходного сигнала.
Чтобы уменьшить этот эффект растекания, нам придется сузить конец ряда дополнительными постоянными значениями Искусственное увеличение количества выборок в серии может обеспечить более точное частотное разрешение и уменьшить утечку спектра. Эта операция называется дополнением. Дополненный ряд преобразуется с использованием ДПФ. Дополнительные значения, добавленные в ряд, помогают уменьшить искажения в спектре ряда, но это не единственные преимущества.
Увеличение длины ряда так, чтобы общее количество выборок было степенью числа 2, значительно повышает вычислительную эффективность алгоритма БПФ. На первый взгляд кажется странным, что намеренное увеличение длины приводит к повышению производительности, но это на самом деле так. Поэтому этой операцией не стоит пренебрегать. Помимо использования нулей, ряд можно дополнить вычисленным средним значением ряда.
Финансовые временные ряды обычно имеют неприятную особенность - они нестационарны. Когда ряд дополнен и содержит медленно меняющийся компонент, резкий контраст значений на обоих концах исходного ряда и значений, используемых для заполнения, может проявляться как заметный частотный компонент в частотной области. Это вызывает т.н. загрязнение.
Чтобы защититься от этой формы искажений, из исходных значений ряда необходимо исключить тренд. Таким образом, исходные значения ряда заменяются бестрендовыми значениями. Когда понадобится вернуться к исходному временному интервалу ряда, нужно будет просто восстановить тренд. Мы это рассмотрим при обсуждении реализации кода в следующем разделе.
Класс CFilter
Класс CFilter инкапсулирует основные примеры трех обсуждаемых типов фильтров. Код представлен в файле Filter.mqh, который начинается с включения файла fasttransforms.mqh из библиотеки ALGLIB.
//+------------------------------------------------------------------+ //| CFilter - class implementing select filters in the freq domain | //+------------------------------------------------------------------+ class CFilter { int m_length; //length of original series int m_padded_len; //modified length of series int m_half_padded_len; //half of modded series double m_slope, m_intercept; //slope and intercept of trend in series double m_buffer[]; //general internal buffer bool m_initialized; //initialization flag complex m_dft[]; //general complex buffer public: CFilter(double &series[],uint min_padding=0, bool detrend=true); ~CFilter(void); void Lowpass(double freq,double width,double &out[],bool add_trend); void Highpass(double freq,double width, double &out[]); void Bandpass(double freq,double width, double &out[]); void Qmf(double freq,double width, complex &out[]); bool IsInitialized(void) { return m_initialized; } };
Класс CFilter имеет параметрический конструктор, которому пользователь должен передать необработанный ряд для фильтрации, а также два других параметра, которые определяют величину применяемого дополнения и необходимость детренда-операции - удаления тренда из ряда перед применением преобразования ДПФ. Если для min_padding установлено значение 0, то фактическая величина заполнения будет определяться только количеством выборок. Параметр min_padding определяет минимальное количество значений, которые будут добавлены в серию, исключая любые дополнительные значения, включенные для удлинения серии до ближайшей степени двойки.
Внутри конструктора после проверки всех аргументов вычисляется окончательная длина дополненного ряда и при необходимости производится детренд-операция. Дополненная серия записывается в массив m_buffer. Далее применяется ДПФ с формой волны, заданной в массиве комплексных чисел m_dft. В случае возникновения ошибки в конструкторе для параметра m_initialized будет установлено значение false.
//+------------------------------------------------------------------+ //|constructor | //+------------------------------------------------------------------+ CFilter::CFilter(double &series[],uint min_padding=0,bool detrend=true) { //---local variables m_initialized=false; int i; int npts = ArraySize(series); int pad = (int)MathAbs(min_padding); //--- check size of series if(npts<=0) { Print("Input array is empty"); return ; } //--- m_length = npts ; for(m_padded_len=2 ; m_padded_len<INT_MAX ; m_padded_len*=2) { if(m_padded_len >= npts+pad) break ; } //--- if(m_padded_len<npts+pad) { Print("Warning, calculated length of modified series is too long"); return; } //--- m_half_padded_len = m_padded_len / 2; //--- ArrayResize(m_buffer,m_padded_len); //--- if(m_padded_len > npts) // Any padding needed? { if(detrend) { m_intercept = series[0] ; m_slope = (series[npts-1] - series[0]) / (npts-1) ; } else { m_intercept = m_slope = 0.0 ; for(i=0 ; i<npts ; i++) m_intercept += series[i] ; m_intercept /= npts ; } for(i=0 ; i<npts ; i++) { m_buffer[i]=series[i] - m_intercept - m_slope * i ; } for(i=npts ; i<m_padded_len ; i++) { m_buffer[i]=0.0; } } else { ArrayCopy(m_buffer,series); m_intercept = m_slope = 0.0 ; } //---Compute the Fourier transform of the padded series CFastFourierTransform::FFTR1D(m_buffer,int(m_padded_len),m_dft); //--- m_initialized = true; }
Пользователю нужно проверить, правильно ли создан экземпляр. Для этого вызываем IsInitialized(). В случае успеха функция должна вернуть true.
После успешного создания экземпляра пользователь может вызвать любой из общедоступных методов, который применяет указанный фильтр к сигналу, хранящемуся в m_dft. Большинство из них имеют схожие входные требования. Во-первых, это характеристики фильтра, определяемые параметрами частоты freq и ширины width. Они соответствуют центральной частоте и ширине применяемой полосы пропускания. Почти все методы ожидают как минимум один последний входной массив, в котором будут сохранены результаты операции фильтрации.
Lowpass() — единственный метод, который принимает четвертый входной параметр, который определяет, следует ли отменить действие детренда, первоначально примененного к исходному сигналу, на выходе фильтра.
//+--------------------------------------------------------------------+ //|Filters series in frequency domain and returns output in time domain| //+--------------------------------------------------------------------+ void CFilter::Lowpass(double freq,double width,double &out[],bool add_trend) { //--- int i ; double f, dist, wt ; complex dft_temp[]; ArrayCopy(dft_temp,m_dft); //--- for(i=0 ; i<=m_half_padded_len ; i++) { f = (double) i / (double) m_padded_len ; // This frequency if(f <= freq) // Flat to here wt = 1.0 ; else { dist = (f - freq) / width ; wt = exp(-dist * dist) ; } dft_temp[i].real*=wt; dft_temp[i].imag*=wt; } //--- double temp[]; //--- CFastFourierTransform::FFTR1DInv(dft_temp,m_padded_len,temp); //--- ArrayResize(out, m_length); //--- for(int i = 0; i<m_length; i++) out[i]=(add_trend)?temp[i] + m_intercept + m_slope*i:temp[i]; }
Реализация синфазных фильтров состоит из двух этапов: сначала форма сигнала, помещенного в m_dft, умножается на модифицированную функцию фильтра. В данной реализации это функция Гаусса. Затем выполняется обратная операция ДПФ, которая возвращает ряд во временную область.
Для расчета выходных параметров фильтра QM, умножаем члены ДПФ сигнала на квадратурную версию функции фильтра. Функция квадратурного фильтра — это функция синфазного фильтра с примененным фазовым сдвигом на 90 градусов. Для получения этого фазового сдвига функция синфазного фильтра умножается на i, что делает ее чисто мнимой. Результатом является функция, выходные данные которой симметричны относительно частоты Найквиста. Выходные члены по обе стороны от частоты 0,5 будут равны в абсолютном выражении, но противоположны по знаку.
На основе этого факта метод Qmf() умножает члены ДПФ формы сигнала на сумму функций синфазного и квадратурного фильтра. Для этого делаем функцию внутриквадратурного фильтра вещественной (напомню, что функция внутриквадратурного фильтра является мнимой) — для этого умножаем ее на i. Когда функции фильтра суммируются, выходные данные, выходящие за пределы частоты Найквиста, отменяют друг друга. В коде отфильтрованные члены ДПФ выше 0,5 устанавливаются в значение 0. Необходимо рассчитывать только отфильтрованные выходные данные, которые ниже или равны частоте Найквиста. После того, как сигнал отфильтрован, выполняется комплексная обратная операция ДПФ для возврата во временную область.
//+------------------------------------------------------------------+ //| Implements Quadrature Mirror Filter, output is complex | //+------------------------------------------------------------------+ void CFilter::Qmf(double freq,double width,complex &out[]) { //--- int i ; double f, dist, wt ; complex dft_temp[]; ArrayCopy(dft_temp,m_dft); //--- for(i=1 ; i<m_half_padded_len ; i++) { f = (double) i / (double) m_padded_len ; // This frequency dist = (f - freq) / width ; wt = exp(-dist * dist) ; dft_temp[i].real *= wt ; dft_temp[i].imag *= wt ; dft_temp[m_padded_len-i].real = dft_temp[m_padded_len-i].imag = 0.0 ; // Causes QMF outputs } //--- dft_temp[0].real = 0.0 ; dist = (0.5 - freq) / width ; dft_temp[m_half_padded_len].real = 0.5 * dft_temp[m_half_padded_len].imag * exp(-dist * dist) ; //--- dft_temp[0].imag = dft_temp[m_half_padded_len].imag = 0.0 ; // By definition of real transform //--- CFastFourierTransform::FFTC1DInv(dft_temp,m_padded_len); ArrayResize(out,m_length); //--- for(i=0 ; i<m_length ; i++) { out[i].real = dft_temp[i].real/double(m_half_padded_len) ; out[i].imag = dft_temp[i].imag/double(m_half_padded_len) ; } } //+------------------------------------------------------------------+
Программа AFD.mq5
Давайте посмотрим на использование функции CFilter на примере приложения AFD.mq5. Приложение реализовано в виде советника. Советник позволяет пользователям генерировать случайные последовательности заданной длины. Пользователи могут установить длину генерируемой серии, а также настроить начальное значение для случайных чисел. Ряд обозначен синим цветом на верхнем графике. На втором графике можно наблюдать результат применения выбранного фильтра к сгенерированной серии. Все параметры фильтра можно настроить из графического интерфейса программы. Вот как выглядит приложение.
Используя приложение AFD, мы можем лучше понимать различные типы информации, получаемые с помощью фильтров. Есть два способа использования сигнала синфазных фильтров. Выходной сигнал фильтра нижних частот можно использовать для предоставления информации о среднем значении входного ряда в любой момент времени. Выходной сигнал фильтра верхних частот выявляет случайные максимумы и минимумы, наблюдаемые в исходной серии. Эти выходные данные дают представление о состоянии входной серии в каждый момент времени.
Выходные данные полосового фильтра менее очевидны с точки зрения их значимости. Вероятно, никто не сможет понять смысл выходного сигнала фильтра только путем наблюдения. Хотя возможно, что эти данные могут быть полезны для модели прогнозирования. Возможно, нахождение выходного сигнала определенной полосы пропускания на пике или минимуме указывает на что-то в исходном ряду.
Давайте посмотрим на выходной сигнал полосы пропускания случайной серии на разных частотах.
Результаты показывают другой тип информации. Пики выходных сигналов полосы пропускания отображают величину периодических изменений в определенном временном интервале. Точнее, они показывают амплитуду изменения, указывая на наличие периодического изменения. Более низкие пики сигнализируют о меньшем изменении.
Амплитуда задается путем выборки выходного сигнала фильтра QM. Расчеты амплитуды и фазы с использованием значений фильтра QM показаны в приведенном ниже фрагменте кода из AFD.mq5.
case ENUM_QMF_AMPLITUDE: { y_name = "Amplitude"; complex comp[]; filter.Qmf(freq,scale,comp); ArrayResize(m_output1,ArraySize(comp)); for(int i=0; i<ArraySize(m_output); i++) m_output1[i]=MathSqrt(comp[i].real*comp[i].real + comp[i].imag*comp[i].imag); } break; case ENUM_QMF_PHASE: { y_name = "Phase"; complex comp[]; filter.Qmf(freq,scale,comp); ArrayResize(m_output1,ArraySize(comp)); for(int i=0; i<ArraySize(m_output); i++) m_output1[i]=(comp[i].real>=1.e-40 || comp[i].imag>=1.e-40)?atan2(comp[i].imag, comp[i].real):0.0; } break;
Разница в выходной полосе пропускания на разных частотах показывает, что доступна разнообразная информация. Таким образом, можно создавать уникальные функции для использования в алгоритме машинного обучения. Чтобы построить правильные наборы данных, практикующему специалисту необходимо четко понимать параметры, которые определяют конкретный фильтр.
Параметр ширины
Как сказано ранее, параметры всех реализованных фильтров выражаются в количестве циклов частоты в единицу времени. Одним из недостатков проведения анализа в частотной области является сложность соотнесения частотных составляющих с их протяженностью во временной области. Используя пример случайной серии, который мы рассмотрели в предыдущем разделе, выходные сигналы полосы пропускания были дискретизированы на частотах 0,15, 0,3 и 0,45 с одинаковой шириной 0,03. Важно понимать, что означают эти значения, особенно в отношении временной области ряда.
Частота 0,15 имеет период 1/0,15 = 6,67 выборок за цикл. Ширина определяет разрешение в частотной области. Если нужно изолировать узкую полосу частот, мы применяем небольшую ширину, обычно 0,01 — это минимум, хотя бывает и меньше. Вернемся к нашему примеру. Ширина была установлена на 0,03, поэтому полоса пропускания растягивается от 0,15-0,03 до 0,15+0,03, т.е. от 0,12 до 0,18. Частоты в этом диапазоне будут пройдут, а частоты выше и ниже почти полностью отсеяны.
Ширина также указывает на разрешение во временной области. Зависимость между разрешением в частотной области и разрешением во временной области обратная. Более высокое разрешение в одной области приводит к потере разрешения в другой. Чтобы оценить протяженность временной области по отношению к ширине, мы применяем формулу 0,8/ширина.
С помощью нее мы можем оценить количество выборок во временной области, на которые влияет полоса пропускания частоты, относительно текущей позиции. Другими словами, оцениваем количество выборок до и после текущей позиции, которые окажут влияние на наблюдаемый результат. Возвращаясь к примеру, ширина 0,03 подразумевает временной размер 0,8/0,03 = 27 выборок. Это означает, что значение на каждом из выходных сигналов определяется или зависит от 27 наблюдений, которые были до этого, и еще 27, которые следуют за ними.
В целом, ширина фильтра должна быть пропорциональна центральной частоте полосы пропускания, которую мы хотим изучить. Это связано с периодом частоты. Более низкие частоты имеют более длинные периоды, а высокие частоты имеют более короткие периоды. Поэтому для более низких частот мы можем позволить себе пожертвовать разрешением во временной области и выбрать узкую ширину. А вот более высокие частоты выигрывают от более широких параметров ширины, что в меньшей степени преобразуется во временную область.
Наконец, параметр ширины также влияет на значения, передаваемые в модель прогнозирования. Вернемся к предыдущему примеру, подразумеваемый временной интервал которого, по нашим расчетам, составляет около 27 наблюдений. Предположим, нужно предсказать следующее значение ряда на временном интервале 201. Мы предоставим значение отфильтрованного вывода, рассчитанное на основе 200 известных значений, то есть на 27 слотов от конца ряда. Мы не можем сознательно использовать какие-либо отфильтрованные выходные данные за пределами этой точки, поскольку мы знаем, что они будут подвержены эффектам, вызванным ДПФ, в соответствии с ограничениями параметров фильтра.
В последнем примере мы отфильтровали выходные данные на разных частотах, но одинаковой ширины. На практике было бы более полезно производить выборку отфильтрованных выходных данных на стратегически выбранных частотах и ширинах, чтобы получить как можно больше полезной информации.
Заключение
Итак, мы рассмотрели три типа фильтров:
- Синфазные фильтры помогают разбить зашумленный ряд на разные составляющие, выделяя важную информацию и убирая отвлекающие лишние характеристики. Передавая соответствующую информацию алгоритмам обучения, есть возможность строить более эффективные модели прогнозирования.
- Инквадратурные фильтры можно использовать для определения областей быстрого изменения уровня в серии. Хотя заметить важные движения в серии может быть легко, передать такие явления в алгоритм обучения может быть сложно. В этом и заключается ценность квадратурных фильтров.
- Сочетание синфазных и квадратурных фильтров позволяет выявить наличие периодической особенности. Эти инструменты могут быть эффективными при выявлении и изучении особенностей, которые, кажется, проявляются во временных рядах случайным образом.
Фильтрация в частотной области повышает эффективность вычислений, обеспечиваемую алгоритмом БПФ. По сравнению с методом свертки во временной области это совсем другой уровень. Но не все так гладко. Преобразование рядов в частотную область чревато подводными камнями, которые могут привести к совершенно ложным выводам из-за искажений, вносимых небрежным обращением с данными. Поэтому при их применении нужно быть крайне внимательными.
Код всех рассмотренных инструментов и программ прилагается. Файл AFD.mq5 использует замечательную библиотеку графического интерфейса Easy and Fast (EAF). Она доступна в библиотеке кодов на mql5.com. Примечание: при использовании библиотеки EAF вместе с ALGLIB всегда обязательно включайте EAF в свое приложение последним, поскольку между этими библиотеками возникают некоторые конфликты имен, из-за которых возникают ошибки компиляции.
Название файла | Описание |
---|---|
Mql5\Include\Filter.mqh | Содержит определение класса CFilter, который реализует базовые цифровые фильтры в частотной области. |
Mql5\Include\RandomStationarySeries.mqh | Содержит подпрограммы (функции) для генерации случайных рядов различных характеристик. Используется в приложении AFD.ex5. |
Mql5\Experts\AFD.mq5 | Это исходный код приложения AFD, он использует библиотеку Easy and Fast GUI, опубликованную в Code Base на mql5.com. |
Mql5\Experts\AFD.ex5 | Скомпилированное приложение AFD, реализованное в виде советника. |
Перевод с английского произведен MetaQuotes Ltd.
Оригинальная статья: https://www.mql5.com/en/articles/13881
![Возможности Мастера MQL5, которые вам нужно знать (Часть 09): Сочетание кластеризации k-средних с фрактальными волнами](https://c.mql5.com/2/62/midjourney_image_13915_50_439__5-logo.png)
![Модифицированный советник Grid-Hedge в MQL5 (Часть I): Создание простого хеджирующего советника](https://c.mql5.com/2/62/Modified_Grid-Hedge_EA_in_MQL5_4Part_Ip_Making_a_Simple_Hedge_EA__LOGO.png)
![Нейросети — это просто (Часть 85): Многомерное прогнозирование временных рядов](https://c.mql5.com/2/75/Neural_networks_are_easy_sPart_858___LOGO.png)
![Машинное обучение и Data Science (Часть 16): Свежий взгляд на деревья решений](https://c.mql5.com/2/62/1midjourney_image_13862_46_406__3_logo.png)
![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования