
Тестирование надежности торговых советников
Введение
При разработке стратегии необходимо учитывать множество сложных деталей, на многие из которых не обращают особого внимания начинающие трейдеры. В результате многим трейдерам, включая меня, пришлось усвоить эти уроки на собственном горьком опыте. Данная статья основана на моих наблюдениях за распространенными подводными камнями, с которыми сталкивается большинство начинающих трейдеров при разработке стратегий на MQL5. В ней представлен ряд советов, хитростей и примеров, которые помогут определить причину дисквалификации советника и протестировать надежность наших собственных советников простым в применении способом. Цель состоит в том, чтобы обучить читателей, помогая им избежать мошенничества в будущем при покупке советников, а также предотвратить ошибки при разработке собственной стратегии.
Тревожные сигналы на рынке советников
Беглый взгляд на рынок MQL5 показывает, что на нем доминируют продавцы, продвигающие торговые системы с искусственным интеллектом, использующие популярные языковые модели, такие как ChatGPT или Gemini AI. Я твердо убежден, что ни одно из этих утверждений не является подлинным по одной простой причине: невозможно использовать коммерческие LLM для бэк-тестирования, не скатываясь к предвзятости в прогнозировании. Кроме того, при интеграции популярных LLM с MQL5 используется функция веб-запроса. Поэтому, если продавец не укажет, что советник требует подключения к Интернету или подсказки, это вряд ли будет законным. Более надежный подход к внедрению LLM в торговлю предполагал бы живое тестирование или разработку на основе таких примитивных моделей, как BERT. Недавняя статья иллюстрирует этот подход.
Однако здесь следует кое-что прояснить. Искусственный интеллект подразумевает не только большие языковые модели, хотя большинство людей предполагают, что это так. Большинство передовых методов машинного обучения, включая обучение без присмотра, контролируемое обучение и обучение с подкреплением, могут быть классифицированы как использующие искусственный интеллект для своих советников. Так что это не ложный маркетинг, если продавец утверждает, что продает советника с искусственным интеллектом, когда используются некоторые модели нейронных сетей. К сожалению, большинство советников с ИИ не используют даже базовые модели нейронных сетей, несмотря на заявления об этом. Один из способов убедиться в этом - проверить, предоставляют ли они дополнительный ONNX-файл. Если продукт состоит только из исполняемого файла, все параметры модели в советнике должны были быть жестко запрограммированы, что обычно приводит к размеру файла более мегабайта.
Некоторые другие тревожные сигналы на рынке советников включают в себя следующее:
- Очень большие стоп-лоссы по сравнению с тейк-профитами. Часто они используют индикаторы, чтобы отфильтровать убыточные сделки при бэк-тестировании, что делает потери редкими и создает иллюзию высокой вероятности выигрыша. На самом деле, один убыток может свести на нет множество прибыльных сделок.
- Продавцы вкладывают в свой сигнал лишь небольшую сумму, например, от 10 до 100 долларов, при продаже советника за 1000 долларов и более. Это говорит о том, что они ожидают, что счет по итогу лопнет, и пытаются извлечь выгоду из высокого процента прибыли от небольшого счета.
- Счет новый, на нем всего несколько сделок, что обеспечивает 100%-ный показатель выигрыша по сигналу.
- Использование мартингейла, хеджирования, усреднения стоимости в долларах или сеточных систем. Эти стратегии увеличивают риск за счет увеличения позиций после убытка или добавления новых сделок в том же направлении во время просадки. Эти классические подходы восходят к 20 веку и вряд ли являются стратегиями "скрытого святого Грааля", поскольку их ожидаемая доходность меньше или равна нулю.
Вот краткое математическое доказательство:
Если их основные стратегии уже не имеют явного преимущества (p значительно больше 0,5), ожидаемая доходность меньше или равна нулю, что означает, что в долгосрочной перспективе вы будете проигрывать, а убытки просто еще не осознаны. Даже если мартингейл или сеточная система построены на основе прибыльного входа, в конечном счете вы все равно рискуете всем балансом своего портфеля при каждой сделке, а не какой-то долей, как в большинстве подходов к управлению рисками. Если вы не уверены, что сможете продолжать вносить больше денег, когда на вашем счете будет огромная просадка, то я советую вам ими не пользоваться.
Следует пояснить, что этот раздел направлен на повышение осведомленности о распространенных ложных маркетинговых приемах, превалирующих на современном рынке MQL5, и не является протестом против продажи или покупки советников на MQL5. На самом деле, я призываю больше людей продавать советников на MQL5, основываясь на надежном маркетинге и по-настоящему надежных советниках, чтобы сделать эту среду более надежной.
Переобучение
Переобучение - распространенная проблема в торговых моделях, когда стратегия может хорошо работать на исторических данных, но не может быть обобщена на новые, невиданные данные. В этом эксперименте мы будем использовать код на python, чтобы продемонстрировать, как может произойти переобучение из-за отбора параметров в торговой модели. В частности, мы будем генерировать случайные торговые сценарии с множеством функций, визуализировать влияние выборочной фильтрации и наблюдать, как меняется эффективность при чрезмерной оптимизации параметров для определенного подмножества данных.
Мы начинаем с моделирования набора данных из 1000 случайных торговых образцов, где каждый образец соответствует торговому решению с тремя характеристиками:
- Характеристика 1: Может представлять собой различные рыночные условия, такие как 'a', 'b' или 'c'.
- Характеристика 2: Представляет собой другой фактор, такой как "d", "e" или "f", например, волатильность активов или настроение.
- Характеристика 3: Может представлять собой другие торговые индикаторы с такими значениями, как 'g', 'h' или 'i'.
import numpy as np import pandas as pd import seaborn as sns import matplotlib.pyplot as plt # Step 1: Generate random samples np.random.seed(42) # For reproducibility # Possible feature values feature_1_values = ['a', 'b', 'c'] feature_2_values = ['d', 'e', 'f'] feature_3_values = ['g', 'h', 'i'] # Generate random data n_samples = 1000 feature_1 = np.random.choice(feature_1_values, n_samples) feature_2 = np.random.choice(feature_2_values, n_samples) feature_3 = np.random.choice(feature_3_values, n_samples) outcome = np.random.choice([0, 1], n_samples) # Random binary outcome # Create a DataFrame df = pd.DataFrame({ 'feature_1': feature_1, 'feature_2': feature_2, 'feature_3': feature_3, 'outcome': outcome })
Каждый из этих образцов будет иметь соответствующий результат (либо выигрыш, либо проигрыш), которому случайным образом присваивается значение 0 или 1. Эти результаты представляют собой результат гипотетической сделки, основанной на заданных характеристиках, что обозначает различные значения параметров.
В реальной торговле выбор правильных параметров (таких как рыночные индикаторы, временные рамки торговли или пороговые значения для сигналов на покупку/продажу) имеет решающее значение для эффективности модели. Однако переобучение происходит, когда модель чрезмерно настраивается для соответствия определенным паттернам в исторических данных, которые плохо поддаются обобщению с новыми данными.
Чтобы продемонстрировать это, мы сначала рассмотрим только те образцы, где Характеристика 1 = "b", Характеристика 2 = "d", а Характеристика 3 = "g".
def plot_filtered_distribution(df, feature_filters): # Filter the DataFrame based on the specified feature values filtered_df = df for feature, value in feature_filters.items(): filtered_df = filtered_df[filtered_df[feature] == value] # Check if filtered dataframe is empty if filtered_df.empty: print("No data available for the selected feature combination.") return # Plot the distribution of outcomes based on the filtered data sns.countplot(x='outcome', data=filtered_df, palette='Set2') plt.title(f'Distribution of Outcomes (filtered by {", ".join([f"{key}={value}" for key, value in feature_filters.items()])})') plt.show() # Example usage: Visualize the distribution of outcomes when filtering by feature_1 = 'a', feature_2 = 'd', feature_3 = 'g' plot_filtered_distribution(df, {'feature_1': 'b', 'feature_2': 'd', 'feature_3': 'g'})
Затем выводим график распределения результатов с учетом образцов, где Характеристика 1 = "c", Характеристика 2 = "f" и Характеристика 3 = "h".
Ясно видно, что, изменив всего три параметра в этих случайно сгенерированных данных, мы можем выбрать набор, в котором в основном преобладают проигрыши или выигрыши. Это говорит о силе переобучения. Сосредоточившись на определенном наборе характеристик, мы заставляем модель соответствовать узкому фрагменту данных, что может привести к ошибочным выводам. Чем более избирательно мы фильтруем данные на основе этих характеристик, тем больше вероятность того, что мы увидим искусственно завышенную эффективность (с точки зрения результатов), что является признаком переобучения. Любая произвольная стратегия, обладающая достаточным количеством параметров для переобучения, неизбежно сможет принести прибыльные результаты.
Это важное предупреждение для трейдеров, полагающихся на тонко настроенные стратегии, основанные на определенных наборах параметров, поскольку они могут плохо соответствовать будущим рыночным условиям. Ключевым выводом является то, что надежность модели, при которой эффективность остается неизменной в широком диапазоне данных, гораздо более ценна, чем оптимизация для узких диапазонов параметров.
Оптимизация в терминале MetaTrader 5
Когда мы пытаемся отобрать оптимальные значения для работы конкретного советника за определенный период, мы проводим оптимизацию. Как показано в предыдущем разделе, небольшую выборку случайных данных легко адаптировать, внеся небольшие коррективы в несколько параметров. В связи с этим возникает вопрос: как мы можем избежать этой ошибки при оптимизации и сделать наши результаты бэк-тестирования более достоверными? В этом разделе мы рассмотрим несколько способов минимизировать риск переобучения и обеспечить более надежные результаты при выполнении оптимизации в терминале MetaTrader 5.
1. Большее количество образцов за более длительный период
Согласно закону больших чисел, предполагая, что доходность вашей стратегии соответствует некоторой форме распределения, средняя доходность ваших образцов будет приближаться к среднему значению этого распределения по мере увеличения количества образцов. Для стратегий, которые не так часто используются, как дневная торговля или скальпинг, рекомендуется протестировать их на данных, охватывающих не менее 10 лет и включающих тысячи сделок. Если ваша стратегия чувствительна к изменениям макрорежима, допустимо тестирование только за последние годы. Однако, в конечном счете, вам потребуется достаточное количество образцов для проверки стратегии, поскольку не существует универсального правила для определения достаточного количества образцов. Цель состоит в том, чтобы продемонстрировать, что существует исторический, повторяющийся паттерн, который может быть использован на финансовых рынках.
Если ваш советник работает на более высоком таймфрейме, его можно протестировать на множестве активов, чтобы собрать больше образцов и потенциально превратить его в стратегию с многими активами. Такой подход значительно снижает вероятность переобучения, поскольку эффективность стратегии будет проверяться в более широком диапазоне рыночных условий и поведения активов. Диверсифицируя тестируемые активы, вы повышаете надежность своей стратегии и ее способность адаптироваться к различным рыночным условиям.
2. Меньшее количество настраиваемых параметров
Как было показано в предыдущем эксперименте, чем больше параметров у вас есть, тем большим количеством способов процесс оптимизации может отфильтровать группы выигрышных образцов. Параметр, сгенерированный случайным образом в начале, может быть легко отфильтрован в группу успешных результатов, но это не обязательно доказывает достоверность всего набора образцов. Дэвид Аронсон (David Aronson) в работе Evidence-Based Technical Analysis исследовал использование методов интеллектуального анализа данных и пришел к выводу, что стратегия с одним настраиваемым параметром вряд ли будет существовать, хотя она была бы менее подвержена переобучению. Рекомендуемый подход заключается в том, чтобы количество настраиваемых параметров не превышало пяти. Такие не влияющие на результаты параметры, как магические числа, не следует считать настраиваемыми. Такие параметры, как период ретроспективного анализа индикаторов, могут быть привязаны к общепринятым значениям, и в таких случаях их не следует рассматривать как настраиваемые параметры при оптимизации.
3. Учёт комиссионных, спредов и свопов при проводимом вами бэк-тестировании и оптимизации
При использовании тестера стратегий обязательно нажмите на знак денег и проверьте, соответствуют ли установки комиссионных, спредов и свопов условиям вашей реальной торговой среды.
Многие трейдеры ошибочно полагают, что если их стратегия постоянно убыточна, это означает, что они действуют противоположно тому, что делала бы выигрышная стратегия. Они могут думать, что, просто изменив направление своей торговли, они будут постоянно выигрывать. Однако это далеко от истины. Трейдинг - это игра с отрицательной суммой для розничных трейдеров. У постоянно проигрывающего трейдера больше шансов использовать стратегию, которая больше не имеет преимуществ, и его результаты зависят от случайного распределения выигрышей и проигрышей. В таких случаях убытки часто возникают из-за спредов, комиссий и своп-сборов, выплачиваемых при каждой сделке.
Гораздо менее вероятно, что вы смогли бы разработать стратегию, которая последовательно подает противоположные сигналы прибыльной стратегии, по сравнению с созданием прибыльной стратегии самостоятельно. В последнем случае вы активно работаете над тем, чтобы стратегия стала выигрышной, в то время как в предыдущем - нет.
Вот почему я не рекомендую начинающим трейдерам пробовать стратегии скальпинга — относительный статистический недостаток слишком велик. Рассмотрим пример: Если вы торгуете EUR/USD, то типичными условиями для брокера b-book являются отсутствие комиссий, но спред в 1 пипс, а для брокера ECN a-book - комиссия в размере 7 долларов за лот со спредом в 0,1 пипса. Если вы пытаетесь зафиксировать тейк-профит всего в 10 пипсов, то в любом случае вы фактически платите около 10% комиссионных за каждую сделку, независимо от того, выигрываете вы или проигрываете. Это особенно проблематично для высокочастотных трейдеров, поскольку со временем эти затраты постепенно снижают прибыль.
Теперь предположим, что у вас есть надежная стратегия с вероятностью выигрыша 55% и соотношением риска и прибыли 1:1. Без учета спредов или комиссионных ваша кривая эквити выглядела бы довольно привлекательно даже по профессиональным стандартам:
Но если вы учтете эти 10%-ные затраты на комиссионные, спреды и свопы из-за вашей попытки скальпировать небольшие сделки, фактически увеличивая относительную стоимость каждой сделки, ваша кривая эквити станет едва прибыльной, как показано ниже:
Имитационный код на python:
import numpy as np import matplotlib.pyplot as plt import pandas as pd # Parameters n_trades = 1000 # Number of trades win_rate = 0.55 # 55% win rate commission_rate = 0.1 # 10% commission per trade initial_balance = 10000 # Starting balance trade_amount = 100 # Amount per trade # Simulate the trades np.random.seed(42) # For reproducibility # Generate random outcomes (1 for win, 0 for loss) outcomes = np.random.choice([1, 0], size=n_trades, p=[win_rate, 1 - win_rate]) # Initialize balance and equity curve balance = initial_balance equity_curve = [balance] # Simulate each trade for outcome in outcomes: # Calculate the result of the trade if outcome == 1: # Win: add profit (trade_amount) and subtract commission balance += trade_amount - (trade_amount * commission_rate) else: # Loss: subtract loss (trade_amount) and subtract commission balance -= trade_amount + (trade_amount * commission_rate) # Append the updated balance to the equity curve equity_curve.append(balance) # Plot the equity curve plt.figure(figsize=(7, 4)) plt.plot(equity_curve) plt.title('Equity Curve with 10% Commission on Each Trade') plt.xlabel('Number of Trades') plt.ylabel('Balance') plt.grid(True) plt.show()
4. Предпринимайте более масштабные шаги в процессе оптимизации и учитывайте чувствительность параметров
В терминале оптимизации MetaTrader 5 можно настроить размер шага для каждого испытания параметра. Рекомендуется использовать большие шаги по сравнению с обычным значением параметра. Сосредоточение внимания на очень специфических значениях может легко привести к переобучению и чувствительности к смене режимов. Например, в прошлом году стратегия возврата к среднему значению могла бы лучше всего сработать при периоде ретроспективы RSI, равном 11, но в этом году он может быть равен 13. Если сосредоточиться на небольших, инкрементальных значениях, мы можем упустить более широкие паттерны эффективности по отношению к параметрам и потратить время на неэффективную оптимизацию.
Лично я предпочитаю использовать коэффициент прибыли в качестве показателя эффективности, поскольку это соотношение, а не абсолютное число, как, например, общая прибыль.
Коэффициент прибыли = Валовая прибыль / Валовой убыток.
Чувствительность к параметрам так же является критически важной. Нам надо убедиться, что наши испытания охватывают широкий диапазон возможных значений для каждого параметра. В идеале область вокруг наилучшего значения должна иметь вогнутое распределение, где эффективность постепенно снижается с постоянной скоростью по мере отклонения значения параметра от оптимального значения. Это гарантирует, что стратегия сохраняет свои преимущества, несмотря на различия в значениях параметров, и что наилучшие параметры эффективности представляют собой оптимальную настройку для стратегии.
Тестирование вне выборки
Независимо от того, оптимизируете ли вы параметры или тестируете советник на разных таймфреймах и символах, лучше всего исключить последние данные из ваших тестов. Прежде чем вносить какие-либо изменения в ваш исходный советник, эти точки данных должны находиться за пределами вашей предметной области. Этот подход известен как тестирование в выборке/вне выборки.
Целью этого метода тестирования является избежать предвзятости в прогнозировании, когда изменения в вашем советнике основаны на известных характеристиках недавнего поведения рынка. Он также помогает снизить риск переобучения во время оптимизации.
Чтобы реализовать это, сначала определитесь с общим размером выборки, которую вы планируете протестировать. В зависимости от количества тестов по образцам, вы можете выбрать соотношение в выборке/вне выборки, например, 7:3, 8:2 или 9:1. Затем вы делаете все наблюдения, предположения и вносите изменения в значения параметров и правила сигналов, используя данные из выборки. После этого примените окончательный вариант советника для бэк-тестирования на основе данных, полученных вне выборки, чтобы проверить, соответствуют ли ваши предположения действительности. Если советник, который был оптимизирован для получения отличных результатов при тестировании в выборке, становится малоприбыльным или даже проигрывает в тестировании вне выборки, это может свидетельствовать либо о размывании преимуществ из-за недавних изменений режимов, либо о переобучении во время оптимизации в выборке.
При оценке того, сохраняется ли согласованность работы советника при тестировании как в выборке, так и за ее пределами, необходимо учитывать несколько ключевых показателей.
Во-первых, вам следует создать версию вашего советника без кумулятивного эффекта левериджа, так как это может исказить результаты и придать излишнее значение завершению набора образцов.
Вот основные показатели, на которые следует обратить внимание:
-
Коэффициент прибыльности: Коэффициент прибыли должен быть больше 1, с обоснованным диапазоном от 1,2 до 1,5. Коэффициент прибыли ниже 1,2 может указывать на то, что стратегия недостаточно прибыльна, в то время как значение выше 1,5 может свидетельствовать о том, что размер образца слишком мал или что торговые издержки не были учтены. Хотя это не обязательно означает, что ваша стратегия мошенническая, следует быть осторожным, если результаты кажутся нереалистичными.
-
Максимальная просадка собственного капитала: Сосредоточьтесь на максимальной просадке капитала, а не на абсолютной, поскольку она отражает потенциальный риск, а не тот, который уже произошел. Максимальная просадка собственного капитала должна быть как минимум на 10% ниже вашего личного допустимого уровня просадки. Если он слишком низкий, можно рассмотреть возможность увеличения риска вашего советника, а если он слишком высок, возможно, вам придется пересмотреть профиль риска вашей стратегии.
-
Корреляция линейной регрессии: Корреляция линейной регрессии (LR) измеряет согласованность вашей кривой собственного капитала. Корреляция, превышающая 0,9, свидетельствует о том, что доходность была относительно стабильной на протяжении всего периода тестирования. Это помогает гарантировать, что стратегия не будет сильно колебаться и ее эффективность будет стабильной.
-
Коэффициент выигрыша и объем торговли по длинным и коротким позициям: Если ваш советник торгует как на длинных, так и на коротких позициях, убедитесь, что их коэффициенты выигрыша и объемы сделок примерно одинаковы. Значительное расхождение между этими двумя показателями может свидетельствовать о дисбалансе в стратегии, который, возможно, потребуется устранить.
Хотя другие показатели также важны, эти три фактора являются основными, на которые следует обращать внимание при оценке надежности вашего советника во время тестирования в выборке и вне выборки.
Некоторые традиционные трейдеры предпочитают форвардный анализ, при котором тестирование в выборке/вне выборки выполняется поэтапно, "продвигаясь вперед" до текущего момента времени. Однако я считаю, что часто в этом нет необходимости, особенно если мы уже позаботились о том, чтобы число наших параметров было небольшим и они не были привязаны к чрезмерно специфическим значениям. В таких случаях весьма вероятно, что эти оптимальные значения параметров будут оставаться неизменными с течением времени. Более того, мы уже подчеркивали, что ключ к успеху стратегии лежит в правилах подачи сигналов, а не в значениях ее параметров. Таким образом, для подтверждения результатов обычно бывает достаточно одного теста в выборке/вне выборки.
Тем не менее, для стратегий, основанных на машинном обучении, ситуация иная. Преимущество этих стратегий часто зависит от параметров базовой модели машинного обучения, которые могут существенно варьироваться в зависимости от периода времени, за который обучающие данные взяты. В этом случае становится необходимым форвардный анализ, чтобы учесть, как эффективность модели может изменяться с течением времени при различных наборах данных. В этой статье я подробно объяснил, как реализовать форвардный анализ. В конечном счете, ключевым выводом является то, что советник должен оставаться прибыльным в последнее время, чтобы подтвердить свою дальнейшую жизнеспособность.
Тестирование выбросов
Тестирование выбросов гарантирует, что ваша прибыль зависит не от нескольких отдельных сделок, на которые приходится большая часть прибыли, а от последовательных, сбалансированных прибылей и убытков. Это важно, потому что, если прибыль в основном обусловлена несколькими выбросами, это снижает ценность использования большего количества образцов для приблизительного определения средней доходности. Чтобы убедиться в этом, просто изучите свою бэк-тестовую кривую собственного капитала и убедитесь, что ее восходящее движение вызвано не несколькими резкими скачками, а устойчивым, последовательным ростом. Кроме того, вы можете подтвердить это, сравнив наибольший прирост со средним показателем в отчете о бэк-тестировании.
Мы также хотим обеспечить, чтобы прибыль не концентрировалась в основном за короткий промежуток времени, поскольку это может свидетельствовать о временной предвзятости режима. Для проверки, чтобы обеспечить согласованность, мы изучаем распределение ежемесячной прибыли. Сначала получим отчет о результатах бэк-тестирования, щелкнув правой кнопкой мыши по отчету и сохранив его.
Затем откройте файл и обратите внимание на номер ряда "Deals" (Сделки) (в данном примере это 9342).
import pandas as pd import matplotlib.pyplot as plt # Replace 'your_file.xlsx' with the path to your file input_file = 'your_backtest.xlsx' # Load the Excel file and skip the first {skiprows} rows, skiprows = the row of "DEAL" data = pd.read_excel(input_file, skiprows=9342) # Select the 'profit' column (assumed to be 'Unnamed: 10') and filter rows as per your instructions profit_data = data[['Time','Symbol','Profit','Balance']][1:-1] profit_data = profit_data[profit_data.index % 2 == 0] # Filter for rows with odd indices profit_data = profit_data.reset_index(drop=True) # Reset index # Convert to float, then apply the condition to set values to 1 if > 0, otherwise to 0 profit_data[['Profit','Balance']] = profit_data[['Profit','Balance']].apply(pd.to_numeric, errors='coerce').fillna(0) # Convert to float, replacing NaN with 0 # Load the data data = profit_data # Calculate percentage gain compared to the previous balance data['percentage_gain'] = data['Profit'] / data['Balance'].shift(1) * 100 # Drop the first row because it doesn't have a previous balance to compare data = data.dropna() # Ensure 'time' is in datetime format data['Time'] = pd.to_datetime(data['Time']) # Extract the year and month from the 'time' column data['year'] = data['Time'].dt.year data['month'] = data['Time'].dt.month_name() # Ensure months are ordered correctly (January to December) month_order = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'] data['month'] = pd.Categorical(data['month'], categories=month_order, ordered=True) # Calculate the total return for each year-month combination monthly_return = data.groupby(['year', 'month'])['percentage_gain'].sum().unstack(fill_value=0) # Function to apply color formatting based on return value def colorize(val): color = 'green' if val > 0 else 'red' return f'background-color: {color}' # Display the table with color coding styled_table = monthly_return.style.applymap(colorize, subset=pd.IndexSlice[:, :]) # Show the table styled_table
Месяцы с просадками почти неизбежны при долгосрочных бэк-тестах, но здесь нам нужно сосредоточиться на проценте доходности и убедиться, что ни одна из просадок значительно не превышает среднюю доходность всего набора образцов.
Наконец, если ваш советник торгует несколькими активами, мы должны убедиться, что ни один из них не приносит большей части прибыли, в то время как другие вносят незначительный вклад. Чтобы сделать это, можно расширить наш исходный код на Python, добавив строки для создания круговой диаграммы, показывающей распределение прибыли по различным активам.
import seaborn as sns # Group by symbol and calculate the total profit/loss for each symbol symbol_return = data.groupby('Symbol')['percentage_gain'].sum() # Plot the pie chart plt.figure(figsize=(7, 3)) plt.pie(symbol_return, labels=symbol_return.index, autopct='%1.1f%%', startangle=90, colors=sns.color_palette("Set2", len(symbol_return))) # Title and display plt.title('Total Return by Symbol') plt.show()
Нам просто нужно убедиться, что ни один отдельный актив не доминирует на круговой диаграмме.
Дополнительные предложения
Здесь я перечисляю четыре более сложных теста на надежность, которые могут потребовать больше опыта и времени.
1. Тестирование в условиях реальной торговли:
Реализуйте стратегию в реальной или бумажной торговой среде с небольшими размерами позиций и следите за ее эффективностью с течением времени в реальных рыночных условиях. Тестирование в условиях реальной торговли проверяет способность стратегии справляться с реальной рыночной динамикой, включая проскальзывание, спреды и задержки исполнения.
Помогает оценить, может ли стратегия работать так, как ожидалось, в реальных торговых условиях и под эмоциональным давлением, помимо бэк-тестирования или моделирования.
2. Моделирование по методу Монте-Карло:
Запустите моделирование по методу Монте-Карло, случайным образом перетасовывая порядок результатов сделок (выигрышей и проигрышей) и генерируя большое количество возможных кривых эквити. Сюда можно также отнести случайные корректировки таких параметров, как точки входа или стоп-лоссы.
Моделирование по методу Монте-Карло помогает оценить, насколько устойчива стратегия к случайным рыночным условиям, давая представление о потенциальных наихудших сценариях и обеспечивая то, что стратегия не будет чрезмерно оптимизирована с учетом прошлых данных.
3. Анализ просадки и риска разорения:
Проанализируйте максимальную просадку стратегии, которая является наибольшей потерей капитала от пика до минимума, и рассчитайте риск разорения или вероятность того, что баланс счета будет сведен к нулю, учитывая текущий профиль соотношения риска и прибыли.
Эти показатели обеспечивают более глубокое понимание профиля рисков стратегии, помогая оценить, является ли допустимой максимальная просадка и вероятность истощения счета в определенных рыночных условиях. Этот анализ имеет решающее значение для долгосрочной выживаемости.
4. Моделирование проскальзывания и исполнения:
Моделируйте проскальзывание и реальные задержки исполнения, вводя случайные различия между ожидаемыми точками входа/выхода и фактическим рыночным исполнением. Вы можете моделировать проскальзывание на основе таких факторов, как волатильность рынка, размер сделки и ликвидность. В тестере стратегий MetaTrader 5 есть стресс-тест, который был бы полезен в этом случае.
Исполнение является ключевым фактором, влияющим на реальную прибыльность. Этот тест помогает оценить, насколько стратегия чувствительна к проскальзыванию и может ли она по-прежнему оставаться прибыльной при далеко не идеальных условиях исполнения. Проскальзывание будет иметь решающее значение в основном в стратегиях, торгующих только в периоды высокой волатильности, например, в стратегиях новостных событий. Кроме того, я полагаю, что большинству розничных трейдеров не нужно зацикливаться на этом, потому что проскальзывание происходит в обоих направлениях. В большинстве случаев положительное и отрицательное проскальзывание компенсируют друг друга, что делает их влияние относительно небольшим по сравнению с другими торговыми издержками.
Заключение
В данной статье я продемонстрировал, как тщательно протестировать надежность вашего советника или любых других продаваемых вам советников. Во-первых, я рассказал о потенциальных маркетинговых тактиках, которые продавцы могут использовать для мошеннического манипулирования данными на маркетплейсе MQL5, а также объяснил, почему эти тактики неэффективны. Затем я представил концепцию переобучения с помощью эксперимента на Python. Затем я изложил ключевые соображения, которые необходимо учитывать при проведении бэк-тестирования и оптимизации в MetaTrader 5, объяснив мотивацию, стоящую за каждым советом. После этого я рассказал о тестировании вне выборки, предоставив подробную информацию о том, как оценивать различные показатели отчета. Я также рассмотрел три типа тестирования выбросов — торговые, временные и по символам, предоставив четкие инструкции о том, как проводить тестирование для каждого из них. Наконец, я завершил статью дополнительными предложениями по более сложным тестам на надежность.
Перевод с английского произведен MetaQuotes Ltd.
Оригинальная статья: https://www.mql5.com/en/articles/16957
Предупреждение: все права на данные материалы принадлежат MetaQuotes Ltd. Полная или частичная перепечатка запрещена.
Данная статья написана пользователем сайта и отражает его личную точку зрения. Компания MetaQuotes Ltd не несет ответственности за достоверность представленной информации, а также за возможные последствия использования описанных решений, стратегий или рекомендаций.





- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Отличная статья Жуо.
Спасибо!
Отличная работа Zhuo и хорошая статья для чтения. В пункте 4, который гласит:
4.Коэффициент выигрыша и объем торговли для длинных и коротких позиций: Если ваш советник торгует как длинными, так и короткими позициями, убедитесь, что их коэффициент выигрыша и объем торговли в достаточной степени схожи.
Значительное расхождение между ними может свидетельствовать о дисбалансе в стратегии, который, возможно, необходимо устранить.
Верно ли это для смещенного направления тренда (тренд на покупку доминирует дольше, чем тренд на продажу. Должен ли советник по-прежнему иметь схожие показатели выигрышей и объемов торговли?
Значительное расхождение между ними может свидетельствовать о дисбалансе в стратегии, который, возможно, необходимо устранить.
Верно ли это для смещенного направления тренда (тренд на покупку доминирует дольше, чем тренд на продажу. Должен ли советник по-прежнему иметь схожие показатели выигрышей и объемов торговли?
Спасибо за комментарии.
Это зависит от того, насколько велика бета в стратегии. Если стратегия для одного актива торгуется на более высоком таймфрейме и с большим периодом удержания, то, скорее всего, результат стратегии будет иметь некоторый перекос в сторону макротренда. Именно поэтому я советую людям торговать стратегиями, которые торгуют большим количеством (объемом), торгуя с более высокой частотой или диверсифицируя стратегию на нескольких некоррелированных активах. Если в достоинства стратегии не входят предположения о смещении тренда, а правила покупки и продажи симметричны, то следует ожидать, что она будет иметь схожий объем сделок и процент выигрышей на большом объеме выборки.
Конечно, стратегии могут иметь допущения о смещении тренда, как, например, некоторые стратегии "только в лонг" для индексов. Для такого типа стратегий трейдеры должны торговать только в одну сторону, потому что они уже предположили, что другое направление не будет работать так же хорошо, как это направление. Просто убедитесь, что вы не используете слишком много предположений, и все будет в порядке.
Спасибо Zhuo за то, что уделил время этому, открыл мне глаза на использование Python для анализа результатов. Основная проблема для меня заключается в том, что именно ea или тренд ответственны за результаты :) Возможно, стоит включить метрику вероятности.
Рассмотрите возможность проведения ежемесячной проверки корреляции между торгуемым рынком и результатами бэктеста. Если корреляция высока, например, выше 0,2, то это может означать, что рыночный тренд отвечает за большую часть результатов вашего бэктеста, что нежелательно.