При составлении портфеля ТС стараются опираться на статистику. Например, пробуют составлять таблицу корреляции на основе вычислений соответствующих коэффициента (КК).
Основная причина такого подхода - найти независимые друг от друга ТС. И чем ближе к нулю КК, тем бОльшая независимость.
Ниже порассуждаем на тему зависимости, а пока сразу классика.
Коэффициент корреляции Пирсона.
Сам КК вычисляется так.
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Особенности языка mql5, тонкости и приёмы работы
fxsaber, 2026.11.02 19:38
Когда составляют портфель из двух ТС, то стараются посчитать корреляцию результатов этих ТС.
- Для этого берут два Equity-вектора - значения Equity каждого бэктеста в одинаковых time-точках (например, в начале каждого часа или в начале каждых суток).
- И после преобразования вычисляют корреляцию между ними.
vector GetVector( const double &Array[] ) { vector Vector; Vector.Assign(Array); return(Vector); } double GetCorr( const double &Array1[], const double &Array2[] ) { return(GetVector(Array1).CorrCoef(GetVector(Array2))); } void ChangeEquity( double &Equity[] ) { for (int i = ArraySize(Equity) - 1; i > 0; i--) Equity[i] = Equity[i] / Equity[i - 1] - 1; Equity[0] = 0; // ArrayRemove(Equity, 0, 1); } void OnStart() { double Equity1[]; // Equity первой ТС - запись каждый час. double Equity2[]; // Equity второй ТС - запись каждый час. ChangeEquity(Equity1); ChangeEquity(Equity2); Print(GetCorr(Equity1, Equity2)); // Корреляция двух ТС. }
Рассуждения.
Разберем несколько ситуаций двух ТС, торгующих на одном символе. Но сначала обсудим, где берутся данные для изучения совместимости двух ТС.
Как правило, это результаты бэктестов. Конечно, эти бэктесты прибыльные. Портфель сглаживает просадки, но просадки в прошлом.
В будущем полная неопределенность. Есть только допущения. Однозначно можно сказать, что чем бОльший объем сейчас у позиции, тем бОльшему риску подвергается торговля.
Поэтому объединение подогнанных красивых кривых Equity из бэктестов, наверное, не совсем по теме рисков.
Разнонаправленные ТС.
Это очень хороший пример, чтобы дискредитировать КК или хотя бы усомниться в его разумности при составлении портфеля.
Пусть у нас одна ТС - OnlyBuy, другая - OnlySell. Объединение этих ТС не увеличивает риски, т.е. их можно смело торговать одновременно.
Непересекающиеся ТС.
Допустим, что позиции ТС1 и ТС2 не бывают открыты одновременно. Тогда в любой момент времени объем открытой позиции не превосходит вариант, если бы только одна ТС торговала. А посему риск при объединении не увеличивается.
Можно позанудствовать по теме разных лотов и прочее. Но на пальцах мысль, вроде, простая и понятная.
Объемы.
Можно попробовать ориентироваться только на историю сделок: объем, направление и время сделки. Когда ТС уменьшают средневзвешенный объем (разнонаправленные ТС) или не увеличивают (непересекающиеся ТС), то риск не растет.
При этом нас не интересует результат сделок. Очевидно, что объединяться будут ТС с хорошими результатами на бэктестах. И данные будут браться только оттуда. Поэтому заниматься подгонкой подогнанного не будем.
Коэффициент средневзвешенного объема.
Для любой истории сделок всегда можно посчитать средневзвешенный по времени объем. Например, для доливщиков этот параметр будет всегда выше, чем для любителей постоянного лота.
Так вот предлагается среднезвзвешенный объем портфеля поделить на сумму таких же объемов двух ТС в отдельности. Эта безразмерная величина будет меняться от нуля до единицы.
Для примера возьмем две ТС, которые не доливаются и торгуют только одним лотом. Тогда коэффициент будет принимать следующие значения.
| Типы ТС | Коэффициент |
|---|---|
| Одинаковые | 1.0 |
| Разнонаправленные | < 0.5 |
| Перевернутые | 0 |
| Непересекающиеся | 0.5 |
Обратите внимание на результат перевернутых ТС. Коэффициент показывает ноль, что, конечно, соответствует нулевому риску такого портфеля - нет торговли.
Как и с коэффициентом корреляции, так и здесь, чем ближе к нулю, тем лучше для портфеля. Нет только отрицательных значений предложенного коэффициента.
Реализация.
Исходник вычислений лежит в библиотеке. К записи прикреплен скрипт, который из выбранных одиночных проходов создает аналог матрицы корреляции.
1: ForumBacktest.tst, VOLUME::GetMean(Deals1) = 12.07092200925314 2: Test.tst, VOLUME::GetMean(Deals1) = 0.264939886798037 3: Test_Orig.tst, VOLUME::GetMean(Deals1) = 0.14 +-----+--------------+--------------+--------------+ | | 1 | 2 | 3 | +-----+--------------+--------------+--------------+ | 1 | 1.000 | 0.041 | 0.860 | // Аналог матрицы корреляции. | 2 | 0.041 | 1.000 | 0.653 | | 3 | 0.860 | 0.653 | 1.000 | +-----+--------------+--------------+--------------+ 01: 0.041 = 1 + 2 = ForumBacktest.tst + Test.tst // Лучшее сочетание. 02: 0.653 = 2 + 3 = Test.tst + Test_Orig.tst 03: 0.860 = 1 + 3 = ForumBacktest.tst + Test_Orig.tst
VOLUME::GetMean - это средневзвешенный по времени объем. Правильно - когда он у всех одинаковый. В распечатке выше это не так, для демонстрации годится.
Зачем?
Берете бесплатно несколько советников из Маркета. Настраиваете их на торговлю постоянным лотом одной величины. И прогоняете в Тестере на одном и том же символе/интервале - можно автоматизировать.
А далее скармливаете приложенному скрипту все интересуемые одиночные проходы (tst-файлы). И получаете таблицу и сортировку от самых лучших сочетаний (ТС или сетов одной и той же ТС) в сторону ухудшения.
Более продвинутый сценарий.
Берете за базу какой-нибудь сет или портфель сетов. Записываете его в Common-папку (терминология MT5) в виде Deals1[]. Затем в критерии оптимизации применяете MathCorrelationVolume между Deals1[](файл) и Deals2[](текущий проход).
Таким образом находите наиболее сочетающиеся сеты с тем, что у вас уже есть.
ЗЫ
Часть кода написана с помощью ИИ - бесплатный встроенный в MT5 AI-Assistant. Он справился за две минуты с наглядным текстовым выводом матрицы. Все остальное было написано без ИИ.
С коэффициентом, скорее всего, изобретен заново велосипед. Если в курсе про такое - дайте знать.


