Архитектура машинного обучения для MetaTrader 5 (Часть 11): Критерий Келли, интеграция правил проп-фирмы и динамический бэктест по CPCV
Оглавление
- Критерий Келли: основа, точка пересечения и ограничения
- Пять условий, определяющих выбор метода
- Двухэтапная гибридная архитектура
- Интеграция с проп-фирмой: динамический w из бюджетов просадки
- Бэктестирование с CPCV и динамическим сайзингом
- Заключение
- Прикрепленные файлы
Введение
У вас есть сигнал определения размера позиции из инструментария, представленного в Части 10. Сигнал учитывает уверенность, скорректирован с учётом одновременности сигналов и дискретизирован. Но он ещё не учитывает выплаты, не ограничен бюджетом и не проверен на комбинаторных путях. Остаются три конкретных пробела.
Во-первых, методы определения размера позиции из Части 10 рассматривают выигрыши и проигрыши симметрично. Стратегия, которая выигрывает три доллара на каждый проигранный доллар, требует принципиально иного распределения капитала, чем симметричная ставка с той же вероятностью, а get_signal не имеет механизма, чтобы выразить это. Во-вторых, ни один из методов AFML не включает жёсткий лимит просадки. Когда счёт проп-фирмы уже израсходовал 70% дневной допустимой потери, тот же модельный сигнал должен давать гораздо меньшую позицию, чем в начале дня, а статическая функция размера на это реагировать не может. В-третьих, одиночный бэктест стратегии с динамическим сайзингом даёт искажённое представление о результативности. Размер позиции на каждом баре зависит от истории P&L до этого бара, а она зависит от каждого предыдущего решения о размере; поэтому результат является функцией конкретного исторического пути не меньше, чем реального статистического преимущества стратегии.
Все три пробела устраняются здесь. После прочтения у вас будет: точное понимание того, когда критерий Келли должен заменять или дополнять get_signal, включая численную точку пересечения, где два метода расходятся, и пять структурных условий, которые Келли не может удовлетворить на реальных финансовых рынках; двухэтапная гибридная архитектура, в которой get_signal отвечает за определение размера сигнала с учётом уверенности и коррекцией по перекрытию, а множитель выплат Келли применяет асимметричную поправку выигрыша/проигрыша на втором этапе, сохраняя коррекцию перекрытия активных меток и добавляя то, что может выразить только Келли; слой риска проп-фирмы (PropFirmAwareSizer), в котором параметр сигмоиды w непрерывно калибруется по оставшемуся бюджету просадки согласно правилам FundedNext Stellar 2-Step, так что по мере расходования дневной или общей допустимой потери функция автоматически становится более пологой без пороговой логики или ручного вмешательства; и фреймворк динамического CPCV-бэктеста, моделирующий новое состояние счёта бар за баром через каждый из комбинаторных путей φ[N, k] и создающий распределение кривых капитала и аудит PBO вместо одного результата стандартного бэктеста, зависящего от пути. Для каждого компонента соответствующие разделы явно описывают практические ограничения.
Эта статья — Часть 11 серии MetaTrader 5 Machine Learning Blueprint. Часть 10 представила четыре метода AFML для определения размера ставки. Читателям, которые ещё не завершили Часть 10, следует сделать это перед продолжением, поскольку статья предполагает знакомство с get_signal, avg_active_signals, bet_size_dynamic, а также с фреймворком коррекции перекрытия активных меток. Статья Единый конвейер валидации установила инфраструктуру V-in-V, CPCV и CSCV, на которую эта статья опирается напрямую: комбинаторная структура путей φ[N, k], используемая в разделе 5, взята из CPCV; аудит PBO в конце этого раздела является процедурой CSCV, подробно описанной там; а трехуровневое разбиение V-in-V определяет, как оценку соотношения выигрыша и проигрыша и долю Келли следует выводить из исторических данных без подгонки к тем же кривым капитала, на которых будет оцениваться система сайзинга. Части 8 и 9 построили инфраструктуру HPO и производственный конвейер, чьи компоненты _WeightedEstimator и clf_hyper_fit создают модель, вероятности которой используются методами сайзинга из Части 10 и этой статьи.
Критерий Келли: основа, точка пересечения и ограничения
Критерий Келли занимает особое место в литературе по определению размера ставки. Это одно из немногих правил сайзинга со строгим теоретическим свойством оптимальности: для последовательности независимых ставок с известными выплатами и вероятностями доля Келли максимизирует ожидаемый логарифм конечного капитала, и никакая альтернативная стратегия дробной ставки асимптотически не делает это лучше. Понимание его связи с методами AFML и того, где эта связь ломается, необходимо для построения обоснованного сайзера, пригодного для промышленного применения.
Теоретическая основа
Келли (1956) вывел оптимальную долю ставки, максимизируя ожидаемый темп логарифмического роста на множестве повторяющихся ставок. Для ставки, которая выигрывает сумму b с вероятностью p и теряет 1 единицу с вероятностью q = 1 − p, формула такова:
f* = (p*b - q) / b
Для симметричных выплат (b = 1) это упрощается до:
f* = 2p - 1
Это линейно по p: вероятность 0.60 даёт долю Келли 0.20, вероятность 0.70 даёт 0.40 и так далее. Формула равна нулю при p = 0.5 (нет преимущества, нет позиции), положительна при p > 0.5 и отрицательна при p < 0.5. Важно, что она естественно даёт отрицательные доли для стратегий с отрицательным преимуществом, что можно интерпретировать как ставку на противоположную сторону.
Численная точка пересечения с get_signal
Для бинарной классификации с симметричными выплатами долю Келли и выход get_signal можно напрямую сравнить на одном уровне вероятности:
| p | get_signal | Kelly f* | Относительная разница |
|---|---|---|---|
| 0.50 | 0.000 | 0.000 | — |
| 0.55 | 0.080 | 0.100 | Келли больше на 25% |
| 0.60 | 0.161 | 0.200 | Келли больше на 24% |
| 0.65 | 0.247 | 0.300 | Келли больше на 21% |
| 0.70 | 0.340 | 0.400 | Келли больше на 18% |
| 0.75 | 0.443 | 0.500 | Келли больше на 13% |
| 0.80 | 0.556 | 0.600 | Келли больше на 8% |
| 0.87 | 0.671 | 0.740 | Келли больше на 10%; около пересечения |
| 0.90 | 0.818 | 0.800 | get_signal больше на 2% |
| 0.95 | 0.961 | 0.900 | get_signal больше на 7% |
| 0.99 | 0.999 | 0.980 | get_signal больше на 2% |

Рисунок 1. Структурное расхождение между get_signal и критерием Келли при симметричных выплатах (b = 1)
Келли линеен по p; get_signal проходит через z-score преобразование, знаменатель которого √(p(1−p)) схлопывается по мере того, как p приближается к 1, из-за чего выход CDF насыщается быстрее. Две кривые пересекаются около p ≈ 0.88. Заштрихованная область отмечает диапазон 0.52–0.65, в котором обычно работают модели промышленного контура финансового машинного обучения. Во всем этом диапазоне Келли рекомендует на 20–25% больше экспозиции на каждом уровне вероятности, и именно здесь оценки вероятностей наименее надежны, а переуверенность наиболее опасна. Выше этой точки относительная агрессивность методов меняется: get_signal насыщается к 1.0, тогда как Келли остается линейным, поэтому при p = 0.95 get_signal выделяет 0.96 против 0.90 у Келли. Точка пересечения — не параметр настройки; это фиксированное следствие двух функциональных форм, справедливое независимо от актива, таймфрейма или модели.
Две кривые пересекаются примерно при p ≈ 0.88. Ниже этого уровня Келли последовательно агрессивнее. Выше него get_signal агрессивнее. Это пересечение является структурным следствием разных математических форм: Келли линеен по p, тогда как знаменатель z-score sqrt(p*(1−p)) стремится к нулю, когда p приближается к 1, из-за чего z-score растет сверхлинейно, а нормальная CDF быстро насыщается.
Это имеет практическое следствие для специалистов по финансовому машинному обучению. Реальная out-of-sample точность моделей финансового прогнозирования обычно находится в диапазоне 0.52–0.65. Именно в этом диапазоне Келли существенно агрессивнее, чем get_signal: при p = 0.55 Келли рекомендует примерно на 25% больше экспозиции. В то же время оценка вероятности в этом диапазоне наиболее подвержена переобучению и ошибке модели. Агрессивность Келли именно в зоне максимальной неопределенности — его главный практический недостаток.
Отношение выплат: решающее структурное преимущество Келли
Сравнение выше предполагает симметричные выплаты. На практике это предположение редко выполняется. Стратегия с заданным стоп-лосс и тейк-профит имеет асимметричные выплаты по построению. Long-позиция, открытая по 1.1000 со стопом 1.0980 и целью 1.1060, имеет соотношение выплат b = 3. Полная формула Келли учитывает это напрямую:
f* = (p*b - q) / b = (0.55 * 3 - 0.45) / 3 = 0.40
Без члена соотношения выплат использование симметричной формулы при p = 0.55 даёт f* = 0.10. Формула с учётом выплат рекомендует позицию в четыре раза больше. get_signal не может выполнить такую поправку, потому что принимает на вход только вероятность, а не структуру выплат. Для стратегий со значительной асимметрией выплат это решающее преимущество критерия Келли.
Пять структурных требований, которые Келли не может удовлетворить на финансовых рынках
Несмотря на теоретическую элегантность, Келли сталкивается с пятью структурными проблемами в применении к финансовым рынкам.
Независимость. Kelly требует i.d ставок. Финансовые метки почти никогда не независимы; перекрывающиеся triple-barrier-метки используют одни и те же бары при атрибуции доходности. Применение Келли к коррелированным ставкам без коррекции приводит к систематическому завышению размера пропорционально среднему перекрытию меток.
Истинная вероятность. Келли требует истинную вероятность, а не оценку. Любая оценка вероятности по конечной выборке подвержена ошибке модели. Формула Келли — это лезвие ножа: даже небольшое превышение Келли в ставке ведет к разорению. Мастерс (1995) показал, что при реалистичной неопределенности оценки дробный Келли (обычно 0.25–0.5 полной доли Келли) значительно предпочтительнее полной теоретической оптимальной доли.
Постоянное соотношение выплат. Келли требует известное постоянное b. В реальной торговле реализованное соотношение выигрыша и проигрыша дрейфует из-за качества исполнения, ликвидности рынка и смены режимов.
Нет модели перекрытия активных меток. Келли рассчитывает каждую ставку независимо, как если бы она была единственной открытой позицией При наивном применении к перекрывающимся меткам он даёт общую портфельную экспозицию, намного превышающую любой разумный лимит риска.
Нет выходных данных для исполнения. Келли не даёт лимитной цены, целевой позиции или дискретизированного выхода. Это формула для доли, а не готовый к исполнению сигнал.
Пять условий, определяющих выбор метода
С учетом этой картины выбор метода сайзинга определяется структурой стратегии, выходом модели, доступностью данных и средой исполнения. Следующие пять условий дают систематическую рамку принятия решения.
Условие 1: Что выдаёт модель?
Если модель выдаёт вероятности классов, начинайте с bet_size_probability. Если она выдаёт непрерывную прогнозную цену, используйте bet_size_dynamic. Если она выдаёт только бинарное направление без уверенности, используйте bet_size_budget. Эти три семейства методов решают три структурно разные задачи и не являются взаимозаменяемыми.
Условие 2: Перекрываются ли метки?
Для любой стратегии, использующей triple-barrier метки с нетривиальным периодом удержания, метки почти наверняка перекрываются. В этом случае average_active=True в bet_size_probability не является опцией; это корректная реализация. Ее исключение равносильно предположению, что ваши метки никогда не перекрываются, что приведет к систематическому завышению размера в периоды высокой плотности сигналов.
Условие 3: Асимметричны ли выплаты?
Если у стратегии хорошо определены stop-loss и тейк-профит, а среднее соотношение выигрыша и проигрыша заметно отклоняется от 1.0, член соотношения выплат Келли стоит включить. Используйте get_signal для первого этапа сайзинга сигнала (он обрабатывает одновременность сигналов), а Келли — как множитель второго этапа, корректирующий асимметрию выплат. Это двухэтапный гибрид, описанный в следующем разделе.
Условие 4: Сколько доступно исторических данных?
Резервный метод EF3M требует как минимум нескольких сотен ставок, предпочтительно нескольких тысяч, чтобы получить стабильные оценки параметров смеси. Для более короткой истории более устойчивыми будут бюджетный или вероятностный метод. Используйте bet_size_reserve когда стратегия имеет долгую стабильную production-историю, а распределение дисбаланса позиций можно надежно охарактеризовать.
Условие 5: Есть ли жесткое ограничение бюджета риска?
Челленджи проп-фирм, счёта с бюджетом риска и институциональные мандаты накладывают жесткие лимиты просадки. Ни один из четырех методов AFML напрямую не включает такие ограничения. В этих условиях параметр w функции bet_size_dynamic даёт естественный рычаг управления: калибруя w по оставшемуся бюджету просадки, а не по фиксированному целевому расхождению, сигмоидальная функция выравнивается по мере расходования бюджета и автоматически уменьшает размеры позиций пропорционально доступной емкости риска. Эта связь подробно разбирается в разделе 4.
Двухэтапная гибридная архитектура
Анализ выше указывает на естественную двухэтапную архитектуру, которая объединяет сильные стороны каждого подхода и избегает их слепых зон. Этап 1 выполняет сайзинг на уровне сигнала с корректной поправкой на одновременность сигналов. Этап 2 выполняет портфельную поправку на асимметрию выплат.
Этап 1: сайзинг сигнала с get_signal
Первый этап использует bet_size_probability с average_active=True чтобы создать сигнал, пропорциональный уверенности прогноза, скорректированный с учётом перекрытия активных меток и дискретизированный для предотвращения чрезмерной торговли. Назовем этот сигнал s. Он включает всю информацию, которую вероятность и временные метки могут дать о подходящем размере позиции.
Этап 2: множитель выплат Келли
Второй этап вычисляет множитель Келли, который корректирует s на асимметрию выплат. Множитель является отношением дробной доли Келли к выходу get_signal при той же вероятности:
from scipy.stats import norm import numpy as np def kelly_payoff_multiplier(prob, avg_win_loss_ratio=1.0, kelly_fraction=0.5, max_amplification=1.5): """ Kelly multiplier relative to get_signal at the same probability. b = 1 (symmetric) → multiplier ≈ 1.0 everywhere b > 1 (favorable) → multiplier > 1.0 at moderate probabilities Kelly f* ≤ 0 → multiplier = 0.0 (no edge; close position) """ b = avg_win_loss_ratio q = 1.0 - prob f_star = (prob * b - q) / b if f_star <= 0: return 0.0 # Kelly says no edge — close position z = (prob - 0.5) / np.sqrt(prob * (1 - prob)) signal = max(2 * norm.cdf(z) - 1, 1e-6) raw = (kelly_fraction * f_star) / signal return float(np.clip(raw, 0.0, max_amplification))
Когда выплаты симметричны (b = 1), множитель примерно равен 1.0 везде: Келли и get_signal согласуются, и два этапа последовательны. Когда b > 1 (выгодные выплаты), множитель превышает 1.0 при умеренных вероятностях, усиливая сигнал этапа 1 для отражения лучшей структуры выплат. Когда формула Келли даёт отрицательную долю (ставка экономически непривлекательна несмотря на вероятность выше 0.5, что может произойти при очень малом b), множитель возвращает 0.0, закрывая позицию независимо от сигнала этапа 1. Параметр max_amplification (по умолчанию 1.5) не даёт Келли предлагать более чем на 50% выше сигнала этапа 1 для отдельного наблюдения, поглощая ошибки в оценке соотношения выплат.
Комбинированный сигнал
Итоговый размер позиции — это произведение сигнала этапа 1, множителя выплат и любых дополнительных портфельных факторов ограничения:
final_size = stage1_signal × kelly_multiplier × constraint_factors
Так задачи разделяются чисто. Вероятностная модель и коррекция перекрытия активных меток находятся на Этапе 1. Структура выплат находится на Этапе 2. Ограничения риска (лимиты просадки, ограничения позиций, корректировки новостных окон) находятся в дополнительных мультипликативных факторах, применяемых после этапа 2.
Рисунок 2. Визуализация полной двухэтапной системы
- Вверху слева, get_signal против Kelly (b=1): Две кривые пересекаются примерно при p≈0.88 и расходятся по обе стороны. Келли агрессивнее ниже пересечения; get_signal агрессивнее выше него.
- В центре слева, множитель Келли (половинный Келли): Множитель как функция p для четырех соотношений выплат b=1.0, 1.5, 2.0, 3.0. При симметричных выплатах (b=1) множитель примерно равен 1.0 по всему диапазону; при более высоком b он существенно усиливает сигнал этапа 1 на умеренных вероятностях.
- Внизу слева, итоговый размер = Этап1 × множитель Келли: Комбинированный двухэтапный размер позиции после применения множителя выплат к выходу get_signal для тех же четырех соотношений выплат.
- Вверху справа, w_param из бюджета риска: Кривые сигмоидального размера, полученные калибровкой w по оставшемуся бюджету просадки. По мере сужения бюджета w растет, и функция выравнивается, автоматически уменьшая позиции.
- В центре справа, модифицирующие факторы: Факторы дневного использования и снижения риска при приближении к цели прибыли как функция прогресса. Оба мультипликативны; ни один не требует пороговой логики.
- Внизу справа, накопленный фактор в течение дня: Произведение всех модифицирующих факторов в пяти репрезентативных точках смоделированного торгового дня, показывающее, как комбинированный фактор накапливается по мере изменения условий.
Интеграция с проп-фирмой: динамический w из бюджетов просадки
Двухэтапная архитектура работает независимо от внешних ограничений риска. Однако в торговле в проп-фирме счёт действует под жесткими лимитами просадки, которые непрерывно меняются по ходу дня. Система сайзинга, игнорирующая эту динамику, похожа на азартную игру с фиксированной ставкой за столом, лимиты которого меняются.
Параметр w функции bet_size_sigmoid обеспечивает связь. Вместо того чтобы один раз калибровать w по фиксированному целевому расхождению, мы непрерывно калибруем его по оставшемуся бюджету просадки. По мере сокращения бюджета w растет, выравнивая сигмоидальную функцию и заставляя один и тот же ML-сигнал давать меньшую позицию. Стратегия автоматически снижает риск по мере уменьшения подушки.
Правила FundedNext Stellar 2-Step
Чтобы сделать это конкретным, рассмотрим FundedNext Stellar 2-Step Challenge — двухфазную оценку, в которой трейдер должен показать стабильную прибыльность при жёстких дневных и общих лимитах просадки, прежде чем получить фондируемый счёт.
| Правило | Значение | Ключевая деталь |
|---|---|---|
| Дневной лимит убытка | 5% начального баланса | Расширяется за счёт внутридневной реализованной прибыли; включает swaps и комиссии |
| Общая максимальная потеря | 10% начального баланса | Порог по балансу/эквити фиксирован на 90% от начального; порог не смещается |
| Цель Фазы 1 | 8% прибыли | Нет лимита времени; минимум 5 торговых дней |
| Цель Фазы 2 | 5% прибыли | Нет лимита времени; минимум 5 торговых дней |
| Новостное окно (фондируемый счёт) | ±5 минут | Только 40% прибыли в этом окне засчитываются в баланс |
| Максимальное плечо | 1:100 | Комиссия: $5/lot, учитывается в дневной просадке |
Дневной лимит динамический, и его часто неправильно понимают. На счёте $100,000 базовый дневной лимит равен $5,000, но если к полудню вы заработали $2,000, лимит расширяется до $7,000: внутридневная реализованная прибыль даёт дополнительную подушку. Свопы, комиссии и сборы также учитываются. Общий пол постоянно закреплен на $90,000; прибыль увеличивает вашу подушку над полом, но сам порог не смещается.
Цепочка калибровки параметр w
Цепочка, связывающая оставшийся бюджет риска с параметр w:
# Step 1: remaining risk budget from account state daily_limit = initial_balance * 0.05 + max(0, intraday_realized_pnl) daily_remaining = max(0, daily_limit - daily_loss_used) overall_remaining = max(0, current_equity - overall_floor) risk_budget_pct = min(daily_remaining, overall_remaining) / initial_balance # Step 2: maximum allowable position at full signal strength # position × stop_loss ≤ risk_budget × safety_factor cal_bet_size = (risk_budget_pct * safety_factor) / stop_loss_pct cal_bet_size = min(0.98, max(0.0, cal_bet_size)) if cal_bet_size < 0.02: return 0.0 # budget exhausted; no new positions # Step 3: define the signal level at which the sizer should output # cal_bet_size. Typically set to 0.95 (near-full conviction). cal_divergence = 0.95 # Step 4: calibrate w so that at cal_divergence signal strength, # bet_size_sigmoid(w, cal_divergence) = cal_bet_size w_param = get_w(price_div=cal_divergence, m_bet_size=cal_bet_size, func='sigmoid') # Step 5: apply to the ML signal from Stage 1 prop_sized = bet_size_sigmoid(w_param, ml_signal)
Параметр safety_factor (по умолчанию 0.70) резервирует 30% рассчитанного бюджета на издержки: комиссию $5/lot, overnight swaps и риск гэпа, который не гарантирует выход по цене stop-loss. Этот буфер поглощает расходы, которые FundedNext засчитывает в дневной лимит до того, как трейдер принял решение о размере.
Параметр cal_divergence (по умолчанию 0.95) задаёт силу сигнала, при которой сайзер должен выдавать максимально допустимую позицию. Значение 0.95, а не 1.0, означает, что сайзер достигает почти полной аллокации при высокой, но не идеальной уверенности, оставляя небольшой запас для сигналов выше точки калибровки.

Рисунок 3. Динамическая калибровка параметра w по оставшемуся бюджету просадки
- Левая панель, максимальный размер позиции относительно бюджета: Максимальная позиция при полной силе сигнала линейно снижается по мере сокращения бюджета риска, с жестким отсечением на 2% бюджета (примерно $200 на счёте $100,000 при стопе 1%), ниже которого сайзер отказывается от новых входов.
- Правая панель, сигмоидальные кривые при разных уровнях бюджета: Один и тот же ML-сигнал 0.6 отображается примерно в позицию 0.58, когда бюджет цел (зеленый, 5.0%), но только в 0.19, когда бюджет почти исчерпан (красный, 0.5%). Выравнивание непрерывное, а не пороговое; по мере расходования емкости просадки каждый последующий сигнал автоматически даёт меньшую позицию через один заново откалиброванный параметр w.
Дополнительные модификаторы
Два дополнительных мультипликативных модификатора покрывают правила, которые калибровка параметр w не охватывает.
Фактор снижения риска при приближении к цели прибыли начинает уменьшать размеры позиций на 80% цели фазы, линейно снижая их до 30% у самой цели. У FundedNext нет правила consistency, но стратегия, заработавшая 7% из 8% цели Фазы 1 и затем отдавшая 3% за один плохой день, теряет все время, уже вложенное в фазу. Пол 30% при 100% прогресса позволяет продолжать торговлю для выполнения правила минимальных торговых дней без существенного риска просадки.
Фактор корректировки новостного окна (только этап фондируемого счёта) умножает размеры позиций на 0.40 в окне ±5 минут вокруг важных новостей. FundedNext засчитывает только 40% прибыли, полученной в этом окне. Если размер рассчитывается так, будто он даст полный P&L, стратегия систематически не дотянет до целей выплат. Фактор 0.40 задаёт размер позиций так, чтобы они давали ожидаемый вклад в баланс после понижающего коэффициента к прибыли. Эта корректировка консервативна: убытки в новостном окне учитываются полностью против лимита просадки, а только 40% прибыли зачисляется. Фактор 0.40 учитывает асимметрию прибыли, но не устраняет риск, что полный убыток в окне потребит больше бюджета просадки, чем соответствующая прибыль восстановила бы. Трейдерам следует подумать, не лучше ли полностью избегать новостного окна вместо торговли уменьшенным размером.

Рисунок 4. Асимметрия зачета прибыли в новостном окне по правилам FundedNext
- Обычные условия (синий): При отношении выплат b = 1.5 ожидаемый вклад на единицу риска линейно растет с вероятностью выигрыша; стратегия выходит в безубыток при p = 0.40.
- Новостное окно, полный размер (красный пунктир): Засчитывается только 40% прибыли, что сдвигает точку безубыточности примерно к p = 0.63 и создаёт зону (красная заливка), где стратегия с настоящим преимуществом в обычных условиях имеет отрицательный ожидаемый вклад внутри окна.
- Новостное окно, уменьшенный размер (оранжевый пунктир): Масштабирование позиции до 40% уменьшает величину и прибыли, и убытков, но не устраняет структурную асимметрию. Трейдерам, чья точность модели попадаёт в заштрихованную область, лучше полностью избегать новостного окна.
Использование
from prop_firm_sizer import PropFirmAccountState, Phase, make_stellar_2step_sizer # Initialize once per account state = PropFirmAccountState( initial_balance=100_000.0, phase=Phase.CHALLENGE_PHASE_1, ) sizer = make_stellar_2step_sizer( stop_loss_pct=0.01, # 1% account risk per trade at the stop safety_factor=0.70, # use 70% of available budget avg_win_loss_ratio=1.2, # from live trade log; update monthly kelly_fraction=0.5, # half-Kelly step_size=0.05, ) # On every bar state.update( realized_pnl_delta=last_closed_trade_pnl, unrealized_pnl=total_floating_pnl, fees_and_swaps=today_swap_and_commission, ) result = sizer.size( events=events_df, prob=calibrated_probs, # probabilities from your classifier pred=primary_sides, state=state, news_times=today_news_events, current_time=datetime.utcnow(), average_active=True, ) position_sizes = result['final_size']
Итоговый DataFrame содержит полный диагностический набор показателей: ML-сигнал этапа 1, откалиброванный параметр w, максимально допустимую позицию при полной силе сигнала, каждый фактор модификации отдельно и итоговый дискретизированный размер позиции. Такая прозрачность необходима в контексте проп-фирмы, где одно превышение лимита имеет серьёзные последствия. Каждый фактор, сформировавший итоговую позицию, можно проверить.
Бэктестирование с CPCV и динамическим сайзингом
При проектировании бэктеста динамически определяемой стратегии возникает естественный вопрос: как оценить ее, не возвращая переобучение, от которого вы пытались избавиться? Стандартный бэктест применяет фиксированную функцию размера к фиксированному набору исторических прогнозов. Динамический сайзинг имеет состояние: размер позиции на баре t зависит от всей истории P&L до бара t, которая зависит от каждого предыдущего решения о размере. Нельзя отделить бэктест от сайзера, не исказив того, как стратегия действительно вела бы себя.
Ключевая проблема
CPCV создаёт φ путей, каждый из которых покрывает всю временную шкалу один раз OOF-прогнозами. На пути 1 прогноз бара t пришел из split S3. На пути 2 прогноз того же бара пришел из split S7. Модель, сформировавшая прогноз, отличается, потому что обучалась на другом подмножестве данных. Это означает, что вероятность на баре t зависит от пути, а значит зависят от пути и размер позиции, и состояние счёта. Нельзя заранее вычислить одну сетку размеров и применить ее ко всем путям.
Архитектура: заново инициализированное состояние для каждого пути
Решение состоит в том, чтобы встроить состояние-зависимой симуляции в фреймворк путей CPCV. Для каждого из комбинаторных путей бэктеста φ[N, k] инициализируется новый экземпляр PropFirmAccountState и проходит симуляционный цикл бар за баром. Каждый путь начинается с одинакового начального баланса и лимитов просадки, но получает разную последовательность OOF-прогнозов, потому что прогнозы каждого пути получены из другой комбинации обучающих разбиений. Пути моделируются параллельно с помощью joblib.Parallel.
from cpcv_dynamic_backtest import CPCVDynamicBacktest, BacktestConfig from afml.cross_validation.combinatorial import ( CombinatorialPurgedCV, optimal_folds_number ) N, k = optimal_folds_number( n_observations=len(X), target_train_size=int(len(X) * 0.60), target_n_test_paths=5, ) cv_gen = CombinatorialPurgedCV( n_folds=N, n_test_folds=k, t1=t1, pct_embargo=0.01 ) cfg = BacktestConfig( initial_balance=100_000.0, phase=Phase.CHALLENGE_PHASE_1, pip_value=10.0, lot_size=0.01, n_jobs=-1, # all physical cores ) backtest = CPCVDynamicBacktest( cv_gen=cv_gen, estimator=estimator, sizer=sizer, cfg=cfg, close_prices=close_prices, primary_sides=sides, ) backtest.run(X=X, y=y, events=events, price_returns=returns)backtest.distribution_report() backtest.pbo_audit(n_folds=8) backtest.plot_equity_distribution()
Что показывает распределение
Именно распределение φ кривых капитала делает CPCV существенно информативнее одиночного бэктеста. Стратегия, у которой распределение коэффициента Шарпа по путям плотное и положительное, продемонстрировала устойчивость к множеству временных конфигураций обучающих данных. Стратегия, чья производительность сильно меняется по путям, хрупка: ее исторический результат зависит от того, на каких данных она обучалась, не меньше, чем от реального статистического преимущества. Динамический сайзинг добавляет ещё одно измерение: некоторые пути будут чаще превышать дневной лимит, показывая, как система размера взаимодействует с последовательной зависимостью P&L. Метод distribution_report показывает долю путей, превысивших дневной лимит, долю путей, превысивших общий лимит, и медианное число торговых дней до цели фазы среди успешных путей.

Рисунок 5. Веера кривых капитала CPCV: сравнение устойчивых и хрупких стратегий
- Устойчивая стратегия (слева, синий): Согласованные дрейф и волатильность по всем 20 комбинаторным путям; конечный капитал плотно сгруппирован между $110,000 и $130,000, и ни один путь не приближается к общему порогу $90,000.
- Хрупкая стратегия (справа, красный): Широкий разброс результатов; некоторые пути достигают $160,000, а другие пробивают порог, демонстрируя сильную зависимость от пути. Ширина веера — визуальный признак хрупкости: узкий веер означает устойчивость производительности к разбиению данных, а широкий показывает, что одиночный исторический бэктест мог оказаться в любой точке этого разброса.
Аудит PBO
Аудит PBO (Probability of Backtest Overfitting) из статьи Единый конвейер валидации применяется здесь без изменений. Матрица доходностей строится из доходностей стратегии по φ путям и передаётся в compute_pbo. PBO около нуля означает, что подход к сайзингу не переобучен на обучающих данных: выбор параметров сайзинга надежно выявляет действительно лучшие конфигурации. PBO около 0.5 означает, что результат бэктеста согласуется со случайностью. Это количественный аудит, отличающий устойчивый фреймворк сайзинга от того, который просто удачно сработал на конкретном историческом пути стандартного бэктеста.
Заключение
Эта статья устранила три пробела, оставшиеся после Часть 10. Критерий Келли даёт поправку на соотношение выплат, которую get_signal дать не может, но его теоретические гарантии требуют условий (независимость, известные истинные вероятности, постоянные выплаты), которых финансовые рынки не предоставляют. Двухэтапная гибридная архитектура переносит учёт асимметрии выплат по Келли в виде множителя поверх get_signal, сохраняя коррекцию перекрытия активных меток этапа 1 и добавляя то, что может выразить только Kelly. Цепочка калибровки параметр w связывает оставшийся бюджет просадки с сигмоидальной функцией размера, создавая сайзер для проп-фирмы, который автоматически снижает риск по мере расходования бюджета без пороговой логики или ручного вмешательства. А фреймворк динамического CPCV-бэктеста оценивает весь конвейер (модель и сайзер) по комбинаторным путям φ[N, k] с новым состоянием счёта на каждом, заменяя одиночный зависящий от пути бэктест распределением кривых капитала и аудитом PBO.
Ни один из этих компонентов не является полным решением сам по себе. Множитель Келли зависит от оцененного соотношения выигрыша и проигрыша, которое дрейфует в production; сайзер проп-фирмы кодирует набор правил одной конкретной фирмы; а динамический CPCV-бэктест, хотя и структурно корректен, в этой статье не подтвержден эмпирическими результатами. Каждый компонент сужает разрыв между инструментарием AFML для сайзинга и production-требованиями, но практик все равно должен постоянно мониторить, рекалибровать и валидировать.
Ключевые выводы:
- Келли и get_signal согласуются при умеренных вероятностях, но структурно расходятся. В диапазоне 0.52–0.65, характерном для большинства финансовых моделей машинного обучения, Келли агрессивнее именно там, где ошибки оценки вероятностей максимальны. Используйте дробный Келли.
- Асимметрия выплат — область Келли. Для стратегий с определенными уровнями stop-loss и тейк-профит включайте соотношение выигрыша и проигрыша через множитель Келли. Не игнорируйте его, если b существенно отклоняется от 1.
- Свяжите сайзер с бюджетом риска. В ограниченных счётах динамическая калибровка параметр w создаёт сайзер позиции, который реагирует на бюджет риска в реальном времени без пороговой логики или ручного вмешательства.
- Валидируйте по путям CPCV, а не по одиночному бэктесту. Распределение кривых капитала φ[N, k], каждая из которых моделируется с новым состоянием счёта, выявляет хрупкость или устойчивость объединенной системы "модель + сайзер". Аудит PBO даёт одно защищаемое число, суммирующее надежность всего фреймворка.
| Файл | Описание | |
|---|---|---|
| 1. | prop_firm_sizer.py | Двухэтапный гибридный сайзер с интеграцией правил FundedNext Stellar 2-Step. Включает PropFirmAccountState, WParamCalibrator, PropFirmAwareSizer, функции-модификаторы и фабрику make_stellar_2step_sizer. |
| 2. | cpcv_dynamic_backtest.py | Оркестратор динамического CPCV-бэктеста. Моделирует заново инициализированное состояние счёта бар за баром по всем путям φ[N, k] параллельно. Включает CPCVDynamicBacktest, BacktestConfig, simulate_path и интеграцию аудита PBO. |
| 3. | README_prop_firm_sizer.md | Полная документация модуля сайзера проп-фирмы: руководство по параметрам, кодирование правил FundedNext, шаблон интеграции и обоснование дизайна каждого компонента. |
Прикрепленные файлы
Перевод с английского произведен MetaQuotes Ltd.
Оригинальная статья: https://www.mql5.com/en/articles/21915
Предупреждение: все права на данные материалы принадлежат MetaQuotes Ltd. Полная или частичная перепечатка запрещена.
Данная статья написана пользователем сайта и отражает его личную точку зрения. Компания MetaQuotes Ltd не несет ответственности за достоверность представленной информации, а также за возможные последствия использования описанных решений, стратегий или рекомендаций.
Особенности написания Пользовательских Индикаторов
3D-визуализация без внешних библиотек: как MetaTrader 5 раскрывает результаты оптимизации через MQL5 + DX11
Нейросети в трейдинге: Принятие торговых решений с учётом неопределенности (UncAD)
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Любопытно, почему вы выбрали CSCV/PBO, а не DSR для работы с ошибками отбора?
Было бы интересно узнать, что вы думаете по этому поводу.
Отличная статья, очень понравилась.
Любопытно, почему вы выбрали CSCV/PBO, а не DSR для работы с ошибками отбора?
Было бы интересно узнать, что вы думаете по этому поводу.
Это отличный вопрос, и я рад, что вы копаетесь в слое валидации - это то место, где большинство производственных систем тихо проваливаются.
Короткий ответ: Для оценкиодной динамически изменяемой стратегии, зависящей от пути, в различных исторических контекстах, CPCV + PBO были более прямым и подходящим диагностическим инструментом в этой статье (а не DSR).
Основная сила DSR: Коррекция множественного тестирования
Дефлированный коэффициент Шарпа (DSR) разработан для устранения ошибки отбора, когда вы проводите множество испытаний - например, тысячи комбинаций гиперпараметров или вариантов моделей - и затем выбираете наиболее эффективную. Он снижает наблюдаемый коэффициент Шарпа за счет учета количества независимых испытаний, дисперсии оценки Шарпа, ненормальности и длины выборки, что дает более реалистичную вероятность того, что заявленные результаты являются статистически значимыми, а не результатом везения.
Основное внимание в статье было уделеноне оптимизации гиперпараметров логики определения размеров. Вместо этого конвейер был представлен как фиксированная, интегрированная система:
Главный вопрос заключался в следующем: " Устойчив лиданный конкретный анализатор в различных исторических контекстах и при различных реализациях пути?". - а не "Какой из 5 000 сизеров работает лучше?".
Почему CPCV/PBO подходит для государственной, зависящей от пути стратегии
Динамически изменяемая стратегия по своей сути являетсягосударственной. Размер позиции вторника зависит от прибыли и убытков понедельника, которые, в свою очередь, зависят от всех предыдущих решений о размерах позиций и изменяющегося состояния счета (PropFirmAccountState). Таким образом, один исторический бэктест - это всего лишь одна случайная выборка из всего распределения возможных путей движения капитала.
PBO - естественный компаньон CPCV, поскольку он напрямую использует ту же комбинаторную структуру путей для аудитаодной модели/сайзера , а не корректирует смещение отбора по многим конкурирующим моделям.
Они дополняют друг друга, а не конкурируют
Я намеренно выбрал CPCV/PBO для этой статьи, потому что они соответствуют непосредственной задаче валидации. В полноценном производственном конвейере, включающем масштабную оптимизацию гиперпараметров (о чем говорилось в предыдущих частях серии), DSR остается важным финальным фильтром после выбора модели.
Надежный рабочий процесс, как правило, сочетает оба инструмента:
Вы точно уловили нужный нюанс. Если бы рабочий процесс включал в себя поиск по сетке kelly_fraction, safety_factor или max_amplification по сотням точек, DSR стал бы критически важным, чтобы не быть обманутым самой удачной конфигурацией. Но чтобы ответить на конкретный вопрос - "Взорвет ли этот конкретный сайзер счет FundedNext в 20% параллельных вселенных?" - PBO, вычисленный по траекториям CPCV, является более острым, более целевым инструментом.
Это отличный вопрос, и я рад, что вы копаетесь в слое валидации - именно здесь большинство производственных систем терпят неудачу.
Короткий ответ: Для оценкиодной динамически изменяемой стратегии, зависящей от пути в различных исторических контекстах, CPCV + PBO был более прямым и подходящим диагностическим инструментом в этой статье (а не DSR).
Основная сила DSR: Коррекция множественного тестирования
Дефлированный коэффициент Шарпа (DSR) разработан для устранения ошибки отбора, когда вы проводите множество испытаний - например, тысячи комбинаций гиперпараметров или вариантов моделей - и затем выбираете наиболее эффективную. Он сглаживает наблюдаемое отношение Шарпа, учитывая количество независимых испытаний, дисперсию оценки Шарпа, ненормальность и длину выборки, что дает более реалистичную вероятность того, что заявленные результаты являются статистически значимыми, а не результатом везения.
Основное внимание в статье было уделеноне оптимизации гиперпараметров логики определения размеров. Вместо этого трубопровод был представлен как фиксированная, интегрированная система:
Главный вопрос заключался в следующем: " Устойчив лиданный конкретный анализатор в различных исторических контекстах и при различных реализациях пути?". - а не "Какая из 5000 моделей лучше всего работает?".
Почему CPCV/PBO подходит для государственной, зависящей от пути стратегии
Динамически изменяемая стратегия по своей сути являетсягосударственной. Размер позиции вторника зависит от прибыли и убытков понедельника, которые, в свою очередь, зависят от всех предыдущих решений о размерах позиций и изменяющегося состояния счета (PropFirmAccountState). Поэтому один исторический бэктест - это всего лишь одна случайная выборка из всего распределения возможных путей движения капитала.
PBO - естественный спутник CPCV, поскольку он напрямую использует ту же комбинаторную структуру путей для аудитаодной модели/сайзера , а не корректирует смещение отбора по многим конкурирующим моделям.
Они дополняют друг друга, а не конкурируют
Я намеренно выбрал CPCV/PBO для этой статьи, потому что они соответствуют непосредственной задаче валидации. В полноценном производственном конвейере, включающем масштабную оптимизацию гиперпараметров (о чем говорилось в предыдущих частях серии), DSR остается важным финальным фильтром после отбора моделей.
Надежный рабочий процесс, как правило, сочетает оба инструмента:
Вы точно уловили нужный нюанс. Если бы рабочий процесс включал в себя поиск по сетке kelly_fraction, safety_factor или max_amplification по сотням точек, DSR стал бы критически важным, чтобы не быть обманутым самой удачной конфигурацией. Но чтобы ответить на конкретный вопрос - "Взорвет ли этот конкретный сайзер счет FundedNext в 20% параллельных вселенных?" - PBO, вычисленный по траекториям CPCV, является более острым, более целевым инструментом.
Спасибо, что нашли время поделиться своими мыслями - я ценю это. Я вернулся и перечитал AFML, чтобы просмотреть все более внимательно, а также с вашим объяснением, и это помогло мне понять эту часть гораздо лучше.