Архитектура машинного обучения для MetaTrader 5 (Часть 12): Калибровка вероятностей для финансового машинного обучения
Содержание
- Почему классификаторы некалиброваны
- Метрики калибровки
- Методы калибровки
- Контракт финансовых данных: калибровка без утечек
- Модуль afml.calibration
- Диагностическая процедура
- Заключение
- Прикреплённые файлы
Введение
Методы расчёта размера позиции из Части 10 принимают прогнозную вероятность и возвращают размер позиции. Множитель Келли из Части 11 использует ту же вероятность и корректирует позицию с учётом асимметрии выплат. Оба расчёта настолько хороши, насколько хороша вероятность, которую они получают.
Случайный лес, который прогнозирует вероятность 0,68 при фактической доле выигрышей 0,55, не просто неточен. Он систематически избыточно уверен, и эта избыточная уверенность напрямую влияет на все последующие расчёты размера позиции. Функция get_signal преобразует завышенную вероятность в более высокое z-значение и, следовательно, в больший размер позиции. Доля Келли растёт вместе с прогнозной вероятностью. Даже небольшое систематическое завышение доли Келли в каждой сделке в итоге разрушит банкролл, который выдержал бы те же сделки при корректном размере позиции.
Симптомы проявляются только на кривой капитала. Стратегия, которая выглядит хорошо сбалансированной в бэктесте с исходными вероятностями, будет систематически открывать позиции крупнее, чем на самом деле подтверждают данные. Это приводит к более глубоким просадкам и более низкому геометрическому росту, чем у корректно откалиброванной версии той же стратегии.
В этой статье мы рассматриваем модуль afml.calibration и его место в рабочем процессе. Вы узнаете: (1) почему классификаторы на основе деревьев склонны к избыточной уверенности и как это видно на диаграмме надёжности; (2) что измеряют оценка Брайера, ECE и MCE; (3) когда использовать изотоническую регрессию вместо масштабирования Платта; (4) как калибровать без временной утечки, используя OOF-прогнозы из PurgedKFold; и (5) как некалиброванность распространяется от вероятностей к размерам позиций, прибыли и убытку (P&L, profit and loss) и распределениям коэффициента Шарпа по путям CPCV.
Эта статья является Частью 12 серии "Архитектура машинного обучения MetaTrader 5". Часть 10 и Часть 11 создали инструментарий расчёта размера позиции, которому передаются откалиброванные вероятности из этой статьи. Статья «Единый процесс валидации» утвердила PurgedKFold как корректную схему разбиения для кросс-валидации, а CPCV — как корректную схему проверки на исторических данных; оба подхода используются здесь для обучения калибровочного отображения и финальных диагностических графиков. Часть 8 и Часть 9 подготовили инфраструктуру HPO, которая выдаёт модель, калибруемую в этой статье.
Почему классификаторы некалиброваны
Проблема избыточной уверенности
Классификатор считается хорошо откалиброванным, если среди всех наблюдений, которым он присвоил прогнозную вероятность 0,70, примерно 70% действительно относятся к положительному классу. Прогнозная вероятность и наблюдаемая частота совпадают. Это свойство называется калибровкой и отличается от точности. Классификатор может правильно ранжировать наблюдения, но при этом систематически быть избыточно уверенным или недостаточно уверенным в назначаемых абсолютных значениях вероятности.
Классификаторы на основе деревьев, такие как случайные леса и деревья градиентного бустинга, структурно склонны к избыточной уверенности. Причина заключается в том, как они формируют оценки вероятности. Случайный лес усредняет доли голосов по входящим в него деревьям. Каждое дерево, обученное минимизировать неоднородность, обычно создаёт оценки на уровне листьев, сгруппированные около 0 и 1. Среднее по ансамблю таких экстремальных оценок оказывается смещённым к хвостам. Истинная доля выигрышей 0,55 часто отображается в прогнозную вероятность 0,65 или 0,70. У деревьев градиентного бустинга есть родственная, но немного иная проблема. Они оптимизируют целевую функцию в пространстве логарифма шансов (log-odds), а не непосредственно в пространстве вероятностей. Затем финальное сигмоидное преобразование выдаёт слишком экстремальные вероятности, когда число раундов бустинга велико относительно реального сигнала в данных.
В финансовом машинном обучении эта проблема усиливается. Отношение сигнал/шум низкое, модели обучаются на ограниченном числе независимых наблюдений, поскольку одновременность меток уменьшает эффективный размер выборки, а вневыборочная точность обычно находится в диапазоне 0,52–0,65, где разрыв между прогнозной и истинной вероятностью максимален. Модель с реальным, но умеренным преимуществом (точность около 0,57) часто присваивает вероятности в диапазоне 0,60–0,80, подразумевая гораздо более сильную уверенность, чем реально поддерживают данные.
Диаграмма надёжности
Диаграмма надёжности делает эту избыточную уверенность видимой. По оси x показана прогнозная вероятность, сгруппированная по интервалам. По оси y показана наблюдаемая доля положительных исходов в каждом интервале. Идеально откалиброванный классификатор даёт прямую диагональную линию от (0,0) до (1,1). Избыточно уверенный классификатор даёт кривую, прогибающуюся ниже диагонали. Наблюдениям с прогнозной вероятностью 0,70 фактически соответствует доля выигрышей ближе к 55%. Разрыв между диагональю и калибровочной кривой прямо показывает, насколько уверенность модели превышает то, что поддерживают данные.
Бутстрэп-доверительные интервалы вокруг кривой крайне важны в финансовых приложениях. При небольшом числе независимых наблюдений из-за одновременности меток кривая надёжности получается шумной. Одноточечная оценка качества калибровки ненадёжна. bootstrap_reliability_ci генерирует 95% доверительные полосы путём ресэмплинга пар «наблюдение–прогноз» с возвращением. Это даёт статистически честное представление о том, где калибровочная кривая оценена надёжно, а где нет.

Рисунок 1. Двухпанельная иллюстрация надёжности калибровки до и после изотонической калибровки
- Слева — исходные вероятности: калибровочная кривая случайного леса почти везде проходит ниже диагонали. Наблюдения с прогнозной вероятностью 0,70 фактически выигрывают примерно в 55% случаев. Бутстрэп-полосы 95% доверия показаны затенённой областью вокруг кривой.
- Справа — калиброванные вероятности (изотоническая калибровка): после изотонической калибровки с использованием OOF-прогнозов через PurgedKFold, кривая близко следует диагонали на всех уровнях вероятности. Доверительные полосы сужаются в диапазоне умеренных вероятностей, где наблюдений больше всего.
Метрики калибровки
Три метрики количественно описывают разные аспекты качества калибровки. Они дополняют друг друга. Модель может хорошо выглядеть по одной метрике и проваливаться по другой.
Оценка Брайера
Оценка Брайера — это среднеквадратичная ошибка между прогнозными вероятностями и интерваларными исходами:
Brier = (1/N) * sum((p_i - y_i)**2)
Она вознаграждает резкость (вероятности, близкие к 0 или 1) и штрафует некалиброванность. Модель, которая прогнозирует 0,5 для каждого наблюдения, получает оценку Брайера 0,25 на сбалансированном наборе данных. Модель, которая одновременно хорошо откалибрована и уверена, получает оценку Брайера ниже этого базового уровня. Оценка Брайера раскладывается на компонент калибровки и компонент разрешающей способности. Изотоническая калибровка напрямую улучшает компонент калибровки, оставляя разрешающую способность неизменной.
Ожидаемая ошибка калибровки
ECE измеряет средневзвешенную абсолютную разницу между средней прогнозной вероятностью и наблюдаемой частотой по интервалам:
ECE = sum_b (|B_b| / N) * |mean_pred_b - mean_true_b|
где B_b — множество наблюдений в интервале b. ECE взвешивается по размеру интервала, поэтому интервалы с большим числом наблюдений сильнее влияют на итоговую оценку. Для финансовых приложений квантильное разбиение часто предпочтительнее равномерного. Распределение прогнозных вероятностей обычно сосредоточено около базовой частоты, и равномерные интервалы оставляют большинство интервалов пустыми, сжимая почти всё в два-три центральных интервала.
Максимальная ошибка калибровки
MCE измеряет наихудшую абсолютную разницу по всем интервалам:
MCE = max_b |mean_pred_b - mean_true_b|
MCE — консервативная метрика. Она отражает не среднее значение, а худшую область диапазона вероятностей. В финансовых приложениях худшей областью обычно является хвост высокой уверенности, где модель назначает 0,75–0,90, но фактически даёт долю выигрышей 0,58–0,65. Именно эта область создаёт самые крупные размеры позиций через get_signal и самые высокие доли Келли. MCE выявляет проблемы в этом хвосте, которые ECE может скрыть из-за усреднения.
Совместное использование метрик
Три метрики отвечают на разные вопросы. Оценка Брайера показывает, полезен ли вероятностный выход модели для принятия решений в целом. ECE показывает, насколько в среднем вероятности отклоняются от наблюдаемых частот. MCE показывает, какая область вероятностей является худшей и насколько сильно она некалибрована. Рабочая схема должна отслеживать все три метрики. Модель с хорошей ECE, но плохой MCE имеет конкретную область избыточной уверенности, которая при срабатывании будет давать неправильно подобранные размеры позиций. Модель с хорошей MCE, но плохой оценкой Брайера хорошо откалибрована, но не резка: её вероятности точны, но малоинформативны.
Методы калибровки
Изотоническая регрессия
Изотоническая регрессия строит неубывающую ступенчатую функцию, которая отображает исходные прогнозные вероятности в калиброванные вероятности. Она минимизирует сумму квадратов отклонений между ступенчатой функцией и истинными метками при условии, что функция монотонно не убывает. В результате получается кусочно-постоянное полностью непараметрическое отображение. Оно не делает предположений о функциональной форме некалиброванности и может исправлять произвольные калибровочные кривые, если они монотонны относительно исходных вероятностей.
Изотоническая регрессия является предпочтительным методом для финансового ML по трём причинам. Во-первых, она не делает распределительных предположений. Структура некалиброванности случайного леса, обученного на финансовых данных, не является лог-линейной. Изотоническая регрессия адаптируется к любой форме некалиброванности. Во-вторых, она сохраняет ранжирование прогнозов. Если наблюдение A имеет более высокую исходную вероятность, чем наблюдение B, оно будет иметь и более высокую калиброванную вероятность. Калибратор не меняет то, в каких наблюдениях модель наиболее уверена; он меняет только абсолютные значения вероятности. В-третьих, ступенчатая функция, создаваемая изотонической регрессией, поддаётся аудиту. Каждая точка калибровки сопоставляет конкретный диапазон исходных вероятностей с конкретным калиброванным значением, и это отображение можно проверить.
Для получения стабильных оценок изотоническая регрессия требует больше калибровочных данных, чем масштабирование Платта. Если в калибровочном наборе меньше нескольких сотен наблюдений, ступенчатая функция может стать нерегулярной и переобучиться на калибровочных данных. Это главное практическое ограничение в финансовых приложениях, где эффективный размер выборки уменьшается из-за одновременности меток.
Масштабирование Платта
Масштабирование Платта обучает логистическую регрессию на исходных скоринговых значениях (score), отображая их в калиброванные вероятности через сигмоидное преобразование:
p_calibrated = 1 / (1 + exp(-(A * score + B)))
где A и B оцениваются методом максимального правдоподобия на калибровочном наборе. Масштабирование Платта предполагает, что некалиброванность лог-линейна. Это предположение достаточно хорошо работает для машин опорных векторов и некоторых деревьев градиентного бустинга, но плохо подходит для долей голосов случайного леса. Для случайного леса, калибровочная кривая которого имеет S-образное отклонение от диагонали, линейное отображение исправит средний диапазон, но оставит хвосты частично некалиброванными.
Масштабирование Платта следует предпочитать изотонической регрессии только тогда, когда калибровочный набор мал (менее 200 наблюдений), а некалиброванность примерно лог-линейна. Во всех прочих случаях, встречающихся в финансовом ML, изотоническая регрессия даёт более точный и более интерпретируемый калибратор.
Сравнение двух методов
| Изотоническая регрессия | Масштабирование Платта | |
|---|---|---|
| Функциональная форма | Непараметрическая ступенчатая функция | Логистическая (сигмоида) |
| Предположение | Монотонные исходные вероятности | Лог-линейная некалиброванность |
| Минимальный объём калибровочных данных | Несколько сотен наблюдений | Десятки наблюдений |
| Предпочтительно для случайного леса (Random Forest) | Да | Нет |
| Ранжирование сохраняется | Да | Да |
| Риск переобучения | Умеренный (ступенчатая функция может быть шумной) | Низкий (только два параметра) |
Контракт финансовых данных: калибровка без утечек
Почему стандартные процедуры калибровки не работают на финансовых данных
Стандартная процедура калибровки (обучить модель на обучающем наборе, сгенерировать прогнозы на отдельном калибровочном наборе, обучить калибратор на этих прогнозах) предполагает, что калибровочный набор получен из того же распределения, что и обучающие данные, но независим от них. В финансовых данных с перекрывающимися метками метода тройного барьера это предположение нарушается двумя способами.
Во-первых, случайное разделение на обучение и калибровку допускает утечку информации через границу очистки. Метки, пересекающие точку разделения, относятся к обеим сторонам. Обучающий набор содержит часть баров периода удержания метки, а калибровочный набор — другую часть. Модель уже видела рыночные условия, которые определят, будет ли прогноз на калибровочном наборе верным. Калибровка, обученная на таких прогнозах, будет оптимистически смещена.
Во-вторых, даже упорядоченное по времени разделение не соблюдает эмбарго. Последние наблюдения обучающего набора имеют общую атрибуцию доходности с первыми наблюдениями калибровочного набора. Без достаточного эмбарго на границе фолда очистка и эмбарго должны гарантировать, что калибровочный набор не загрязнён событиями, которые модель неявно усвоила через перекрывающиеся метки.
Правильная процедура: OOF-калибровка через PurgedKFold
Правильный подход использует OOF-прогнозы (out-of-fold, прогнозы для наблюдений вне обучающей части своего фолда) из PurgedKFold. Для каждого фолда модель обучается на обучающем разбиении, прогнозирует на валидационном разбиении, а затем валидационные прогнозы объединяются в полноразмерный OOF-массив. Этот OOF-массив обладает тремя свойствами: (1) каждый прогноз создан моделью, которая не обучалась на данном наблюдении; (2) очистка предотвращает утечку меток через границы фолдов; (3) эмбарго уменьшает временное загрязнение от соседних баров. Затем калибратор обучается по этим OOF-прогнозам относительно истинных меток.
from afml.calibration.calibration import CalibratorCV from afml.cross_validation.cross_validation import PurgedKFold cv = PurgedKFold(n_splits=5, t1=events['t1'], pct_embargo=0.01) # Оборачиваем базовый классификатор — CalibratorCV сам является оценивателем, совместимым с библиотекой scikit-learn calibrated_clf = CalibratorCV(estimator=clf, cv=cv) # Метод fit() («обучить») последовательно выполняет три действия: # 1. формирует OOF-прогнозы через PurgedKFold # 2. обучает калибровочное отображение (по умолчанию изотоническое; вариант Платта включается параметром method='platt') # 3. обучает базовую модель на полном наборе данных calibrated_clf.fit(X, y, sample_weight=sample_weight) # OOF-вероятности сохраняются для диагностики (используются в разделе 6) oof_probs_raw = calibrated_clf.oof_probs_ # При применении модели predict_proba() («вероятностный прогноз») автоматически использует обученное калибровочное отображение calibrated_probs = calibrated_clf.predict_proba(X_new)[:, 1]
Веса выборки при калибровке
CalibratorCV передаёт sample_weight и при обучении базового оценивателя, и при обучении калибровочного отображения. Взвешенное обучение калибровочного отображения важно для финансовых данных, потому что OOF-наблюдения не одинаково информативны. Наблюдение из бара с высокой уникальностью и наблюдение из сильно перекрывающейся метки не должны одинаково влиять на калибровочную кривую. Передача тех же AFML-весов уникальности или временного затухания, которые использовались при обучении модели, гарантирует, что калибровочная кривая обучается с тем же информационным взвешиванием, что и сама модель. Если sample_weight опущен, калибратор считает все OOF-наблюдения одинаково информативными, что внутренне противоречит взвешенному базовому классификатору.
Модуль afml.calibration
Модуль состоит из двух уровней. Основной интерфейс — CalibratorCV, модель-обёртка, совместимая с библиотекой scikit-learn. Он (1) генерирует OOF-прогнозы через PurgedKFold, (2) обучает калибровочное отображение — по умолчанию изотоническое, а при выборе метода Платта — логистическое, и (3) обучает базовую модель на полном наборе данных. Поскольку он реализует стандартный интерфейс моделей scikit-learn, его можно компоновать с любым последовательностью обработки scikit-learn, поиском по сетке или циклом кросс-валидации. Слой метрик и визуализации предоставляет отдельные функции — brier_score, expected_calibration_error, maximum_calibration_error, calibration_report, plot_reliability, и plot_reliability_with_ci — которые принимают numpy-массивы и возвращают скалярные значения или графики. fit_platt_scaling доступен как низкоуровневый конструктор для масштабирования Платта при вызове вне интерфейса CalibratorCV.
from afml.calibration.calibration import ( CalibratorCV, brier_score, expected_calibration_error, maximum_calibration_error, calibration_report, plot_reliability_with_ci, ) from afml.cross_validation.cross_validation import PurgedKFold import matplotlib.pyplot as plt cv = PurgedKFold(n_splits=5, t1=events['t1'], pct_embargo=0.01) # Шаг 1: обучаем модель: формируем OOF-прогнозы, строим калибровочное отображение и заново обучаем базовую модель calibrated_clf = CalibratorCV(estimator=clf, cv=cv) calibrated_clf.fit(X, y, sample_weight=sample_weight) # Шаг 2: берём сохранённые исходные OOF-вероятности и получаем их калиброванные значения. # При изотонической калибровке (значение по умолчанию) calibrator_ содержит IsotonicRegression: применяем .predict() («предсказать»). # При масштабировании Платта calibrator_ содержит LogisticRegression: применяем predict_proba() к столбцу исходных вероятностей (raw). oof_probs_raw = calibrated_clf.oof_probs_ oof_probs_cal = calibrated_clf.calibrator_.predict(oof_probs_raw) # Шаг 3: рассчитываем метрики report = calibration_report(y, oof_probs_raw, oof_probs_cal) print(report) # Шаг 4: строим диаграмму надёжности с бутстрэп-доверительным интервалом fig, axes = plt.subplots(1, 2, figsize=(14, 6)) plot_reliability_with_ci(y, oof_probs_raw, ax=axes[0], title="Исходные вероятности", random_state=42) plot_reliability_with_ci(y, oof_probs_cal, ax=axes[1], title="Калиброванные вероятности", random_state=42)
Интеграция в рабочий процесс
В рамках производственного процесса, созданного в Части 9, калибровка активируется передачей calibrate=True в ModelDevelopmentPipeline.run(). После того как clf_hyper_fit возвращает лучшую модель, calibrate_model() вызывается автоматически. Он создаёт CalibratorCV поверх этой модели, используя PurgedKFold с теми же n_splits и pct_embargo, что и на шаге HPO, затем обучает его на всём обучающем наборе. После этого self.best_model ссылается на обученный CalibratorCV, поэтому все последующие вызовы predict_proba() возвращают калиброванные вероятности без изменения вызывающего кода.
# Запускаем весь рабочий процесс с включённой калибровкой model, features, metrics, config = pipeline.run( calibrate=True, ) # Атрибут pipeline.calibrator содержит обученный CalibratorCV для последующей диагностики; valid — маска пригодных OOF-значений valid = ~np.isnan(pipeline.calibrator.oof_probs_) oof_brier = np.mean( (pipeline.calibrator.oof_probs_[valid] - y.values[valid]) ** 2 ) # Строим диаграмму надёжности напрямую по OOF-прогнозам plot_reliability_with_ci( y, pipeline.calibrator.oof_probs_, title="OOF — Исходные вероятности", ) plot_reliability_with_ci( y, pipeline.calibrator.calibrator_.predict( pipeline.calibrator.oof_probs_[valid]), title="OOF — Калиброванные вероятности", )
После завершения pipeline.run() заполняются два атрибута. pipeline.best_model — это экземпляр CalibratorCV, используемый для всех последующих применений модели. pipeline.calibrator содержит тот же объект для диагностического доступа, включая диаграммы надёжности, сравнения оценки Брайера и исходные OOF-вероятности, доступные через calibrator.oof_probs_.
При экспорте в ONNX — открытый формат обмена моделями — действует отдельное ограничение: оно проявляется, когда в рабочем процессе задан параметр export_onnx=True («экспортировать модель в ONNX»). CalibratorCV не имеет сопоставления с оператором ONNX, поэтому _save_all_artifacts() разворачивает калибратор и экспортирует внутренний оцениватель библиотеки scikit-learn как источник для ONNX-экспорта. Изотоническое отображение отдельно сохраняется как сериализованный объект IsotonicRegression. При использовании в MetaTrader 5 ONNX-модель выдаёт исходные вероятности; они проходят через calibrator.calibrator_.predict() на этапе постобработки перед тем, как вероятности попадут в слой расчёта размера позиции.
Диагностическая процедура
Запуск шага калибровки отдельно показывает, что исходные вероятности некалиброваны, а изотоническая регрессия их исправляет. Это необходимо, но недостаточно. Вывод становится окончательно убедительным только тогда, когда эффект прослеживается по всей цепочке: от вероятностей к размерам позиций, затем к прибыли и убытку (P&L, profit and loss) и, наконец, к распределениям коэффициента Шарпа по путям.

Цепочка распространения некалиброванности от исходных вероятностей к коэффициенту Шарпа по путям
Следующие шесть рисунков делают эту цепочку явной.
Распределение размера позиции
Поскольку get_signal является монотонной функцией вероятности, систематический сдвиг распределения вероятностей создаёт предсказуемый сдвиг распределения размеров позиций. Избыточно уверенные вероятности, сосредоточенные в диапазоне 0,60–0,80, отображаются в выходы get_signal в диапазоне 0,20–0,60. Диаграмма рассеяния исходных и калиброванных размеров позиций показывает, что почти каждое наблюдение находится выше диагонали равного размера, подтверждая, что исходная модель систематически завышает размер позиции относительно калиброванной.

Рисунок 2. Трёхпанельная иллюстрация распределения размера позиции
- Слева — гистограмма: get_signal для исходных (оранжевые) и калиброванных (зелёные) вероятностей. Исходное распределение везде сдвинуто вправо; калибровка возвращает его ближе к центру.
- В центре — диаграмма рассеяния: исходный и калиброванный размер позиции для каждого наблюдения. Точки выше диагонали представляют наблюдения, для которых исходная модель завышает размер позиции; почти все наблюдения находятся выше неё.
- Справа — средний размер позиции по децилям: средний размер позиции в каждом дециле вероятности для исходной и калиброванной моделей. Избыточный размер в верхних децилях, где избыточная уверенность максимальна, отмечен отдельно.
Анализ преимущества по децилям
Завышение размера становится опасным в сочетании с тем фактом, что высоковероятностные прогнозы исходной модели не соответствуют пропорционально высоким фактическим долям выигрышей. Анализ преимущества по децилям делит наблюдения на десять интервалов по прогнозной вероятности и строит среднюю прогнозную вероятность против фактической доли выигрышей в каждом интервале. Хорошо откалиброванная модель даёт диаграмму рассеяния, где интервалы следуют диагонали. Избыточно уверенная модель создаёт интервалы в верхних децилях, которые заметно расположены выше неё: модель прогнозирует 0,70, но фактически даёт 0,57.

Рисунок 3. Анализ преимущества по децилям (размер пузыря пропорционален числу наблюдений в дециле)
Долина завышенной доли Келли
Теория Келли даёт аналитический механизм, связывающий избыточно уверенные вероятности с ухудшением прибыли и убытка (P&L, profit and loss). Ожидаемая логарифмическая скорость роста стратегии с позициями достигает максимума при истинной оптимальной доле Келли и падает по обе стороны: резко справа (завышение доли Келли) и постепенно слева (занижение доли Келли). Поскольку даже небольшое систематическое завышение доли Келли на каждом наблюдении через накопление отрицательного роста ведёт к разорению, правый нисходящий склон является опасной зоной. Избыточно уверенная модель стабильно рекомендует доли Келли выше оптимума, помещая стратегию на этот склон почти в каждой сделке.

Рисунок 4. Долина завышенной доли Келли
Влияние на прибыль и убыток (P&L)
Моделирование кривой капитала на исходных и калиброванных вероятностях с использованием половинной доли Келли переносит аргумент из пространства вероятностей на уровень счёта. Каждый прогон моделирования применяет одну и ту же последовательность сделок с размерами позиций, полученными соответственно из исходных и калиброванных вероятностей. Калиброванная кривая капитала получается более гладкой, достигает более высокого конечного капитала и показывает меньшие просадки не потому, что сигналы разные, а потому что размеры позиций корректны.

Рисунок 5. Влияние на прибыль и убыток (P&L)
Устойчивость по путям CPCV
Один прогон кривой капитала зависит от выбранного пути. Результат отражает конкретную последовательность прогнозов модели, а не общее поведение калиброванной стратегии по сравнению с некалиброванной. Распределение путей CPCV из статьи о едином рабочем процессе валидации решает эту проблему. φ[N, k] независимых путей симулируются, каждый со свежей последовательностью OOF-прогнозов из другой коминтервалации обучающих фолдов. Распределение коэффициента Шарпа по путям даёт более надёжную основу для оценки того, даёт ли калибровка реальное структурное улучшение или просто сдвигает один удачный путь.
Калибровка не только сдвигает средний коэффициент Шарпа вверх. Она также сужает стандартное отклонение по путям. Широкое распределение коэффициента Шарпа по путям сигнализирует о хрупкости. Калибровка уменьшает эту зависимость от пути, поскольку размеры позиций, завышенные из-за избыточной уверенности, являются главным механизмом, из-за которого одна неудачная последовательность сделок создаёт непропорционально большую просадку на одном пути, но не на других.

Рисунок 6. Двухпанельная иллюстрация распределения коэффициента Шарпа по путям CPCV
- Слева — Коэффициент Шарпа по каждому пути: коэффициент Шарпа по пути CPCV для исходных (оранжевые) и калиброванных (зелёные) вероятностей. Калиброванные пути в среднем выше и менее вариативны.
- Справа — распределение: ядерная оценка плотности коэффициента Шарпа по путям для всех φ[N, k] путей. Калибровка сдвигает среднее, сужает стандартное отклонение и увеличивает долю путей с положительным коэффициентом Шарпа. PBO, рассчитанный по калиброванной матрице доходностей, ниже, что подтверждает: улучшение не является артефактом выбора пути.
Заключение
Аргумент в пользу калибровки в этом рабочем процессе состоит не в том, что некалиброванные модели плохо ранжируют наблюдения. Случайные леса с достойными признаками действительно ранжируют наблюдения правильно. Реальная проблема в том, что абсолютные значения вероятности, которые они назначают, не соответствуют долям выигрышей, подразумеваемым этими вероятностями. Каждый метод расчёта размера позиции из частей 10 и 11 напрямую преобразует эти абсолютные значения в размеры позиций и доли Келли. Диагностическая процедура в разделе 6 количественно оценивает стоимость этого несоответствия на каждом этапе цепочки: пространство вероятностей, пространство позиций, прибыль и убыток (P&L, profit and loss) и распределение коэффициента Шарпа по путям. Исправление — изотоническая калибровка по OOF-прогнозам через PurgedKFold — выполняется одним вызовом и не добавляет параметров модели, не вводит новых степеней свободы и создаёт отображение, которое можно полностью аудировать и периодически перепроверять по мере изменения распределения данных.
Ключевые выводы:
- Калибровка и дискриминационная способность независимы. Модель, которая правильно ранжирует наблюдения, всё равно может быть избыточно уверенной. Оценка Брайера, ECE и MCE измеряют калибровку; AUC измеряет дискриминационную способность. Важны оба аспекта, и высокий AUC не оправдывает плохую калибровку, когда абсолютные значения вероятности используются для определения размера позиции.
- Используйте изотоническую калибровку для классификаторов на основе деревьев. Масштабирование Платта предполагает лог-линейную некалиброванность, что не выполняется для случайных лесов. Изотоническая регрессия непараметрична и адаптируется к фактической форме некалиброванности. Используйте масштабирование Платта только тогда, когда эффективный размер OOF-выборки после очистки и эмбарго падает ниже примерно 200 наблюдений.
- Калибруйте через PurgedKFold, а не через случайный отложенный набор. Случайное калибровочное разбиение допускает утечку информации через границу очистки. OOF-прогнозы через PurgedKFold с корректным эмбарго — единственный допустимый источник калибровочных данных для финансовых данных с перекрывающимися метками.
- Периодически перепроверяйте калибратор. Отображение исходных вероятностей в калиброванные отражает структуру некалиброванности модели на распределении обучающих данных. После значительного сдвига режима или после повторного обучения модели на существенно другом наборе данных калибратор следует обучить заново. Устаревшая калибровка лучше, чем её отсутствие, но она не является надёжной бесконечно.
- Отслеживайте все три метрики. ECE измеряет средний разрыв; MCE измеряет худшую область; оценка Брайера измеряет общую полезность вероятностей для принятия решений. Стратегия с хорошей ECE, но высокой MCE имеет конкретную область вероятностей, создающую неправильно подобранные размеры позиций, которые усреднённые метрики не выявят.
Прикреплённые файлы
| Файл | Описание |
|---|---|
| __init__.py | Инициализатор пакета — экспортирует публичный API из calibration.py, делая инструментарий калибровки напрямую импортируемым на уровне пакета. |
| calibration.py | Основной интерфейс: CalibratorCV модель-обёртка, совместимая с библиотекой scikit-learn, который:
brier_score, expected_calibration_error, maximum_calibration_error, compute_reliability, bootstrap_reliability_ci, plot_reliability, plot_reliability_with_ci, calibration_report, fit_platt_scaling. |
| README.md | Пользовательская документация — обзор, ключевые возможности, примеры быстрого старта, справочник API и рекомендации по использованию модуля калибровки. |
Перевод с английского произведен MetaQuotes Ltd.
Оригинальная статья: https://www.mql5.com/en/articles/21938
Предупреждение: все права на данные материалы принадлежат MetaQuotes Ltd. Полная или частичная перепечатка запрещена.
Данная статья написана пользователем сайта и отражает его личную точку зрения. Компания MetaQuotes Ltd не несет ответственности за достоверность представленной информации, а также за возможные последствия использования описанных решений, стратегий или рекомендаций.
Автоматизация торговых стратегий в MQL5 (Часть 31): Создание системы распознавания гармонического паттерна "3 Drives" с использованием Price Action
Разработка торговой стратегии: Метод Butterfly Oscillator
Разработка инструментария для анализа Price Action (Часть 47): Отслеживание торговых сессий Forex и пробоев в MetaTrader 5
Автоматизация торговых стратегий в MQL5 (Часть 30): Создание гармонического паттерна AB=CD на основе Price Action с визуализацией
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования