Разработка трендовых стратегий - помощь в реализации / сотрудничество - страница 4

 

Пример использования методов L1-фильтрации тренда в языке MQL5 для вектров float и double на модельных данных броуновского движения.


Основная цель L1-фильтрации тренда (L1 Trend Filtering) заключается в выделении тренда во временном ряде таким образом, чтобы:

  • сохранить долгосрочную динамику данных;
  • подавить краткосрочные колебания и шум;
  • автоматически выявить точки изменения наклона тренда.

В отличие от классических методов сглаживания, этот способ не предполагает гладкость тренда и позволяет получать кусочно-линейную аппроксимацию, что особенно важно при анализе финансовых временных рядов.

Файлы:
 

Пример использования методов L1-фильтрации тренда в языке MQL5 для double на модельных данных броуновского движения.

Используются значения параметра регуляризации, заданные в единицах λmax. lambda_factors = {1.0,0.8,0.5,0.2,0.1,0.01,0.001};

Файлы:
 

Скейлинговые свойства λmax⁡

Параметр λmax играет ключевую роль при использовании L1-фильтрации, поскольку он задаёт верхнюю границу регуляризации, при которой решение вырождается в глобальную линейную аппроксимацию. Интересным свойством этой величины является её масштабная зависимость от длины временного ряда.

Численные эксперименты показывают, что λmax растет по степенному закону от числа наблюдений:

где: T — длина временного ряда, α — показатель степени.

Для случайного блуждания (броуновского движения) можно показать, что показатель степени должен быть близок к α≈2.5. Амплитуда отклонений броуновского движения растёт как  , оператор второй разности масштабируется как  . При вычислении λmax фактически оценивается максимум величины, связанной с интегралом кривизны ряда.

В результате совокупный масштаб приводит к зависимости:

что соответствует показателю степени α ≈ 2.5.

Таким образом, при увеличении длины временного ряда значение λmax растет значительно быстрее линейного роста.


Численный эксперимент для броуновского движения

Для проверки масштабного закона был проведён численный эксперимент.

Для различных длин временного ряда T генерировались реализации броуновского движения, после чего вычислялось среднее значение λmax.

Использовалась логарифмическая аппроксимация:

что позволяет оценить показатель степени α методом линейной регрессии.

Результат:

2026.04.12 10:06:26.274 TestScalingLambdaMaxBrownMovement (EURUSD,H1)   Scaling test with statistics
2026.04.12 10:06:27.334 TestScalingLambdaMaxBrownMovement (EURUSD,H1)   run 1 -> alpha = 2.480774
2026.04.12 10:06:28.312 TestScalingLambdaMaxBrownMovement (EURUSD,H1)   run 2 -> alpha = 2.530977
2026.04.12 10:06:29.334 TestScalingLambdaMaxBrownMovement (EURUSD,H1)   run 3 -> alpha = 2.435511
2026.04.12 10:06:30.381 TestScalingLambdaMaxBrownMovement (EURUSD,H1)   run 4 -> alpha = 2.461984
2026.04.12 10:06:31.391 TestScalingLambdaMaxBrownMovement (EURUSD,H1)   run 5 -> alpha = 2.467093
2026.04.12 10:06:32.383 TestScalingLambdaMaxBrownMovement (EURUSD,H1)   run 6 -> alpha = 2.487965
2026.04.12 10:06:33.398 TestScalingLambdaMaxBrownMovement (EURUSD,H1)   run 7 -> alpha = 2.532371
2026.04.12 10:06:34.430 TestScalingLambdaMaxBrownMovement (EURUSD,H1)   run 8 -> alpha = 2.455831
2026.04.12 10:06:35.406 TestScalingLambdaMaxBrownMovement (EURUSD,H1)   run 9 -> alpha = 2.483485
2026.04.12 10:06:36.398 TestScalingLambdaMaxBrownMovement (EURUSD,H1)   run 10 -> alpha = 2.420283
2026.04.12 10:06:36.398 TestScalingLambdaMaxBrownMovement (EURUSD,H1)   mean alpha = 2.475627
2026.04.12 10:06:36.398 TestScalingLambdaMaxBrownMovement (EURUSD,H1)   std deviation = 0.036281
2026.04.12 10:06:36.398 TestScalingLambdaMaxBrownMovement (EURUSD,H1)   standard error = 0.011473
2026.04.12 10:06:36.398 TestScalingLambdaMaxBrownMovement (EURUSD,H1)   theory = 2.5000
2026.04.12 10:06:36.398 TestScalingLambdaMaxBrownMovement (EURUSD,H1)   percent error from theory = 0.9749 %
2026.04.12 10:06:36.398 TestScalingLambdaMaxBrownMovement (EURUSD,H1)   scaling test for lambda_max
2026.04.12 10:06:36.404 TestScalingLambdaMaxBrownMovement (EURUSD,H1)   T=   64   <lambda_max>=97.302362
2026.04.12 10:06:36.416 TestScalingLambdaMaxBrownMovement (EURUSD,H1)   T=  128   <lambda_max>=566.626861
2026.04.12 10:06:36.442 TestScalingLambdaMaxBrownMovement (EURUSD,H1)   T=  256   <lambda_max>=3162.076116
2026.04.12 10:06:36.488 TestScalingLambdaMaxBrownMovement (EURUSD,H1)   T=  512   <lambda_max>=18271.204936
2026.04.12 10:06:36.594 TestScalingLambdaMaxBrownMovement (EURUSD,H1)   T= 1024   <lambda_max>=100057.796790
2026.04.12 10:06:36.812 TestScalingLambdaMaxBrownMovement (EURUSD,H1)   T= 2048   <lambda_max>=578620.887399
2026.04.12 10:06:37.218 TestScalingLambdaMaxBrownMovement (EURUSD,H1)   T= 4096   <lambda_max>=3192555.936035
2026.04.12 10:06:38.053 TestScalingLambdaMaxBrownMovement (EURUSD,H1)   T= 8192   <lambda_max>=17895314.647170
2026.04.12 10:06:38.053 TestScalingLambdaMaxBrownMovement (EURUSD,H1)   estimated scaling exponent alpha = 2.4967
2026.04.12 10:06:38.053 TestScalingLambdaMaxBrownMovement (EURUSD,H1)   theoretical value = 2.5000

График (в дважды логарифмическом масштабе) показывает наличие степенной зависимости функции λmax⁡ от количества данных для броуновского движения.

Рис.3. Степенная зависимость LambdaMax для броуновского движения

Степенная зависимость LambdaMax для броуновского движения

Результаты моделирования показывают:

mean alpha = 2.4756
std deviation = 0.036
theory = 2.5
percent error ≈ 1%

Таким образом, эксперимент подтверждает теоретическую зависимость:



График в двойном логарифмическом масштабе демонстрирует линейную зависимость между log⁡(λmax) и log⁡(T).

 

Скейлинг для финансовых временных рядов

Аналогичный эксперимент был проведён для котировок рынка FOREX. Для различных валютных пар и таймфреймов вычислялся показатель степени α.

Результаты показывают, что для реальных финансовых данных значение α также находится в диапазоне α≈2.45–2.60, что очень близко к теоретическому значению для броуновского движения. Это означает, что масштабное поведение λmax практически универсально и сохраняется для различных рынков и таймфреймов.

Скрипт TestScalingLambdaMaxSymbol.mq5 производит расчет показателя степени λmax⁡ для заданного символа для стандартных таймфреймов M1-H1.

Результат расчета для EURUSD:

TestScalingLambdMaxSymbol (EURUSD,H1)   EURUSD scaling test for standard timeframes     
TestScalingLambdMaxSymbol (EURUSD,H1)   EURUSD (PERIOD_M1) estimated scaling exponent = 2.5038  
TestScalingLambdMaxSymbol (EURUSD,H1)   EURUSD (PERIOD_M2) estimated scaling exponent = 2.5350  
TestScalingLambdMaxSymbol (EURUSD,H1)   EURUSD (PERIOD_M3) estimated scaling exponent = 2.5034  
TestScalingLambdMaxSymbol (EURUSD,H1)   EURUSD (PERIOD_M4) estimated scaling exponent = 2.5422  
TestScalingLambdMaxSymbol (EURUSD,H1)   EURUSD (PERIOD_M5) estimated scaling exponent = 2.5341  
TestScalingLambdMaxSymbol (EURUSD,H1)   EURUSD (PERIOD_M6) estimated scaling exponent = 2.5132  
TestScalingLambdMaxSymbol (EURUSD,H1)   EURUSD (PERIOD_M10) estimated scaling exponent = 2.5188 
TestScalingLambdMaxSymbol (EURUSD,H1)   EURUSD (PERIOD_M12) estimated scaling exponent = 2.5126 
TestScalingLambdMaxSymbol (EURUSD,H1)   EURUSD (PERIOD_M15) estimated scaling exponent = 2.5208 
TestScalingLambdMaxSymbol (EURUSD,H1)   EURUSD (PERIOD_M20) estimated scaling exponent = 2.4887 
TestScalingLambdMaxSymbol (EURUSD,H1)   EURUSD (PERIOD_M30) estimated scaling exponent = 2.5695 
TestScalingLambdMaxSymbol (EURUSD,H1)   EURUSD (PERIOD_H1) estimated scaling exponent = 2.6118  

Результаты для EURUSD (стандартные таймфреймы M1-H1) приведены на рис.4.

Рис.4. Степенная зависимость LambdaMax для различных таймфреймов EURUSD

Степенная зависимость LambdaMax для различных таймфреймов EURUSD

Аналогичным образом можно рассмотреть другие валютные пары.

Для USDJPY:

TestScalingLambdMaxSymbol (EURUSD,H1)   USDJPY scaling test for standard timeframes     
TestScalingLambdMaxSymbol (EURUSD,H1)   USDJPY (PERIOD_M1) estimated scaling exponent = 2.5851  
TestScalingLambdMaxSymbol (EURUSD,H1)   USDJPY (PERIOD_M2) estimated scaling exponent = 2.5825  
TestScalingLambdMaxSymbol (EURUSD,H1)   USDJPY (PERIOD_M3) estimated scaling exponent = 2.4889  
TestScalingLambdMaxSymbol (EURUSD,H1)   USDJPY (PERIOD_M4) estimated scaling exponent = 2.5099  
TestScalingLambdMaxSymbol (EURUSD,H1)   USDJPY (PERIOD_M5) estimated scaling exponent = 2.5059  
TestScalingLambdMaxSymbol (EURUSD,H1)   USDJPY (PERIOD_M6) estimated scaling exponent = 2.4939  
TestScalingLambdMaxSymbol (EURUSD,H1)   USDJPY (PERIOD_M10) estimated scaling exponent = 2.5548 
TestScalingLambdMaxSymbol (EURUSD,H1)   USDJPY (PERIOD_M12) estimated scaling exponent = 2.5641 
TestScalingLambdMaxSymbol (EURUSD,H1)   USDJPY (PERIOD_M15) estimated scaling exponent = 2.5525 
TestScalingLambdMaxSymbol (EURUSD,H1)   USDJPY (PERIOD_M20) estimated scaling exponent = 2.5390 
TestScalingLambdMaxSymbol (EURUSD,H1)   USDJPY (PERIOD_M30) estimated scaling exponent = 2.5805 
TestScalingLambdMaxSymbol (EURUSD,H1)   USDJPY (PERIOD_H1) estimated scaling exponent = 2.4645  

Результаты для USDJPY также хорошо аппроксимируются степенной зависимостью.

Рис.5. Степенная зависимость LambdaMax для различных таймфреймов USDJPY

Степенная зависимость LambdaMax для различных таймфреймов USDJPY

Для GBPUSD:

TestScalingLambdMaxSymbol (EURUSD,H1)   GBPUSD scaling test for standard timeframes     
TestScalingLambdMaxSymbol (EURUSD,H1)   GBPUSD (PERIOD_M1) estimated scaling exponent = 2.5235  
TestScalingLambdMaxSymbol (EURUSD,H1)   GBPUSD (PERIOD_M2) estimated scaling exponent = 2.5449  
TestScalingLambdMaxSymbol (EURUSD,H1)   GBPUSD (PERIOD_M3) estimated scaling exponent = 2.5439  
TestScalingLambdMaxSymbol (EURUSD,H1)   GBPUSD (PERIOD_M4) estimated scaling exponent = 2.5427  
TestScalingLambdMaxSymbol (EURUSD,H1)   GBPUSD (PERIOD_M5) estimated scaling exponent = 2.5248  
TestScalingLambdMaxSymbol (EURUSD,H1)   GBPUSD (PERIOD_M6) estimated scaling exponent = 2.5308  
TestScalingLambdMaxSymbol (EURUSD,H1)   GBPUSD (PERIOD_M10) estimated scaling exponent = 2.5293 
TestScalingLambdMaxSymbol (EURUSD,H1)   GBPUSD (PERIOD_M12) estimated scaling exponent = 2.5235 
TestScalingLambdMaxSymbol (EURUSD,H1)   GBPUSD (PERIOD_M15) estimated scaling exponent = 2.5069 
TestScalingLambdMaxSymbol (EURUSD,H1)   GBPUSD (PERIOD_M20) estimated scaling exponent = 2.4977 
TestScalingLambdMaxSymbol (EURUSD,H1)   GBPUSD (PERIOD_M30) estimated scaling exponent = 2.5659 
TestScalingLambdMaxSymbol (EURUSD,H1)   GBPUSD (PERIOD_H1) estimated scaling exponent = 2.5524  

Аналогичная ситуация для котировок GBPUSD:

Рис.6. Степенная зависимость LambdaMax для различных таймфреймов GBPUSD

 Степенная зависимость LambdaMax для различных таймфреймов GBPUSD


Для рассмотренных котировок EURUSD, USDJPY и GBPUSD полученные значения показателя степени также близки к 2.5.

Линейные зависимости в log-log масштабе для функции λmax⁡ для множества таймфреймов и различных валютных пар свидетельствуют о степенной зависимости λmax⁡ от количества данных.


Практическое значение скейлинга

Наличие степенной зависимости λmax имеет важное практическое следствие.

Поскольку λmax∝T^2.5, абсолютное значение параметра λ сильно зависит от:

  1. Длины окна данных;
  2. Таймфрейма;
  3. Масштаба временного ряда.

Поэтому использование абсолютного значения λ неудобно для практических задач.

Гораздо более устойчивым является использование относительного параметра λ=c⋅λmax, где c лежит в диапазоне 0<c<1.

Такой подход:

  • Делает параметр регуляризации масштабно-инвариантным;
  • Упрощает перенос параметров между различными инструментами;
  • Позволяет использовать одинаковые настройки для разных таймфреймов.

Именно поэтому удобнее использовать параметр λ в единицах λmax.

Файлы:
 

Метод L1-фильтрации тренда

Основная идея L1-фильтрации заключается в поиске тренда, который близок к исходным данным, но содержит как можно меньше изменений наклона. В отличие от классических методов сглаживания, которые минимизируют квадрат кривизны, L1-подход минимизирует сумму модулей вторых разностей.

Это приводит к принципиально другому результату:

  • большинство вторых разностей становится равным нулю,
  • тренд автоматически разбивается на линейные сегменты.

Таким образом, L1-фильтр не пытается сделать тренд гладким, а ищет минимальное число структурных изменений, объясняющих наблюдаемые данные. Это делает метод особенно удобным для финансовых временных рядов, где динамика часто состоит из последовательности квазилинейных фаз роста и падения.

В методе L1-фильтрации тренд определяется как решение выпуклой задачи оптимизации:


В матричной форме:


где:

  • y — входной временной ряд;
  • x — искомый тренд;
  • D — матрица вторых разностей;
  • λ>=0 — параметр регуляризации.

Использование L1-нормы приводит к принципиально иному результату: многие вторые разности становятся равными нулю, а значит тренд является кусочно-линейным.

Вторая разность определяется как:

Если  , то точки   лежат на одной прямой.

Следовательно, нулевая вторая разность означает линейный участок тренда, а ненулевая вторая разность соответствует излому. L1-норма способствует разреженности вектора Dx, то есть большинство вторых разностей становятся равными нулю. Это означает, что на соответствующих интервалах тренд является линейным. Точки, где вторые разности ненулевые, интерпретируются как точки излома тренда.

Таким образом, метод L1 Trend Filtering автоматически строит тренд как набор линейных сегментов, соединённых в точках структурных изменений.

Основные свойства L1-фильтрации тренда:

    • Тренд представляет собой набор линейных сегментов;
    • Точки излома интерпретируются как структурные изменения во временном ряду;
    • При λ=0 тренд совпадает с исходными данными;
    • При достаточно большом λ тренд точно равен лучшей линейной аппроксимации;
    • Вычислительная сложность остаётся линейной по числу наблюдений.


    Роль параметра регуляризации λ

    Параметр λ управляет балансом между точностью аппроксимации и сложностью тренда:

    Значение λ   Характер решения  
    λ=0
    x=y, сглаживание отсутствует
    Малое λ
    Слабое сглаживание, много изломов
    Среднее λ
    Кусочно-линейный тренд
    Большое λ
    Почти линейный тренд
    λ≥λmax​
    Тренд строго линейный

    Зависимость L1-тренда от параметра регуляризации λ

    Таким образом, λ контролирует число и расположение изломов тренда.


    Геометрическая интерпретация задачи

    Искомый тренд x можно рассматривать как точку в n-мерном пространстве. Первый член функционала, отвечающий за точность аппроксимации данных, задаёт евклидовый шар с центром в точке наблюдений y: чем ближе x к y, тем меньше ошибка.

    Регуляризующий член с L1-нормой вторых разностей задаёт выпуклое многогранное множество (полиэдр). В отличие от гладких эллипсоидов, возникающих при L2-регуляризации, этот полиэдр имеет острые вершины. Эти вершины соответствуют ситуациям, когда некоторые вторые разности тренда равны нулю.

    Именно наличие острых углов у L1-нормы приводит к разреженным решениям: оптимальное решение стремится попасть в вершину полиэдра, где активны лишь некоторые ограничения. Это означает, что большая часть вторых разностей обнуляется, а тренд автоматически принимает кусочно-линейную форму.

    Оптимальное решение соответствует первой точке касания евклидового шара и L1-полиэдра. В этой точке тренд состоит из линейных сегментов, соединённых в ограниченном числе точек излома.

    Параметр λmax⁡ соответствует ситуации, когда евклидовый шар касается L1-полиэдра не в вершине, а вдоль подпространства линейных функций. В этом случае все вторые разности равны нулю, и тренд является строго линейным.

    При λ≥λmax⁡ ни одно из ограничений L1-нормы не становится активным, поэтому дальнейшее увеличение регуляризации не изменяет решение задачи и тренд остаётся линейным.

     

    Пример L1-разложения изображения при различных lambda, картинка a из архива в #15

    Пример L1-разложения изображения при различных lambda

    L1ImageDenoiseLambda (EURUSD,H1)        lambda=0.8
    L1ImageDenoiseLambda (EURUSD,H1)        lambda=0.46243681487285615
    L1ImageDenoiseLambda (EURUSD,H1)        lambda=0.26730975968719034
    L1ImageDenoiseLambda (EURUSD,H1)        lambda=0.15451734231771613
    L1ImageDenoiseLambda (EURUSD,H1)        lambda=0.08931813453002928
    L1ImageDenoiseLambda (EURUSD,H1)        lambda=0.051629992053064996
    L1ImageDenoiseLambda (EURUSD,H1)        lambda=0.029844511346162825
    L1ImageDenoiseLambda (EURUSD,H1)        lambda=0.017251500960445438
    L1ImageDenoiseLambda (EURUSD,H1)        lambda=0.009972161444905517
    L1ImageDenoiseLambda (EURUSD,H1)        lambda=0.005764368219975006
    L1ImageDenoiseLambda (EURUSD,H1)        lambda=0.003332070099249446
    L1ImageDenoiseLambda (EURUSD,H1)        lambda=0.0019260898545374959
    L1ImageDenoiseLambda (EURUSD,H1)        lambda=0.0011133685718640526
    L1ImageDenoiseLambda (EURUSD,H1)        lambda=0.0006435782701904413
    L1ImageDenoiseLambda (EURUSD,H1)        lambda=0.00037201785673531256
    L1ImageDenoiseLambda (EURUSD,H1)        lambda=0.00021504344093063052
    L1ImageDenoiseLambda (EURUSD,H1)        lambda=0.00012430500485407505
    L1ImageDenoiseLambda (EURUSD,H1)        lambda=0.00007185401314684179
    L1ImageDenoiseLambda (EURUSD,H1)        lambda=0.00004153492621932226
    L1ImageDenoiseLambda (EURUSD,H1)        lambda=0.000024009098733553102
    L1ImageDenoiseLambda (EURUSD,H1)        lambda=0.00001387836393289026
    L1ImageDenoiseLambda (EURUSD,H1)        lambda=0.000008022333015965127
    L1ImageDenoiseLambda (EURUSD,H1)        lambda=0.000004637277659690338
    L1ImageDenoiseLambda (EURUSD,H1)        lambda=0.000002680559888285312
    L1ImageDenoiseLambda (EURUSD,H1)        lambda=0.0000015494869710182498
    L1ImageDenoiseLambda (EURUSD,H1)        lambda=8.95674774455837e-07
    L1ImageDenoiseLambda (EURUSD,H1)        lambda=5.177412373266506e-07
    L1ImageDenoiseLambda (EURUSD,H1)        lambda=2.9927826089708503e-07
    L1ImageDenoiseLambda (EURUSD,H1)        lambda=1.7299660716241934e-07
    L1ImageDenoiseLambda (EURUSD,H1)        lambda=0.0000001

    Таким образом, при уменьшении параметра регуляризации λ детализация увеличивается (как в примерах с временными рядами в #31 и #32).

    Пример применения L1-фильтра для удаления шума в изображениях
    Пример применения L1-фильтра для удаления шума в изображениях
    • 2026.04.10
    • www.mql5.com
    Настройки тестирования Параметры тестирования без фильтров Параметры тестирования с фильтром закрытия сделок L1 Close Filter Стратегия с фильтром закрытия L1 Close Filter Индикаторы тренда на базе L1 Trend Filter
    Файлы:
     
    Таким образом, метод L1 Trend Filter формирует компактное разреженное описание данных, тот же принцип используется во многих современных методах обработки данных.