English 中文 Español Deutsch 日本語 Português Français Italiano Türkçe
Комбинаторика и теория вероятностей для трейдинга (Часть IV): Логика Бернулли

Комбинаторика и теория вероятностей для трейдинга (Часть IV): Логика Бернулли

MetaTrader 5Трейдинг | 16 ноября 2021, 10:23
3 857 14
Evgeniy Ilin
Evgeniy Ilin

Содержание


Введение

В прошлых статьях цикла я описывал фракталы как инструмент для описания рынка и в частности, для описания ценообразования. Эта модель отлично описывает рынок, что было подтверждено с помощью вычислений и симуляций. Все это затевалось не только ради того, чтобы описать простейшие формы ценообразования, но и для того, чтобы иметь возможность в дальнейшем описывать любые векторные ряды, которые имеют схожий набор параметров что и ценообразование. Ведь действительно, если подумать, а что же такое трейд в общем случае, то окажется, что трейд, это такой же кусочек рынка, который имеет как продолжительность во времени, так и вероятность появления в процессе торговли. Как из цены, так и из трейдов можно составить произвольные кривые, которые в случае с ценой называются ценовой историей, а в случае торговли историей торговли.

В случае с ценой все гораздо понятнее, потому что все члены такого ряда всегда идут четко и друг за другом. Можно, конечно, из цены составить такие ряды, которые будут накладываться друг на друга, но тогда такой анализ абсолютно бесполезен для нас, так как не будет практической пользы от подобного анализа. В случае же с бектестами или историей торгов все обстоит немного иначе. В процессе изучения этих процессов я пришел к однозначному выводу, что к прибыльной и стабильной торговле проложен гораздо более легкий и правильный путь как раз через область анализа торговой истории или бектестов. Будет завершающая статья с описанием одного из таких подходов, но пока для него рановато.


Почему правильное представление данных очень важно для анализа?

Если более глубоко углубиться в поверхностный анализ возможностей описания торговой истории и бектестов языком математики, в первую очередь нужно осознавать для чего нам понадобится такой анализ и что он даст в итоге? Есть ли вообще добавленная стоимость в таком анализе? На самом деле дать четкий ответ сразу невозможно, но он есть и ответ постепенно приводит к простым и работающим решениям, но сначала нам придется углубиться в тернии. Учитывая опыт предыдущих статей, меня сразу интересовали следующие вопросы:

  1. Можно ли свести любую стратегию к фрактальному описанию торговли?
  2. Если сведение возможно, то для чего оно может пригодиться?
  3. Если сведение не всегда возможно, то каковы условия сводимости?
  4. Если условия сводимости выполнены, разработка алгоритма сведения
  5. Рассмотрение иных вариантов описания стратегии, и обобщение

Сразу отвечу на все эти вопросы. Свести некоторые стратегии к фрактальному описанию возможно, и я разработал этот алгоритм, его я буду описывать дальше. Он пригодится в целом не только для этих целей, ведь он универсальный, но не это главное. А сейчас подумаем и постараемся ответить на вопрос, что же такое история торгов языком случайных чисел и теории вероятностей? Ответ прост: это набор обособленных сущностей или векторов, появление которых на определенном промежутке времени имеет определенную вероятность и коэффициент использования времени. Основной характеристикой каждой такой сущности является вероятность ее появления. Коэффициент использования времени — это просто вспомогательная величина, которая помогает определить, насколько имеющееся время используется для торговли. Можно нарисовать иллюстрацию для того, чтобы лучше понимать, о чем идет речь:

Диаграмма преобразования данных

На рисунке есть следующие обозначения:

  1. Черная точка – начало трейда
  2. Красный треугольник – конец очередного трейда
  3. Оранжевый шестиугольник – одновременно и конец предыдущего трейда и начало следующего
  4. T[i] – время очередного окна торговли
  5. P[i] – прибыль или убыток очередного трейда
  6. n – количество трейдов
  7. m – количество торговых окон

На рисунке специально изображены 3 графика, для того чтобы показать, что варианты “A” и “B” могут быть сведены к варианту “C”. Теперь разберемся что это за варианты:

  1. Вариант “A” – это то, как мы видим произвольную торговлю с использованием всех возможных приемов, мани менеджмента и прочих трюков.
  2. Вариант “B” – это то же самое только учитывая, что единовременно может быть открыт лишь 1 ордер на соответствующем счете.
  3. Вариант “C” – это то, как мы видим торговлю либо в сервисе сигналов, либо на бектесте.

Очень важно отметить, что вариант “C” максимально информативен и в большинстве случаев мы полагаемся именно на это представление нашей торговли, кроме того, интересно что к данному виду можно свести абсолютно любую стратегию, а все потому, что главной характеристикой любого бектеста, либо торгового сигнала является именно линия эквити. Эта линия отражает реальную прибыль или убытки на текущий момент.

Если проанализировать линию эквити произвольной стратегии, то окажется, что точки открытия и закрытия очередных сделок могут располагаться абсолютно произвольно, если линия эквити остается неизменной. Это говорит нам о том, что ту или иную стратегию торговли можно представить огромным числом различных способов и все эти способы будут эквивалентны друг другу, так как будут эквивалентны их линии эквити. В данной связи не имеет смысла просто так искать все эквивалентные варианты и самое главное зачем их искать?

Если взять стратегию типа “B”, то преобразование ее в тип “C” является крайне простой операцией в том плане, что нам нужно всего лишь склеить воедино временные интервалы в том порядке, что они расположены, тестер и сервис сигналов, собственно, именно это и делает. Другое дело, если мы пытаемся преобразовать тип “A” в тип “C”, тут совсем все иначе. Для того чтобы произвести подобные преобразования, необходимо сначала свести тип “A” к типу “B”, а уже после всего этого производить преобразование в тип “C”. Теперь вы знаете, как работает тестер стратегий и сервис сигналов.

Само по себе данное преобразование не несет какой-то практической ценности для торговли, но может развить понимание глубинных вещей, например можно прийти к тому, что есть следующие типы стратегий:

  1. Описываемые двумя состояниями
  2. Описываемые несколькими состояниями
  3. Описываемые бесконечным количеством состояний

В данной статье я покажу вам примеры описания первых двух типов стратегий. Третий тип стратегий более сложный и подлежит отдельному рассмотрению в рамках другой статьи, я проведу это рассмотрение в свое время, а пока что для того, чтобы понять третий тип стратегии, необходимо разобраться с первыми двумя. Эти два типа помогут разуму созреть до того, чтобы прийти к третьему и последнему, общему типу стратегии.


Двойные состояния

Фракталы, описанные в предыдущих статьях, это не что иное как модель с двумя состояниями. Состояниями в данном случае являются движение вниз и движение вверх. В случае, если мы применяем модель к линии баланса торговли, а не к ценообразованию, то эта модель будет работать точно так же. Данная модель построена на схеме Бернулли. Схема Бернулли описывает простейший фрактал с двумя состояниями:

  • P[k] = C(n,k)*Pow(p,k)*Pow(q,n-k)   — формула Бернулли ( P[k] – вероятность выпадения конкретного сочетания )
  • p - вероятность выпадения состояния “1” в результате единичного опыта
  • q – вероятность выпадения состояния “2” в результате единичного опыта

Эти формулы способны вычислить вероятность того, что по истечении “n” шагов, мы получим кривую баланса или любую другую кривую, в которой будет “k” первых состояний и “n-k” вторых состояний, это не обязательно должны быть профиты сделок. Эти состояния могут символизировать любой вектор параметров, в котором мы видим уникальность. Самое интересное, что сумма всех подобных вероятностей конкретного сочетания должна образовывать полную группу, а это значит, что сумма всех таких вероятностей должна быть равна единице, что символизирует тот факт, что за “n” шагов обязательно должно появиться одно из таких сочетаний:

  • Summ(0...k…n)[ P[k] ] = 1

Нас же в данном случае интересует применение данных вещей для описания либо ценообразования, либо бектестов и сигналов. Представим, что наша стратегия состоит из сделок, которые закрываются по равноудаленным стопам, но при этом мы знаем, что невозможно вычислить предполагаемое движение цены в будущем, тогда распределение этих вероятностей будет иметь вот такой вид:

Двойные состояния

На этих трех рисунках изображены:

  1. Распределение вероятностей при случайном блуждании или торговле
  2. Распределение вероятностей при прибыльной торговле или восходящем тренде
  3. Распределение вероятностей при убыточной торговле или нисходящем тренде

Как видно из этих диаграмм, в зависимости от вероятности шага вверх, вероятности тех или иных сочетаний меняются, и максимально вероятный случай смещается либо влево, либо вправо, как и все остальные вероятности. Такая модель представления бектеста или ценообразования является простейшей и наиболее предпочтительной для анализа. Если для описания ценообразования такой модели может быть достаточно, то для описания торговли, конечно же, нет. На практике мы сталкиваемся с тем, что кривая баланса может содержать самые различные трейды, как по длительности, так и по прибыли. В зависимости от того, какие показатели трейда для нас наиболее важны, мы можем выделить не два, а столько состояний, сколько нам нужно.


Множественные состояния

Теперь давайте разберем наглядный пример. Представим, что по-прежнему нам важна лишь величина прибыли или убытка очередного трейда, но известно, что прибыль или убыток может принимать строго три фиксированных величины, и известны вероятности выпадения каждой такой величины. Если все именно так, то мы можем сказать, что имеем систему с тремя состояниями. Теперь попробуем спросить себя, а можно ли описать все возможные развития событий подобно системе с двумя состояниями? На самом деле можно. Я собираюсь немного усовершенствовать схему Бернулли для того, чтобы она могла работать с системой со сколько угодно состояниями.

Если следовать логике Бернулли, нужно определить счетчики состояний:

  • i[0] – количество выпадений первых состояний в цепочке независимых испытаний
  • i[1] – количество выпадений вторых состояний в цепочке независимых состояний
  • . . .
  • i[N] – количество выпадений N – состояния
  • N – количество состояний системы
  • s – номер состояния

Если по очереди определять количество выпадения определенного состояния, то доступное количество для следующего состояния будет:

  • s[i]  = N - Summ(0… k … i - 1) [ s[k] ]

Можно сказать проще. Если мы выбрали количество исходов предыдущего состояния, то на следующее состояние остается исходов меньше ровно на столько, сколько состояний было выбрано на предыдущее состояние. Точно так же, как и в схеме Бернулли, существуют цепочки вероятностей, которые несовместны и имеют одинаковую вероятность. Количество цепочек с одинаковым количеством всех состояний тогда вычислится так:

  • A[h](N,i[0]  ,i[1] ,… i[n]) = C(N , i[0]) * C(N-i[0] , i[1]) *…. C(N-Summ(0…k…n-1)[ i[k] ] , i[n])
  • С - сочетания
  • h – очередной уникальный набор шагов

Ну и соответственно понятно, что вероятности таких наборов можно посчитать точно так же, как в схеме Бернулли. Умножим вероятность одного такого набора на их количество:

  • P[k] = A[h](N,i[0]  ,i[1] ,… i[n]) * Pow(p[0], i[0]) * Pow(p[1], i[1]) … * Pow(1- Summ(0…j…N-1)[ p[j] ] , i[1])
  • p[j] – вероятность появления определенного состояния

Для наглядности я сделал трехмерные графики, как и в предыдущем примере для двух состояний. Точно так же у нас 30 шагов, но я беру уже три состояния вместо двух:

Тройные состояния

Конечно же понятно, что объем этого графика будет в точности равен единице, так как каждый столбик символизирует несовместное событие, и все эти несовместные события как раз и образуют полную группу. На графиках две разных стратегии с разными векторами вероятностей. Эти вероятности символизируют шанс выпадения одного из трех состояний.

  • S1 – количество выпавших первых состояний
  • S2 – количество выпавших вторых состояний
  • S3 = 30 – S1 – S2 – количество выпавших третьих состояний

Если вдруг в нашей системе есть четвертое состояние, то изобразить это можно будет только в четырех измерениях, если пять состояний, то соответственно график будет пятимерный и так далее. Для человеческого глаза только 3 измерения доступны, поэтому более сложные системы невозможно будет изобразить графически. Но нужно понимать, что многомерные функции такие же функциональные, как и другие.


Программная реализация множественных состояний

Понятно, что двойные состояния можно представить одномерным массивом данных, а что, если состояний больше? На ум приходит только многомерный массив. Но, насколько я знаю, во всех языках программирования используются максимум двойные массивы. Может быть и есть где-то возможности по созданию трехмерных массивов и массивов с множественным измерениями, но это далеко не самый удобный вариант. Лучше использовать коллекции или кортежи для этих целей:

структура фрактальных кортежей

Здесь как раз та ситуация с “30” шагами. Первый и третий столбики отражают внутреннюю структуру кортежа. Видно, что это просто массив в массиве. Там, где написано к примеру “[31,1]” – это значит, что этот элемент матрицы тоже является матрицей с “31” строкой и одним столбцом. Как раз таки формула Бернулли и вся схема Бернулли является частным случаем именно этой более общей схемы. Если потребовать двух состояний, то кортежи превратятся в одномерные массивы, и мы как раз получим простые сочетания, которые и играют основную роль в формуле Бернулли.

Если посмотреть, что же внутри этих массивов, то получим столбики “2” и “4”. Второй столбик — это количество эквивалентных веток конкретных уникальных наборов состояний, а четвертый — это суммарная вероятность таких веток, ведь их вероятности равны.

Очень наглядным критерием для проверки правильности вычисления подобных кортежей является проверка полной группы событий и общего числа всех уникальных веток. Для этих целей можно соорудить общую функцию, которая просуммирует все элементы этих сложных кортежей вне зависимости от сложности их внутренней структуры. Пример показан на скриншоте выше. Такая функция должна быть обязательно рекуррентной, и вызывать сама себя внутри, тогда она будет универсальной для любого числа состояний и количества шагов. Что касается числа уникальных веток, истинное значение считается так:

  • Pow(N,n)

Иначе говоря, количество состояний системы нужно возвести в степень количества шагов, и так мы получим все возможные комбинации уникальных цепочек, состоящих из наших состояний. На рисунке это число выступает в роли переменной “CombTotal”, с ней и сравниваем то, что получилось при суммировании.

Для того чтобы посчитать сами кортежи, нужно использовать похожие функции с такой же рекуррентной структурой:

функции для вычисления фрактальных кортежей

Видно, что все происходит похоже. Есть всего пара отличий. В каждом уровне обязательно домножение на количество сочетаний по оставшимся свободным шагам. А когда считаем вероятности домножаем на вероятность того состояния, которое сейчас набираем, ну и конечно не забываем домножить на уже собранную вероятность цепи. Просто по очереди набираем все состояния, пока не останется свободных ячеек, а ячейки — это количество наших шагов.

Можно также сделать пример выделения состояний из данных, которые нам известны. Например, известно, что у нас есть торговая статистика, и в этой статистике у каждого ордера сохранена информация о его длительности, объеме торгов и прочая информация, например величина убытка или прибыли. Так как выборка конечна, то и число состояний конечно. Можно, например, определить, сколько вообще вариантов прибыли есть в этой выборке. И каждое уникальное значение профита считать уникальным состоянием. Считаем количество появление всех таких профитов во всей выборке и делим на общее количество всех сделок и получаем вероятность выпадения конкретного состояния. И так делаем для всех состояний. Если потом просуммировать все эти вероятности, то получим единицу. Если так, то все сделано верно. Так же можно сделать, например со временем, сделать классификацию по времени существования ордера. Иначе говоря, состоянием может быть любая уникальная характеристика какого-либо события. В данном случае событием считается трейд, а его параметры это уже как раз характеристики конкретного события. Примеры состояний могут быть такими в нашем случае:

примеры состояний

На рисунке пример составления наборов состояний. По правилам состояния должны образовывать полную группу событий, иначе говоря, не должно быть там совместных состояний. Вероятность этих событий можно посчитать, просто разделив количество ордеров в таблице с конкретными состояниями на количество всех ордеров, а в нашем случае это число “7”. Это на примере ордеров, но это не обязательно могут быть ордера, может быть что угодно.


Заключение

В этой статье я старался показать, как можно оценивать выборки данных, как составлять из них новые путем классификации данных и объединения их в наборы состояний, вероятности которых можно посчитать. Что делать с этими данными решать вам. Самым лучшим использованием я считаю множественные выжимки и их оценка, это еще называют кластеризацией выборки. Плюс в том, что кластеризация выборки может служить как отличный фильтр для усиления показателей торговли уже имеющихся систем, а также для получения прибыльной торговли из уже имеющейся, казалось-бы убыточной стратегии — всего-то нужно произвести кластеризацию и найти всеми желаемые прибыльные выборки. А самое главное, подобные механизмы могут являться одной из ступеней обработки данных в масштабируемых торговых системах. Мы будем применять эти механизме на практике, когда перейдем к сборке самоадаптирующейся торговой системы, а пока что это — очередной кирпичик.

Ссылки


Прикрепленные файлы |
States_Research.zip (1064.01 KB)
Последние комментарии | Перейти к обсуждению на форуме трейдеров (14)
WME Ukraine/ lab. of Internet-trading
Alexandr Plys | 20 нояб. 2021 в 13:49
Evgeniy Ilin #:

Давайте к практике. "200" подбрасываний например. Если проанализировать всю эту последовательность испытаний, то можно выделить в ней не единичные подбрасывания, а к примеру различные цепочки с разными наборами состояний. В торговле если мы не цепочки трейдов анализируем а цену, то это называют паттернами. Любой паттерн можно с достаточной точностью представить цепочкой состояний. Интересно что при рассмотрении отдельного состояния или просто шага, то мы получим хаос скорее всего, а как только эти состояния объединяются в цепочки то образуется паттерн и этот паттерн может говорить как о покупке так и о продаже, все что вам нужно сделать это проанализировать то что происходит после паттерна и составить статистику. Бектест или история торгов это тоже кривая и паттерны можно искать не только на уровне цены но и на уровне виртуальной торговли. Я это буду описывать позже в другой статье, материала просто много и он должен в свое время появляться.

А так в целом хорошо что вы пытаетесь копать дальше это радует ).


"Интересно что при рассмотрении отдельного состояния или просто шага, то мы получим хаос скорее всего ..."
- вот тут надо остановиться.

Хаос или турбулентность на рынке происходит очень редко раз 5-7 лет и выражается она в резком бегстве или наплыву,
что влияет на бурный рост, который потом резко сдувается, или на паническое падение стоимости финансового инструмента.
Поэтому можно рассматривать даже просто и без ценовых Паттернов, коих великое множество, и, которые далеко не всегда дают направление, которое от них ожидают.
Не правда ли, Евгений? 

Evgeniy Ilin
Evgeniy Ilin | 20 нояб. 2021 в 16:29
Alexandr Plys #:


"Интересно что при рассмотрении отдельного состояния или просто шага, то мы получим хаос скорее всего ..."
- вот тут надо остановиться.

Хаос или турбулентность на рынке происходит очень редко раз 5-7 лет и выражается она в резком бегстве или наплыву,
что влияет на бурный рост, который потом резко сдувается, или на паническое падение стоимости финансового инструмента.
Поэтому можно рассматривать даже просто и без ценовых Паттернов, коих великое множество, и, которые далеко не всегда дают направление, которое от них ожидают.
Не правда ли, Евгений? 

Естественно, все именно так. В понимании трейдера паттерн это - какая-то ценовая картинка, но паттерн это гораздо больше чем ценовая картинка. Паттерн это цепочка состояний. Состояния могут выражаться как в визуальных аспектах так и просто в векторе каких-то параметров, которые невозможно визуально определить. Просто человеку проще визуально видеть что-то, но а что делать если паттерн многомерный и его можно изобразить только в многомерном пространстве? Паттерн это цепочка состояний, где каждое состояние может характеризоваться любым набором абсолютно любых как скалярных так и комплексных величин,  ив данной связи не обязательно рассматривать именно цену, можно рассматривать и кривую Mjving Average и все что хотите... главное эти данные уметь обработать и составить статистику, а можно виртуальный баланс виртуального бектеста рассматривать с тем же успехом, а можно линию его эквивти и тд итп... вариаций плюс бесконечность и налюбой можно получить статистику и сделать усиленную выжимку.

Evgeniy Ilin
Evgeniy Ilin | 20 нояб. 2021 в 16:49
Dmitry Fedoseev #:

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

Конечно, ребра тоже разные могут быть, с наклоном влево или вправо, с наклоном на один диапазон градусов или на другой. Каждое состояние можно дробить до посинения, тогда получится найти более точные модели паттернов, или даже те паттерны которых не существует в классическом трейдерском представлении, но они будут гораздо эффективнее классических. Единственное при составлении таких состояний нужно обязательно требовать полноты группы. То есть эти состояния должны быть несовместными событиями одного пространства событий и образовывать полную группу, то есть их суммарная вероятность должна быть равна единице обязательно. Эти события должны быть несовместными. Если эти условия соблюдены тогда можно строить комбинации цепочек из этих состояний, что и есть паттерны.

Dmitry Fedoseev
Dmitry Fedoseev | 20 нояб. 2021 в 17:25
Evgeniy Ilin #:

Конечно, ребра тоже разные могут быть, с наклоном влево или вправо, с наклоном на один диапазон градусов или на другой. Каждое состояние можно дробить до посинения, тогда получится найти более точные модели паттернов, или даже те паттерны которых не существует в классическом трейдерском представлении, но они будут гораздо эффективнее классических. Единственное при составлении таких состояний нужно обязательно требовать полноты группы. То есть эти состояния должны быть несовместными событиями одного пространства событий и образовывать полную группу, то есть их суммарная вероятность должна быть равна единице обязательно. Эти события должны быть несовместными. Если эти условия соблюдены тогда можно строить комбинации цепочек из этих состояний, что и есть паттерны.

С наклоном только один вариант, когда центр массы проецируется ровно в точку опоры. В остальных случаях нет устойчивости.

mytarmailS
mytarmailS | 4 февр. 2022 в 10:23
Evgeniy Ilin #:

Для человеческого глаза только 3 измерения доступны, поэтому более сложные системы невозможно будет изобразить графически. Но нужно понимать, что многомерные функции такие же функциональные, как и другие.

Жень но для этого существуют методы снижения размерности - PCA , t-sne. umap итп..

вот первая попавшаяся статья

Графика в библиотеке DoEasy (Часть 88): Коллекция графических объектов — двумерный динамический массив для хранения динамически изменяемых свойств объектов Графика в библиотеке DoEasy (Часть 88): Коллекция графических объектов — двумерный динамический массив для хранения динамически изменяемых свойств объектов
В статье создадим класс динамического многомерного массива с возможностью изменения количества данных в любом измерении. На основе созданного класса создадим двумерный динамический массив для хранения динамически изменяемых некоторых свойств графических объектов.
Стать хорошим программистом (Часть 5): повышаем скорость программирования Стать хорошим программистом (Часть 5): повышаем скорость программирования
Я полагаю, каждый разработчик хочет писать код быстрее. При этом возможность быстро и эффективно писать код — это не какая-то особая врожденная способность, доступная только избранным. Это навык, которым может овладеть любой программист, чем мы и займемся в этой статье.
Пользуйтесь каналами и групповыми чатами MQL5.community Пользуйтесь каналами и групповыми чатами MQL5.community
На сайте MQL5.com встречаются трейдеры со всего мира — публикуют статьи, бесплатные коды и продукты в Маркете, выполняют работы на фриланс бирже и копируют торговые сигналы. Вы можете общаться с ними на форуме, в трейдерские чатах и каналах MetaTrader.
Разработка торговых роботов при помощи визуального программирования Разработка торговых роботов при помощи визуального программирования
В статье демонстрируется возможности редактора botbrains.app — no-code платформы для разработки торговых роботов. Чтобы создать торгового робота не нужно программировать — просто перетащите нужные блоки на схему, задайте их параметры и установите связи между ними.