Как заработать на нестационарности рынков? (Статья)

 

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


Рынки постоянно меняются – нестационарны.


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


Что делать в этом случае? Может быть, взять да и отказаться от всякой оптимизации – подгонки под исторические данные?


Ответ очевиден: при построении оптимальной модели рынка, необходимо эту самую оптимизацию проводить таким образом, чтобы модель рынка была динамической, а не статической. Т.е. предоставить этой самой модели некоторые степени свободы.


Казалось бы, последнее утверждение, выглядит банально. Да. Но посмотрите, что делается при построении рыночных моделей, и Вы заметите, что столь банальная истина практически не используется.


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


1. Заведомо динамичную модель второго игрока - рынка, предполагающие для него степени свободы выбора стратегии - смешанную стратегию.
2. Уже готовый математический и алгоритмический аппарат, чтобы приступить немедленно. Математический аппарат для игры двух лиц со смешанными стратегиями и нулевой суммой является полным, т.е. в нем отсутствуют какие либо «белые пятна», а потому мы либо получим решение, либо заведомый ответ о том, что решений не существует.

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

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

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

Построение платежной матрицы

Платежная матрица для игры двух лиц с нулевой суммой – это двумерное числовое пространство. Суть в том, что математическое ожидание для строки или столбца этой самой матрицы вычисляется с учетом оптимальных стратегий обоих игроков. Общее (итоговое) матожидание всей игры, т.е. по всем строкам или по всем столбцам с учетом оптимальных стратегий обоих игроков называется ценой игры.

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

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

Практический пример

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

Продолжительность торговой сессии 7 часов 30 минут. Таким образом, получается, что всю сессию можно разбить на 15 равных частей по 30 минут каждая. Поэтому анализ ситуации будет проводить на таймфрейме M30.

Возьмем котировки за 15 последних дней – три полные торговые недели. Будем считать, что результат каждого отрезка времени это разница между ценой открытия некоего бара и ценой открытия предшествующего ему бара, т.е. для бара с номером n в исторических данных это будет Open[n] – Open[n + 1]. Время берется по бару c номером n + 1

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

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

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

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

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

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

Как получить решения для уже готовой платежной матрицы?


Существует несколько способов, среди которых наиболее распространены:


1. Через линейное программирование, а именно Симплекс методом. Метод не очень хорош, т.к. он может заклинить (в зависимости от реализации), если у платежной матрицы не существует решений, а в некоторых случаях если в платежной матрице присутствует седловая точка или не имеется ни единого решения (зависит от реализации).
2. Итерационный метод. На каждом шагу итерационного метода достигается сходимость к одному из потенциальных решений платежной матрицы. Суть в том, что если следующий шаг неоднозначен, то выбор осуществляется с помощью генератора случайных чисел. Поэтому метод может выдать различные решения при пересчете одной и той же платежной матрицы. Если решения отсутствуют, или цена игры равна нулю, то сходимость матожидания будет стремиться к нулевому значению.

Я лично пользуюсь итерационным методом, алгоритм которого привожу ниже. Листинг на языке Java, что легко позволяет его переконвертировать на язык C с помощью специальных утилит или перекомпилировать в машинные коды с помощью GCJ. Теоретически все можно было бы сразу написать на языке MQL4 или MQL5, но в данный момент низкая скорость MQL4 и наличие глюков в MQL5 пока не позволяют использовать данный алгоритм на вышеуказанных языках программирования.


В качестве входного параметра функции подается платежная матрица в виде массива – matrix


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


Функция выдает на консоль текущее значение пройденной части алгоритма (прогресс) в процентах и математическое ожидание с учетом оптимальных стратегий для игрока по строкам и по столбцам.

 

Это исходник функции поиска оптимальных смешанных стратегий для игры двух лиц с нулевой суммой с учетом минимизации расходов для игрока по строкам (положительные значения в платежной матрице - выигрыши для игрока по строкам и проигрыши для игрока по столбцам). Исходник рабочий. Проверено, мин нет.


  public double[] getData(double[][] a) {
    int m = a.length;
    int n = a[0].length;
    double[] p = new double[m];
    double[] q = new double[n];
    double[] x = new double[m];
    double[] y = new double[n];
    int r = rand.nextInt(m);
    int c = 0;
    for (int t = 0; t < 100; t++) {
      System.out.print("Progress: " + t + "%  \r");
      for (int u = 0; u < 10000; u++) {
        for (int j = 0; j < n; j++) {
          y[j] = y[j] + a[r][j];
        }
        c = 0;
        for (int j = 1; j < n; j++) {
          if ((y[j] == y[c]) && rand.nextBoolean()) {
            c = j;
          }
          if (y[j] > y[c]) {
            c = j;
          }
        }
        q[c] = q[c] + 1d;
        for (int i = 0; i < m; i++) {
          x[i] = x[i] + a[i][c];
        }
        r = 0;
        for (int i = 1; i < m; i++) {
          if ((x[i] == x[r]) && rand.nextBoolean()) {
            r = i;
          }
          if (x[i] < x[r]) {
            r = i;
          }
        }
        p[r] = p[r] + 1d;
      }
    }
    System.out.println("Progress: 100%");
    for (int i = 0; i < n; i++) {
      q[i] = q[i] / 1000000d;
    }

    double ep = 0d;
    for (int i = 0; i < m; i++) {
      double result = 0;
      for (int j = 0; j < n; j++) {
        result = result + a[i][j] * q[j] * p[i] / 1000000d;
      }
      ep = ep + result;
    }
    System.out.println("Expected Payoff = " + ep);

    return q;
  }
 
Reshetov >>:

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

Трудно не согласится.

в силу нестационарности рынка вероятность того, что рынок обязательно не будет придерживаться собственной оптимальной стратегии, а следовательно, тем самым обязательно же уменьшит расходную часть торговой системы трейдера, увеличив при этом доходную, если эта самая торговая система будет строго придерживаться оптимальной стратегии.
Похоже. Если считать, что у рынка эта оптимальная стратегия есть. Мне лично ближе аналогия игры с природой, где природа осмысленных стратегий не строит.
Возьмем котировки за 15 последних дней – три полные торговые недели. Будем считать, что результат каждого отрезка времени это разница между ценой открытия некоего бара и ценой открытия предшествующего ему бара, т.е. для бара с номером n в исторических данных это будет Open[n] – Open[n + 1]. Время берется по бару c номером n + 1

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

Супер! Дальше уйдём в очередные вычисления и подгонки.

Только кто сказал, что "котировки за 15 дней" сведенные в матрицу, это оптимальная стратегия рынка, а не очередной, но препарированный извращенным способом, участок временного ряда?

Тем более, что природа, извиняюсь рынок, не обязана придерживаться этой матрицы...


Напоминает стишок про попа и его любимую собаку...

Сильно цуцык мяса захотел. ;)


В итоге - садовник не понял фишки новой "оптимизации на лету".

Поясните отличия от обычных методов подгонки, пожа.

 
Sorento >>:


Похоже. Если считать, что у рынка эта оптимальная стратегия есть. Мне лично ближе аналогия игры с природой, где природа осмысленных стратегий не строит.

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


Поэтому лучше придерживаться мнения, что рынок не тупая "природа", у которая действует, как ей удумается, а он все же более эффективный, нежели можно предположить. А посему, лучше сделать расчет именно с учетом того, что он попытается объегорить трейдера и сделает это наиболее эффективно.


Как говорит один мой знакомый (тоже трейдер): в нашем деле лучше лишний раз перестраховаться, чем один раз обосраться.


Sorento >>:

Только кто сказал, что "котировки за 15 дней" сведенные в матрицу, это оптимальная стратегия рынка, а не очередной, но препарированный извращенным способом, участок временного ряда?

Тем более, что природа, извиняюсь рынок, не обязана придерживаться этой матрицы...

...

Поясните отличия от обычных методов подгонки, пожа.

Для этого есть методы дополнительной проверки на вшивость. Например, на форвардных тестах.


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


Если не нравиться брать историю 15 дней, дык ведь никто и не запрещает взять поболее или поменее.

 
Reshetov >>:

Поэтому лучше придерживаться мнения, что рынок не тупая "природа", у которая действует, как ей удумается, а он все же более эффективный, нежели можно предположить. А посему, лучше сделать расчет именно с учетом того, что он попытается объегорить трейдера и сделает это наиболее эффективно.


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

а уж тут и наша "оптимальная по отношению к ней" подоспеет. ;)


Как садовник, не сильно разбираюсь в играх, особенно если они типа "Я знаю, что он знает, что я знаю.."

 
Sorento >>:

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

а уж тут и наша "оптимальная по отношению к ней" подоспеет. ;)


Как садовник, не сильно разбираюсь в играх, особенно если они типа "Я знаю, что он знает, что я знаю.."

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


Но в данной ветке предполагается обсуждение модели предложенной топикстатером, а не различных идей от всевозможных бредогенераторов.


Sorento >>:

Как садовник, не сильно разбираюсь в играх, особенно если они типа "Я знаю, что он знает, что я знаю.."

Ну дык, завсегда найдется какой нибудь добрый советчик, который разбирается в данной области как свинья в апельсинах.

 
Reshetov >>:

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


Но в данной ветке предполагается обсуждение модели предложенной топикстатером, а не различных идей от всевозможных бредогенераторов.

Спасибо за конструктив в наукообразии и игре в цифирьки.

Вопросы сняты.

Честь имею.


Напомню только:


Два игрока T-рейдер:) и В-ремя:) играют в игру, основанную на подбрасывании монеты. Игроки одновременно и независимо друг от друга выбирают герб (Г - sell - цена вниз) или решку (Р - buy - цена вверх) .

Если результаты двух подбрасываний монеты совпадают (т.е. ГГ или РР), то игрок Т получает один доллар от игрока В.

Иначе игрок T платит один доллар игроку В.

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




Минимумы строк

ТГ1-1-1
ТР-11-1
Максимумы столбцов11


Максминная и минимаксная величины (цены) для этой игры равны -1 долл. и 1 долл. соответственно. Так как эти величины не равны между собой, игра

не имеет решения в чистых стратегиях.

В частности, если игрок Т использует стратегию ТГ, игрок В выберет стратегию ВР, чтобы получить от игрока Т один доллар.

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

Постоянное искушение каждого игрока перейти к другой стратегии указывает на то, что решение в виде чистой стратегии неприемлемо.

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

Мулен Э. Теория игр с примерами из математической экономики. М.: Мир,


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

 
Sorento >>:

Спасибо за конструктив в наукообразии.

Вопросы сняты.

Честь имею.

Не за что. Мы завсегда рады отшить какого нибудь флудераста.

 
Reshetov >>:

Не за что. Мы завсегда рады отшить какого нибудь флудераста.

Спасибо за оценки.

Лишь бы в радость. :)

 
Reshetov писал(а) >>

Существует несколько способов, среди которых наиболее распространены:


1. Через линейное программирование, а именно Симплекс методом. Метод не очень хорош, т.к. он может заклинить (в зависимости от реализации), если у платежной матрицы не существует решений, а в некоторых случаях если в платежной матрице присутствует седловая точка или не имеется ни единого решения (зависит от реализации).
2. Итерационный метод. На каждом шагу итерационного метода достигается сходимость к одному из потенциальных решений платежной матрицы. Суть в том, что если следующий шаг неоднозначен, то выбор осуществляется с помощью генератора случайных чисел. Поэтому метод может выдать различные решения при пересчете одной и той же платежной матрицы. Если решения отсутствуют, или цена игры равна нулю, то сходимость матожидания будет стремиться к нулевому значению.

А нельзя все это упростить рассматривая только часть сделок отвечающих определенным условиям, или отбрасывая часть сделок?

Допустим есть интрадей-система с множеством сделок. Оставляем лонговые сделки которые происходили на медвежей дневной свече и шортовые соответсвенно. Можно даже не просто на медвежей, а на 50 самых медвежих из истории сделок и т.д. и т.п. Критериев фильтрации можно кучу придумать. Ведь по сути это просто выбор наихудших ситуаций для трейдера - условный асимметричный ответ (:)) рынка

Можно и наоборот: искать оптимальные стратегии но не на всей истории, а только на самых невыгодных по определенным критерием участках истории для лонгов и шортов.

 
Avals >>:

А нельзя все это упростить рассматривая только часть сделок отвечающих определенным условиям, или отбрасывая часть сделок?

Допустим есть интрадей-система с множеством сделок. Оставляем лонговые сделки которые происходили на медвежей дневной свече и шортовые соответсвенно. Можно даже не просто на медвежей, а на 50 самых медвежих из истории сделок и т.д. и т.п. Критериев фильтрации можно кучу придумать. Ведь по сути это просто выбор наихудших ситуаций для трейдера - условный асимметричный ответ (:)) рынка

Можно и наоборот: искать оптимальные стратегии но не на всей истории, а только на самых невыгодных по определенным критерием участках истории для лонгов и шортов.

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


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


Спасибо за предложенную идею смешанных стратегий по шортам и лонгам!

Причина обращения: