Случайные леса предсказывают тренды
Введение
Изначально целью построения торговой системы является предсказание поведения некоторого рыночного инструмента, например, валютной пары. Цели предсказания могут быть разными, мы же ограничимся предсказанием трендов, а точнее предсказанием роста («лонгов») или падения («шортов») значений котировки валютной пары.
Обычно, для решения проблемы предсказания трейдер берет график валютной пары, рисует некоторое количество индикаторов и пытается найти некоторую комбинацию – паттерн, который будет иметь предсказательную способность.
В данной статье рассмотрим автоматический выбор паттернов и их предварительную оценку с помощью пакета Rattle из системы статистического анализа R.
1. О Rattle
В качестве инструмента для предсказания поведения валютных пар выберем систему R, которая идеально подходит для задач предсказания на финансовых рынках. Вместе с тем R остается, прежде всего, языком программирования для квалифицированных статистиков и для многих трейдеров остается вне досягаемости. Сложность самой R усугубляется тем обстоятельством, что инструменты для предсказания являются многочисленными и рассредоточены по многим пакетам, которые и составляют основную функциональность R.
Rattle (the R Analytical Tool To Learn Easily) объединяет множество пакетов R, которые важны для построения торговых систем, но каждый по отдельности нелегки для использования новичком. Понимание R не требуется, чтобы начать с Rattle. Но результатом работы с Rattle будет код на R, который может быть использован при построении реальной торговой системы. На этом этапе знание R будет необходимо.
В любом случае Rattle является незаменимым инструментом на этапе проектирования торговой системы, позволяет даже новичкам быстро посмотреть результат тех или иных идей и получить их оценку.
Rattle (Уильямс, 2009) является бесплатным программным обеспечением с открытым исходным кодом, созданным в рамках статистического пакета программного обеспечения R (R Рабочая группа Разработки, 2011). Как бесплатное программное обеспечение, исходный код Rattle и R доступен всем без ограничения. Исходный код Rattle написан на языке С и всем разрешено (и поощряется) рассмотрение исходного кода для обучения, его понимания, проверки и расширения.
2. Описание исходных данных
В основе расчетов, произведенных в статье, лежит набор данных, содержащий котировки шести валютных пар EURUSD, GBPUSD, USDCHF, USDJPY, EURGBP, USDCAD с ценами закрытия на таймфрейме Н1 за период с 10.01.2011 по 24.12.2013 – всего свыше 18 тысяч бар, что является достаточным для доверия произведенным расчетам. На основе указанных валютных пар был создан набор данных, который использовался для поиска паттернов, предсказывающих «лонги-шорты».
Набор данных с исходными котировками дан в приложении к статье с именем kot60_110101_131231_UA.txt.
2.1. Создание целевой переменной
На самом первом шаге следует определиться с тем, что мы будем предсказывать. Несмотря на кажущуюся простоту, выбор цели предсказания и данных, которые материализуют эту цель в виде набора цифр, носит краеугольный характер.
Обратимся к идее предсказывать тренд. Эта идея опирается на желание торговать тренды.
Из определения тренда: «тренд растущий, если следующая цена больше предыдущей цены» и, наоборот, для падающего тренда. Из определения следует, что необходимо предсказывать цену валютной пары. Было 1.3500 для EURUSD, предсказали 1.3550 – растущий тренд, покупаем.
Но базовыми приказами являются приказы «купить» и «продать», а предсказана величина цены. Величина цены используется, к примеру, в торговых системах на пробой уровня. Чтобы реализовать план по торговле трендов, надо будет произвести дополнительное действие по сравнению цен. При этом очевидно, что мы предсказываем не то, что собирались торговать!
Поэтому, если планировалась трендовая торговая система, то модель должна сразу предсказывать тренд. Учить модель надо трендам, целевая переменная должна принимать только два значения «купить» и «продать» или в закодированном (категориальном) виде «1» и «-1».
Различие моделей, которые используют совокупность исходных данных для вычисления будущей величины цены финансового актива, и моделей, которые относят совокупность исходных данных к некоторому классу, является принципиальным. Первый тип моделей относится к регрессионным моделям, а второй тип моделей относится к классификационным моделям.
По предсказательным моделям регрессионного типа вычисляется значение некоторой величины в будущем, и когда это будущее наступит, у нас будет фактическое значение этой предсказанной величины.
По предсказательным моделям классификационного типа вычисляется класс, к которому будет отнесена совокупность поступивших на момент предсказания исходных данных. В качестве таковых примем два класса «лонг» и «шорт». Как в любой другой модели классификационного типа эти два класса не имеют конкретной величины, «лонг» нельзя сравнивать с «шортом». Хотя в дальнейшем закодируем для удобства «лонг» как «1» и «шорт» как «0», но из этого не следует, что «лонг» больше «шорта». Чтобы подчеркнуть это обстоятельство в R и, соответственно, в Rattle, для таких качественных переменных имеется специализированный тип – категориальные (номинальные) переменные.
«Лонги» и «шорты» в качестве целевой переменной отличаются от ниже описанных независимых переменных тем, что они, вообще говоря, не существуют. Это обстоятельство хорошо согласуется с тем, что мы собрались предсказывать будущее, которое в данный момент не существует. Однако на исторических данных мы вполне можем нарисовать тренды – ведь в прошлом будущее для нас полностью открыто.
Для выделения трендов на исторических данных используется индикатор ZigZag. Он замечательно работает на исторических данных и безнадежен на реальном графике: всегда перерисовывает последнее звено, а иногда и предыдущее. Но на исторических данных динамика отсутствует, поэтому можно нарисовать очень красивые тренды с помощью этого индикатора.
Для построения целевой переменной использовался ZigZag с параметром «расстояние между разворотами», равным 0.0035 долларов. На рис. 1 представлен результат.
Рис.1. Индикатор ZigZag
Осталось преобразовать значения индикаторов в категорическую величину, в которой «лонг» = 1, а «шорт» = 0.
Результат представлен на рис. 2.
Рис.2. Индикатор ZigZag в категорическом виде
И последняя операция с целевой переменной. Сдвигаем индикатор ZigZag влево, в результате чего получается, что текущему бару соответствует будущее значение индикатора ZigZag. В данной статье сделан сдвиг на единицу, что соответствует предсказанию на один шаг вперед, для используемых данных на один час вперед.
Можно сделать сдвиг на большее число баров, что будет соответствовать предсказанию на большее число баров. Отмечу отличие данного подхода от моделей прогноза, в которых для прогноза последующего значения обязательно используется предыдущее значение, т.е. для прогноза на два часа вперед будет использоваться прогноз на один час вперед и это приводит к суммированию ошибки прогноза.
Модели, представленные в данной статье и классификационные модели вообще, не обладают свойством накопления ошибки прогноза. В классификационных моделях прогноз на два бара вперед будет обладать своей собственной ошибкой предсказания, которая никоим образом не связана с ошибкой предсказания на один бар вперед.
2.2. Создание независимых переменных
Независимые переменные, в дальнейшем предикторы, независимы в том смысле, что поступают в модель извне, являются внешними, измеряемыми переменными, или переменными, вычисленными на основе этих внешних переменных. Например, любые экономические, финансовые данные, включая котировки валютных пар, являются независимыми переменными, так как их значения образуются в результате деятельности субъектов на рынке. К этой же категории переменных относятся и индикаторы из технического анализа, которые вычисляются на основе котировок.
Выбор независимых переменных не менее важен, чем выбор целевой переменной. Более того, именно выбор независимых переменных определяет успешность моделирования. Основное время, затраченное на разработку модели, уходит как раз на анализ и подбор набора независимых переменных.
Под определение предикторов подходят переменные из исходного файла kot60_110101_131231_UA, в котором содержатся шесть котировок валютных пар, а также дата и время.
Последние две величины весьма интересны в методическом плане. Попытки использования даты и времени в торговых системах предпринимаются всегда, но в наших моделях учет некоторых скрытых сведений о зависимости котировок от времени суток и дня недели может быть выявлен моделями классификации автоматически. Единственное, что необходимо преобразовать эти две переменные в категорический вид: время, как категорию с 24 уровнями, а дату в категорическую переменную с пятью уровнями, что будет соответствовать дню недели.
Кроме имеющихся исходных предикторов создадим дополнительные предикторы, которые, по моему мнению, выявляют наличие трендов в исходных котировках. Эти дополнительные предикторы создадим с помощью широко известных индикаторов.
Применим следующие индикаторы: скользящие средние с периодами 5,10 и 15; MACD(12,26,9), RSI с периодами 14,21,28. Кроме этого, используем приращение котировок и скользящих средних. Все эти преобразования применим ко всем шести котировкам валютных пар.
В число независимых переменных включим сам индикатор ZigZag со вспомогательными целями. Для построения моделей он использоваться, естественно, не будет, так как его значение на крайне правом баре неизвестно.
Таким образом, создано 88 независимых переменных плюс одна целевая переменная и плюс одна служебная переменная (ZigZag). Количество данных по каждой из переменных равно 18083.
Весь этот набор переменных оформлен в виде рабочей области R и доступен в приложении к статье с именем TC.RData. Использовать этот набор данных можно следующим образом:
- загружаем R;
- загружаем библиотеку Rattle;
- вкладка Файл/Рабочее пространство;
- ищем на диске файл TC.RData и загружаем его.
3. Интеллектуальный анализ исходных данных
Пакет Rattle предлагает набор средств для предварительной, иногда говорят, интеллектуальной обработки данных или data mining.
3.1. Ввод и предварительный просмотр
Рассмотрим некоторые возможности, которые становятся доступны после выполнения действий, перечисленных перед данной главой выше.
Результатом будет картинка, показанная на рис. 3.
Рис.3. Стартовый экран Rattle
Построение моделей в Rattle соответствует движению от вкладки Data до вкладки Log.
Первая вкладка Rattle – Data, в соответствии со своим названием «Данные» позволяет загрузить данные, с которыми в дальнейшем можно будет производить манипуляции.
Для нас представляют интерес две кнопки: Spreadsheets и R Dataset.
Кнопка Spreadsheets позволяет загружать файлы, имеющие формат Excel. Читатель, пожелавший проверить свои идеи, может подготовить собственный экселевский файл и затем применить возможности Rattle.
Для повторения действий, описанных в данной статье или каких-либо дополнительных действий с явно избыточным файлом, приложенным к статье, следует использовать кнопку R Dataset. Эта кнопка загружает файл в формате R, который называется «Рабочее пространство» или «Рабочий файл». Они имеют расширение на диске .RData. Этот файл должен быть загружен в R, после чего он станет доступен по этой кнопке.
Загрузим наш заранее заготовленный файл и получим верхнюю часть картинки на рис. 4 и нижнюю часть картинки на рис. 5.
Рис.4. Верхняя часть исходного файла
Рис.5. Нижняя часть исходного файла
3.2. Корреляция целевой переменной с независимыми переменными
Замечание. Кнопка «Выполнить» играет решающую роль: вначале подготавливается действие, но не производится. Чтобы любое действие было выполнено, необходимо нажать кнопку «Выполнить». Это следует делать везде при повторении действий, указанных в данной статье.
На рис. 4 можно увидеть перечень переменных, их характеристики, а также роль этих переменных в их использовании. Так как мы не собираемся и в принципе не можем использовать индикатор ZigZag в моделях, то перед построением моделей отметим его как Ignore – игнорируемый.
Остальные переменные у нас используются как входные, кроме последней переменной, которая используется как целевая переменная – Target.
Важное значение для обоснования уровня доверия к результатам моделирования имеет кнопка Partition, с помощью которой исходный набор данных можно разделить на три части, или не делить вообще. В этом месте указываются пропорции набора данных, которые используются для обучения модели (Training), проверки модели (Validation) и тестирования модели (Testing).
В следующем поле указывается начальное число для датчика псевдослучайных чисел. Смысл этого состоит в следующем: например, 70% исходных данных, компонуемых в обучающий набор данных, выбираются из исходного набора данных случайным образом. В результате этого оставшиеся две части по 15% (как в нашем случае) также представляют собой случайную последовательность баров.
Поэтому, меняя Seed, из исходного набора данных можно получить произвольное количество разных обучающих и других наборов данных.
Рис.6. Корреляция переменных
В полученной довольно большой таблице находим столбец с заголовком ZZ.35, из которого сделана выборка, показанная в таблице ниже.
Переменная | ZZ.35 |
---|---|
RSI_cad.14 | -0.0104122177 |
JPY.dif2 | -0.0088412685 |
EUR.dif3 | -0.0052379279 |
CHF.dif3 | -0.0049692265 |
GBP.dif3 | -0.0047409208 |
GBP.dif1 | 0.0044691430 |
MA_cad.15.dif1 | -0.0039004722 |
JPY.dif1 | -0.0023831247 |
GBP.dif2 | -0.0015356091 |
EUR.dif2 | -0.0013759749 |
CHF.dif2 | -0.0012447101 |
EUR.dif1 | 0.0005863149 |
MA_cad.10.dif1 | 0.0023981433 |
CHF.dif1 | 0.0024543973 |
MA_gbp.5.dif1 | 0.0043757197 |
MA_cad.5.dif1 | 0.0075424397 |
MA_gbp.10.dif1 | 0.0094964069 |
EURGBP.dif1 | 0.0095990416 |
CAD.dif1 | 0.0110571043 |
Табл. 1. Корреляция переменных
Мы видим, что довольно большой перечень переменных имеет корреляцию с ZZ.35 менее 0.01. Да и величина корреляции, менее 0.1, не позволяет делать вывод о каком-либо влиянии независимых переменных на целевую переменную.
На данном этапе отметим этот факт и по обстоятельствам будем его использовать после оценки моделей.
В моделях классификации степень влияния предикторов на целевую переменную играет чрезвычайно важную роль. Считается, что при небольшой величине корреляции соответствующий предиктор является шумом в модели, что приводит к ее переобучению. Под переобучением модели понимается такое ее состояние, при котором модель начинает учитывать несущественные для целевой переменной сведения и предикторах.
Каких-либо рекомендаций по величине корреляции не существует. Обычно используется магическое для статистики число – 5%. Но это в принципе неверно. Дело в том, что удаление предикторов, которые для модели являются шумом, приводит к уменьшению ошибки предсказания. А удаление предиктора, который не является шумом для модели, приводит к увеличению ошибки предсказания. Так что минимальный перечень предикторов, которые полезны для модели, устанавливается экспериментально.
3.3. Масштабирование
Некоторые модели, например, машины опорных векторов SVM, весьма чувствительны к разному масштабу предикторов, под которым имеется в виду следующее. Например, валютная пара EURUSD имеет изменчивость данных в пределах 0.5, валютная пара USDJPY имеет изменчивость несколько десятков единиц. Чтобы исключить разный масштаб предикторов, их на вкладке Transform преобразовывают в один масштаб, наиболее предпочтительно, когда колебания всех предикторов происходят в диапазоне [0-1].
Для выполнения масштабирования набираем Transform/Rescale/Scale [0-1]. После этого отмечаем все переменные и нажимаем, как всегда, «Выполнить».
3.4. Преобразование в категорический вид
Преобразование в категорический вид позволяет преобразовать значение числовой переменной в фактор с несколькими уровнями. Среди наших предикторов имеется явный кандидат на преобразование в многоуровневый фактор – это индикатор RSI, который, как считается при своих значениях ближе к нулю или 100 показывает развороты тренда.
Для выполнения преобразования значений индикатора RSI в категорическую форму набираем: Transform/Recode/KMeans, при этом количество уровней факторов устанавливаем равное 8. Отмечаем все индикаторы RSI и, как всегда, нажимаем «Выполнить».
Итак, отметим на вкладке Data переменную ZZ.35 как Ignore и можно переходить к построению моделей.
4. Общий алгоритм модели классификации
В Rattle доступны следующие модели:
- модель древовидной классификации (Tree);
- модель случайного леса (forest);
- модель усиливающихся деревьев (ada);
- модель машин опорных векторов (SVM);
- обобщенные линейные модели (glm);
- модель нейронных сетей (NNET).
Несмотря на принципиальное различие моделей классификации, и не только доступных в Rattle, все они имеют общие черты, которые состоят в следующем.
Берется обучающий набор, который состоит из строк (в нашем случае 18030), содержащих значения предикторов (88 в нашем случае) и значение целевой переменной – «лонг» или «шорт» в нашем примере.
Любой из алгоритмов классификации решает следующую задачу: отделить комбинации значений предикторов, которым соответствует «лонг» от комбинации значений предикторов, которым соответствует «шорт». Это этап обучения модели.
Затем наступает этап проверки модели.
Берется другой набор данных, а мы помним, что разделили исходный набор данных на три части, и рассматриваются комбинации предикторов, которые сравниваются с теми, которые были получены на этапе обучения. Для каждой комбинации предикторов выносится суждение о принадлежности к «лонгам» или «шортам. Так как в проверочном наборе данных известны эти значения, то сравнивается результат предсказания с фактом. Соотношение фактических «лонгов-щортов» с предсказанным и дает ошибку предсказания.
Если результат нас не устраивает, то мы возвращаемся на этап интеллектуального анализа данных с целью улучшить результат. К сожалению, качество этого этапа практически полностью определяется опытом трейдера. Производятся изменения в исходном наборе данных, и снова выполняется моделирование.
Если нас устроили результаты на наборе данных обучения и проверки, то мы снова проверяем модель на наборе данных, который еще не использовался – тестовом наборе данных.
Качество моделей – это не только небольшая ошибка предсказания, но и небольшие расхождения в величине этой ошибки на разных наборах данных. Это говорит об устойчивости модели и отсутствия переобучения, на сленге трейдеров – сверх подгонки.
В статье рассмотрим только одну из моделей – модель леса случайных деревьев, сокращенно называемую «случайный лес».
5. Модель случайного леса (forest)
5.1. Краткий обзор
Алгоритм работы трейдера можно представить следующим образом: берется котировка валютной пары, к ней добавляется некоторый набор индикаторов и по совокупности текущих значений котировки и индикаторов принимается торговое решение.
К простейшей торговой системе «Скользящая средняя», в которой покупают, если текущая цена выше скользящей средней, и продают, если ниже, могут быть добавлены дополнительные условия, например, значения индикатора RSI. В итоге, трейдер получает дерево решений, в листьях которого находятся значения котировки валютной пары, значения скользящей средней и значения индикатора RSI, а в своем корне имеет два значения «покупать-продавать».
Описанный процесс построения дерева решений автоматизирован в модели классификационных деревьев. В результате получается одно дерево, на сленге трейдеров – один паттерн.
Алгоритм отдельного дерева не способен производить точные модели, потому что разнообразие приводит к нестабильности, которую можно наблюдать при создании отдельных деревьев решений.
Читатель может самостоятельно проверить это утверждение с помощью Rattle, используя модель Tree, которая реализует описанный алгоритм построения дерева.
Идея модели леса случайных деревьев состоит во включении в состав модели не одного классификационного дерева (ни одного паттерна), а многих деревьев. В результате случайные леса имеют тенденцию к большей устойчивости к изменениям в данных, они очень устойчивы к шуму (то есть, переменным, которые имеют небольшое влияние на целевую переменную).
Случайность, используемая алгоритмом случайного леса, проявляется в выборе как строк таблицы (наблюдений), так и предикторов. Именно эта случайность определяет значительную устойчивость к шуму, выбросам и переобучению при сравнении с отдельным древовидным классификатором.
Случайность также определяет существенную вычислительную эффективность. В создании отдельного дерева решений разработчик модели может выбрать случайное подмножество наблюдений, доступных в обучающем наборе данных. Кроме того, в каждом узле в процессе создания дерева решений рассматривают только небольшую часть всех доступных переменных при определении наилучшего расщепления набора данных. Это приводит к существенному снижению требований к вычислительным мощностям.
В итоге модель случайного леса - хороший выбор для построения моделей по ряду причин. Часто требуется небольшая предварительная обработка данных, поскольку данные не должны быть нормализованы, и подход эластичен к выбросам. Можно избежать потребности в выборе переменных, потому что алгоритм эффективно делает собственный выбор переменных. Поскольку создается много деревьев, используя два уровня случайности (наблюдения и предикторы), то каждое дерево является эффективной независимой моделью, и получающаяся модель не склонна к переобучению на обучающем наборе данных.
Алгоритмы случайных лесов часто создают от 100 до 500 деревьев. При компоновке окончательной модели решения, принятые каждым из деревьев, объединяются путем обработки деревьев как равных. Окончательное решение на ансамбле деревьев будет решением на большей части учредительных деревьев. Даже если 51 из этих 100 деревьев укажут на «лонг», то будет принято значение «лонг», хотя, возможно, с меньшей уверенностью.
5.2. Алгоритм
5.2.1. Формирование выборки из набора данных
Алгоритм формирования случайного дерева создает много деревьев решений, используя понятие, называемое бутстрэп агрегирование (bagging сокращение от bootstrap aggregation), для введения случайности в процесс формирования выборки. Бутстрэп агрегирование – это идея собрать случайную выборку наблюдений в стеллаж. В произвольном порядке составляется много стеллажей из выбранных наблюдений, полученных из исходных наблюдений в обучающем наборе данных.
Подборка в стеллажи делается с заменой, означающей, что у отдельного наблюдения есть шанс многократного появления в конкретном стеллаже. Часто объем выборки такой же, как и полный набор данных, а на практике получается, что около двух третей наблюдений будет включено стеллаж (с повторениями) и одна треть не будет учтена. Затем каждый стеллаж наблюдений используется в качестве обучающего набора данных для создания дерева решений, а неучтенные наблюдения могут использоваться в качестве независимой выборки в целях оценки результатов.
5.2.2. Формирование набора предикторов
Второй основной элемент случайности касается выбора предикторов для расщепления набора данных. На каждом шаге при создании отдельного узла решения (то есть, в каждой точке расщепления дерева), выбирается случайный, и обычно небольшой, набор предикторов. Рассматриваются только выбранные предикторы при выборе в точке расщепления. Для каждого узла в создании дерева решений рассматривают разный случайный набор предикторов.
5.2.3. Случайность
Путем формирования случайных наборов, как данных, так и переменных, получаются деревья решений, у которых имеются различные направления результативности для различных подмножеств данных. Именно это изменение позволяет рассматривать этот ансамбль деревьев как представление команды сотрудничающих экспертов с различной экспертизой, которая даст «налучшее» предсказание.
Формирование выборок также предполагает другое значимое преимущество – вычислительную эффективность. Рассматривая только небольшую часть общего количества предикторов при расщеплении, значительно понижаются объемы требуемых вычислений.
При создании каждого дерева решений алгоритм формирования случайного дерева обычно не будет обрывать деревья решений. Считается, что случайный лес сверхподогнанных деревьев может дать очень хорошую модель, которая выполняется хорошо на новых данных.
5.2.4. Подсчет в ансамбле
В развертывании многих деревьев решений как одной модели, у каждого дерева есть равный вес в заключительном процессе принятия решений. Простое большинство диктует результат. Поэтому 51% разделений и 99% разделений дадут одинаковый класс, например, «лонгов».
Результаты расчетов, предоставляемые Rattle, являются частичными: пользователь получает только результат в виде класса. При использовании модели в R, становятся доступны результаты в виде вероятности класса.
5.3. Построение модели случайного леса
Для построения модели необходимо набрать Model/Forest, после чего начнется расчет модели, который занимает несколько минут для наших исходных данных.
Разделю результат расчета на несколько частей и прокомментирую.
Рассмотрим результаты, приведенные на рис. 7.
Рис.7. Верхняя часть результатов подгонки модели случайного леса
Отметим некоторые сведения на этом рисунке.
Целевая переменная – TREND.
В ходе построения модели было создано 500 деревьев. При расщеплении в каждом узле дерева использовалось 9 предикторов (переменных). Кроме этого для нас представляют интерес кнопки Errors (Ошибки) и OOB ROC.
Далее приведены сведения об ошибке предсказания, которые имеют следующий вид:
OOB estimate of error rate: 15.97%
Confusion matrix:
0 | 1 | class.error | |
---|---|---|---|
0 | 4960 | 1163 | 0.1899396 |
1 | 858 | 5677 | 0.1312930 |
Табл. 2. Матрица сопряженности (ошибок) для обучающего набора
Перевод следующий: Величина ошибки оценки вне стеллажа: 15.97%.
Полученная ошибка предсказания вполне приличная. Важно уточнить то, как она получена, а именно: «вне стеллажа». Дело в том, что для построения модели использовался не весь обучающий набор данных, который, в свою очередь, составляет 70% исходного набора данных. Для построения модели использовались примерно 60% обучающего набора данных, а 40% не использовались. Эти 40% и называются «Out of bag» - вне стеллажа. Именно на этих данных получена ошибка предсказания, равная 15.97%.
Далее по тексту.
Матрица сопряженности, еще называемая матрицей ошибок, читается следующим образом.
Сверху строка – это предсказанные «шорты» и «лонги». Слева сбоку – это фактические «шорты» и «лонги», которые получены из индикатора ZigZag для исторических данных.
Величина 4960 с координатами (0,0) – это количество «шортов», которые были правильно предсказаны. Следующая величина 1163 – это количество «шортов», которые были предсказаны как «лонги».
Величина 858 с координатами (1,0) – это количество «лонгов», которые были предсказаны как «шорты». Величина 5677 – это количество правильно предсказанных «лонгов».
Далее в результатах моделирования.
Приведу несколько строчек большой таблицы, в которой перечислены все переменные модели. Это таблица "важности" переменных.
0 | 1 | MeanDecreaseAccuracy | MeanDecreaseGini | |
---|---|---|---|---|
MA_eur.5.dif1 | 42.97 | 41.85 | 54.86 | 321.86 |
EUR.dif3 | 37.21 | 46.38 | 51.80 | 177.34 |
RSI_eur.14 | 37.70 | 40.11 | 50.75 | 254.61 |
EUR.dif2 | 24.66 | 31.64 | 38.24 | 110.83 |
MA_eur.10.dif1 | 22.94 | 25.39 | 31.48 | 193.08 |
CHF.dif3 | 22.91 | 23.42 | 30.15 | 73.36 |
MA_chf.5.dif1 | 21.81 | 23.24 | 29.56 | 135.34 |
Табл. 3. Важность переменных в модели случайного леса
Таблица содержит несколько оценок важности переменных. Под «важностью» понимается степень влияния конкретной переменной на целевую переменную. Чем больше величина оценки, тем «важнее» соответствующая переменная.
Сведения этой таблицы используются для исключения из модели наименее важных переменных. Как вообще в статистике, так и в классификации в частности, считается, что чем проще модель, тем она лучше, конечно не за счет потери точности модели.
И последнее, что представляет интерес на вкладке Model – это кнопка Errors. Нажимаем и получаем рис.8.
Рис.8. Зависимость ошибки моделирования от числа деревьев
6. Результативность моделей
Оценка результативности моделей производится на вкладке Evaluate, на которой Rattle предоставляет доступ к набору опций для оценки результативности моделей.
Из всего перечня предоставляемых опций оценки результативности моделей остановимся на Error Matrix (матрица ошибок), она же на предыдущей вкладке матрица сопряженности.
При переходе из вкладки Model на вкладку Evaluate последняя из созданных моделей будет автоматически отмечена флажком. Это соответствует общему образцу поведения в Rattle: создаем и настраиваем модель, а затем исследуем ее результативность, перемещаясь на вкладку Evaluate.
Для оценки модели необходимо указать набор данных, на котором следует выполнить оценку. Следующая строка опций в пределах интерфейса Rattle предоставляет набор альтернативных источников данных.
Первые четыре опции для Data соответствуют разделению набора данных, указанного на вкладке Data. Опции – Training (обучение), Validation (проверка), Test (тестирование) и Full (весь набор). Понятие разделения набора данных на наборы обучения/проверки/тестирования было обсуждено ранее.
Первая опция (не наилучший вариант) должна оценить модель на наборе данных обучения. Это - обычно не самая хорошая идея. Проблема с оценкой модели на наборе данных обучения состоит в том, что модель была создана на этом наборе данных. Модель должна исполниться очень хорошо на наборе данных обучения, потому что мы очень старались добиться этого. Но исполняться модель будет всегда на ранее неизвестных данных.
Необходим подход, который бы обеспечил хорошее исполнение модели на новых и ранее неизвестных данных. При этом мы получим реальный рейтинг ошибок модели, который отобразит различие предсказания по модели и фактическим данным. Этот рейтинг ошибок на неизвестном наборе, а не рейтинг ошибок на обучающем наборе данных, будет лучшей оценкой результативности модели.
Мы используем набор данных Validation (Проверки) для проверки результативности модели при ее создании и настройке. Таким образом, после создания модели будет проверена результативность по этому набору данных проверки. Затем можно изменить некоторые опции настройки для создания модели. Мы сравниваем новую модель со старой, основывая ее результативность на наборе данных проверки. В этом смысле набор данных проверки используется во время процесса моделирования, чтобы создать заключительную модель. Следовательно, у нас все еще будет смещенная оценка заключительной результативности нашей модели, если мы положимся на набор данных проверки для этой меры.
Набор данных Test (Тестирования) - это заключительный набор данных, который вообще не использовался во время создания модели. Как только мы идентифицировали «лучшую» модель, основанную на наборах данных обучения и проверки, то можно оценить результативность модели на наборе данных тестирования. Это - оценка ожидаемой результативности на любых новых данных. Четвертая опция использует для оценки модели набор данных Full (Весь набор - объединение наборов данных обучения, проверки и тестирования). Это, как можно заметить, не более чем любопытство, а не стремление получить точный результат.
Другая возможность, доступная как источник данных, предоставлена посредством ввода выборки. Это доступно, если выбрана опция Score в качестве типа оценки. В этом случае раскроется окно, для ввода некоторых дополнительных данных.
Матрица ошибок (сопряженности) используется при предсказании категориальной целевой переменной.
Матрица ошибок (Error Matrix) показывает фактические результаты против предсказанных результатов. Выдается две таблицы: первая показывает количественные результаты, вторая таблица показывает результаты в процентах.
В Rattle матрица ошибок находится на вкладке Evaluate. Нажатие кнопки «Выполнить» исполнит выбранную модель на указанном наборе данных для предсказания результата для каждого из наблюдений в этом наборе данных. Предсказания сравниваются с фактическими наблюдениями.
На рис. 9 показана матрица ошибок для ранее рассчитанной модели случайного леса.
Рис.9. Результат оценки модели случайного леса
Из рисунка видно, что средняя ошибка составляет 0.167, т.е 16.7%. На этапе обучения была получена ошибка предсказания равная 15.97%. Можно считать эти величины равными.
Проведем расчет для набора данных тестирования. Получаем следующий результат:
Error matrix for the Random Forest model on TC [test] (counts):
Predicted | Predicted | |
---|---|---|
Actual | 0 | 1 |
0 | 1016 | 256 |
1 | 193 | 1248 |
Табл. 4. Матрица ошибок для модели случайного леса в абсолютных величинах (тестовый набор)
Error matrix for the Random Forest model on TC [test] (proportions):
Predicted | Predicted | ||
---|---|---|---|
Actual | 0 | 1 | Error |
0 | 0.37 | 0.09 | 0.20 |
1 | 0.07 | 0.46 | 0.13 |
Табл. 5. Матрица ошибок для модели случайного леса в относительных величинах (тестовый набор)
Overall error: 0.1654994, Averaged class error: 0.1649244
Ошибка предсказания равна 16.4%.
Все три полученные цифры примерно равны, что говорит о приемлемом результате моделирования.
Отдельно следует отметить, что результативность моделей, которую рассчитывает Rattle, в обязательном порядке следует проверить в тестере терминалов МetaТrader 4 или MetaTrader 5. Затем, как обычно, на демо-счете и реальном счете с небольшими лотами. Только после этого можно будет делать окончательные выводы о модели.
7. Улучшение модели
Выше, при исследовании корреляции псевдо целевой переменной ZZ.35 с предикторами, было выяснено, что значительное количество предикторов очень слабо коррелировано с целевой переменной.
Удалим те предикторы, которые имеют коэффициент корреляции менее 0.01. Для этого на вкладке Data пометим соответствующие предикторы как игнорируемые (Ignore) и повторим расчет модели случайного леса на вкладке Model.
Получаем следующие результаты:
- ошибка предсказания вне стеллажа = 15.77%;
- ошибка предсказания на наборе данных проверки = 15.67%;
- ошибка предсказания на наборе данных тестирования = 15.77%.
Хотя ошибка уменьшилась незначительно, но, что более важно, уменьшился разрыв между ошибками предсказания на разных наборах данных. Это значит, что наша модель устойчива.
Можно продолжить удаление предикторов, руководствуясь таблицей корреляции. Кроме этого можно попытаться улучшить результативность модели (уменьшить ошибку предсказания), используя сведения из таблицы важности предикторов, которая получена при расчете модели.
В любом случае процесс исключения предикторов должен быть продолжен до тех пор, пока удаление очередного предиктора не приведет к ухудшению результативности модели. На этом этапе можно будет остановиться – у вас в руках минимальная, наиболее эффективная модель для конкретного набора предикторов.
8. Использование модели в терминале MetaTrader 4
Теоретически можно представить себе следующую организацию биржевой торговли с использованием Rattle. Входные данные для Rattle готовятся в виде файла Excel некоторыми внешними инструментами для периода день и выше. По закрытию биржи трейдер получает необходимые цены, вносит в исходный файл, делает за несколько минут предсказание на следующий день и к открытию биржевых торгов имеет прогноз на весь день.
При торговле внутри дня без терминала МetaТrader 4 или его аналога не обойтись.
Для организации автоматической и полуавтоматической торговли с использованием Rattle потребуется:
- обученная заранее модель, которая была сохранена в виде рабочего пространства R;
- библиотека взаимодействия терминала и R;
- код на R, который передает очередную порцию данных в модель, получает результат и отправляет результат моделирования обратно в терминал.
Обучение одной из шести моделей доступных в Rattle, рассмотрено выше. Ко всему, количество моделей классификации, доступных в R, приближается к 150, но для их использования Rattle бесполезен.
Библиотека взаимодействия R и терминала МetaТrader 4 имеется в CodeBase: mt4R for new MQL4.
Код на R, который соответствует обученной модели, имеется в журнале (вкладка Log). Все действия, которые производились при создании модели, протоколируются в виде кода на R, который и следует использовать в реальной торговле.
Заключение
Статья будет полезна как новичкам, так и опытным трейдерам для предварительной оценки и выбора модели торговой системы.
При использовании Rattle основной интеллектуальной проблемой в построении торговой системы является выбор целевой переменной и необходимых для этой целевой переменной предикторов. Опытные трейдеры уже имеют необходимые наработки в этой области, а новичкам Rattle поможет обрести необходимый опыт.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Читаем документацию, всегда по всем пакетам. В RStudio открываем вкладку Packages, набираем в поиске имя пакета и нажимаем на выскочившее имя пакета, откроется хелп. А лучше здесь по имени пакета, там могут быть ссылки на попутные материалы.
Если интересна идеология, то в функциях, которые входят в пакет, будет обязательна ссылка на теоретическую статью.
Спасибо!
Открыл я значит pdf с описанием и тут настройки ошарашали - столько всего требуется, что я и не знаю что там половину значит.
Может есть что-то попроще, пусть и менее надежное, а желательно с GUI?
А вообще, вот бы Вам забабахать статьи по этой теме, с подробностями куда и как, было бы весьма полезно!
Спасибо!
Открыл я значит pdf с описанием и тут настройки ошарашали - столько всего требуется, что я и не знаю что там половину значит.
Может есть что-то попроще, пусть и менее надежное, а желательно с GUI?
А вообще, вот бы Вам забабахать статьи по этой теме, с подробностями куда и как, было бы весьма полезно!
А кто обещал, что будет просто?
R - это профессия: трейдинг, анализ и прогноз на предприятиях ....
Если Вам это не нужно, то Вам в технический анализ, там просто и весело.
А кто обещал, что будет просто?
R - это профессия: трейдинг, анализ и прогноз на предприятиях ....
Если Вам это не нужно, то Вам в технический анализ, там просто и весело.
Что-то Вы не в том ключе отреагировали...
Если заниматься развитием в трейдинге данной темы, то нужно больше информации - я об этом говорю. Переводчики криво переводят документацию, особенно если термины тебе не известны.
Что-то Вы не в том ключе отреагировали...
Если заниматься развитием в трейдинге данной темы, то нужно больше информации - я об этом говорю. Переводчики криво переводят документацию, особенно если термины тебе не известны.
Очень даже в том ключе: R - это профессия, навсегда, по=мере изучения у Вас будут появляться новые идеи, под которые нужен будет инструмент, который Вы будете находить в R - и в один прекрасный, а может быть грустный момент времени Выы поймете что идей у Вас, Ваши идей будет гораздо больше, чем возможности их реализовывать. И это все будет приносить деньги.
Очень даже в том ключе: R - это профессия, навсегда, по=мере изучения у Вас будут появляться новые идеи, под которые нужен будет инструмент, который Вы будете находить в R - и в один прекрасный, а может быть грустный момент времени Выы поймете что идей у Вас, Ваши идей будет гораздо больше, чем возможности их реализовывать. И это все будет приносить деньги.
У трейдера много профессий, куда уж ещё? Мультизадачность не портит качество? Почему бы не делегировать часть задач профессионалам? Да, знаю, что никому нельзя верить, но всё же...