Обсуждение статьи "Как построить 29-парный портфель с L1-фильтром и VaR-распределением лотов"

 

Опубликована статья Как построить 29-парный портфель с L1-фильтром и VaR-распределением лотов:

Разбирается практическое применение L1 Trend Filter для очистки шума и формирования структурных признаков, совместимых с live-торговлей. Показан полный цикл: H1-данные 29 инструментов из MetaTrader 5, каузальная фильтрация, CatBoost на горизонте трёх L1-баров, честный walk-forward и распределение лотов по VaR. Читатель получает воспроизводимый кодовый конвейер и методику портфельной оценки.

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

Но есть и вторая проблема, о которой говорят реже: торговля одной парой делает систему заложницей конкретного инструмента. EURUSD в боковике может месяцами не давать прибыли, пока GBPJPY показывает направленное движение. Трейдер приходит к этой статье с двойной болью: признаки, построенные напрямую на сырой цене, дают модели слишком много мусора, а зависимость от единственной валютной пары делает доходность нестабильной.

Решение опирается на три идеи. По отдельности они полезны, вместе — дают новый уровень качества. Первая — L1 Trend Filter, математически строгий метод нелинейного сглаживания на основе выпуклой оптимизации, который извлекает из ценового ряда чистый кусочно-линейный тренд без задержки. Вторая — диверсификация на 29 инструментов: 28 мажорных и кросс-пар плюс золото (XAUUSD). Третья — параметрическое VaR-распределение лотов, где каждому инструменту выделяется доля от общего бюджета обратно пропорционально его волатильности, что автоматически снижает вес высокорисковых инструментов и повышает вес стабильных.

Автор: Yevgeniy Koshtenko

 

Поразбирался с математикой, интересные идеи. Хорошая и интересная статья.

Однако, система может принести неприятности на разворотах тренда. 

Это в статье не прозвучало.

 
"EURJPY":  1.0 / 157.0,
    "GBPJPY":  1.0 / 157.0,
    "AUDJPY":  1.0 / 157.0,
    "CADJPY":  1.0 / 157.0,
    "CHFJPY":  1.0 / 157.0,
    "NZDJPY":  1.0 / 157.0, и т.д...

а если курс изменился?


L1-фильтр  идеально рисует прямые линии на устоявшемся тренде, игнорируя шум. Но у каузальной версии (которая не заглядывает в будущее) есть неизбежная плата за сглаживание: инерция.

Текущий live-цикл работает по таймеру — он пересчитывает сигналы раз в час или проверяет условия каждые 10-60 секунд. На волатильных инструментах вроде XAUUSD или GBPJPY самые жесткие развороты происходят внутри часа. Если цена резко разворачивается, формируя мощный паттерн, ожидание закрытия H1-бара или срабатывания минутного таймера приведет к огромной просадке по открытой позиции.

 

Доброе утро. При запуске программы я получаю ошибку "❌ EURUSD : не удается получить тик". Эта ошибка возникает со всеми символами. Есть ли какие-нибудь решения? В режиме тестирования на исторических данных все работает идеально, и графики в итоге генерируются. Однако в режиме "Бесконечный цикл в реальном времени" я получаю указанную выше ошибку.

<moderator's note: machine translation to the Russian>

 
Dear  Evgeniy , I really enjoyed your article well written with solid base theory, well done Bro. I ran a couple of tests... Here is my suggestion :
1- change the total lot from static 6 to an output of a function that calculates it based on a multplier of free margin(e.g. 0.2)... then max per symbol would be a multplier of totLots (e.g. 0.1)
2- in many instances after the relearn the code looses contanct with mt5, you may benefit on adding this in send_market order :
if mt5.terminal_info() is None:
print("MT5 disconnected. Reconnecting...")

mt5, terminal = mt5_connect_expected()

Yevgeniy Koshtenko - Koshtenko - Профиль трейдера
Yevgeniy Koshtenko - Koshtenko - Профиль трейдера
  • 2026.06.19
  • www.mql5.com
Профиль трейдера
 
syndicato # :

Good morning. When I launch the program, I get the error "❌ EURUSD : Unable to get tick." This error occurs with all symbols. Are there any solutions? In historical data testing mode, everything works perfectly, and charts are generated. However, in "Real-time infinite loop" mode, I get the error mentioned above.

<moderator's note: machine translation to the Russian>

you can solve that using the what I proposed in my comment
 

for j in range(prev_i + 1, i): w = (j - prev_i) / (i - prev_i) out[j] = (1 - w) * prev_val + w * float(seg_l1[-1]) # ← seg_l1[-1] это значение в точке i (БУДУЩЕЕ!)

Алгоритм при интерполяции подглядывает в будущее на stride-1 баров и это делает его непригодным для live-торговли.