Блог им. bbanny_05

OS Engine и ошибки тестирования в Скринерах и Мультитикерных стратегиях и БАГИ БАГИ

В общем решил попробовать стратегии OS_Engine_team из рекламируемого АлгоСтарта !
Все скачал запустил, показывает неплохую растущую эквити вроде все круто.
НО решил все перепроверить в используя модный Vibe Coding и другую систему создания стратегий.
И тут начались проблемы с воспроизведением результатов которые давала OSEngine:
— доходность упала в два раза
— Sharpe уменьшился в два раза
— Max DrawDown вырос до 50%
И пришлось все ДЕТАЛЬНО анализировать с помощью дебаггера и создания логов.
В результате нашел что скринер по волатильности у меня считался немного по другому, поменял расчет, 
после этого MAX DrawDown уменьшился до -15%, что уже неплохо и почти как в оригинале, НО доходность НЕ выросла,
и первые 5 лет с 2015 по 2020 год эквити почти топчется на месте, у в оригинале эквити всегда растет.
Пришлось вернуться назад и заново все детально проверять.
И вот какую ошибку я нашел в результате проверок:
(это мое предположение почему есть проблема)

Суть проблемы

У разных тикеров в исторических данных могут отсутствовать свечи за определённые периоды:

  • не было сделок,

  • биржа не торговалась,

  • сбой при скачивании истории,

  • разные торговые календари и т.д.

Это нормально и неизбежно.

Проблема начинается дальше.

Как ведёт себя OS Engine

Судя по поведению, OS Engine:

  1. Делает первичное выравнивание по временным меткам.

  2. Далее идёт по массивам свечей без учёта временных меток, просто по индексам.

В результате индикаторы начинают считаться по разным реальным периодам времени, хотя визуально всё выглядит корректно.

Пример

Допустим, считаем SMA(5) по трём тикерам:

  • Тикер 1 — данные полные
    → SMA считается за 5 последних календарных дней, включая сегодняшний.

  • Тикер 2 — нет свечей за сегодня
    → SMA считается за 5 рабочих дней, но только до вчерашнего дня.

  • Тикер 3 — был сбой в истории
    → SMA считается за 5 дней в прошлом месяце.

При этом:

  • ошибок нет,

  • предупреждений нет,

  • визуально в интерфейсе всё выглядит «нормально».

 Вы никогда об этом не узнаете, если не начнёте пошагово проверять данные и отлаживать расчёты в дебаггере.

Почему это опасно

  • Скринеры дают некорректные сигналы

  • Результаты тестирования искажены

  • Стратегии могут «работать» только из-за ошибки синхронизации данных

  • Найти причину практически невозможно без глубокого анализа

-------------------------------------------------

Дальше решил проверить мои выводы с помощью LLM:
Промпт для Athcropic агента по исходному коду OSEngine

Проверь правильность утверждения, проанализировав исходный код
```
Ошибка в скринерах и там где используется больше одного тикера для тестирования
Проблем состоит в том что в данных тикеров могут отсутствовать свечи за разные периоды времени, не было сделок в этот перид или другая причина
НО когда OS Engine начинает идти по свечкам тикеров то видимо используется только первоначальное выравнивание по временным меткам, а потом по истрическим данным мы идем игнорирую временные метки. В результате получается что по одному тикеру, к примеру SMA(5) считается за 5 последних дней включая теущий день, по второму тикеру считается за 5 рабочих дней НО только до вчерашнего дня, а по третьему(если к примеру был сбой при скачке истторических данных) за пять дней в прошлом месяце. И вы этого даже не заметите нигде и не поймете, если не начнете все детально отлаживать и проверять в дебаггере.
```


Полученный ответ после анализа:

-----------------------------------------

АНАЛИЗ УТВЕРЖДЕНИЯ: ОШИБКА СИНХРОНИЗАЦИИ СВЕЧЕЙ В МНОГОТИКЕРНОМ ТЕСТИРОВАНИИ

На основе анализа исходного кода утверждение СПРАВЕДЛИВО И КРИТИЧНО ВЕРНО. Вот подробное объяснение проблемы:

1️⃣ АРХИТЕКТУРА ПРОБЛЕМЫ

Основной поток обработки свечей (TesterServer.cs, строки 862-867):

 

Суть проблемы: Все тикеры обрабатываются ПОСЛЕДОВАТЕЛЬНО в одном цикле, используя ОДНО ТЕКУЩЕЕ ВРЕМЯ (TimeNow).


2️⃣ КАК ЭТО ПРОИСХОДИТ В РЕЖИМЕ ТЕСТИРОВАНИЯ

Фаза 1: Начальное выравнивание (по времени)

В SecurityTester.CheckCandles() (строки 4769-4849):

 

На этом этапе: Все свечи выравниваются по временным меткам. Если у тикера нет свечи на текущий момент времени, он просто ждёт или пропускает.

Фаза 2: Обработка исторических данных (БЕЗ проверки времени)

В CandleSeries.SetNewCandleInArray() (Candles/CandleSeries.cs, строки ~595-646):

 

3️⃣ ОСНОВНОЙ ДЕФЕКТ: ИГНОРИРОВАНИЕ ВРЕМЕННЫХ МЕТОК

Сценарий, где это ломается:

Допустим, тестируем 3 тикера с 5-минутными свечами:

Время Тикер 1 (EURUSD) Тикер 2 (GBPUSD) Тикер 3 (USDJPY)
10:00 ✅ Есть ✅ Есть ✅ Есть
10:05 ✅ Есть ⚠️ Нет данных ✅ Есть
10:10 ✅ Есть ✅ Есть ❌ Ошибка скачивания
... ... ... ...

Что происходит при обработке индикатора SMA(5):

 

4️⃣ ГДЕ СКРЫТА ПРОБЛЕМА В КОДЕ

А) В LoadNextData() — нет синхронизации:

 

Б) В CheckCandles() — нет проверки пропусков:

 

В) В SetNewCandleInArray() — НЕТ валидации:

 

5️⃣ ПОЧЕМУ ЭТО НЕ ВИДНО БЕЗ ОТЛАДКИ

  1. Визуально скринер показывает значения (SMA = 100.5, 102.3 и т.д.)
  2. Математически SMA рассчитана правильно по доступным свечам
  3. НО эти свечи могут быть из разных временных интервалов!
  4. Индикатор ничего «не знает» о пропусках в исторических данных

Пример:

  • SMA по EURUSD: среднее за последние 25 минут ✅ (правильно)
  • SMA по GBPUSD: среднее за 10 минут + 3 дня назад ❌ (ОШИБКА!)
  • SMA по USDJPY: среднее за май прошлого года ❌❌ (КРИТИЧЕСКАЯ ОШИБКА!)

6️⃣ КОД, ДЕМОНСТРИРУЮЩИЙ ПРОБЛЕМУ

BotTabScreener.cs, строка 2638:

 

BotTabSimple.cs, строка 6525:

 

7️⃣ ПОСЛЕДСТВИЯ ДЛЯ ТЕСТИРОВАНИЯ

Проблема Последствие
Разные временные интервалы в SMA Неверные сигналы
Корреляция между тикерами «из прошлого» False positives в торговле
Пропущенные дни в одном из тикеров Слепое тестирование
Ошибка скачивания истории Тест на АБСОЛЮТНО НЕПРАВИЛЬНЫХ данных

8️⃣ КАК ЭТО МОЖНО ИСПРАВИТЬ

Вариант 1: Синхронизация с проверкой времени

 

Вариант 2: Добавить валидацию в CandleSeries

 
ИТОГОВЫЙ ВЫВОД

✅ УТВЕРЖДЕНИЕ ПОЛНОСТЬЮ СПРАВЕДЛИВО

Проблема действительно существует и скрыта в архитектуре OS Engine:

  1. Нет принудительной синхронизации между свечами разных тикеров
  2. Временные метки игнорируются при добавлении свечей в индикаторы
  3. Пропущенные дни/пропуски обрабатываются молчаливо без предупреждений
  4. Некорректные сигналы гарантированы при тестировании на нескольких тикерах

Это КРИТИЧЕСКИЙ ДЕФЕКТ для систем типа скринеров, которые сравнивают несколько инструментов одновременно.


Так что имейте это ввиду! 
Доходность стратегий АлгоСтарта будет раза в 2 ниже чем то что показывает OSEngine.

НУ а по ХОРОШЕМУ, НАДО ИСПРАВИТЬ баги в OSEngine и ЗАНОВО провести ВСЕ тестирования стратегий и подбор параметров.

  • обсудить на форуме:
  • OsEngine
1.3К | ★4
2 комментария
Я заполняю пропуски так:
        full_sec_range = pd.DataFrame({'t': range(min_t, max_t + 1)})
        df = full_sec_range.merge(df, on='t', how='left')
        df['last_price'] = df['last_price'].ffill().bfill()
        df['first_price'] = df['first_price'].fillna(df['last_price'])
        df['min_price'] = df['min_price'].fillna(df['last_price'])
        df['max_price'] = df['max_price'].fillna(df['last_price'])

Это просто размножает last_price на пустые следующие свечи. Так себе способ, но лучше, чем получить смещение по времени как в статье.
Если бы там было хоть что-то прибыльное, автор б не раздавал это за лайки. Мало того что сливное, так еще и чтобы это запустить нужно пуд соли съесть. А реальные отзывы Алексей сразу банит в чате )

Читайте на SMART-LAB:
Фото
EUR/USD: коррекция перед очередным витком роста?
Европейская валюта отходит от недавно достигнутых максимумов. Цена корректируется и уже коснулась горизонтального уровня 1.1920. При пробое...
Фото
📃 Как решения по ставке влияют на цены акций
Основной инструмент денежно-кредитной политики Банка России — это ключевая ставка. Для инвесторов она имеет большое значение. 🔵Ставка...
Что нового в Trade API? Автоматизируйте торговлю с комфортом
БКС продолжает улучшать Trade API и внедрять новый функционал, чтобы вы могли с комфортом автоматизировать свою торговлю. Что нового? •...
Фото
Как не проспать премправо по ЮМГ/ЕМЦ и купить акции на 15% дешевле рыночной стоимости?
Доброго утра. Я являюсь акционером ЮМГ (GEMC) и этот вопрос волнует меня не меньше вашего.  Также, мы видим интерес к этому моменту судя по...

теги блога Ибрагим

....все тэги



UPDONW
Новый дизайн