Обсуждение статьи "Объединяем 3D-бары, квантовые вычисления и машинное обучение в единую торговую систему"

 

Опубликована статья Объединяем 3D-бары, квантовые вычисления и машинное обучение в единую торговую систему:

Представлена полная интеграция модуля 3D-баров в квантово-усиленную торговую систему для прогнозирования движения валютных пар. Система объединяет стационарные четырёхмерные признаки, квантовый энкодер на 8 кубитах и градиентный бустинг CatBoost с 52+ признаками. Система реализована на Python с использованием MetaTrader 5, Qiskit, CatBoost и опциональной интеграцией LLM Llama 3.2 для интерпретации прогнозов.

В предыдущих статьях мы рассмотрели применение квантовых вычислений для извлечения нелинейных корреляций из рыночных данных, а также интеграцию языковых моделей с градиентным бустингом CatBoost. Точность прогнозирования составила 62.4% на кросс-валидации, что обеспечило доходность +27.39% за месяц бэктестинга на микросчёте $140.

Однако, анализ показал, что система упускает критически важную информацию — многомерную структуру взаимодействия цены, времени и объёма. Классические индикаторы работают с проекциями рынка на двумерные графики, теряя объёмную картину происходящего. В данной статье представлена полная интеграция модуля 3D-баров в квантово-усиленную торговую систему.

Автор: Yevgeniy Koshtenko

 


bar3d_yellow_cluster на последнем месте. Что не так?

 

Путем перебора параметров модели  CatBoost и долгих часов максимум что удалось получить 

================================================================================

Средняя точность: 55.66% ± 4.34%


Обучение финальной модели на всех данных...


✓ Модель сохранена: models/catboost_quantum_3d.cbm


ТОП-10 ВАЖНЫХ ПРИЗНАКОВ:

                feature  importance

   bar3d_trend_strength   30.591319

                EMA_200   22.086104

                 EMA_50   14.959278

                   MACD    4.816617

          volatility_20    4.555638

                    ATR    3.050433

bar3d_volume_volatility    2.690818

 bar3d_price_volatility    2.354294

              vol_ratio    2.308871

        price_change_21    2.308647


3D-БАРЫ В ТОПЕ (5 признаков):

                feature  importance

   bar3d_trend_strength   30.591319

bar3d_volume_volatility    2.690818

 bar3d_price_volatility    2.354294

    bar3d_reversal_prob    0.735604

   bar3d_yellow_cluster    0.215698


Как у вас получился bar3d_yellow_cluster самым важным, не понимаю

 

제공된 코드를 분석한 결과, 현재 버전에서는 학습 데이터(Training) 백테스트 데이터(Backtest)가 명확하게 구분되어 있지 않은 것으로 나타났습니다.

이는 데이터 유출 로 이어져 백테스팅 결과가 실제 결과보다 훨씬 좋게 나오는 구조를 만들어냅니다.

코드의 논리를 분석하여 그 이유를 자세히 설명하겠습니다.

1. 문제 분석

A. 훈련 단계 (모드 1)

main() 함수에서 모드 1이 선택되면 load_mt5_data(180)가 호출됩니다.

파이썬

if choice == "1": data = load_mt5_data(180) # Загружаются все данные за последние 180 дней # ... model = train_catboost_model(data, quantum_encoder, bars_3d)

다음으로, 함수 내부를 살펴보면 train_catboost_model 교차 검증이 수행되지만 마지막에는 전체 데이터셋을 사용하여 재학습이 이루어진다는 것을 알 수 있습니다 .

파이썬
                        # Внутри train_catboost_model
    print("\n전체 데이터로 최종 모델 학습 중...")
    model.fit(X, y, verbose=500) # Здесь X — это полные данные за последние 180 дней

즉, 해당 모델은 "오늘"까지의 모든 데이터를 사용하여 학습됩니다.

B. 백테스트 단계 (모드 4)

backtest() 함수는 BACKTEST_DAYS = 30(최근 30일)으로 설정된 기간 동안 테스트를 수행합니다.

파이썬

end = datetime.now().replace(second=0, microsecond=0) start = end - timedelta(days=BACKTEST_DAYS) # Последние 30 дней

2. 결론: 데이터 유출 발생 사례

  • 학습 데이터: [오늘 - 180일] ~ [오늘]

  • 테스트 데이터: [오늘 - 30일] ~ [오늘]

테스트하려는 기간(최근 30일) 은 이미 학습 데이터에 포함되어 있습니다 . 이는 모델이 이미 정답을 "본" 상태에서 시험을 치르는 것과 같으므로 백테스트 승률이 비현실적으로 높습니다.

3. 해결 방법 (코드 수정 가이드)

정확한 백테스트를 위해서는 학습 과정에서 테스트 기간을 제외 해야 합니다 .

해결 방법 1: 학습 함수에서 최신 데이터를 제외합니다(권장).

train_catboost_model 함수 내부 또는 데이터 로딩 단계에서 백테스트 기간만큼 데이터를 잘라내야 합니다.

파이썬
                    # Предложение по исправлению: изменение внутри функции train_catboost_model
def train_catboost_model(data_dict, quantum_encoder, bars_3d=None):
    # ... (пропуск) ...
    
    # [Исправление] Не создавайте X сразу из всех данных, нужно разделить их по дате.
    # Или просто исключите данные за последние BACKTEST_DAYS перед обучением.
    
    cutoff_index = len(df_features) - (BACKTEST_DAYS * 96) # Примерно 96 баров в день для M15
    
    # Используем для обучения только данные до точки отсечения
    train_features = df_features.iloc[:cutoff_index] 
    
    # ... далее используем train_features для обучения ...

해결 방법 2: 핵심 로직에서 데이터를 분리합니다.

가장 쉬운 방법은 main() 함수에서 데이터를 로드할 때 서로 다른 기간을 설정하는 것입니다.

  • 모드 1 (학습): load_mt5_data(start_days=210, end_days=30) (예: 210일 전부터 30일 전까지의 데이터)

  • 모드 4(테스트): backtest(days=30) (예: 30일 전부터 오늘까지의 데이터)

요약하자면, 현재 코드에는 예측 편향이 포함되어 있어 백테스트 결과를 신뢰할 수 없습니다. 실제 사용 전에 기간을 분할하고 모델을 재학습한 후 다시 테스트하는 것이 필수적입니다.

 

Приветствую, да, без углубления и изучения кода, выглядит очень заманчиво. НО, прочитав предыдущего комментатора - полез внутрь.

Действительно, бэктест проходит на данных, которые catboost уже видела.

Ради интереса деактивировал в коде вот эту строку:


    print("\nОбучение финальной модели НА ВСЕХ ДАННЫХ...")

#     model.fit(X, y, verbose=500)


и вуа ля, на бэктесте за 30 дней, режим 4, нет ни одной сделки(

CatBoost: еле-еле больше 50%


...эх, а счастье было так близко..)


Вами проделана огромная работа...и разочарование

 
djgagarin #:

Приветствую, да, без углубления и изучения кода, выглядит очень заманчиво. НО, прочитав предыдущего комментатора - полез внутрь.

Действительно, бэктест проходит на данных, которые catboost уже видела.

Ради интереса деактивировал в коде вот эту строку:


    print("\nОбучение финальной модели НА ВСЕХ ДАННЫХ...")

#     model.fit(X, y, verbose=500)


и вуа ля, на бэктесте за 30 дней, режим 4, нет ни одной сделки(

CatBoost: еле-еле больше 50%


...эх, а счастье было так близко..)


Вами проделана огромная работа...и разочарование

ну товарищ шлепает по 2 статьи в неделю. код вероятнее всего генерил ии.