Сегодня уже никого не удивишь механическими торговыми системами. Основным преимуществом системной торговли является ее объективность. Любой успешный трейдер четко знает, что он будет покупать и когда продавать. Иногда эти правила существуют только в его голове, а иногда они выражены в виде алгоритма механической торговой системы. Автоматизация процесса принятия решений на бирже позволяет анализировать огромное количество поступающей информации и торговать такие высокочастотные или сложные стратегии, которые простому человеческому мозгу не под силу.
Классическая торговая система состоит из четырех основных элементов:
- условие на вход в позицию;
- условие на выход из позиции с прибылью;
- условие на выход из позиции с убытком;
- объем денежных средств, задействованных в сделке.
Однозначно определив все эти четыре пункта, можно протестировать их на исторических котировках и принять или отклонить построенную по ним торговую систему. Начинающие трейдеры часто не уделяют внимания последнему элементу - управлению капиталом. И из-за этого терпят преждевременный крах, даже не успев оглядеться на рынке и определить эффективность первых трех пунктов. Как следствие, многие книги по биржевой торговле пестрят аксиомами, вроде "успешная торговая система лишь на 20% состоит из точек входа и выхода и на 80% - из управления рисками и психологии". Но это уже явный перекос в обратную сторону. Ведь убыточную систему вряд ли удастся заставить приносить прибыль, лишь изменяя правила управления капиталом. Если верить авторам подобных афоризмов, то профессионалы не знают никаких особенных правил для открытия позиции, а их успешность обусловлена лишь своевременным обрезанием убытков. Но и это полуправда, и вот почему. Хороший выход действительно важнее входа для очень многих систем. Многочисленные тесты показывают, что при хороших выходах из позиции можно получать прибыль даже на случайных входах. Но полноценный результат способна принести лишь система с действительно хорошими входами. И одной из задач профессионального трейдера является поиск таких условий для открытия позиции, что положительное математическое ожидание системы начнет реализовываться как можно скорее.
Как правило, поиск точек для открытия позиции происходит по принципу статистической оценки. Трейдер формирует гипотезу "Что, если..." и сравнивает полученный результат с эффективностью случайного или альтернативного входа. Иногда бывает, что условия на вход и выход жестко связаны, тогда такая пара сравнивается с допустимым стандартным шаблоном. Но в любом случае, трейдеру самостоятельно приходится изобретать паттерны на вход и оценивать их устойчивость и матожидание. Это достаточно надежный и проверенный способ разработки входов, хоть и в некоторой степени субъективный. В этой статье я хочу показать иной вариант постановки задачи для поиска хороших точек на открытие позиций - прямой анализ данных.
Интеллектуальный анализ данных обладает как своими достоинствами, так и недостатками. Среди достоинств можно выделить объективность результатов, ведь все множество данных обрабатывается определенной последовательностью однозначных алгоритмов. И, повторив процедуру поиска закономерностей на другом компьютере, мы получим тот же самый результат. Среди возможных недостатков можно выделить, как это ни парадоксально, заметную субъективность всего подхода. Сам пользователь должен будет определить, в каких свойствах и критериях алгоритмы Дата-Майнинга будет искать устойчивые "знания".
Первым этапом в интеллектуальном анализе является проверка и подготовка данных. Тут и необходимо определиться, какие критерии будут использоваться для поиска закономерностей. Сам временной ряд биржевых котировок определяется несколькими основными параметрами:
- дискретность времени. Могут использоваться минутные, часовые или даже дневные интервалы времени для построения ряда котировок;
- значения цены за временнОй интервал. Используется цена открытия и закрытия, а также максимальная и минимальная цена за интервал;
- значения объема торгов и, иногда, открытого интереса.
Но абсолютные значения цен малоинформативны и нам сейчас не интересны. Необходимо каждой котировке придать несколько текущих и относительных свойств рынка. Поэтому вручную рассчитаем такие показатели, как сила и направление тренда, общий уровень волатильности, динамику роста последних трех дней, относительную величину ценового диапазона, близость к локальным максимумам и минимумам, относительное положение "центра" свечи к предыдущей, изменение максимальной и минимальной цены свечи к предыдущей. Всего 15 относительных, нормированных показателей, которые характеризуют каждый интервал по 15 параметрам. Нормировка необходима для корректного сравнения котировок различных акций и на различных отрезках времени. Приведя все ценовые данные к одному знаменателю, мы получим 15-мерное пространство значений, где каждая котировка представлена отдельной точкой с 15 координатами.
Поскольку для Дата-Майнинга потребуется большое количество данных, то тут я буду использовать дневные котировки акций из состава индекса СП-500 за 10 лет. Когда все данные были подготовлены, я сформировал три неповторяющиеся выборки размером в 30000, 10000 и 10000 дней. Позже я объясню, зачем нужны именно три выборки.
Итак, данные собраны и можно переходить ко второму этапу подготовки. Для начала необходимо проверить, что за критерии мы выбрали в качестве характеристик состояния рынка для каждой дневной котировки. Ведь каждый критерий, по сути, определяет конкретный признак рынка и нужно убедиться, что эти признаки друг друга не дублируют. Для этого необходимо разбить признаки по общим классам. Но все они имеют различную размерность и разный диапазон разброса. Поэтому первой процедурой станет Стандартизация данных таким образом, чтобы все критерии имели среднее значение, равное нулю и дисперсию, равную единице. Подобную процедуру я уже рассматривал при определении корреляционной матрицы для портфеля акций. Стандартизировав значения, можно классифицировать подготовленные признаки. Смотрим дендрограмму:
По шкале абсцисс идет мера относительного сходства признаков, которые идут по оси ординат. Все признаки сгруппировались в три основных класса. Верхний класс (выделен красным овалом) можно обозначить, как "класс волатильности". Он содержит в себе три признака:
- процентное отношение вчерашнего диапазона к позавчерашнему;
- отношение стандартного отклонения цены к своему среднему;
- нормированный рост за предыдущий день.
Нижний класс (выделен красным овалом) можно обозначить, как "класс приращения". Он содержит в себе пять признаков:
- изменение максимума свечи относительно максимума вчерашней свечи, нормированное по вчерашнему диапазону;
- нормированное изменение минимумов;
- нормированное изменение центра свечи;
- нормированный рост;
- нормированный гэп.
Средний класс можно обозначить как "класс трендовости". Он содержит два признака тренда, значение Стохастика, нормированный рост за позапрошлый и предыдущий день, сегодняшний диапазон и относительное изменение объема. Но пока подобная иерархическая классификация немного сумбурна, хоть и дает основное представление о природе признаков. Все дело в том, что некоторые выбранные мною критерии слишком "близко" характеризуют один и тот же признак. Так, в нижнем "классе приращений" признаки относительного смещения свечи не играют существенной роли по отдельности и, как следствие, объединяются в одну общую группу. В среднем "классе трендовости" точно так же объединяются в одну группу признаки направления тренда и Стохастик. Поэтому можно предположить высокую корреляцию признаков внутри этих подгрупп. Смотрим корреляционную матрицу:
Так и есть. Красным цветом выделены признаки, которые своими показаниями попросту дублируют друг друга. Такие признаки называются мультиколлинеарными и приносят больше вреда, чем пользы. Поэтому было бы логично заменить эти шесть признаков двумя новыми, полностью их повторяющими. Таким образом, можно немного понизить размерность пространства и повысить качество признаков с минимальными информационными потерями. В многомерной статистике для этого разработаны два специальных алгоритма: выделение главных компонент и факторный анализ. Первый метод заменяет группу коррелированных признаков их линейной комбинацией, максимально полно передающей их дисперсии. Факторный анализ - более сложный алгоритм, но позволяющий заменить целую группу разнородных признаков меньшим количеством новых факторов, объясняющих бОльшую часть корреляции. Более подробно с факторным анализом можно ознакомиться в литературе по многомерной статистике. А пока посмотрим на результат факторного анализа выбранных шести признаков:
В представленной таблице видно, что Фактор1 имеет большую связь с критериями сдвига свечи, а Фактор2 - с критериями тренда. Еще раз отмечу, что факторы заменяют не отдельные критерии, а все их множество, понизив шестимерное пространство признаков до двумерного. Если бы мы этим и ограничились, то уже сейчас можно было бы построить визуальную поверхность с осями "тренд" и "сдвиг". Безусловно, меняя шесть признаков на два новых фактора, мы немного теряем в информативности. В факторном анализе для оценки качества подмены служит значение "объясненной дисперсии". В нашем случае Фактор1 объясняет 47% дисперсии, а Фактор2 - почти 40%. То есть вместе они объясняют почти 90% дисперсии шести признаков, значит замена выполнена очень качественно.
Теперь, когда мультиколлинеарность признаков устранена, можно еще раз проверить классификацию признаков. Смотрим новую дендрограмму:
Хорошо видно, что теперь все признаки объединяются в две большие группы. Сейчас не буду давать их человеческую интерпретацию. Скажу лишь, что признаки волатильности объединились в один общий подкласс (выделен красным):
- отношение вчерашнего диапазона к позавчерашнему;
- отношение стандартного отклонения к своему среднему;
- отношение сегодняшнего диапазона ко вчерашнему.
Подобная классификация признаков меня вполне устраивает, поэтому этап подготовки данных можно считать завершенным.
Каждая котировка соответствует определенной точке в многомерном пространстве, поэтому можно среди всего множества точек попытаться определить кластеры. Кластеры - это плотно сгруппированные точки, и можно предположить, что с близостью их расстояния растет схожесть их свойств. Чтобы получше представить себе физический смысл кластеров, можно вспомнить нашу Вселенную. В классической интерпретации Вселенная - это трехмерное пространство. Так вот галактики в ней - это и есть кластеризованные звезды. Созвездия на небе - тоже кластеры звезд. Внутри кластера дисперсия расстояний меньше, чем вне этого кластера.
Для трехмерного пространства очень легко найти меру расстояния. Но как быть, когда осей пространства больше и обычные метры уже не подойдут? На этот случай разработано несколько различных метрик, самая простая из которых - Евклидово расстояние. Не нужно пугаться, это достаточно простая и эффективная метрика, особенно для наших стандартизированных признаков. Поэтому, рассчитав расстояние между точками, можно определить, когда их плотность повышается и образуется кластер. Но непосредственный перебор всех возможных расстояний - непосильная задача даже для современных компьютеров. Обычно делают наоборот - определяют нужное количество кластеров и "стягивают" в них точки. Самый популярный алгоритм кластерного анализа - метод к-средних. В этом случае все точки будут распределены по заранее определенному числу кластеров. Метод достаточно грубый, так как многие точки придется «за уши» притягивать к ближайшему кластеру. Но в нашем случае такой алгоритм кластеризации вполне пригоден.
Основной задачей при использовании метода к-средних является определение числа необходимых кластеров. Кластеры должны быть достаточно самобытны, а значит, их должно быть много. Но они должны быть статистически значимы, то есть содержать достаточное количество точек. Для моего множества данных я определил 50 кластеров. Смотрим результаты кластерного анализа:
В таблице представлена дисперсия значений отдельных признаков. Напомню, что кластер имеет место, если дисперсия значений внутри него меньше, чем вне его границ. В первой колонке таблицы представлена внешняя дисперсия, в третьей - дисперсия внутри кластеров. В пятой и шестой колонках - критерий статистической значимости разбиения признаков по кластерам. Хорошо видно, что для всех признаков внутренняя дисперсия меньше внешней – значит, кластерный анализ действительно группирует котировки по схожим кластерам. Эмпирическим путем можно проверить, что с увеличением числа кластеров, будет увеличиваться разница между внешней и внутренней дисперсией. Поэтому мы получим группы очень похожих точек, но некоторые кластеры будут размываться случайными "отдаленными" точками. Чуть позже мы рассмотрим, как проверить устойчивость кластеров вневыборочными тестами.
Теперь, когда все пространство точек разбито на кластеры, можно поподробнее разобраться с их смыслом. В каждый кластер точка попадает, исходя из близости своих координат к центру существующих кластеров. В нашем случае координаты - это численные характеристики текущего состояния рынка. То есть сортировка по группам будет происходить примерно следующим образом: если был небольшой гэп вверх и вчерашний диапазон был немного выше позавчерашнего, и ..., и на рынке был умеренный восходящий тренд, то точка попадает в кластер №1. Каждый критерий "небольшого гэпа" или "умеренного тренда" определен нечетким диапазоном для каждого кластера. То есть всего мы имеем 50 не очень однозначных (для каждого признака по отдельности) условий для попадания точки в конкретный кластер. Таким образом, каждый кластер можно рассматривать как "нечеткий" паттерн.
Возникает резонный вопрос, можно ли получить логическое описание условий для включения точки в тот или иной кластер. Для ответа на этот вопрос рассмотрим следующий график:
На графике представлены средние значения признаков для каждого конкретного кластера. Хорошо видно, что кластеры очень сильно пересекаются по отдельно взятым координатам. Поэтому однозначно будет очень трудно выявить принадлежность точки к кластеру по одной или двум координатам. Как самолет в полете характеризуется географическими координатами и высотой, так любая котировка определяется совокупностью всех 15 признаков. Как вариант, для определения общечеловеческих правил разбиения на кластеры можно использовать алгоритм "дерево решений". В результате мы получим огромный сложноструктурированный список логических правил "Если...то...", с большой вероятностью повторяющий принцип кластерного анализа. Но вот использовать эти правила для реальной торговли будет достаточно проблематично. Далее я покажу, что эти правила нам особо и не потребуются.
В зависимости от комбинации признаков, котировки будут иметь различную частоту. Следовательно, мощность кластеров будет различна по количеству включенных в них точек. Рассмотрим следующую гистограмму:
Хорошо видно, как варьируется размер кластеров. Невозможно однозначно сказать, является ли малочисленный кластер "настоящим" или он образовался только из-за искусственной группировки редких котировок. Поэтому пока к результатам, показанным малочисленными кластерами, надо относиться как к малодостоверным. Основным критерием "справедливой" принадлежности точки к тому или иному кластеру является расстояние до центра этой группы. Как я уже говорил, расстояние в многомерном пространстве определяется Евклидовой метрикой. Посмотрим распределение удаленностей точек от центра:
Хорошо видно, что распределение является логнормальным. Величина безразмерная и ее можно использовать для ручного исключения слишком далеких точек из кластера. Но нам это пока не требуется. На этом этап кластерного анализа можно считать завершенным. Получены качественные кластеры и оценена их статистическая пригодность.
Теперь переходим к самому интересному этапу интеллектуального анализа данных - его применению в системной торговле. Для начала нужно проверить устойчивость полученных кластеров на вневыборочных данных. В реальной торговле у нас не будет возможности производить предобработку и стандартизацию поступающих котировок. Поэтому нужен алгоритм, способный распределять котировки по кластерам "на лету".
Для начала подведем итог математических преобразований, определяющих принадлежность котировок к своим кластерам:
- значение текущих характеристик рынка получены из обработки последовательности биржевых котировок. На этом этапе ничего сложного нет, на это способна любая программа технического анализа;
- стандартизация значений;
- факторный анализ и замена мультиколлинеарных признаков новыми Факторами;
- кластерный анализ по методу к-средних.
В результате мы получили 50 классов, по которым распределены котировки в зависимости от значений текущих характеристик рынка. А один из лучших алгоритмов в многомерной статистике для классификации - это нейронная сеть, построенная на основе многослойного перцептрона. В качестве входных данных мы будем подавать 15 значений текущих характеристик. На предпоследнем слое будет находиться 50 нейронов в соответствии с 50 кластерами. В зависимости от уровня активации этих нейронов будет меняться вероятность классификации котировки в тот или иной кластер. Обычно алгоритм классификации построен по принципу "победитель забирает все". То есть наиболее активированный нейрон и определит класс котировки. Но в нашем случае это не лучший вариант. Например, вероятности классификации могут распределиться следующим образом:
- с 40% вероятностью принадлежит 8 классу;
- с 20% вероятностью принадлежит 20 классу;
- с 10% вероятностью принадлежит 1, 13, 46 или 48 классу.
В этом случае точка будет отнесена к 8 кластеру, хотя вероятность правильного прогноза лишь 40%. Поэтому введем дополнительные ограничения, что "победитель заберет все" только если его вероятность будет выше 80%. В противном случае нейросеть просто пометит точку как неопределенную. Такой подход понизит общий процент ошибочных прогнозов за счет небольшого уменьшения общего числа прогнозов. Ведь нам не нужно торговать все время, нам нужно торговать только в те моменты, когда фактор вероятности на нашей стороне. Рассмотрим архитектуру нейросети:
В левой части кружочками обозначены входные данные. Далее идут скрытые слои. Далее идет слой из 50 нейронов, которые на выходе дают один прогноз - номер кластера. Сначала обучим нейросеть на нашей основной выборке. По принципу правильного обучения она будет случайным образом разбита на три группы для обучения, теста и контроля. Смотрим полученные результаты:
Нейросеть правильно классифицировала 83% значений - это хороший результат, вполне пригодный для дальнейшей работы. Теперь нужно разобраться какие кластеры определялись лучше, какие хуже. Смотрим сводную таблицу:
Хорошо видно, что процент ошибок рос с уменьшением количества точек, входящих в конкретный кластер. Поэтому малочисленные кластеры не только статистически малодостоверны, но и слабопрогнозируемы. Вполне возможно, что при более глубоком анализе там и найдутся устойчивые паттерны, но пока исключим их из дальнейшей работы (шрифты выделены красным цветом).
Полученные кластеры содержат в себе как устойчивые так и более случайные комбинации значений. Все они достоверны на основной выборке данных, но могут и не повториться на вневыборочных котировках. Чтобы определить устойчивость, необходимо как-то определить "оптимальность" кластеров для принятия торговых решений. Для этого вычислим математическое ожидание всех кластеров - рассчитаем нормированное значение роста дня, следующего за котировкой из определенного кластера:
- находим день, следующий за "классифицированным" днем и определяем его абсолютный рост;
- нормируем рост, деля абсолютное значение на текущее значение стандартного отклонения. Тем самым получаем значение роста в процентах от волатильности;
- суммируем значения накопленного роста для всех точек из кластера.
Таким образом, мы видим, что какие-то кластеры лучше торговать в лонг, какие-то - в шорт. Рассчитаем точно таким же образом матожидания кластеров из первого вневыборочного множества котировок. После чего отберем только те кластеры, матожидание которых одинаково на обеих выборках. Смотрим сводную таблицу:
В левой части таблицы находится кластеры из основной выборки, в правой - вневыборочные кластеры. Общее количество "устойчивых" кластеров равно 17, что составляет лишь треть от общего количества. Много это или мало? Во-первых, какое-то количество кластеров мы даже не рассматривали из-за их малочисленности. Во-вторых, вполне естественно, что какие-то кластеры образовались только благодаря случайным свойствам случайной выборки. Поэтому, если число устойчивых кластеров на втором вневыборочном интервале так же будет меньше 1/3 от этих 17, то весь результат можно будет объяснить случайностью. Поэтому проверим матожидание этих же 17 кластеров на втором вневыборочном интервале:
В правой части таблицы расположены кластеры из нового набора данных. Лишь три кластера оказались убыточными - результат более чем позитивный. Можно сделать вывод, что кластерный анализ действительно позволяет отыскивать паттерны со значимым смещением матожидания.
Устойчивость кластеров на вневыборочных интервалах зависит от качества разбиения и анализа базового множества данных. Эффективность кластерного анализа, в свою очередь, зависит от правильной подготовки и выбора ключевых признаков. Таким образом, пригодность всего алгоритма интеллектуального поиска паттернов на открытие позиции целиком зависит от способности трейдера выделить наиболее значимые характеристики рынка. Можно "дробить" рынок по конфигурациям свечей, силе тренда или динамике волатильности - в любом случае мы получим множество кластеров с различной устойчивостью и математическим ожиданием.
Теперь можно посмотреть, насколько равномерно распределены кластеры по всему множеству котировок из второго вневыборочного интервала. Для этого проделаем следующие операции:
- заранее обученная нейросеть будет последовательно классифицировать поступающие котировки;
- если котировка будет отнесена к 4, 6, 7, 11, 17, 21, 24, 28, 29, 30, 35, 39 кластеру, то на открытии следующего бара будет открыта длинная позиция;
- если котировка будет отнесена к 1, 14, 31, 33, 36 кластеру, то будет открыта короткая позиция;
- открытая позиция будет удерживаться до конца дня;
- по итогам сделки будет рассчитываться значение прибыли, нормированное по текущей волатильности.
В результате мы получим аналог кривой капитала, построенной по результатам обычной торговой системы. Смотрим полученный график:
Хорошо видно, что линия капитала достаточно равномерно растет вверх. Но в отличие от классических графиков, по оси Х расположена не шкала времени, а количество проторгованных сделок. Поскольку для торговли использовались 17 кластеров из 50, то из выборки в 10000 дней позиция открывалась 3727 раз. То есть мы были "в позиции" каждый третий день. Можно отметить, что для паттерной торговли это достаточно часто, поэтому легко можно и ужесточить требования к кластерам по уровню их устойчивости и эффективности матожидания.
В этой статье я рассказал о том, как можно использовать алгоритмы многомерного статистического анализа для построения торговой системы. Самая субъективная часть процесса - выбор текущих характеристик фондового рынка. Но независимо от того, какой выбор сделает трейдер, эти характеристики должны быть приведены к одному знаменателю и нормированы. Когда свойства рынка определены и измерены, нужно выбрать наиболее значимые и слабокоррелированные - в этом поможет алгоритм факторного анализа по методу главных компонент. Затем, правильно подготовив данные, можно разбить все множество котировок на группы со схожими свойствами - для этого подойдет алгоритм кластерного анализа по методу к-средних. Сгруппировав все котировки по нескольким классам, можно обучить правилам группировки нейросеть - в моем случае использовался многослойный перцептрон. Это позволит в дальнейшем определять принадлежность котировки к тому или иному классу в реальном времени. Необходимо определить матожидание кластеров и их устойчивость на одном или более статистически значимом вневыборочном интервале. Когда нейросеть обучена, а нужные кластеры выбраны, можно использовать их как паттерны для открытия позиций.
Автор статьи: Тарас Правдюк, (с) специально для "Русского Трейдера".
Классическая торговая система состоит из четырех основных элементов:
- условие на вход в позицию;
- условие на выход из позиции с прибылью;
- условие на выход из позиции с убытком;
- объем денежных средств, задействованных в сделке.
Однозначно определив все эти четыре пункта, можно протестировать их на исторических котировках и принять или отклонить построенную по ним торговую систему. Начинающие трейдеры часто не уделяют внимания последнему элементу - управлению капиталом. И из-за этого терпят преждевременный крах, даже не успев оглядеться на рынке и определить эффективность первых трех пунктов. Как следствие, многие книги по биржевой торговле пестрят аксиомами, вроде "успешная торговая система лишь на 20% состоит из точек входа и выхода и на 80% - из управления рисками и психологии". Но это уже явный перекос в обратную сторону. Ведь убыточную систему вряд ли удастся заставить приносить прибыль, лишь изменяя правила управления капиталом. Если верить авторам подобных афоризмов, то профессионалы не знают никаких особенных правил для открытия позиции, а их успешность обусловлена лишь своевременным обрезанием убытков. Но и это полуправда, и вот почему. Хороший выход действительно важнее входа для очень многих систем. Многочисленные тесты показывают, что при хороших выходах из позиции можно получать прибыль даже на случайных входах. Но полноценный результат способна принести лишь система с действительно хорошими входами. И одной из задач профессионального трейдера является поиск таких условий для открытия позиции, что положительное математическое ожидание системы начнет реализовываться как можно скорее.
Как правило, поиск точек для открытия позиции происходит по принципу статистической оценки. Трейдер формирует гипотезу "Что, если..." и сравнивает полученный результат с эффективностью случайного или альтернативного входа. Иногда бывает, что условия на вход и выход жестко связаны, тогда такая пара сравнивается с допустимым стандартным шаблоном. Но в любом случае, трейдеру самостоятельно приходится изобретать паттерны на вход и оценивать их устойчивость и матожидание. Это достаточно надежный и проверенный способ разработки входов, хоть и в некоторой степени субъективный. В этой статье я хочу показать иной вариант постановки задачи для поиска хороших точек на открытие позиций - прямой анализ данных.
Интеллектуальный анализ данных обладает как своими достоинствами, так и недостатками. Среди достоинств можно выделить объективность результатов, ведь все множество данных обрабатывается определенной последовательностью однозначных алгоритмов. И, повторив процедуру поиска закономерностей на другом компьютере, мы получим тот же самый результат. Среди возможных недостатков можно выделить, как это ни парадоксально, заметную субъективность всего подхода. Сам пользователь должен будет определить, в каких свойствах и критериях алгоритмы Дата-Майнинга будет искать устойчивые "знания".
Первым этапом в интеллектуальном анализе является проверка и подготовка данных. Тут и необходимо определиться, какие критерии будут использоваться для поиска закономерностей. Сам временной ряд биржевых котировок определяется несколькими основными параметрами:
- дискретность времени. Могут использоваться минутные, часовые или даже дневные интервалы времени для построения ряда котировок;
- значения цены за временнОй интервал. Используется цена открытия и закрытия, а также максимальная и минимальная цена за интервал;
- значения объема торгов и, иногда, открытого интереса.
Но абсолютные значения цен малоинформативны и нам сейчас не интересны. Необходимо каждой котировке придать несколько текущих и относительных свойств рынка. Поэтому вручную рассчитаем такие показатели, как сила и направление тренда, общий уровень волатильности, динамику роста последних трех дней, относительную величину ценового диапазона, близость к локальным максимумам и минимумам, относительное положение "центра" свечи к предыдущей, изменение максимальной и минимальной цены свечи к предыдущей. Всего 15 относительных, нормированных показателей, которые характеризуют каждый интервал по 15 параметрам. Нормировка необходима для корректного сравнения котировок различных акций и на различных отрезках времени. Приведя все ценовые данные к одному знаменателю, мы получим 15-мерное пространство значений, где каждая котировка представлена отдельной точкой с 15 координатами.
Поскольку для Дата-Майнинга потребуется большое количество данных, то тут я буду использовать дневные котировки акций из состава индекса СП-500 за 10 лет. Когда все данные были подготовлены, я сформировал три неповторяющиеся выборки размером в 30000, 10000 и 10000 дней. Позже я объясню, зачем нужны именно три выборки.
Итак, данные собраны и можно переходить ко второму этапу подготовки. Для начала необходимо проверить, что за критерии мы выбрали в качестве характеристик состояния рынка для каждой дневной котировки. Ведь каждый критерий, по сути, определяет конкретный признак рынка и нужно убедиться, что эти признаки друг друга не дублируют. Для этого необходимо разбить признаки по общим классам. Но все они имеют различную размерность и разный диапазон разброса. Поэтому первой процедурой станет Стандартизация данных таким образом, чтобы все критерии имели среднее значение, равное нулю и дисперсию, равную единице. Подобную процедуру я уже рассматривал при определении корреляционной матрицы для портфеля акций. Стандартизировав значения, можно классифицировать подготовленные признаки. Смотрим дендрограмму:

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

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

В представленной таблице видно, что Фактор1 имеет большую связь с критериями сдвига свечи, а Фактор2 - с критериями тренда. Еще раз отмечу, что факторы заменяют не отдельные критерии, а все их множество, понизив шестимерное пространство признаков до двумерного. Если бы мы этим и ограничились, то уже сейчас можно было бы построить визуальную поверхность с осями "тренд" и "сдвиг". Безусловно, меняя шесть признаков на два новых фактора, мы немного теряем в информативности. В факторном анализе для оценки качества подмены служит значение "объясненной дисперсии". В нашем случае Фактор1 объясняет 47% дисперсии, а Фактор2 - почти 40%. То есть вместе они объясняют почти 90% дисперсии шести признаков, значит замена выполнена очень качественно.
Теперь, когда мультиколлинеарность признаков устранена, можно еще раз проверить классификацию признаков. Смотрим новую дендрограмму:

Хорошо видно, что теперь все признаки объединяются в две большие группы. Сейчас не буду давать их человеческую интерпретацию. Скажу лишь, что признаки волатильности объединились в один общий подкласс (выделен красным):
- отношение вчерашнего диапазона к позавчерашнему;
- отношение стандартного отклонения к своему среднему;
- отношение сегодняшнего диапазона ко вчерашнему.
Подобная классификация признаков меня вполне устраивает, поэтому этап подготовки данных можно считать завершенным.
Каждая котировка соответствует определенной точке в многомерном пространстве, поэтому можно среди всего множества точек попытаться определить кластеры. Кластеры - это плотно сгруппированные точки, и можно предположить, что с близостью их расстояния растет схожесть их свойств. Чтобы получше представить себе физический смысл кластеров, можно вспомнить нашу Вселенную. В классической интерпретации Вселенная - это трехмерное пространство. Так вот галактики в ней - это и есть кластеризованные звезды. Созвездия на небе - тоже кластеры звезд. Внутри кластера дисперсия расстояний меньше, чем вне этого кластера.
Для трехмерного пространства очень легко найти меру расстояния. Но как быть, когда осей пространства больше и обычные метры уже не подойдут? На этот случай разработано несколько различных метрик, самая простая из которых - Евклидово расстояние. Не нужно пугаться, это достаточно простая и эффективная метрика, особенно для наших стандартизированных признаков. Поэтому, рассчитав расстояние между точками, можно определить, когда их плотность повышается и образуется кластер. Но непосредственный перебор всех возможных расстояний - непосильная задача даже для современных компьютеров. Обычно делают наоборот - определяют нужное количество кластеров и "стягивают" в них точки. Самый популярный алгоритм кластерного анализа - метод к-средних. В этом случае все точки будут распределены по заранее определенному числу кластеров. Метод достаточно грубый, так как многие точки придется «за уши» притягивать к ближайшему кластеру. Но в нашем случае такой алгоритм кластеризации вполне пригоден.
Основной задачей при использовании метода к-средних является определение числа необходимых кластеров. Кластеры должны быть достаточно самобытны, а значит, их должно быть много. Но они должны быть статистически значимы, то есть содержать достаточное количество точек. Для моего множества данных я определил 50 кластеров. Смотрим результаты кластерного анализа:

В таблице представлена дисперсия значений отдельных признаков. Напомню, что кластер имеет место, если дисперсия значений внутри него меньше, чем вне его границ. В первой колонке таблицы представлена внешняя дисперсия, в третьей - дисперсия внутри кластеров. В пятой и шестой колонках - критерий статистической значимости разбиения признаков по кластерам. Хорошо видно, что для всех признаков внутренняя дисперсия меньше внешней – значит, кластерный анализ действительно группирует котировки по схожим кластерам. Эмпирическим путем можно проверить, что с увеличением числа кластеров, будет увеличиваться разница между внешней и внутренней дисперсией. Поэтому мы получим группы очень похожих точек, но некоторые кластеры будут размываться случайными "отдаленными" точками. Чуть позже мы рассмотрим, как проверить устойчивость кластеров вневыборочными тестами.
Теперь, когда все пространство точек разбито на кластеры, можно поподробнее разобраться с их смыслом. В каждый кластер точка попадает, исходя из близости своих координат к центру существующих кластеров. В нашем случае координаты - это численные характеристики текущего состояния рынка. То есть сортировка по группам будет происходить примерно следующим образом: если был небольшой гэп вверх и вчерашний диапазон был немного выше позавчерашнего, и ..., и на рынке был умеренный восходящий тренд, то точка попадает в кластер №1. Каждый критерий "небольшого гэпа" или "умеренного тренда" определен нечетким диапазоном для каждого кластера. То есть всего мы имеем 50 не очень однозначных (для каждого признака по отдельности) условий для попадания точки в конкретный кластер. Таким образом, каждый кластер можно рассматривать как "нечеткий" паттерн.
Возникает резонный вопрос, можно ли получить логическое описание условий для включения точки в тот или иной кластер. Для ответа на этот вопрос рассмотрим следующий график:

На графике представлены средние значения признаков для каждого конкретного кластера. Хорошо видно, что кластеры очень сильно пересекаются по отдельно взятым координатам. Поэтому однозначно будет очень трудно выявить принадлежность точки к кластеру по одной или двум координатам. Как самолет в полете характеризуется географическими координатами и высотой, так любая котировка определяется совокупностью всех 15 признаков. Как вариант, для определения общечеловеческих правил разбиения на кластеры можно использовать алгоритм "дерево решений". В результате мы получим огромный сложноструктурированный список логических правил "Если...то...", с большой вероятностью повторяющий принцип кластерного анализа. Но вот использовать эти правила для реальной торговли будет достаточно проблематично. Далее я покажу, что эти правила нам особо и не потребуются.
В зависимости от комбинации признаков, котировки будут иметь различную частоту. Следовательно, мощность кластеров будет различна по количеству включенных в них точек. Рассмотрим следующую гистограмму:

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

Хорошо видно, что распределение является логнормальным. Величина безразмерная и ее можно использовать для ручного исключения слишком далеких точек из кластера. Но нам это пока не требуется. На этом этап кластерного анализа можно считать завершенным. Получены качественные кластеры и оценена их статистическая пригодность.
Теперь переходим к самому интересному этапу интеллектуального анализа данных - его применению в системной торговле. Для начала нужно проверить устойчивость полученных кластеров на вневыборочных данных. В реальной торговле у нас не будет возможности производить предобработку и стандартизацию поступающих котировок. Поэтому нужен алгоритм, способный распределять котировки по кластерам "на лету".
Для начала подведем итог математических преобразований, определяющих принадлежность котировок к своим кластерам:
- значение текущих характеристик рынка получены из обработки последовательности биржевых котировок. На этом этапе ничего сложного нет, на это способна любая программа технического анализа;
- стандартизация значений;
- факторный анализ и замена мультиколлинеарных признаков новыми Факторами;
- кластерный анализ по методу к-средних.
В результате мы получили 50 классов, по которым распределены котировки в зависимости от значений текущих характеристик рынка. А один из лучших алгоритмов в многомерной статистике для классификации - это нейронная сеть, построенная на основе многослойного перцептрона. В качестве входных данных мы будем подавать 15 значений текущих характеристик. На предпоследнем слое будет находиться 50 нейронов в соответствии с 50 кластерами. В зависимости от уровня активации этих нейронов будет меняться вероятность классификации котировки в тот или иной кластер. Обычно алгоритм классификации построен по принципу "победитель забирает все". То есть наиболее активированный нейрон и определит класс котировки. Но в нашем случае это не лучший вариант. Например, вероятности классификации могут распределиться следующим образом:
- с 40% вероятностью принадлежит 8 классу;
- с 20% вероятностью принадлежит 20 классу;
- с 10% вероятностью принадлежит 1, 13, 46 или 48 классу.
В этом случае точка будет отнесена к 8 кластеру, хотя вероятность правильного прогноза лишь 40%. Поэтому введем дополнительные ограничения, что "победитель заберет все" только если его вероятность будет выше 80%. В противном случае нейросеть просто пометит точку как неопределенную. Такой подход понизит общий процент ошибочных прогнозов за счет небольшого уменьшения общего числа прогнозов. Ведь нам не нужно торговать все время, нам нужно торговать только в те моменты, когда фактор вероятности на нашей стороне. Рассмотрим архитектуру нейросети:

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

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

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

В левой части таблицы находится кластеры из основной выборки, в правой - вневыборочные кластеры. Общее количество "устойчивых" кластеров равно 17, что составляет лишь треть от общего количества. Много это или мало? Во-первых, какое-то количество кластеров мы даже не рассматривали из-за их малочисленности. Во-вторых, вполне естественно, что какие-то кластеры образовались только благодаря случайным свойствам случайной выборки. Поэтому, если число устойчивых кластеров на втором вневыборочном интервале так же будет меньше 1/3 от этих 17, то весь результат можно будет объяснить случайностью. Поэтому проверим матожидание этих же 17 кластеров на втором вневыборочном интервале:

В правой части таблицы расположены кластеры из нового набора данных. Лишь три кластера оказались убыточными - результат более чем позитивный. Можно сделать вывод, что кластерный анализ действительно позволяет отыскивать паттерны со значимым смещением матожидания.
Устойчивость кластеров на вневыборочных интервалах зависит от качества разбиения и анализа базового множества данных. Эффективность кластерного анализа, в свою очередь, зависит от правильной подготовки и выбора ключевых признаков. Таким образом, пригодность всего алгоритма интеллектуального поиска паттернов на открытие позиции целиком зависит от способности трейдера выделить наиболее значимые характеристики рынка. Можно "дробить" рынок по конфигурациям свечей, силе тренда или динамике волатильности - в любом случае мы получим множество кластеров с различной устойчивостью и математическим ожиданием.
Теперь можно посмотреть, насколько равномерно распределены кластеры по всему множеству котировок из второго вневыборочного интервала. Для этого проделаем следующие операции:
- заранее обученная нейросеть будет последовательно классифицировать поступающие котировки;
- если котировка будет отнесена к 4, 6, 7, 11, 17, 21, 24, 28, 29, 30, 35, 39 кластеру, то на открытии следующего бара будет открыта длинная позиция;
- если котировка будет отнесена к 1, 14, 31, 33, 36 кластеру, то будет открыта короткая позиция;
- открытая позиция будет удерживаться до конца дня;
- по итогам сделки будет рассчитываться значение прибыли, нормированное по текущей волатильности.
В результате мы получим аналог кривой капитала, построенной по результатам обычной торговой системы. Смотрим полученный график:

Хорошо видно, что линия капитала достаточно равномерно растет вверх. Но в отличие от классических графиков, по оси Х расположена не шкала времени, а количество проторгованных сделок. Поскольку для торговли использовались 17 кластеров из 50, то из выборки в 10000 дней позиция открывалась 3727 раз. То есть мы были "в позиции" каждый третий день. Можно отметить, что для паттерной торговли это достаточно часто, поэтому легко можно и ужесточить требования к кластерам по уровню их устойчивости и эффективности матожидания.
В этой статье я рассказал о том, как можно использовать алгоритмы многомерного статистического анализа для построения торговой системы. Самая субъективная часть процесса - выбор текущих характеристик фондового рынка. Но независимо от того, какой выбор сделает трейдер, эти характеристики должны быть приведены к одному знаменателю и нормированы. Когда свойства рынка определены и измерены, нужно выбрать наиболее значимые и слабокоррелированные - в этом поможет алгоритм факторного анализа по методу главных компонент. Затем, правильно подготовив данные, можно разбить все множество котировок на группы со схожими свойствами - для этого подойдет алгоритм кластерного анализа по методу к-средних. Сгруппировав все котировки по нескольким классам, можно обучить правилам группировки нейросеть - в моем случае использовался многослойный перцептрон. Это позволит в дальнейшем определять принадлежность котировки к тому или иному классу в реальном времени. Необходимо определить матожидание кластеров и их устойчивость на одном или более статистически значимом вневыборочном интервале. Когда нейросеть обучена, а нужные кластеры выбраны, можно использовать их как паттерны для открытия позиций.
Автор статьи: Тарас Правдюк, (с) специально для "Русского Трейдера".