Выдержка из текста работы
Финансовый рынок является важнейшим элементом мировой экономики. Институциональная структура этого рынка, призванного осуществлять перераспределение капитала, имеет сложную структуру. Подобная разветвленная структура сформирована необходимостью осуществления координации и организации взаимодействия лиц или институтов, желающих инвестировать средства с владельцами инвестиционных проектов. Таким образом, финансовый рынок осуществляет важнейшую задачу в рамках делового цикла, так как обеспечивает привлечение свободного капитала в виде инвестиций.
Принятие решений на финансовом рынке, а также разработка инвестиционных стратегий — важнейшая задача, стоящая как перед частными инвесторами, так и перед инвестиционными компаниями. От качества решения этой задачи напрямую зависит успешность инвестиционной деятельности, осуществляемой участником финансовых рынков.
На сегодняшний день в деловой и научной литературе опубликовано множество статей и исследований, посвященных вопросам инвестирования на финансовом рынке. Математический инструментарий, применяемый для решения задач в инвестиционной сфере, обширен и многогранен. Он включает, как относительно простые методы анализа, такие как сглаживание, использование индикаторов технического анализа, корреляционный и регрессионный анализы, так и сложные методы, стоящие на стыке нескольких научных областей. К таким методам можно отнести построение нейронных сетей, генетических алгоритмов, моделей опорных векторов и т.д. На фоне такого обилия исследовательского инструментария, а также значительного прогресса в сфере информационных технологий, получил широкое распространение целый пласт методов анализа, объединяемых в общее направление — технический анализ.
Актуальность исследования:
Финансовые рынки с самого их появления являются объектом пристального изучения множества ученых. Изучению динамики фондовых рынков, вопросам анализа и прогнозирования цен финансовых активов посвящено множество работ таких видных ученых, как Дж.Линтнер , Ж.Моссин , Г.Марковиц , Дж.Тобин , У.Шарп , Э.Элтон и др.
А. Гринспен в своей книге «Карта и территория» обозначает одну из важных проблем, стоящую перед современными аналитиками и исследователями.
С начала 1960-х годов в экономической области были применены, революционные на тот момент, эконометрические методы. Со временем они были имплементированы в области финансов. Качество оценки этих методов и прогностические способности удовлетворяли мировую финансовую отрасль. В преддверии кризиса 2008 года, 12 сентября, JPMorgan заявил, что рост ВВП США ускорится в начале 2009 года. Однако неожиданность кризиса, его непредсказуемость показала, что эконометрические методы не в силах дать объяснение и спрогнозировать подобные критические моменты в экономике. Именно неспособность классических методов к прогнозированию кризисных явлений создает предпосылки к рассмотрению широкого круга альтернативных методов.
В последние годы большую популярность,в среде исследователей и профессионалов финансового рынка, приобрело новое направление — машинное обучение (machinelearning). Существует много определений этой междисциплинарной области, однако по мнению автора наилучшее объяснение дал Артур Эль Самуэль (Samuel, 1959).
«Машинное обучение — процесс, в результате которого машина (компьютер) способна показывать поведение, которое в нее не было явно заложено (запрограммировано).»
Основным отличием машинного обучения от классического моделирования является то. Что исходные алгоритмы сами интерпретируют данные, поданные на них аналитиком. То есть нет методологической необходимости проводить декомпозицию данных перед анализом. В рамках самого анализа алгоритма выстраивается логика, на основании поданных данных. Это позволяет избежать сложного и долгосрочного этапа анализа различных гипотез, что упрощает задачу аналитика, переводя ее в область решения прикладных задач.
Гипотезой исследования является тезис о способности методов машинного обучения эффективно анализировать финансовые временные ряды и давать качественные прогнозы.
Целью работы является разработка практического подхода, позволяющего реализовать методы машинного обучения для моделирования и прогнозирования финансовых временных рядов. Для достижения указанной цели были поставлены и решены следующие задачи:
* изучить подходы к определению стоимости финансовых инструментов;
* рассмотреть этапы развития области исследования, выявить актуальную проблематику; моделирование финансовый рынок временной
* рассмотреть существующие методы и алгоритмы машинного обучения. Выявить преимущества и недостатки различных алгоритмов. Выбрать метод для практической реализации;
* оценить применимость такого-то метода для прогнозирования американского рынка акций
* создать практическую модель, реализую избранную концепцию;
* разработать программную реализацию модели;
* исследовать прикладное значение разрабатываемой модели.
Объектом исследования являются инструменты фондового рынка, в частности обыкновенные акции американской компании Apple (биржевой тикет AAPL) и индекс американских компаний S&P 500. Этот инструмент можно считать наиболее точным приближением рынка Америки. Он включает в себя бумаги 500 наиболее крупных компаний Американского фондового рынка — наиболее развитого из мировых финансовых центров.
Степень разработанности проблемы. На данный момент имеется множество исследований, охватывающих широкую проблематику, начиная от теоретических проблемметодологии построения алгоритмов и заканчивая проблемами прикладного порядка. Так как данная область находится на стыке нескольких областей, таких как математика, кибернетика, программирования и экономика, то возможно применение смежных областей знаний. Все же стоит сказать, что при достаточно широком освещении данной темы, комплексных работ, полностью раскрывающих весь процесс от формирования теоретической модели, до конечного программного продукта почти нет.
Предметом исследования методы машинного обучения и их приложение к финансовым временным рядам.
1.Новые методы прогнозирования финансовых рядов
1.1Классические подходы к анализу финансовых рынков
Традиционно выделяют несколько направлений в рамках который идет рассмотрение и анализ финансовых активов: это фундаментальный и технический виды анализа. С распространением высокопроизводительных персональных компьютеров фундаментальный анализ начал ослаблять свои позиции, в виду широкого применения инструментов технического анализа, улучшения качества исполнения инструментальной части и переходу к принципам лояльности к пользователю (user-friendly) . В последние годы многие приемы технического анализа были автоматизированы, что значительно упростило их применение, и открыло дорогу широкому кругу участников к их применению для прогнозирования. Проанализируем представленные подходы более детально.
Фундаментальный анализ. Фундаментальный анализ базируется на исследовании общих макроэкономических показателей, состояний секторов экономики, ее отраслей, финансово-хозяйственных показателях компаний, чьи ценный прошли процедуру листинга на фондовом рынке. Основная роль фундаментального анализа состоит в изучение положения дел в реальном секторе экономики, выявление взаимосвязей между реальными показателями и финансовыми котировками компаний, а также прогнозирование изменений реальных показателей.
При анализе ценных бумаг принято выделять следующие уровни фундаментального анализа:
Первый уровень — обобщенный макроэкономический анализ экономики. Этот этап анализа позволяет определить общий инвестиционный фон в стране, оценить макроэкономический и юридические риски, свойственные для этой страны. Макроэкономическая ситуация имеет большое значение, и неопределенность на страновом уровне в значительной степени влияет на все инвестиционные активы, даже потенциально прибыльные. Основными факторами, оказывающими существенное влияние, являются макроэкономические показатели, политические риски и социальная обстановка в стране.
Второй уровень — отраслевой анализ. На основании проведенного анализа инвестор производит выборку отраслей, представляющую для него интерес. Так как рынок неоднороден, не все отрасли обладают одинаковым инвестиционным потенциалом.
В фундаментальном анализе принято выделять следующие группы отраслей:
Молодые отрасли. Компании еще не выпускают акции, что сильно ограничивает возможности инвесторов по инвестированию в них.
Развивающиеся отрасли. К ним принято относить отрасли, которые переживают период бурного развития. Широко распространен выпуск акций для привлечения основного капитала, что делает их инвестиционно-привлекательными, хоть и рискованными.
Сформировавшиеся отрасли. Полностью сформировавшиеся сегменты экономики. Обычно в таких отраслях все сегменты рынка уже поделены, сформировались бизнес стандарты, характерные для большинства участников рынка. Все показатели компаний-участниц отрасли стабильны даже в периоды экономических трудностей. Вложение в компании таких отраслей принято считать надежной, но как следствие низкодоходной инвестицией.
Третий уровень — анализ компаний. В рамках исследования проводится всесторонняя оценка финансово-хозяйственного положения компаний-эмитента, эффективность управления, прогнозируются перспективы развития, целевые уровни прибыли и т.п. Все эти действия делаются с целью оценить «истинную» стоимость компании — теоретическую стоимость, к которой актив «тяготеет» в долгосрочной перспективе. Проводя сравнения выявленной «истинной», как ее еще называют справедливой, стоимости с рыночной ценой актива, аналитик делает вывод о переоцененности, либо неоцененности исследуемого актива.
Несмотря на то, что фундаментальный анализ делает попытку провести объективную оценку множества факторов реальной экономики, влияющих на стоимость акций, многие выводы исследователя базируются на субъективном видении аналитиком влияния того или иного фактора. Не менее важным является то, что аналитиком используется информация, доступная ранее широкому кругу участников фондового рынка, что предполагает ее использование в формировании цен.
При всем при этом нельзя не отметить, что выводы фундаментального анализа подтверждаются практикой. Компании, имеющие ярко выраженные фундаментальные преимущества, имеют тенденцию к опережающему росту, относительно индекса отрасли. Акции таких компаний менее подвержены падениям и быстрее восстанавливаются после спадов.
Другим направлением, которое развивалось в среде фондовых аналитиков, является технический анализ. Изначально технический анализ зародился, как узкое направление «чартистов» (от англ. сhart — график) — исследователей, строивших прогнозы на нарисованных от руки графиках. От наглядности построения цен активов во многом зависел результат анализа. Средства анализа были достаточно простыми — линии поддержки/сопротивления, выявление различных рыночных фигур и анализ циклов.
В последнее время технический анализ получил широкое распространение. Это связано с такими факторами, как развитие информационных систем, появление инструментария, позволяющего в автоматическом режиме проводить построения, а также вовлечением широкого круга инвесторов в торговлю на финансовых рынках по средствам электронной торговли через сеть Интернет. Широкую популярность технического анализа можно объяснить его наглядностью, относительной простотой применяемых инструментов и однозначностью выводов и правил, которые из них следуют.
Основные постулаты были впервые сформулированы Чарльзом Доу в цикле статей в Wall Street Journal. В них он изложил свое видение анализа рынка, а также принципы, которые в последствии легли в основу технического анализа:
Цены учитывают все. Это утверждение состоит в том, что цены рынка в полной мере отражают все процессы, как экономические, так и политические, социальные и прочие. Это положение технического анализа дает возможность убрать из аналитической базы всякую прочую информацию, кроме ценовых рядов. Интересным фактом является, что это допущение позднее легло в основу гипотезы эффективного рынка — гипотезы, основным выводом которой является невозможность систематического извлечения прибыли.
На рынке существуют тенденции. Приверженцы технического анализа придерживаются предпосылки, что рынок имеет периоды, когда цена актива поступательно растет на протяжении определенного интервала времени. Большинство методов технического анализа построены на выявление существующей тенденции и следовании ей. Склонность к тенденциозности объясняется психологическими особенностями, как отдельного индивида, так и биржевого сообщества.
История имеет свойство повторяться. Утверждение обосновывает применение ранее выявленных методов для прогнозирования поведения рынка в будущем. Говоря в общем, можно сказать, что эта предпосылка всех прогнозных моделей. Ведь не имея связи прошлых периодов с будущими невозможно осуществить прогнозирование в принципе.
Основными целями, которые ставит перед собой технический аналитик, является выявление существование тенденций на рынке, оценка перспектив дальнейшего движения цены и постановка важных ценовых уровней.
Если сравнить цели и инструменты фундаментального и технического анализа, то становится очевидно, они работают с разными временными горизонтами. Первый дает вероятность спрогнозировать поведение динамики актива в ближайшей перспективе, в то время как второй дает целевые ориентиры на долгосрочную перспективу. Необходимо оговориться, что большинство методов технического анализа не имеют методологических ограничений по временному периоду. Однако нестационарность анализируемого процесса не позволяет надеяться, что характеристики ряда надолго останутся в этом положении.Только органично сочетая эти два подхода возможно осуществление эффективной долгосрочной инвестиционной деятельности. Фундаментальный анализ, который дает долгосрочные оценки поведения активов, обычно применяется инвесторами, реализующими долгосрочные стратеги. Технический анализ, который способен давать краткосрочные прогнозы широко используется для осуществления оперативного управления и краткосрочной торговли на фондовом рынке.
1.2 Эконометрические модели
Эконометрические модели являются одними из самых распространенных методов проведения анализа и прогнозирования экономических показателей. Впервые предложенный в 1910 году П. Сиомпом, термин «эконометрия», он описывал поведение экономических временных рядов их графическое отображение. Позднее, в 1933 году нобелевский лауреат Рагнар Фриш дал другое обозначение термину «эконометрика» — самостоятельное направление в экономической науке. Задачей этого нового направления являлось «развитие экономической мысли в ее связи со статистикой и математикой». В 50-х годах эконометрическое моделирование стало приоритетным направлением для ряда ведущих экономических университетов. В 60-х годах развитие данной направления экономической науки стало развиваться по пути их дифференциации по секторам и отраслям, что в последствии привело к все большему усложнению самих моделей. Итогом стал тот факт, что большинство развитых стран, начиная с 80-х годов, стали основывать свои экономические политики на основе эконометрических прогнозов.
Проблемами моделирования эконометрических систем и прогнозированием динамики основных макроэкономических показателей были заняты видные ученые того времени: Т. Браун, Зильнер, Дж. Джонсон, Хаавелмо, Мур,и др. Большой вклад внести и советские ученые: Ермилов А.П. и Чижов Ю.А. исследованием американского рынка на основе эконометрических моделей, Анчишин А.И. — прогнозированием динамики роста экономических показателей.
Для прогнозирования финансовых рынков особый интерес представляют модели, дающие возможность оценивать значения финансовых временных рядов. Можно выделить два класса моделей: экспертные методы и модельное прогнозирование.
Экспертные методы принято подразделять на индивидуальные и коллективные оценки (являющиеся производной от индивидуальных). Данный метод широко используется в областях, где существует неполнота информации. В ситуациях наличия достаточной численной информации, для прогнозирования применяются статистические методы.
В эконометрике существует три класса методов:
1. Модель временных данных;
2. регрессионная модель с одним уравнением;
3. системы одновременных уравнений.
У всех этих моделей можно выделить общие этапы построения:
1. Определение целей и задач моделирования;
2. Формализация априорной информации;
3. выбор спецификации модели;
4. сбор количественной информации, ее фильтрация и обработка;
5. оценка параметров выбранной спецификации с последующим качественным анализом;
6. интерпретация полученных результатов. Проверка оцененной модели с точки зрения экономической логики и реалистичности полученных результатов.
Прогнозирование финансовых временных рядов базируется на выборе адекватной модели, что является само по себе сложной задачей. В эконометрике существует большое разнообразие «стандартных» моделей. К ним относятся модели скользящего среднего порядка МА, авторегрессии порядка AR(p), смешанные модели авторегрессии и скользящего среднего порядка (p,q) — ARMA (p,q). Так, процесс ARMA выглядит следующим образом:
где = Yi — Yt;
ut — остаточный член ошибки в уравнении.
Базовой предпосылкой моделей ARMA является стационарность временных рядов, (наличие постоянного мат. ожидания и вариации). Заметим, что финансовые временные ряды редко являются стационарными. Не трудно заметить, проводя мониторинг рыночных данных, что финансовые переменные имеют низко волатильные интервалы, за которыми следуют периоды высокой «турбулентности», т.е. нестабильность основных показателей ряда является не постоянной, а изменяющейся во времени».
В 80-е годы был разработан ряд инструментов, позволяющих проанализировать и предсказать подобную нестабильность. Так, в случае изменения во времени показателей ряда, рыночным агентам следует требовать дифференцированную во времени риск-премию в качестве платы за принимаемый риск.
Понятие ARCH (Autoregressive conditional heteroscedasticy — авторегрессионная условная гетероскедастичность) было введено Инглом и обобщенно Боллерслейем до общей ARCH или GARCH. Эти модели относятся к нелинейным стохастическим процессам в отличие от линейно-зависимых процессов AR и MA.
Определим характеристики модели ACRH:
Данный показатель, что продиктован значениями предыдущих периодов, является условной средней доходностью. Моделирование условной средней осуществляется с целью выделения ряда квадратов остатков (), на основе которых оценивается условная дисперсия. В модели ARCH берется за предпосылку, что остатки имеют изменяющуюся дисперсию h2. Тогда
,где z ~ N(0,1).
Поэтому, уравнение условной дисперсии на базе временных рядов любого значения лага(р) при расчете квадратных остатков, учтенных в модели можно представить так:
Выше выведен общий вид линейной модели ARCH (p). Неотрицательность величины air может вызывать определённые трудности при использовании ARCH-модели. Данное условие необходимо для сохранения положительного значения условной дисперсии. При использовании множества лагов это условие может быть нарушено. Боллерслевым былииспользованы предыдущие значения условной дисперсии для ухода от длинных лагов ARCH(q). Обобщенная модель была названа GARCH-моделью:
где — предыдущие квадраты остатков из уравнений условной средней,
Значения коэффициентов и >0 позволяют избежать возможности появления отрицательных значений условных дисперсий.
Необходимо отметить, что развитие семейства ARCH-моделей создало широкий инструментарий для анализа и объяснения экономических временных рядов. Например, модель E-GARCH(p,q) созданная Ф. Блэком, позволяет объяснить эффект асимметрии (волатильность имеет тенденцию к возрастанию после уменьшения котировок, то есть после падения величины отката). В модели HARCH(p) характер убывания автокорреляционной функции для квадратов величин ht более медленный, чем в моделях типа ARCH и GARCH. Этот же эффект памяти свойственен и моделям FIGARCH.
1.3 Появление новых методов анализа информации
Мир XXI века можно охарактеризовать, как зарождающееся информационное общество — такое состояние мировой экономики и общества, при котором значительное место занимают процессы создания, хранения и обработки информации. Основным драйвером формирования информационного общества несомненно является глобализация. Именно глобализация, со всеми производными ей процессами, создает предпосылки для значительного увеличения информационных потоков и как следствие существенного увеличение генерируемой информации.
Мы не можем представить нашу жизнь без таких атрибутов современного человека, как социальных сетей, предоставляющих возможность поддерживать постоянную связь с сотнями людей по всему миру, новостных агрегаторов, поставляющих актуальную информацию, обо всем происходящем в мире, торговых терминалов, открывающих круглосуточный доступ к десяткам финансовых центров по всему миру. Информация окружает нас всюду. Согласно исследованию, проведенному командой Мартина Гилберта из Университета Южной Калифорнии США, объем хранимой в цифровом виде информации составляет фантастические 277,3 эксабайта (1018 байт). При этом, по расчетам ученых, на все время наблюдений (исследование проводилось по периоду с 1986 по 2007 год) скорость вычислений растет со среднегодовым темпом в 58%, количество передаваемой информации — с темпом в 28%, а объемы хранимой информации — в 23% в год.
Становится очевидным, что человечество имеет в своем распоряжение огромные объемы информации. Из этого возникает своевременный вопрос о возможности использования этого огромного объема ежедневно генерируемых данных. При первом взгляде на объект исследования перед учеными встал ряд проблем:
Анализируемые данные имеют объем, который стремится к бесконечности;
Данные являются разнородными (количественные, качественные, мультимедийные, текстовые и др.);
Результаты анализа должны быть выражены в простой и понятной человеку форме.
Именно такие предпосылки легли в основу направления DataMining — области информатики, зародившейся в конце 80-х. Формальным появлением этой области исследования можно считать семинар проведенный Грегорием Пятецким-Шапиро в 1989 году. Основной гипотезой данного направления является тезис о том, что данные могут иметь некие «скрытые данные». Характеристиками скрытых знаний (hidden knowledge) являются:
Новизна. Данные не должны подтверждать результаты, полученные другими более простыми методами;
Нетривиальность. Данные должны выявлять зависимости, которые не могут быть объяснены простыми причинно-следственными связями;
Практически-полезными. Данные должны иметь практическое приложение.
Говоря о «скрытых данных» нельзя обойти важнейшее для DataMining’а понятие шаблона (pattern). Вся современная технология построена на концепции шаблона, отражающейфрагменты многоаспектных связей в анализируемых данных. Шаблоны предоставляют собой закономерности, характерные для определенных наборов данных. Важной особенностью данного направления является то, что методы, используемые для поиска шаблонов, не предполагают априорной структуры данных, вида их взаимосвязей. Это позволяет использовать данные, не обладая глубокими предметными знаниями в области исследуемых данных.
Как уже было сказано ранее, нетривиальность шаблонов является одним из важнейших критериев поиска. Изыскиваемые регулярности в данных должны быть неожиданными (unexpected), раскрывая целый пласт глубинных данных. Именно это дало название области — раскопки данных (datamining).
Рисунок 1 Уровни знаний
Одним из важнейших приемов при поиске закономерностей в данных является обобщение. Именно эта задача, простая для человеческого ума, вызывает множество сложностей при реализации классическими методами моделирования. Основная проблема, что часто сложно, а иногда и невозможно выделить априорную структуру данных, что мешает построению адекватной модели.
Рисунок 2 Подходы к анализу данных
Для решения этой проблемы используются методы, способные работать с данными без предварительно обозначенной структуры данных. Класс таких методов принято объединять в понятии машинного обучения(machinelearning).Исходя из названия области можно понять, что особенностью является обучаемость алгоритмов — их способность выстроить собственную логику, на основе предоставляемых модельных данных. Существует два вида обучения — дедуктивное и индуктивное. Индуктивное, или обучение по прецедентам, представляет собой процесс выявления закономерностей в эмпирических данных. Для этого применяются два подхода: обучение с учителем и самообучение или спонтанное обучение. В работе будет сделан фокус на обучение с учителем.
Классификация методов обучения в machinelearning:
Индуктивное обучение — выявление взаимосвязей в исследуемых данных;
Обучение с учителем;
Обучение без учителя;
Дедуктивное обучение — формализация экспертных оценок.
Обучение с учителем. Один из самых распространенных методов обучения в машинном обучении. Формально задачу можно описать так: имеется массив объектов A, состоящее из признаков объекта (a1, a2,a3 …ai),и поле откликов B,состоящее из реакций на эти признаки (b1, b2, b3 … bi) Между объектами полей существует взаимосвязи l, характер взаимосвязей неизвестен, лишь известно о существовании отображения. Задачей обучения является восстановить взаимосвязи l, сформулировав модельную взаимосвязь , которая бы могла дать достаточно точно интерпретировать каждый объектобучающей выборки. Этот метод получил название минимизации эмпирического риска(empiricalriskminimization). Эмпирическим риском называют среднюю ошибку модели на обучающей выборке. ERM-метод самый широко применимый при построении обучающего алгоритма.
После процедуры построения модели на обучающей выборке, или как принято говорить в рамках области — «процесса обучения», необходимо оценить ее адекватность. Обычно для этого используется применение модели на данных, не входящих в обучающую выборку. В рамках этой проверки у исследователя есть возможность выявить такие важные характеристики модели, как коэффициент детерминации тестовой выборки, MSEи MAPE.
Рисунок 3
Одной из важнейших проблем, которые возникают при использовании ERM-метода, является проблема переобучения (overfitting). Переобучение — явление, характеризующееся высокой разницей в объясняющей способности модели на обучающей и тестовой выборке. Данное явление может быть объяснено следующими причинами:
В рамках построения (fitting) модели, были выявлены закономерности, характерные для обучающей выборки, но не выявленные в тестируемых данных;
При создании модели была проведена столь точная подгонка к обучающим данным, что это привело к ложной интерпретации случайной компоненты, как закономерности;
В рамках выбора алгоритма обучения была выбрана слишком сложная модель. Для любого моделирования существует оптимальная сложность модели, дающая минимальное переобучение.
Для иллюстрации(machinelearning, 2010) рассмотрим задачу аппроксимации функции . Тренировочными данными будут являться
50 наблюдений . В качестве модели будет использована полиномиальная модель . Для построения обучающей модели будет использован МНК . Варьируя степень полинома, то есть сложность модели, можно увидеть, что происходит с моделью.
Рисунок 4 Источник:machinelearning.ru
Рисунок 5 Источник: machinelearning.ru
Рисунок 6 Источник:machinelearning.ru
Рисунок 7 Источник:machinelearning.ru
Как видно из графика, при увеличении сложности модели сначала происходит увеличение эффективности. Но в какой-то момент усложнение начинает ухудшать качество модели, что и является отражением эффекта переобучения.
В рамках дисциплины был разработан ряд методов, позволяющих бороться с эффектом переобучения. Так широкое распространение приобрели следующие методы: перекрестная проверка (cross-validation), регуляризация (regularization), принудительная остановка алгоритма, априорная вероятность, уменьшение размерности и др.
Перекрестная проверка- метод оценки аналитической модели и ее поведения на независимых данных. При оценке модели имеющиеся в наличии данные разбиваются на k частей. Затем на k?1 частях данных производится обучение модели, а оставшаяся часть данных используется для тестирования. Процедура повторяется k раз; в итоге каждая из k частей данных используется для тестирования. В результате получается оценка эффективности выбранной модели с наиболее равномерным использованием имеющихся данных.(Википедия, 2013)
Регуляризация — метод, заключающийся в имплементации дополнительного условия с целью предотвращения переобучения, ограничения вычислительной сложности алгоритма и решении некорректно поставленных задач. Данное дополнительное условие, чаще всего принимает вид штрафа за сложность модели.
Уменьшение размерности — процедура уменьшающая количество объясняющих переменных. В рамках процедуры стоит задача классификации и ранжирования переменных по их влиянию на объясняющую способность алгоритма. В рамках задачи уменьшения размерности применяются такие методы, как метод главных компонент, исследование информационной энтропии, а также формы корреляционного анализа
1.4 Основные алгоритмы машинного обучения
В рамках интеллектуального анализа данных и в частности машинного обучения применяется множество алгоритмов. Однако стоит выделить ряд самых востребованных и широко используемых в практических исследованиях. Согласно результатам международной конференции по дата майнингу, проведенной институтом инженеров по электротехнике и электронике в декабре 2006 года(IEEE, 2007)был назван ряд алгоритмов, которые внесли наибольший вклад в развитие направления. К таким алгоритмам были отнесены: C4.5, k-Means, метод опорных векторов (SVM), Apriori, алгоритм максимизации ожидания (EM), алгоритм ссылочного ранжирования PageRank, метод усиления слабых классификаторов AdaBoost, метод k ближайших соседей, наивный байесовский классификатор, and алгоритм построения классификационно-регрессионных деревьев CART.
Алгоритм построения деревьев принятия решений С4.5
Одной из самых распространенных задач в интеллектуальном анализе данных является классификация данных. Построение алгоритма классификации, то есть классификатора, является самой частой задачей в машинном обучении. Общая структура классификаторов повторяет принципы обучения с учителем: на вход подается массив данных, представляющий собой набор случаев. Случай имеет логическую структуру
описывающую одно из состояний. Алгоритм выстраивает свою логику на основе обучения по этим случаям и подает на выход классификатор — механизм, способный анализировать вектор признаков и прогнозировать класс этого случая.
Алгоритм С4.5 был создан австралийским ученым Джоном Квинланом. Алгоритм является развитием другого алгоритма автора — ID3. В алгоритме реализованы такие решения, как отсечение лишних ветвей решений (pruning), работа с неполной обучающей выборкой и некоторые другие функции.
Алгоритм начинает свою работу с построения стартового дерева принятия решений. Этот этап выполнятся в соответствии с принципом построения алгоритмов «разделяй и властвуй». Основная идея данного подхода заключается в последовательном разбиение задачи на подзадачи с целью дальнейшей комбинации полученных результатов для получения решения главной задачи. Обычно разбиение происходит до момента, когда подзадачи низшего уровня не становятся элементарными.
Рисунок 8Принцип построения алгоритмов «Разделяй и властвуй»
Алгоритм оценивает наиболее часто представленный класс в обучающей выборке и помечает все листья в деревьях самым распространенным классом. В противном же случае методом теста по одному или более признакам выделяется класс случая. Подобные тесты проводятся для каждого для каждого результата теста. Тест применяется рекурсивно для каждого подмножества. После проведения множества тестов, алгоритм проводит ранжирование тестов по следующим эвристическим алгоритмам: оценка информационной энтропии, а также коэффициента информационно выигрыша, полученного из информационного результата проведенных тестов.
Признаки могут иметь, как числовой, так и категориальный вид, что определяет формат результатов теста. Для числовых а признаков A они будут находиться в области, где h является пороговым значением. Значение порогового значения h вычисляется путем оптимизации параметра A на обучающем множестве S, по критерию вышеуказанных эмпирических параметров. При категориальных признаках тесты возвращают одно значение.
После выполнения построения стартового дерева происходит процедура редукции (pruning) с целью предотвращения переподгонки (overfitting).Алгоритм редукции отталкивается от пессимистичной оценки уровня ошибок в наборе из Nслучаев, Eиз которых не принадлежат к наиболее частотному классу. Вместо отношения E/N, алгоритм определяет верхний предел биноминальной вероятности, что события Е наблюдались в Nиспытаниях с определенным уровнем доверия.
Алгоритм C4.5 относится к семейству алгоритмов построения деревьев принятия решений. В отличие от всех остальных алгоритмов, приведенных в этом списке, этот алгоритм является символьным, а не числовым. Это позволяет относительно просто перейти к форме, удобной для интерпретации человеком. Именно поэтому данный алгоритм широко применяется для формального построения логики.
k-Means: кластеризация методом k-средних
Алгоритм k-Meansбыл разработан в 50-х годах польским математиком Гуго Штейнгаузом. Алгоритм является одним из самых распространенных методов кластеризации -упорядочивания элементов массива по относительно однородным группам. Для осуществления кластеризации необходимо выбрать критерий, в соответствии с которым наблюдения будут относить к той или иной группе. В рамках описываемого алгоритма подобным критерием выбирается расстояния. Можно назвать множество видов расстояний: эвклидово, расстояние Чебышева, степенное расстояние и др. В k-Meansиспользуется Эвклидово расстояние, т.е. геометрическое расстояние в многомерном пространстве. В рамках алгоритма ставится задача минимизировать расстояние от точек кластера до его центроида — условного центра кластера.
гдеk — число кластеров, Si-полученные кластеры, i = 1,2,3, …, kи мi-центроиды кластеров.
Алгоритм является итерационным, то есть проводит последовательный набор из двух фаз. На первой фазе происходит присваивание данных. В рамках этого шага каждому элементу множества X присваивается кластер, исходя из евклидового расстояния до него. Вторым шагом является перемещение центроида. Алгоритм выполняется, пока на новой итерации не будет изменений.
Рисунок 9 Кластеризация методом k-средних
Проблемой алгоритма является большое влияние стартовых положений центроидов кластеров. Большое влияние приводит к возникновению, иногда, очень ощутимой погрешности. Так же сложностью является умение алгоритма работать с заранее определенным количеством классов. Этот факт требует от исследователя понимания структуры данных, что в какой-то мере идет вразрез с общей парадигмой машинного обучения. Последним узким местом данного алгоритма является чувствительность к выбросам, хотя подобной проблемой страдают почти все алгоритмы интеллектуального исследования данных.
SVM: Метод опорных векторов
Метод опорных векторов является самым популярным методом методом анализа данных. В профессиональной среде он стал, своего рода,musttry — алгоритм, который должен был применён почти при любой постановке задачи классификации, регрессионного анализа и прогнозирования. Широкой популярности метода способствовали такие преимущества, как надежная теоретическая основа, относительно небольшая обучающая выборка и нечувствительность к числу измерений. Вкупе с высокой эффективностью, это делает этот алгоритм очень востребованным среди профессиональных аналитиков данных.
Алгоритм был разработан американским ученым Владимиром Наумовичем Вапниковым в 1995 году. Впервые метод был применен для бинарной классификации текстов 1998 году Форстеном Йоахимсом. Подход, предложенный В. Вапниковым предполагает непрерывное уменьшение эмпирической ошибки классификации и увеличение зазора, между разделяющей гиперплоскостью и областями класса.
Основная идея метода достаточно проста. Представим пространство для удобства визуального восприятия в котором определен набор объектов (точек) p. Перед исследователями стоит задача построить классификатор, который сможет однозначно определить принадлежность объекта к тому или иному объекту. Для этого стоится объект размерностью .В нашем случае это будет прямая. Построение должно быть таким, чтобы по одну сторону вектора находились объекты одного класса, а по противоположную — другого класса.
Рисунок 10 Построение линейных классификаторов SVM
На схеме (рис.9) представлены 3 опорных вектора (L1, L2, L3), которые разделяют пространство. Как не сложно догадаться может существовать множество векторов, удовлетворяющих данному критерию. Именно поэтому было введено требование к максимизации зазора. Разделяющим вектором выбирается тот вектор, который имеет наибольшее расстояние между двумя параллельными ему опорными векторами, касающимися классифицируемых наборов.
В более сложных случаях, которые намного чаще встречаются на практике мы имеем дело с гиперпространствами — векторными пространствами больших размерностей и гиперплоскостями — подпространствами, имеющими размерность на единицу меньше, чем материнское пространство. Логика работы метода опорных векторов сохраняется в пространствах с большими размерностями.
Очевидным вопросом остаются случаи, когда линейным способом невозможно разделить пространства. В таких случаях принято говорить о линейной неразделимости. В 1992 году в совместном исследовании( A training algorithm for optimal margin classifiers., 1992) Владимира Вапникова, Изабелы Гиойон и Бернанда Бозера было предложено решение проблемы. Для этого необходимо вложить пространство в пространство большей размерности H.Для этого применяется отображение . В этом случае при анализе образов изначального пространства в пространстве Hможно свести решение задачи к линейно разделимому случаю.
Рисунок 11 Классификатор во входном пространстве
Рисунок 12 Классификатор в пространстве большей размерности после преобразования
Стоит отметить, что кроме классической линейно реализации классификатора существует нелинейная реализация ядра классификатора. В 1992 году Изабель Гийон, ВладимирВапники Бернхард Босер предложили способ создания нелинейного классификатора. В данном случае предлагается переход от скалярных произведений к произвольным ядрам. К наиболее распространенным ядрам для нелинейно классификации относятся:
Полиномиальное (однородное):
Полиномиальное (неоднородное):
Радиальная базисная функция:
Обобщая можно сказать, что данный метод является одним из лучших. Результаты, полученные с его применением, демонстрируют высокую точность. Однако нельзя не сказать, что данный метод имеет определенные недостатки. К таким проблемам можно отнести низкую скорость работы алгоритма, а также требователен к вычислительным ресурсам, что ограничивает его использование в приложении к большим объемам данных.
Алгоритм Apriori: поиск ассоциативных правил
Поиск ассоциативных правил, то есть наборов элементов, часто встречающихся в исследуемых данных — ресурсоемкая операция. Если применить грубый подход полного перебора, то машинное время, требуемое для вычисления, будет приближаться к , где n-количество элементов массива данных. Для решения данной проблемы был разработан алгоритм Apriori. В рамках работы алгоритма фигурируют такие метрики, как поддержка идостоверность.
Поддержка — доля наблюдений, содержащих пересечение множеств анализируемых признаков.
Достоверность — является априорной вероятностью по Байесу для множества двух признаков.
Алгоритм Aprioriбыл предложен Ракешем Агравалом в 1994 году(Fast Algorithms for Mining Association Rules, 1994). В алгоритме используется свойство анти-монотонности: поддержка любого набора не может превышать минимальную поддержку его подмножеств. Однако обратное не верно. Основной целью использования данного свойства является задача снижения размерности области исследуемых данных.
В рамках работы алгоритма производится поуровневый поиск часто встречающихся наборов элементов. В данном случае свойство анти-монотонности является эвристикой. Допустим существует множество элементов N, состоящее из {a,b,c,d}. Тогда существует следующее множество комбинаций множества N.
Рисунок 13 Принцип анти-монотонности
Допустим было выявлено, что набор 2-ого уровня {c,d} не проходит установленное пороговое значение уровня поддержки. Из свойства анти-монотонности следует, что все супермножества для {c,d} не проходят проверку на уровень поддержки. Подобная эвристика позволяет экспоненциально уменьшить объем вычислений.
Работа алгоритма состоит из двух задач: генерации кандидатов и оценки поддержки. Алгоритм по уровням проходит ходит комбинаторное дерево выполняя эти этапу. Сначала алгоритм формирует комбинации, после чего происходит оценка поддержки. В результате прохождения проверки на оценку отсеиваются те кандидаты, что имеют поддержку ниже требуемого уровня. Дальше алгоритм работает с подмножеством, состоящим только из элементов, прошедших проверку. На следующем этапе опять происходит генерация кандидатов, из указанного подмножества. Алгоритм работает в цикле, пока будет возможность создавать более одной комбинации элементов. Как уже становится понятно, максимальное количество итераций алгоритма составляет количество элементов исходного множества.
EM: алгоритм нахождения оценок функции правдоподобия
Алгоритм применяется в статистических исследованиях с целью поиска оценок максимального правдоподобия стохастических моделей в случаях, когда переменные явно невыражены и являются скрытыми. Алгоритм состоит из двух этапов — расчета математического ожидания и максимизации.
В основе работы метода анализа данных стоит предпосылка, о том, что исследуемое множество можно представить, как статистическую смесь многомерных распределений. Результирующей функцией является функция параметров распределения, которое максимизирует логарифмическую функцию правдоподобия. Элементы каждого кластера, согласно этой модели, подчиняются своему закону распределения. То есть все элементы исследуемого множества относятся ко всем кластерам, но с разной вероятностью. После подгонки параметров распределений на обучающей выборке, новые данные получают вектор вероятностей принадлежности к каждому кластеру пространства. Наибольшая вероятность является критерием отнесения элемента пространства к тому или иному кластеру.
kNN: метод k ближайших соседей
Одним из простейших в области интеллектуального анализа данных является метод k ближайших соседей. Этот метрический метод классификации основывается на подходе анализа ближайших наблюдений из обучающей выборки. Алгоритм отталкивается от предположения компактности данных: наблюдения одно класса чаще находятся рядом с друг другом, чем с объектами другого класса. Это предполагает, что граница областей классов имеют достаточно простую форму и объекты явно локализованы в пространстве генеральной совокупности.
Метод выполняет ряд простых и интуитивных шагов:
Вычисляет расстояние от исследуемого объекта до каждого объекта обучающей выборки;
Отбирает k «соседей» с наименьшим расстоянием;
Присваивает исследуемому объекту класс, аналогичный самому часто встречающемуся классу, среди k ближайших соседей.
Этот простой способ часто применяется в простых предметных областях, когда требуется простой метод обобщения. Плюсом метода, помимо простоты реализации, можно назвать высокую интерпретируемость результатов и понятность внутренней логики алгоритма для эксперта.
Однако у метода имеется ряд существенных недостатков. К ним можно отнести низкую эффективность. Метод плохо приспособлен для поиска глубинного пласта знаний, а потому область его применения уже, чем у многих других методов. Так же, хотя она присуща многим методам машинного обучения, проблемой является чувствительность к выбросам. Последней в списке, но не последней по значимости является проблема низкой производительности метода: алгоритм требует большого количества памяти, а машинное время исполнения приближается к , что делает его низко производительным на больших выборках данных.
Наивный байесовский классификатор
Еще одним простым методов классификации является подход наивного байевского классификатора (НБК). Этот метод является специальным случаем общего байевского классификатора. Основной гипотезой НБК является утверждение о независимости признаков. Это уменьшает размерность задачи, сводя ее к оценке набора одномерных плотностей.
Основной идеей алгоритма является вычисление вероятности отнесения наблюдения к классу:
, где
Dc-количество наблюдений, принадлежащих классу св обучающей выборке
D — общее количество наблюдений в обучающей выборке
V — общее количество признаков в обучающей выборке
Wc — частота признака в наблюдениях, классифицированных как класс cв обучающей выборке
Mc — суммарное количество признаков в наблюдениях класса c
Семейство байесовских алгоритмов до сих пор удерживают свои позиции в области анализа данных, хотя наивный байесовский классификатор имеет плохую практику применения на сложных данных, имеющих большое количество взаимосвязей. При этом нельзя не отметить такие важные достоинства алгоритма, как высокая производительность и хорошая работа с многоклассовой классификацией.
CART: классификационно-регрессионные деревья
Первые работы, связанные с созданием деревьев решений, то есть последовательного процесса принятия решений, относятся к исследованиям С. Ховленда (Hoveland) и Е. Ханта(Hunt) середины XXвека. Первой работой, давшей импульс развития для всего направления исследования, стала книга Е. Ханта «Experiments in Induction», написанная в 1966 году.
В рамках предметной области введен ряд терминов и обозначений:
Термин |
Описание |
|
Узел |
логический элемент дерева, в котором происходит разбиение |
|
Лист |
Конечный элемент дерева, в котором отражается решение |
|
Метка класса |
Класс, присвоенный Объекту деревом |
|
Проверка |
Условие разбиения в Узле |
|
Признак |
Независимая переменная, определяющая класс |
|
Объект |
Наблюдение |
Таблица 1
Деревья решений позволяют представить процедуру решения в структурированном, пошаговом виде. Основу структуры составляют «узлы» и «листья». На «ветвях» дерева располагаются признаки, от которых зависит значение целевой функции. В «узлах» расположены признаки и их проверка, по которой происходит разбиение.
Рисунок 14
Область приложения деревьев достаточно широка и охватывает множество направлений, таких как интеллектуальный анализ данных, поддержка принятия решений, выстраивание формализованной логики. Однако все задачи можно объединить в 2 большие группы: классификация и регрессия. Деревья отлично справляются с задачами классификации, относя наблюдения к тому или иному классу. Классификационные деревья являются классическим примером алгоритма обучения с учителем. Так же данный метод может проводить регрессионный анализ по недискретным данным, выявляя зависимости между переменными.
Построение дерева начинается с корня — первого узла решения. При рассмотрении обучающей выборки , существует три варианта действий:
В изучаемом множестве T представлен только один класс , принадлежащий множеству классов . Тогда решением задачи обучения для Tбудет лист, который будет определять класс;
В изучаемом обучающей выборке T представлены признаки, относящиеся к нескольким классам. В данном случае необходимо разбить обучающую выборку на подмножества, чтобы увеличить частотность классов в каждом соответственно. В рамках алгоритма CART мы говорим о бинарной классификации, поэтому разделение происходит на два подмножества.
Важнейшим вопросом встает принцип разбиения обучающего множества. Именно принцип разбиения является ключевым различием в разных алгоритмах построения деревьев принятия решений. Рассмотрим принцип разбиения, используемый в таких алгоритмах, как C4.5 и CART. Для каждого узла необходимо сформулировать проверку, которая будет осуществлять разбиение. В качестве проверяемого объекта выбирается один из признаков. Существует два подхода: информационный и вероятностный.
Информационный подход к разбиению
В алгоритме С4.5 применяется подход, основанный на оценке изменения информационной энтропии. Информационная энтропия — мера неопределенности информации. Пространство, в котором объекты равномерно распределены объекты имеет меньшую энтропию, в то время кластеризованное пространство имеет высокую энтропию. Критерием кластеризации в C4.5 выступает информационный выигрыш — разница значения информационной энтропии при разбиении на подмножества.
— множество подмножеств обучающей выборки, полученных при разбиении проверкой X.Выбирается признак, дающий наибольший информационный выигрыш.
Вероятностный подход
Подход, применяемый в методе CARTосновывается на индексе Джини, оценивающем «расстояние» между распределениями классов.
Критерием разбиения же является минимальный индекс Джини:
Важным отличием алгоритма CARTявляется механизм отсечения ветвей. В рамках CART отсечение рассматривается как компромисс между оптимальным размером деревьев, определяющим быстродействие, и получения эффективной оценки. Однако вопросом встает какие деревья отсекать — в данном случае мы сталкиваемся с показательным ростом количества поддеревьев при увеличении количества листьев на дереве.
В алгоритме CART реализуется ранжирование поддеревьев с целью выявления «лучших» кандидатов, с которыми в дальнейшем будет проводиться процедура прунинга. В данном случае применяется методология регуляризации — в функцию вводится штраф за сложность, который переводит критерий из плоскости «точность» в плоскость «эффективность». В результате в результате процедуры прунинга подбирается оптимальный размер дерева.
Алгоритм CARTсочетает в себе такие важные характеристики, как эффективность построения модели, быстродействие и решение многих практических проблем на теоретическом уровне. Важным преимуществом метода является непараметричность, что избавляет от необходимости поиска параметров распределения. Так же преимуществом метода является эффективная борьба с выбросами, путем их группировки и вынесения в отсекаемые ветви.
AdaBoost: алгоритм усиления слабых классификаторов
В отличие от всех алгоритмов, что были описаны ранее, алгоритмAdaBoostработает с другими алгоритмами, создавая конструкции из моделей. Концепция усиления (boosting) основывается на идее создания сильного и точного правила классификации путем комбинации нескольких слабых и относительно неточных классификаторов. Алгоритм AdaBoost, разработанный Йоавом Фройндом и Робертом Гапире в 1997 году, является первым примером реализации подобной идеи. Более того этот алгоритм до сих пор является наиболее используемым и исследованным среди всего класса усиливающих алгоритмов. Во многом это связано с сильными сторонами предложенного алгоритма.
Сформулируем задачу, стоящую перед алгоритмом: Требуется построить классификатор , где X — пространство векторов признаков, а Y — пространство классов. Данный алгоритм является методом машинного обучения с учителем, а потому имеется обучающая выборка , где . Обычно в рамках алгоритма рассматривается бинарная классификация, где {.Так же мы имеем множество слабых классификаторов >y, … , } Итоговым классификатор Сбудет иметь вид кусочно-постоянно функции, составленной из взвешенных слабых классификаторов:
, где — вес l-его классификатора
В рамках работы алгоритма происходит два важных этапа: отбор слабых классификаторов и их комбинирование. Структура алгоритма выглядит следующим образом.
Задается исходное распределение ;
Для каждой итерации :
в распределении ;
вычисляется весовой коэффициент
взвешенный классификатор
обновляется распределение весов
Подбирается нормализующий коэффициент ;
Создается ансамбль, представляющий собой кусочно-линейный классификатор
На данный момент подход усиления классификаторов признан наиболее успешным подходом к классификации. Алгоритм имеет хорошие обобщающие возможности, что выражается в улучшение качества работы базовых алгоритмов и улучшение точности усиленного классификатора. При этом важным достоинством метода является низкая вычислительная нагрузка процедуры бустинга, что выражается в определяющей доле суммарного времени вычисления базовых классификаторов в общей процедуре построения ансамбля классификаторов.
К наиболее сильным сторонам алгоритма является эффективная работа с шумовыми составляющими данных. Благодаря тому, что подобные данные выносятся в отдельные веса, где в последствие классифицируются, алгоритм устойчив к переобучению. Однако высоко зашумленные данные плохо анализируется. Одним из возможных решений может служить применение менее агрессивных функций потерь, чем экспоненциальная, что используется в базовом алгоритме.
Подводя итог можно сформулировать ряд выводов, касательно рассмотренного теоретического инструментария, существующего в рамках направления машинного обучения. Машинное обучение имеет широкий спектр аналитических методов, позволяющих проводить сложные, нетривиальные исследования данных. Основными классами задач, с которыми имеет дело интеллектуальный анализ данных является:
Классификация;
поиск ассоциативных правил;
сокращение размерности данных;
ранжирования;
кластеризация.
Производными от этих задач является прогнозирование. На основе выявленной структуры данных проводится экстраполяция зависимостей. Именно это является наиболее ценным практическим результатом исследования данных. Сформулировав задачу из области финансов в терминах машинного обучения, мы получаем мощных инструмент анализа финансовых данных.
Применение алгоритмов машинного обучения для прогнозирования поведения финансовых временных рядов
В последние годы тема применения машинного обучения в финансах активно обсуждается в широком кругу исследователей. Стоит отметить, что ввиду своей кроссдисциплинарности, данное направление интересует специалистов из таких сфер, как финансы, математика, информатика и другие. Проведены исследования, использующие те или иные методы машинного обучения для решения задачи прогнозирования.
Так группа исследователей из МадридскогоГосударственного Университета, Педро Н. Родригез и Симон Сосвилла-Риверо провели исследование американского рынка акций. (Using machine learning algorithms to find patterns in stock prices, 2006) Они рассмотрели применение алгоритма С4.5 в связке с методом адаптивного усиления классификаторов. Проанализировав большой пласт исторических данных с 1962 по 2004 годы. Исследователями была выявлена возможность прогнозирования поведения финансовых временных рядов. Испанские исследователи варьировали количество итераций усиливающего алгоритма, пытаясь оценить влияние данного параметра на внутри-выборочную и вне-выборочную точность.
Исследования показали, что варьирование этого показателя отражает общую проблему синдрома переобучения: увеличение эффективности на обучающей выборке после достижения критической точки ведет к потере предсказательной способности модели.
Другим исследованием, рассматривающим применение целого набора методов машинного обучения, а также их комбинацию, является работа польского доктора информатики Крустофа Д. Г. (Krzysztof Jerzy Geras). В этой работе исследователь выстраивает инструментарий машинного обучения для поиска прогнозной функции (bettingfunction) или, как она еще называется, функции покупки (buyingfunction). Данная функция показывает в каких долях рыночные агенты распределяют свои средства, между классами — в данном случае акциями. Автор использует фреймворк микроэкономического исследования, максимизируя построенную функцию полезности.
В исследовании широко применяются такие методы машинного обучения, как деревья принятия решений, нейронные сети, логистическая регрессия, наивный баесовский классификатор и машина опорных векторов. В результате были получены интересные данные. Так сравнивая работу нескольких алгоритмов, автор получает отчетливый результат, что такой метод, как наивная баесовская классификация приносит слабые результаты, в то время, как деревья принятия решение и машина опорных векторов стабильно дают лучшую точность. Так же автор приходит к выводу, что размер обучающей выборки дает стабильное улучшение эффективности прогноза на тестовой выборке.
Другим исследованием, разрабатывающим данное направление, является работа Ватсала Х. Шаха. В ней проводится обзор эффективности работы ряда методов машинного обучения. Так рассматривались методы однослойного принятия решения, что является частным случаем метода деревьев принятия решений с одним узлом, линейная регрессия, машина опорных векторов, а также алгоритм адаптивного бустинга. Автор сравнивает их эффективность и делает вывод о том, что модели с классификатором имеют лучшую эффективность относительно самостоятельных моделей.
Говоря о теме усиливающих алгоритмов, нельзя не упомянуть о работе индийской группы исследователей доктора Субхенду Пани (Dr.Subhendu Pani) и Сунджайя Сен (Sanjaya Sen). Ученые рассмотрели классификационный алгоритм CART в приложение к различным методам построения ансамблей моделей. Ученые рассмотрели такие алгоритмы, как ADABOOST, LOGIBOOST, BAGGING, DAGGING. В рамках работы анализировался индийский рынок акций. Задачей, поставленной исследователями, была успешная классификация направления движения. Согласно исследованию, алгоритм ADABOOST давал наилучший результат среди других алгоритмов усиления.
Хорошие результаты в прогнозировании финансовых временных рядов и в частности фондовых рынков, показали такие методы как модель классификационных деревьев CART, область построения искусственных нейронных сетей, алгоритм ADAboost, а также машина опорных векторов SVM. Врядеработ (Using machine learning algorithms to find patterns in stock prices, 2006), (Prediction Markets for Machine Learning, 2011), (Machine Learning Techniques for Stock Prediction, 2007), (Application of Machine Learning Algorithm in Indian Stock Market Data, 2014), (Satish Rao, 2010) выделяется эффективность таких методов, как деревья принятия решений. Возможность построения сильного классификатора, эффективно справляющегося с поставленными задачами. Так же отмечена эффективность использования ансамблей из слабых классификаторов, в частности классификационно-регрессионных деревьев, для прогнозирования и различных методов бустинга. В рамках практической части работы будет рассмотрена модель, реализующая принципы машинного обучения, в рамках решения задачи из области финансов, применяя комбинацию методов CART + ADAboost.
2.Модель ансамблей классификационных деревьев для прогнозирования динамики финансовых временных рядов
В рамках проверки эффективности применения методов машинного обучения для прогнозирования финансовых рынков, необходимо выделить основные этапы, которые необходимо реализовать в практической части. Так первостепенной задачей является формализация объекта исследования в терминах машинного обучения. Следующим важным этапом является выбор модели, которая будет использоваться для анализа, а также формы представления данных, которая будет отвечать требованиям к входным данным. На этом этапе необходимо провести предварительный анализ данных, выявить возможный дефицит/профицит данных, их качественные характеристики. Основным этапом реализации задачи является описание этапов работы практической модели. На этом этапе будет происходить подробный обзор методов и операций, что будут производиться с данными, из цели и задачи. Последним этапом построение модели будет описание программной составляющей — инструментария, использованного для анализа данных.
2.1 Постановка практической задачи
В рамках объекта исследования был выбран американский фондовый рынок. Американский фондовый рынок — крупнейший региональный сегмент фондового рынка, обладающей капитализацией более 19 триллионов долларов(Bank of America Merrill Lynch, 2014). На рынке NYSE прошли процедуру листинга более 3,5 тысяч компаний, среди которых крупнейшие компании американской экономики и мира. Обладая огромной ликвидностью этот рынок является отличной модельной площадкой для применения численных методов.
Анализ будет проводиться на котировках акций компании Apple (тикет: AAPL). Компания занимает первое место по капитализации не только среди американских, но и среди мировых компаний. Ликвидность, публичность и длительная история котирования на рынке — три критерия, по которым был отобран данный символ.
Основной задачей финансового моделирования является прогнозирование динамики финансового временного ряда — в нашем случае это котировки символа AAPL. При прогнозировании движения котировки наибольшую важность имеют такие показатели как направление прогнозируемого движения (d), влияющая на тип торгового приказа, прогнозируемая амплитуда (a), вероятность прогноза и горизонт прогноза (t). Опираясь на принцип построения алгоритмов «разделяй и властвуй» мы можем рекурсивно разбивать задачу прогнозирования F c характеристиками a, d, с,tна n подзадач , , … . Если экстраполировать, то мы придем к атомарной операции — прогнозу движения цены на минимальный инвестиционный горизонт. В данном случае мы можем перейти к прогнозированию направления движения.
Подводя итог, мы можем сформулировать поставленную финансовую задачу в терминах интеллектуального анализа данных. Существует набор данных, представленный некоторыми временными рядами. Ставится задача прогнозирования направления движения в рамках этих данных, на основе проведенной бинарной классификации данных и выявленных взаимосвязей в них.
2.2 Выбор алгоритма для анализа данных
Так как самым важным элементом модели является процедура определения структуры данных на основе их бинарной классификации, то был выбран алгоритм, который хорошо зарекомендовал себя при решение подобных задач — CART. При решение практических задач классификации часто применяется связка двух алгоритмов CART + AdaBoost. Линейный классификатор усиливается алгоритмом бустинга для получения более эффективной классификации.
Данная комбинация аналитических инструментов является эффективной с точки зрения вычислительной эффективности. При использовании алгоритмов усиления простых классификаторов важным требованием является производительность базового алгоритма. Именно по этой причине такой эффективный алгоритм как SVM ограничен в применение с усиливающими алгоритмами.
Для работы подобного алгоритма необходимо сформировать данные в определенном формате. Данные необходимо разбить на следующие категории: предикторы, временные ряды, что объясняют изменения и предиктанды — временные ряды, поведение которых объясняют предикторы.
Форма представления предиктанда, при подаче его в алгоритм CARTдолжна быть категориальной, то есть должна принимать ограниченный набор значений. В нашем случае это прогнозируемый рост значения временного ряда (UP) и прогнозируемое падение значения временного ряда (DOWN). Предикторы имеют свободную форму представления, но в нашем случае это буду значения .В качестве предикторов были выбраны временные ряды котировки AAPL, индекса S&P500, характеризующего экономику, а также технологический индекс NASDAQ, а также их производные.
Предиктанд |
Предиктор |
|
Ряд , где . |
Цена открытия AAPL, а также ее лаг на 14 периодов; приращение цены открытия AAPL, a также ее лаг на 14 периодов; цена закрытия AAPL, a также ее лаг на 14 периодов; приращение цены закрытия AAPL, a также ее лаг на 14 периодов; максимальная цена AAPL за период; минимальная цена AAPL за период; торговый объем AAPL за период a также его лаг на 14 периодов; приращение торгового объема AAPL, a также его лаг на 14 периодов; значения индикатора MACD* по цене открытия AAPL периода; значение индикатора MACD по цене закрытия AAPL периода; значение индикатора Stochastic; значение осциллятора RSI** по цене открытия AAPL периода; значение осциллятора RSI по цене закрытия AAPL периода; Цена открытия COMP***, а также ее лаг на 14 периодов; приращение цены открытия COMP, a также ее лаг на 14 периодов; цена закрытия COMP, a также ее лаг на 14 периодов; приращение цены закрытия COMP, a также ее лаг на 14 периодов; максимальная цена COMP за период; минимальная цена COMP за период; торговый объем COMP за период a также его лаг на 14 периодов; приращение торгового объема COMP, a также его лаг на 14 периодов; значения индикатора MACD по цене открытия COMP периода; значение индикатора MACD по цене закрытия COMP периода; значение индикатора Stochastic; значение осциллятора RSI по цене открытия COMP периода; значение осциллятора RSI по цене закрытия COMP периода; Цена открытия SPY****, а также ее лаг на 14 периодов; приращение цены открытия SPY, a также ее лаг на 14 периодов; цена закрытия SPY, a также ее лаг на 14 периодов; приращение цены закрытия SPY, a также ее лаг на 14 периодов; максимальная цена SPY за период; минимальная цена SPY за период; торговый объем SPY за период a также его лаг на 14 периодов; приращение торгового объема SPY, a также его лаг на 14 периодов; значения индикатора MACD по цене открытия SPY периода; значение индикатора MACD по цене закрытия SPY периода; значение индикатора Stochastic; значение осциллятора RSI по цене открытия SPY периода; значение осциллятора RSI по цене закрытия SPY периода; |
Таблица 2
*MACD — технический индикатор, разработанный Джеральдом Аппеем. Широко используется трейдерами для прогнозирования поведения биржевых котировок. Технически, представляет собой композицию из скользящих средних разного периода.
**RSI — технический индикатор, широко применяемый для, так называемого, диагностирования разворотных точек при торговле. Разработан Уилисом Валдером и стал одним из самых широко применимых инструментов технического анализа.
***COMP — NASDAQCOMPosite. Сводный индекс американской высокотехнологической биржи США. Индекс включает акции более 5 тысяч компаний-эмитентов из США и других стран.
****SPY — индексный фонд, портфель которого в точности повторяет индекс S&P 500.
2.3 Практическая реализация модели
В рамках исследования был построена программная реализация практической модели. Модель была реализована средствами программной среды R. Данная среда включает язык программирования, ориентированный на реализацию статистических вычислений. В рамках реализации были разработан ряд скриптов. Скрипты реализуют один или несколько этапов задачи:
Подготовка данных;
отбор переменных;
построение модели;
оптимизация модели;
оценка модели.
Первым этапом была подготовка сырых данных, поданных на вход к удобному для анализа виду. В рамках работы первого скрипта были проведены такие процедуры, как выстраивание таймфрейма, очистка данных от выбросов и неполных данных, генерация производных временных рядов и упорядочивание массива данных. Данная процедура в специализированной литературе получила название «Datatidying». Основной задачей данной процедуры является получение упорядоченного набора данных — такого массива данных, которых подчинялся бы трем признакам:
Каждая переменная формирует столбец;
каждое наблюдение формирует строчку;
каждый тип единиц наблюдения образует таблицу.
Первичными данными, которые были использованы для преобразования, являются:
№ |
Данные |
Символ |
Период |
Наблюдения |
|
1. |
Котировки компании Apple |
AAPL |
2005-01-03/2015-11-13 |
1 063 974 |
|
2. |
Сводныйиндекс NASDAQ |
COMP |
2014-01-02/2015-12-31 |
195 596 |
|
3. |
Индекс S&P 500 |
SPY |
2005-01-03/2015-11-16 |
1 072 501 |
Таблица 3
Первым делом поминутные данные были переведены в более высокий таймфрейм. В данном случае это M15 — данные извлекаются с интервалом в 15 минут. Данное действие было совершено с целью первичного уменьшения влияния «шума» на минутных данных. Также подобная частотность выбрана исходя из минимального требования, закладываемого автором, к частотности совершения сделок.
# Establishingconvenienttimeframe
kTimeframe<- 15
# AAPL
dF<- AAPL.M1[(1 : kTimeframe),c(‘AAPL.Open’,’AAPL.High’,’AAPL.Low’,
‘AAPL.Close’,’AAPL.Volume’)]
AAPL.Open <- as.numeric(dF[1,’AAPL.Open’])
AAPL.High <- max(dF[,’AAPL.High’])
AAPL.Low <- min(dF[,’AAPL.Low’])
AAPL.Close <- AAPL.M1[timeframe,’AAPL.Close’]
AAPL.Volume <- sum(dF[,’AAPL.Volume’])
AAPL.0row <- cbind(AAPL.Open, AAPL.High, AAPL.Low, AAPL.Close, AAPL.Volume)
names(AAPL.0row)<- c(‘AAPL.Open’,
‘AAPL.High’,
‘AAPL.Low’,
‘AAPL.Close’,
‘AAPL.Volume’)
rm(dF, AAPL.Open, AAPL.High, AAPL.Low, AAPL.Close, AAPL.Volume)
for(i in(1 : (as.integer(nrow(AAPL.M1)/kTimeframe) — kTimeframe))){
dF <- AAPL.M1[(1 + kTimeframe*i):(kTimeframe*(i+1)),]
AAPL.Open <- as.numeric(dF[1,’AAPL.Open’])
AAPL.High <- max(dF[,’AAPL.High’])
AAPL.Low <- min(dF[,’AAPL.Low’])
AAPL.Close <- dF[kTimeframe,’AAPL.Close’]
AAPL.Volume <- sum(dF[,’AAPL.Volume’])
AAPL.row <- cbind(AAPL.Open, AAPL.High, AAPL.Low, AAPL.Close, AAPL.Volume)
names(AAPL.row)<- c(‘AAPL.Open’,
‘AAPL.High’,
‘AAPL.Low’,
‘AAPL.Close’,
‘AAPL.Volume’)
AAPL.0row <- rbind(AAPL.0row, AAPL.row)
AAPL.M15 <- AAPL.0row
rm(AAPL.0row,AAPL.Open, AAPL.High, AAPL.Low, AAPL.Close, AAPL.Volume, AAPL.row,
i,dF)
В результате были получены 3 массива данных, состоящих из данных, отобранных с частотой 15 периодов из исходных сырых данных — AAPL.M15, COMP.M15, SP500.M15. В результате был получен ряд, повторяющий исходные данные, фильтрующий интерчастотные колебания. Важно заметить, что минимумы и максимумы колебаний учитываются.
Рисунок 15 Соотнесение таймфреймов M1 и M15
После того, как данные были переведены в старший таймфрейм была проведена проверка на полноту данных в разрезе каждого массива данных. После предварительных процедур была произведена генерация производных временных рядов от массивов AAPL.M15, COMP.M15, SP500.M15 (подробнее см. Приложение 1). Были сформированы ряды, указанные в Табл. 3. На основание них были получены массивы Data.AAPL, Data.NASDAQи Data.SP500.
После того, как была проведена процедура подготовки данных, их очистили от выбросов и неполных наблюдений, после чего входные данные для анализа были упакованы в общий массив данных, который имеет формат, удобный для дальнейшего анализа. В общем итоге конечный массив данных состоит из 220 временных рядов. Получив такой массив рядов, перед авторов встал ряд проблем, теоретического и практического направления. Подобное количество предикторов, используемое в модели, неизбежно приведет к переобучению. Алгоритм построения дерева, в попытке учесть в изменения такого количества переменных неизбежно начнет включать множество шумовых эффектов, что приведет к потере эффективности на тестовых данных. Другой проблемой встает техническая реализация. Деревья окажутся столь большими, что процедура прунинга, до приемлемых размеров, станет почти полностью сокращать влияние некоторых предикторов. Последней проблемой является сложность работы со столь большим массивом данных. Так как работа алгоритма предполагает многократные итерации, то наличие такого огромного массива входных данных должно существенно сказаться на производительности.
Решением возникшей проблемы может стать процедура отбора переменных (featureselection): необходимооценить временные ряды, их качественность с точки зрения прогностической способности. В результате станет возможным отсеять низкокачественные ряды. В рамках работы были применены следующие методы оценки: поиск линейно корреляции, а также информационная энтропия. Так же было принято решение об отказе от использования значений индекса NASDAQ в виду невозможности использования его для тестирования на разных рыночных эпохах, ввиду его краткости.
#Establishing library
library(quantmod)
library(FSelector)
#Loading tydied data
load(«I:/DataMining/#PROJECTS/Diplom/DATA/Data.tidyed.RData»)
#====================================================Filtering=================
# Linear correlations
lin.corr <- linear.correlation(dCl.Px ~ Op.Px + Op.lag1.Px + Op.lag2.Px + Op.lag3.Px + Op.lag4.Px + Op.lag5.Px + Op.lag6.Px + Op.lag7.Px + Op.lag8.Px + Op.lag9.Px + Op.lag10.Px + Op.lag11.Px +Op.lag12.Px + Op.lag13.Px + Op.lag14.Px + dOp.Px + dOp.lag2.Px + dOp.lag3.Px + dOp.lag4.Px + dOp.lag5.Px + dOp.lag6.Px + dOp.lag7.Px + dOp.lag8.Px + dOp.lag9.Px + dOp.lag10.Px + dOp.lag11.Px + dOp.lag12.Px + dOp.lag13.Px + dOp.lag14.Px + Cl.Px + Cl.lag1.Px + Cl.lag2.Px + Cl.lag3.Px + Cl.lag4.Px + Cl.lag5.Px + Cl.lag6.Px + Cl.lag7.Px +Cl.lag8.Px + Cl.lag9.Px + Cl.lag10.Px+ Cl.lag11.Px + Cl.lag12.Px + Cl.lag13.Px + Cl.lag14.Px + dCl.lag2.Px + dCl.lag3.Px + dCl.lag4.Px + dCl.lag5.Px + dCl.lag6.Px + dCl.lag7.Px + dCl.lag8.Px + dCl.lag9.Px + dCl.lag10.Px + dCl.lag11.Px + dCl.lag12.Px + dCl.lag13.Px + dCl.lag14.Px + High.Px + Low.Px + Vo + Vo.lag1 + Vo.lag2 + Vo.lag3 + Vo.lag4 + Vo.lag5 + Vo.lag6 + Vo.lag7 + Vo.lag8 + Vo.lag9 + Vo.lag10 + Vo.lag11 + Vo.lag12 + Vo.lag13 + Vo.lag14 + dVo.Px + dVo.lag2 + dVo.lag3 + dVo.lag4 + dVo.lag5 + dVo.lag6 + dVo.lag7 + dVo.lag8 + dVo.lag9 + dVo.lag10 + dVo.lag11 + dVo.lag12 + dVo.lag13 + dVo.lag14 + MACD.Open + MACD.Open.signal + MACD.Volume + MACD.Volume.signal + Stoch.fastK + Stoch.fastD + Stoch.slowD + RSI.Open + RSI.Close + dOp.Px.SP500 + dOp.lag2.Px.SP500 + dOp.lag3.Px.SP500 + dOp.lag4.Px.SP500 + dOp.lag5.Px.SP500+ dOp.lag6.Px.SP500 + dOp.lag7.Px.SP500 + dOp.lag8.Px.SP500 + dOp.lag9.Px.SP500 + dOp.lag10.Px.SP500 + dOp.lag11.Px.SP500 + dOp.lag12.Px.SP500 + dOp.lag13.Px.SP500 + dOp.lag14.Px.SP500 + dCl.Px.SP500 + dCl.lag2.Px.SP500 + dCl.lag3.Px.SP500 + dCl.lag4.Px.SP500 + dCl.lag5.Px.SP500 + dCl.lag6.Px.SP500 + dCl.lag7.Px.SP500 + dCl.lag8.Px.SP500 + dCl.lag9.Px.SP500+ dCl.lag10.Px.SP500 + dCl.lag11.Px.SP500 + dCl.lag12.Px.SP500 + dCl.lag13.Px.SP500 + dCl.lag14.Px.SP500 + Vo.SP500 + Vo.lag1.SP500 + Vo.lag2.SP500 + Vo.lag3.SP500 + Vo.lag4.SP500 + Vo.lag5.SP500 + Vo.lag6.SP500 + Vo.lag7.SP500 + Vo.lag8.SP500 + Vo.lag9.SP500 + Vo.lag10.SP500 + Vo.lag11.SP500 + Vo.lag12.SP500 + Vo.lag13.SP500 + Vo.lag14.SP500 + dVo.Px.SP500 + dVo.lag2.SP500 + dVo.lag3.SP500 + dVo.lag4.SP500 + dVo.lag5.SP500 + dVo.lag6.SP500 + dVo.lag7.SP500+ dVo.lag8.SP500 + dVo.lag9.SP500 + dVo.lag10.SP500 + dVo.lag11.SP500 + dVo.lag12.SP500 + dVo.lag13.SP500 + dVo.lag14.SP500,data = Data)
# Information entropy
information.entropy <- information.gain(dCl.Px ~ Op.Px + Op.lag1.Px + Op.lag2.Px + Op.lag3.Px + Op.lag4.Px + Op.lag5.Px + Op.lag6.Px + Op.lag7.Px + Op.lag8.Px + Op.lag9.Px + Op.lag10.Px + Op.lag11.Px +Op.lag12.Px + Op.lag13.Px + Op.lag14.Px + dOp.Px + dOp.lag2.Px + dOp.lag3.Px + dOp.lag4.Px + dOp.lag5.Px + dOp.lag6.Px + dOp.lag7.Px + dOp.lag8.Px + dOp.lag9.Px + dOp.lag10.Px + dOp.lag11.Px + dOp.lag12.Px + dOp.lag13.Px + dOp.lag14.Px + Cl.Px + Cl.lag1.Px + Cl.lag2.Px + Cl.lag3.Px + Cl.lag4.Px + Cl.lag5.Px + Cl.lag6.Px + Cl.lag7.Px +Cl.lag8.Px + Cl.lag9.Px + Cl.lag10.Px+ Cl.lag11.Px + Cl.lag12.Px + Cl.lag13.Px + Cl.lag14.Px + dCl.lag2.Px + dCl.lag3.Px + dCl.lag4.Px + dCl.lag5.Px + dCl.lag6.Px + dCl.lag7.Px + dCl.lag8.Px + dCl.lag9.Px + dCl.lag10.Px + dCl.lag11.Px + dCl.lag12.Px + dCl.lag13.Px + dCl.lag14.Px + High.Px + Low.Px + Vo + Vo.lag1 + Vo.lag2 + Vo.lag3 + Vo.lag4 + Vo.lag5 + Vo.lag6 + Vo.lag7 + Vo.lag8 + Vo.lag9 + Vo.lag10 + Vo.lag11 + Vo.lag12 + Vo.lag13 + Vo.lag14 + dVo.Px + dVo.lag2 + dVo.lag3 + dVo.lag4 + dVo.lag5 + dVo.lag6 + dVo.lag7 + dVo.lag8 + dVo.lag9 + dVo.lag10 + dVo.lag11 + dVo.lag12 + dVo.lag13 + dVo.lag14 + MACD.Open + MACD.Open.signal + MACD.Volume + MACD.Volume.signal + Stoch.fastK + Stoch.fastD + Stoch.slowD + RSI.Open + RSI.Close + dOp.Px.SP500 + dOp.lag2.Px.SP500 + dOp.lag3.Px.SP500 + dOp.lag4.Px.SP500 + dOp.lag5.Px.SP500+ dOp.lag6.Px.SP500 + dOp.lag7.Px.SP500 + dOp.lag8.Px.SP500 + dOp.lag9.Px.SP500 + dOp.lag10.Px.SP500 + dOp.lag11.Px.SP500 + dOp.lag12.Px.SP500 + dOp.lag13.Px.SP500 + dOp.lag14.Px.SP500 + dCl.Px.SP500 + dCl.lag2.Px.SP500 + dCl.lag3.Px.SP500 + dCl.lag4.Px.SP500 + dCl.lag5.Px.SP500 + dCl.lag6.Px.SP500 + dCl.lag7.Px.SP500 + dCl.lag8.Px.SP500 + dCl.lag9.Px.SP500+ dCl.lag10.Px.SP500 + dCl.lag11.Px.SP500 + dCl.lag12.Px.SP500 + dCl.lag13.Px.SP500 + dCl.lag14.Px.SP500 + Vo.SP500 + Vo.lag1.SP500 + Vo.lag2.SP500 + Vo.lag3.SP500 + Vo.lag4.SP500 + Vo.lag5.SP500 + Vo.lag6.SP500 + Vo.lag7.SP500 + Vo.lag8.SP500 + Vo.lag9.SP500 + Vo.lag10.SP500 + Vo.lag11.SP500 + Vo.lag12.SP500 + Vo.lag13.SP500 + Vo.lag14.SP500 + dVo.Px.SP500 + dVo.lag2.SP500 + dVo.lag3.SP500 + dVo.lag4.SP500 + dVo.lag5.SP500 + dVo.lag6.SP500 + dVo.lag7.SP500+ dVo.lag8.SP500 + dVo.lag9.SP500 + dVo.lag10.SP500 + dVo.lag11.SP500 + dVo.lag12.SP500 + dVo.lag13.SP500 + dVo.lag14.SP500,data = Data)
На основе проведенного анализа были получены следующие результаты, показывающие влияние отдельных временных рядов, на целевой:
Рисунок 16
На основе полученных данных были отобран ряд рядов, обладающих сравнительным преимуществом. На основе этих аналитических данных общий массив входных данных для моделирования был уменьшен, сохранив только «эффективные» ряды. В итоговое моделирование попали следующие ряды: приращение цены открытия AAPLи ряд его лагов, приращение цены закрытия AAPL и ряд его лагов, значение торгового объема, значения индикатора StochasticпоAAPL, значение индикатора RSIпо ценам закрытия AAPL, а также приращение цены закрытия индекса S&P 500 и ряд его лагов.
Получив отобранные данные были закончены подготовительные этапы и можно было перейти к практическому моделированию. При реализации модельной части алгоритма, особое требование выдвигалось к производительности кода. Так как код предполагал множественные итерации, необходимо было применить методы, обладающие высоким быстродействием. Так классическая реализация цикла через оператор forне давала достаточной эффективности. В среде разработчиков программных решений на языке Rшироко применяется его аналог — семейство функций apply().
Рисунок 17 Иттерационная структура алгоритма
Было принято решение выстроить модельную часть программы в виде функции, запускаемой lapply()-одной из функций семейства apply(). Программная реализация представлена ниже:
FunFitAndPred<- function(dF,index.par,index){
# Function split rolling window on train and test parts. Next step is modeling
# using rpart algorithms the model on the train sample. Futhermore this model
# boosts in ADAboost algorithm. Last step is predicting tests on the both
# samples — test and train.
# Agrs:
# dF: dataframe, where rolling window exist.
# index.par: index of matrix in global environment, which include sets of
# parameters. Set of parameters uses for fitting and modelling.
# index: index of dataframe, establishing rolling window position
# Returns:
# vector of errors in train and test sample
par<- parametr.valuation[index.par,]
# Routing parameters
N <- as.numeric(par[1])
n <- as.numeric(par[2])
m <- as.numeric(par[3])
control<- rpart.control(maxdepth = as.numeric(par[4]))
mfinal <- as.numeric(par[5])
# Training sample
train <- dF[(kN — n — 1 + index):(kN — 1 + index),]
train.predictand <- factor(ifelse(tail(train$dCl.Px, -1)>0,1,0),
levels = c(1,0))
train.predictand <- as.matrix(train.predictand)
colnames(train.predictand)<- c(‘predictand’)
train.predictors <- head(train[,c(1:21)], -1)
train.data <- cbind(train.predictand, train.predictors)
# Fiting tree and ADAboosting
fit <- boosting(predictand ~ dOp.Px + dOp.lag2.Px + dCl.lag2.Px + dCl.lag3.Px
+ dCl.lag4.Px + dCl.lag5.Px + dCl.lag6.Px + dCl.lag7.Px
+ dCl.lag8.Px + dCl.lag9.Px + dCl.lag10.Px + dCl.lag11.Px
+ dCl.lag12.Px + Vo + Stoch.fastK + Stoch.fastD + RSI.Close
+ dCl.Px.SP500 + dCl.lag2.Px.SP500 + dCl.lag3.Px.SP500
+ dCl.lag4.Px.SP500,data = train.data, mfinal = mfinal,
coeflearn = ‘Breiman’,control = control)
# Test sample
test <- dF[(kN + index):(kN + kM + index),]
test.predictand <- factor(ifelse(tail(test$dCl.Px, -1)>0,1,0),
levels = c(1,0))
test.predictand <- as.matrix(test.predictand)
colnames(test.predictand)<- c(‘predictand’)
test.predictors <- head(test[,c(1:21)], -1)
test.data <- cbind(test.predictand, test.predictors)
# Predicting
train.predict <- predict(fit, train.data)
test.predict <- predict(fit, test.data)
output <- c(test.predict[6])
print(«PROCESSING»)
return(output)
В рамках исполнения данной функции выполняется ряд задач. Так первоначально функция извлекает из всего массива анализируемых данных выборку, на которой будет проводиться моделирование. Алгоритм разбивает извлеченный суб-массив на обучающую выборку и тестовую. По данным обучающей выборки алгоритм формирует модель — набор классификационных деревьев. Данные деревья участвуют в формирование ансамбля, в рамках работы алгоритма адаптивного усиления. Когда ансамбль окончательно сформирован, он используется для прогнозирования значений предиктанда на тестовой выборке. Результатом работы моделирующей функции является точность прогноза на тестовой выборке.
После формирования исполняющей функции необходимо было подобрать параметры, при которых данная функция имеет лучший результат прогнозирования. Сложность на данном этапе является, что оптимизация должна вестись по целому ряду параметров, несвязанных друг с другом функциональной связью. Данная задача гиперпараметрической оптимизации в общем случае не имеет эффективного метода решений. Основными методами, применяемыми для решения подобных задач, являются методы категории bruteforce — перебор ограниченного диапазона с целью поиска наилучших наборов параметров. В рамках работы была проведена процедура гиперпараметрической оптимизации (см. Приложение 3). В рамках работы оптимизационного алгоритма были выявлены параметры, дающие наилучшую точность модели.
Следующим этапом стало применение готовой модели с подобранными оптимальными параметрами. Для тестирования был выбран диапазон, находящийся вне обучающей выборки, длиной 2000 наблюдений. После прогонки задачи по этому диапазону была получена итоговая средняя точность прогноза — 50,8% на трехпериодном горизонте прогнозирования и 53,8% на однопериодном.
Эти результаты отчетливо показывают, что применение инструментария машинного обучения позволяет осуществлять успешное прогнозирование финансовых временных рядов.
Заключение
В рамках проведенного теоретического и практического исследования был сделан ряд выводов и достигнуты практические результаты. В работе был проведен обзор основных этапов развития исследуемой области. Это позволило сформировать полное представление о целях и задачах, которые ставились основоположниками области машинного обучения. Следующим важным этапом работы является обзор наиболее важных алгоритмов машинного обучения, которые имеют самое широкое применение среди исследователей.
Анализ алгоритмов, их специфики и класса задач, которые они способны эффективно решать, дало возможность автору данной работы выбрать наиболее подходящий алгоритм для этого. В своем выборе модели автор опирался на опыт других исследователей в данной области. Для выбора модели первостепенной задачей было создать некую связку между общей методикой области исследования и конкретной финансовой задачей, которая стоит перед исследователем — прогноз динамики показателей фондового рынка. Для этого было необходимо сформулировать финансовую задачу в терминах направления анализа данных. Когда это было сделано, для поставленной задачи был подобран оптимальный алгоритм, хорошо зарекомендовавший себя при решении схожих задач.
В рамках разработки оптимального алгоритма автор исследовал различные наборы параметров. В процессе оптимизации были проварьированы следующие показатели: величина обучающей выборки и глубина деревьев в алгоритмах. Было выявлено, что при увеличение обучающей выборки имеется четкая тенденция к уменьшению средней ошибки. Это связано с тем, что модель лучше описывает общие тенденции при большем объеме входных данных.
Рисунок 18
При исследовании влияния параметра глубины разбиения деревьев не было выявлено, что на указанном интервале варьирования наблюдается устойчивая тенденция. По этой причине были выбраны такие значения показателей, которое дает наилучшее значение средней ошибки на тестовой выборке. Наилучшим показателем значения глубины дерева оказалось предельное ветвление на 20 нод. При данном показателе модель демонстрирует существенно лучшую эффективность прогнозирования.
Рисунок 19
Основная гипотеза работы о возможности применения методов машинного обучения для прогнозирования финансовых временных рядов, в частности данных рынка акций подтвердилась. Исследовательская модель, разработанная для проверки поставленной гипотезы, подтвердила возможность прогнозирования фондового рынка с помощью указанных методов. Точность прогноза направления изменения цены закрытия акций компании Apple(биржевой тикет: AAPL) при периоде прогноза в 3 периода составляет 50,8%. При прогнозе атомарного изменения цены результат прогноза составляет 53,8%. При этом разница в точности в обучающей и тестовой выборках составляет в среднем составляет 10%: 66,1%в среднем при описание обучающей выборки.Данные результаты свидетельствуют о том, что, используя данную модель можно извлекать аналитическую прибыль.
Анализируя практическую пользу модели нельзя не отметить ее слабость. Хотя аналитическая прибыль и может быть извлечена, реальная прибыль, складывающаяся при добавление транзакционных и операционных издержек, будет, вероятно, не удовлетворять требованиям инвесторов к доходности, взвешенной по риску. Причиной данной неэффективности автор видит в качества исполнения модели. Путями улучшения модели автор видит следующее:
более качественный подбор входных данных, применение очистки данных от шума, в частности метода главных компонент
реализация более эффективного отбора входных переменных, используя более широкий арсенал фильтров, а также методов обертки
тестирование модели на различных рыночных эпохах с целью выявления общих тенденций, существующих на больших интервалах рынка
тестирование большего количества параметров, а также анализ других принципов организации архитектуры обучающей и тестовой выборок
применение данной модели в связке с методом определения «режима» рынка.
Эти действия, выходящие за рамки данной работы, по мнению автора, смогут улучшить данную модель, доведя ее до экономически эффективного порода точности.
Приложение 1
#Establishinglibrary
library(quantmod)
#Loading row data
load(«I:/DataMining/#PROJECTS/Diplom/DATA/aapl_2005_2015.RData»)
load(«I:/DataMining/#PROJECTS/Diplom/DATA/spy_2005_2015.RData»)
load(«I:/DataMining/#PROJECTS/Diplom/DATA/nasdaq.RData»)
AAPL.M1 <- aapl
NASDAQ.M1 <- nasdaq
SP500.M1 <- spy
rm(aapl, nasdaq, spy)
##=====================================Data Composition========================
# Establishing convenient timeframe
kTimeframe <- 15
# AAPL
dF <- AAPL.M1[(1 : kTimeframe),c(‘AAPL.Open’,’AAPL.High’,’AAPL.Low’,
‘AAPL.Close’,’AAPL.Volume’)]
AAPL.Open <- as.numeric(dF[1,’AAPL.Open’])
AAPL.High <- max(dF[,’AAPL.High’])
AAPL.Low <- min(dF[,’AAPL.Low’])
AAPL.Close <- AAPL.M1[timeframe,’AAPL.Close’]
AAPL.Volume <- sum(dF[,’AAPL.Volume’])
AAPL.0row <- cbind(AAPL.Open, AAPL.High, AAPL.Low, AAPL.Close, AAPL.Volume)
names(AAPL.0row)<- c(‘AAPL.Open’,
‘AAPL.High’,
‘AAPL.Low’,
‘AAPL.Close’,
‘AAPL.Volume’)
rm(dF, AAPL.Open, AAPL.High, AAPL.Low, AAPL.Close, AAPL.Volume)
for(i in(1 : (as.integer(nrow(AAPL.M1)/kTimeframe) — kTimeframe))){
dF <- AAPL.M1[(1 + kTimeframe*i):(kTimeframe*(i+1)),]
AAPL.Open <- as.numeric(dF[1,’AAPL.Open’])
AAPL.High <- max(dF[,’AAPL.High’])
AAPL.Low <- min(dF[,’AAPL.Low’])
AAPL.Close <- dF[kTimeframe,’AAPL.Close’]
AAPL.Volume <- sum(dF[,’AAPL.Volume’])
AAPL.row <- cbind(AAPL.Open, AAPL.High, AAPL.Low, AAPL.Close, AAPL.Volume)
names(AAPL.row)<- c(‘AAPL.Open’,
‘AAPL.High’,
‘AAPL.Low’,
‘AAPL.Close’,
‘AAPL.Volume’)
AAPL.0row <- rbind(AAPL.0row, AAPL.row)
AAPL.M15 <- AAPL.0row
rm(AAPL.0row,AAPL.Open, AAPL.High, AAPL.Low, AAPL.Close, AAPL.Volume, AAPL.row,
i, dF)
# NASDAQ
dF <- NASDAQ.M1[(1 : kTimeframe),c(‘COMP.Open’,’COMP.High’,’COMP.Low’,
‘COMP.Close’,’COMP.Volume’)]
COMP.Open <- as.numeric(dF[1,’COMP.Open’])
COMP.High <- max(dF[,’COMP.High’])
COMP.Low <- min(dF[,’COMP.Low’])
COMP.Close <- NASDAQ.M1[kTimeframe,’COMP.Close’]
COMP.Volume <- sum(dF[,’COMP.Volume’])
COMP.0row <- cbind(COMP.Open, COMP.High, COMP.Low, COMP.Close, COMP.Volume)
names(COMP.0row)<- c(‘COMP.Open’,
‘COMP.High’,
‘COMP.Low’,
‘COMP.Close’,
‘COMP.Volume’)
rm(dF, COMP.Open, COMP.High, COMP.Low, COMP.Close, COMP.Volume)
for(i in(1 : (as.integer(nrow(NASDAQ.M1)/kTimeframe) — kTimeframe))){
dF <- NASDAQ.M1[(1 + kTimeframe*i):(kTimeframe*(i+1)),]
COMP.Open <- as.numeric(dF[1,’COMP.Open’])
COMP.High <- max(dF[,’COMP.High’])
COMP.Low <- min(dF[,’COMP.Low’])
COMP.Close <- dF[kTimeframe,’COMP.Close’]
COMP.Volume <- sum(dF[,’COMP.Volume’])
COMP.row <- cbind(COMP.Open, COMP.High, COMP.Low, COMP.Close, COMP.Volume)
names(COMP.row)<- c(‘COMP.Open’,
‘COMP.High’,
‘COMP.Low’,
‘COMP.Close’,
‘COMP.Volume’)
COMP.0row <- rbind(COMP.0row, COMP.row)
NASDAQ.M15 <- COMP.0row
rm(COMP.0row,COMP.Open, COMP.High, COMP.Low, COMP.Close, COMP.Volume, COMP.row,
i, dF)
# S&P 500
dF <- SP500.M1[(1 : kTimeframe),c(‘SPY.Open’,’SPY.High’,’SPY.Low’,
‘SPY.Close’,’SPY.Volume’)]
SPY.Open <- as.numeric(dF[1,’SPY.Open’])
SPY.High <- max(dF[,’SPY.High’])
SPY.Low <- min(dF[,’SPY.Low’])
SPY.Close <- SP500.M1[kTimeframe,’SPY.Close’]
SPY.Volume <- sum(dF[,’SPY.Volume’])
SPY.0row <- cbind(SPY.Open, SPY.High, SPY.Low, SPY.Close, SPY.Volume)
names(SPY.0row)<- c(‘SP500.Open’,
‘SP500.High’,
‘SP500.Low’,
‘SP500.Close’,
‘SP500.Volume’)
rm(dF, SPY.Open, SPY.High, SPY.Low, SPY.Close, SPY.Volume)
for(i in(1 : (as.integer(nrow(SP500.M1)/kTimeframe) — kTimeframe))){
dF <- SP500.M1[(1 + kTimeframe*i):(kTimeframe*(i+1)),]
SPY.Open <- as.numeric(dF[1,’SPY.Open’])
SPY.High <- max(dF[,’SPY.High’])
SPY.Low <- min(dF[,’SPY.Low’])
SPY.Close <- dF[kTimeframe,’SPY.Close’]
SPY.Volume <- sum(dF[,’SPY.Volume’])
SPY.row <- cbind(SPY.Open, SPY.High, SPY.Low, SPY.Close, SPY.Volume)
names(SPY.row)<- c(‘SP500.Open’,
‘SP500.High’,
‘SP500.Low’,
‘SP500.Close’,
‘SP500.Volume’)
SPY.0row <- rbind(SPY.0row, SPY.row)
SP500.M15 <- SPY.0row
rm(SPY.0row,SPY.Open, SPY.High, SPY.Low, SPY.Close, SPY.Volume, SPY.row, i, dF)
# Creating temporary data-buffer
data.stoch <- AAPL.M15[,c(‘AAPL.High’,’AAPL.Low’,’AAPL.Close’)]
data.stoch.NASDAQ <- NASDAQ.M15[,c(‘COMP.High’,’COMP.Low’,’COMP.Close’)]
data.stoch.SP500 <- SP500.M15[,c(‘SP500.High’,’SP500.Low’,’SP500.Close’)]
# Fixing NAs
AAPL.M15 <- AAPL.M15[complete.cases(AAPL.M15),]
NASDAQ.M15 <- NASDAQ.M15[complete.cases(NASDAQ.M15),]
SP500.M15 <- SP500.M15[complete.cases(SP500.M15),]
# Naming variables
# AAPL
Op.Px <- Op(AAPL.M15)
Op.lag1.Px <- lag(Op(AAPL.M15), k=1)
Op.lag2.Px <- lag(Op(AAPL.M15), k=2)
Op.lag3.Px <- lag(Op(AAPL.M15), k=3)
Op.lag4.Px <- lag(Op(AAPL.M15), k=4)
Op.lag5.Px <- lag(Op(AAPL.M15), k=5)
Op.lag6.Px <- lag(Op(AAPL.M15), k=6)
Op.lag7.Px <- lag(Op(AAPL.M15), k=7)
Op.lag8.Px <- lag(Op(AAPL.M15), k=8)
Op.lag9.Px <- lag(Op(AAPL.M15), k=9)
Op.lag10.Px <- lag(Op(AAPL.M15), k=10)
Op.lag11.Px <- lag(Op(AAPL.M15), k=11)
Op.lag12.Px <- lag(Op(AAPL.M15), k=12)
Op.lag13.Px <- lag(Op(AAPL.M15), k=13)
Op.lag14.Px <- lag(Op(AAPL.M15), k=14)
dOp.Px <- (Op.Px — Op.lag1.Px)/Op.lag1.Px
dOp.lag2.Px <- (Op.Px — Op.lag2.Px)/Op.lag2.Px
dOp.lag3.Px <- (Op.Px — Op.lag3.Px)/Op.lag3.Px
dOp.lag4.Px <- (Op.Px — Op.lag4.Px)/Op.lag4.Px
dOp.lag5.Px <- (Op.Px — Op.lag5.Px)/Op.lag5.Px
dOp.lag6.Px <- (Op.Px — Op.lag6.Px)/Op.lag6.Px
dOp.lag7.Px <- (Op.Px — Op.lag7.Px)/Op.lag7.Px
dOp.lag8.Px <- (Op.Px — Op.lag8.Px)/Op.lag8.Px
dOp.lag9.Px <- (Op.Px — Op.lag9.Px)/Op.lag9.Px
dOp.lag10.Px <- (Op.Px — Op.lag10.Px)/Op.lag10.Px
dOp.lag11.Px <- (Op.Px — Op.lag11.Px)/Op.lag11.Px
dOp.lag12.Px <- (Op.Px — Op.lag12.Px)/Op.lag12.Px
dOp.lag13.Px <- (Op.Px — Op.lag13.Px)/Op.lag13.Px
dOp.lag14.Px <- (Op.Px — Op.lag14.Px)/Op.lag14.Px
Cl.Px <- Cl(AAPL.M15)
Cl.lag1.Px <- lag(Cl(AAPL.M15), k=1)
Cl.lag2.Px <- lag(Cl(AAPL.M15), k=2)
Cl.lag3.Px <- lag(Cl(AAPL.M15), k=3)
Cl.lag4.Px <- lag(Cl(AAPL.M15), k=4)
Cl.lag5.Px <- lag(Cl(AAPL.M15), k=5)
Cl.lag6.Px <- lag(Cl(AAPL.M15), k=6)
Cl.lag7.Px <- lag(Cl(AAPL.M15), k=7)
Cl.lag8.Px <- lag(Cl(AAPL.M15), k=8)
Cl.lag9.Px <- lag(Cl(AAPL.M15), k=9)
Cl.lag10.Px <- lag(Cl(AAPL.M15), k=10)
Cl.lag11.Px <- lag(Cl(AAPL.M15), k=11)
Cl.lag12.Px <- lag(Cl(AAPL.M15), k=12)
Cl.lag13.Px <- lag(Cl(AAPL.M15), k=13)
Cl.lag14.Px <- lag(Cl(AAPL.M15), k=14)
dCl.Px <- (Cl.Px — Cl.lag1.Px)/Cl.lag1.Px
dCl.lag2.Px <- (Cl.Px — Cl.lag2.Px)/Cl.lag2.Px
dCl.lag3.Px <- (Cl.Px — Cl.lag3.Px)/Cl.lag3.Px
dCl.lag4.Px <- (Cl.Px — Cl.lag4.Px)/Cl.lag4.Px
dCl.lag5.Px <- (Cl.Px — Cl.lag5.Px)/Cl.lag5.Px
dCl.lag6.Px <- (Cl.Px — Cl.lag6.Px)/Cl.lag6.Px
dCl.lag7.Px <- (Cl.Px — Cl.lag7.Px)/Cl.lag7.Px
dCl.lag8.Px <- (Cl.Px — Cl.lag8.Px)/Cl.lag8.Px
dCl.lag9.Px <- (Cl.Px — Cl.lag9.Px)/Cl.lag9.Px
dCl.lag10.Px <- (Cl.Px — Cl.lag10.Px)/Cl.lag10.Px
dCl.lag11.Px <- (Cl.Px — Cl.lag11.Px)/Cl.lag11.Px
dCl.lag12.Px <- (Cl.Px — Cl.lag12.Px)/Cl.lag12.Px
dCl.lag13.Px <- (Cl.Px — Cl.lag13.Px)/Cl.lag13.Px
dCl.lag14.Px <- (Cl.Px — Cl.lag14.Px)/Cl.lag14.Px
High.Px <- Hi(AAPL.M15)
Low.Px <- Lo(AAPL.M15)
Vo <- Vo(AAPL.M15)
# Fixing ejections in Vo
ejections <- which(Vo == 0)
replace.list <- c(length(ejections))
for(i in(1 : length(ejections))){
replace.list[i]<- mean(Vo[(ejections[i] — 5) : ejections[i]])
Vo <-replace(Vo, ejections, replace.list)
rm(i, ejections, replace.list)
Vo.lag1 <- lag(Vo, k=1)
Vo.lag2 <- lag(Vo, k=2)
Vo.lag3 <- lag(Vo, k=3)
Vo.lag4 <- lag(Vo, k=4)
Vo.lag5 <- lag(Vo, k=5)
Vo.lag6 <- lag(Vo, k=6)
Vo.lag7 <- lag(Vo, k=7)
Vo.lag8 <- lag(Vo, k=8)
Vo.lag9 <- lag(Vo, k=9)
Vo.lag10 <- lag(Vo, k=10)
Vo.lag11 <- lag(Vo, k=11)
Vo.lag12 <- lag(Vo, k=12)
Vo.lag13 <- lag(Vo, k=13)
Vo.lag14 <- lag(Vo, k=14)
dVo.Px <- (Vo — Vo.lag1)/Vo.lag1
dVo.lag2 <- (Vo — Vo.lag2)/Vo.lag2
dVo.lag3 <- (Vo — Vo.lag3)/Vo.lag3
dVo.lag4 <- (Vo — Vo.lag4)/Vo.lag4
dVo.lag5 <- (Vo — Vo.lag5)/Vo.lag5
dVo.lag6 <- (Vo — Vo.lag6)/Vo.lag6
dVo.lag7 <- (Vo — Vo.lag7)/Vo.lag7
dVo.lag8 <- (Vo — Vo.lag8)/Vo.lag8
dVo.lag9 <- (Vo — Vo.lag9)/Vo.lag9
dVo.lag10 <- (Vo — Vo.lag10)/Vo.lag10
dVo.lag11 <- (Vo — Vo.lag11)/Vo.lag11
dVo.lag12 <- (Vo — Vo.lag12)/Vo.lag12
dVo.lag13 <- (Vo — Vo.lag13)/Vo.lag13
dVo.lag14 <- (Vo — Vo.lag14)/Vo.lag14
MACD.Open <- MACD(AAPL.M15[,’AAPL.Open’],nFast = 12, nSlow = 26, nSig = 9,
maType = «EMA»)
MACD.Volume <- MACD(AAPL.M15[,’AAPL.Volume’],nFast = 12, nSlow = 26, nSig = 9,
maType = «EMA»)
Stoch <- stoch(data.stoch, nFastK = 5, nFastD = 3, nSlowD = 3,
maType = «EMA», bounded = FALSE,smooth = 3)
RSI.Open <- RSI(AAPL.M15[,’AAPL.Open’], n = 14, maType = «SMA»)
RSI.Close <- RSI(AAPL.M15[,’AAPL.Close’], n = 14, maType = «SMA»)
# NASDAQ
Op.Px.NASDAQ <- Op(NASDAQ.M15)
Op.lag1.Px.NASDAQ <- lag(Op(NASDAQ.M15), k=1)
Op.lag2.Px.NASDAQ <- lag(Op(NASDAQ.M15), k=2)
Op.lag3.Px.NASDAQ <- lag(Op(NASDAQ.M15), k=3)
Op.lag4.Px.NASDAQ <- lag(Op(NASDAQ.M15), k=4)
Op.lag5.Px.NASDAQ <- lag(Op(NASDAQ.M15), k=5)
Op.lag6.Px.NASDAQ <- lag(Op(NASDAQ.M15), k=6)
Op.lag7.Px.NASDAQ <- lag(Op(NASDAQ.M15), k=7)
Op.lag8.Px.NASDAQ <- lag(Op(NASDAQ.M15), k=8)
Op.lag9.Px.NASDAQ <- lag(Op(NASDAQ.M15), k=9)
Op.lag10.Px.NASDAQ <- lag(Op(NASDAQ.M15), k=10)
Op.lag11.Px.NASDAQ <- lag(Op(NASDAQ.M15), k=11)
Op.lag12.Px.NASDAQ <- lag(Op(NASDAQ.M15), k=12)
Op.lag13.Px.NASDAQ <- lag(Op(NASDAQ.M15), k=13)
Op.lag14.Px.NASDAQ <- lag(Op(NASDAQ.M15), k=14)
dOp.Px.NASDAQ <- (Op.Px.NASDAQ — Op.lag1.Px.NASDAQ)/Op.lag1.Px.NASDAQ
dOp.lag2.Px.NASDAQ <- (Op.Px.NASDAQ — Op.lag2.Px.NASDAQ)/Op.lag2.Px.NASDAQ
dOp.lag3.Px.NASDAQ <- (Op.Px.NASDAQ — Op.lag3.Px.NASDAQ)/Op.lag3.Px.NASDAQ
dOp.lag4.Px.NASDAQ <- (Op.Px.NASDAQ — Op.lag4.Px.NASDAQ)/Op.lag4.Px.NASDAQ
dOp.lag5.Px.NASDAQ <- (Op.Px.NASDAQ — Op.lag5.Px.NASDAQ)/Op.lag5.Px.NASDAQ
dOp.lag6.Px.NASDAQ <- (Op.Px.NASDAQ — Op.lag6.Px.NASDAQ)/Op.lag6.Px.NASDAQ
dOp.lag7.Px.NASDAQ <- (Op.Px.NASDAQ — Op.lag7.Px.NASDAQ)/Op.lag7.Px.NASDAQ
dOp.lag8.Px.NASDAQ <- (Op.Px.NASDAQ — Op.lag8.Px.NASDAQ)/Op.lag8.Px.NASDAQ
dOp.lag9.Px.NASDAQ <- (Op.Px.NASDAQ — Op.lag9.Px.NASDAQ)/Op.lag9.Px.NASDAQ
dOp.lag10.Px.NASDAQ <- (Op.Px.NASDAQ — Op.lag10.Px.NASDAQ)/Op.lag10.Px.NASDAQ
dOp.lag11.Px.NASDAQ <- (Op.Px.NASDAQ — Op.lag11.Px.NASDAQ)/Op.lag11.Px.NASDAQ
dOp.lag12.Px.NASDAQ <- (Op.Px.NASDAQ — Op.lag12.Px.NASDAQ)/Op.lag12.Px.NASDAQ
dOp.lag13.Px.NASDAQ <- (Op.Px.NASDAQ — Op.lag13.Px.NASDAQ)/Op.lag13.Px.NASDAQ
dOp.lag14.Px.NASDAQ <- (Op.Px.NASDAQ — Op.lag14.Px.NASDAQ)/Op.lag14.Px.NASDAQ
Cl.Px.NASDAQ <- Cl(NASDAQ.M15)
Cl.lag1.Px.NASDAQ <- lag(Cl(NASDAQ.M15), k=1)
Cl.lag2.Px.NASDAQ <- lag(Cl(NASDAQ.M15), k=2)
Cl.lag3.Px.NASDAQ <- lag(Cl(NASDAQ.M15), k=3)
Cl.lag4.Px.NASDAQ <- lag(Cl(NASDAQ.M15), k=4)
Cl.lag5.Px.NASDAQ <- lag(Cl(NASDAQ.M15), k=5)
Cl.lag6.Px.NASDAQ <- lag(Cl(NASDAQ.M15), k=6)
Cl.lag7.Px.NASDAQ <- lag(Cl(NASDAQ.M15), k=7)
Cl.lag8.Px.NASDAQ <- lag(Cl(NASDAQ.M15), k=8)
Cl.lag9.Px.NASDAQ <- lag(Cl(NASDAQ.M15), k=9)
Cl.lag10.Px.NASDAQ <- lag(Cl(NASDAQ.M15), k=10)
Cl.lag11.Px.NASDAQ <- lag(Cl(NASDAQ.M15), k=11)
Cl.lag12.Px.NASDAQ <- lag(Cl(NASDAQ.M15), k=12)
Cl.lag13.Px.NASDAQ <- lag(Cl(NASDAQ.M15), k=13)
Cl.lag14.Px.NASDAQ <- lag(Cl(NASDAQ.M15), k=14)
dCl.Px.NASDAQ <- (Cl.Px.NASDAQ — Cl.lag1.Px.NASDAQ)/Cl.lag1.Px.NASDAQ
dCl.lag2.Px.NASDAQ <- (Cl.Px.NASDAQ — Cl.lag2.Px.NASDAQ)/Cl.lag2.Px.NASDAQ
dCl.lag3.Px.NASDAQ <- (Cl.Px.NASDAQ — Cl.lag3.Px.NASDAQ)/Cl.lag3.Px.NASDAQ
dCl.lag4.Px.NASDAQ <- (Cl.Px.NASDAQ — Cl.lag4.Px.NASDAQ)/Cl.lag4.Px.NASDAQ
dCl.lag5.Px.NASDAQ <- (Cl.Px.NASDAQ — Cl.lag5.Px.NASDAQ)/Cl.lag5.Px.NASDAQ
dCl.lag6.Px.NASDAQ <- (Cl.Px.NASDAQ — Cl.lag6.Px.NASDAQ)/Cl.lag6.Px.NASDAQ
dCl.lag7.Px.NASDAQ <- (Cl.Px.NASDAQ — Cl.lag7.Px.NASDAQ)/Cl.lag7.Px.NASDAQ
dCl.lag8.Px.NASDAQ <- (Cl.Px.NASDAQ — Cl.lag8.Px.NASDAQ)/Cl.lag8.Px.NASDAQ
dCl.lag9.Px.NASDAQ <- (Cl.Px.NASDAQ — Cl.lag9.Px.NASDAQ)/Cl.lag9.Px.NASDAQ
dCl.lag10.Px.NASDAQ <- (Cl.Px.NASDAQ — Cl.lag10.Px.NASDAQ)/Cl.lag10.Px.NASDAQ
dCl.lag11.Px.NASDAQ <- (Cl.Px.NASDAQ — Cl.lag11.Px.NASDAQ)/Cl.lag11.Px.NASDAQ
dCl.lag12.Px.NASDAQ <- (Cl.Px.NASDAQ — Cl.lag12.Px.NASDAQ)/Cl.lag12.Px.NASDAQ
dCl.lag13.Px.NASDAQ <- (Cl.Px.NASDAQ — Cl.lag13.Px.NASDAQ)/Cl.lag13.Px.NASDAQ
dCl.lag14.Px.NASDAQ <- (Cl.Px.NASDAQ — Cl.lag14.Px.NASDAQ)/Cl.lag14.Px.NASDAQ
High.Px.NASDAQ <- Hi(NASDAQ.M15)
Low.Px.NASDAQ <- Lo(NASDAQ.M15)
Vo.NASDAQ <- Vo(NASDAQ.M15)
MACD.Open.NASDAQ <- MACD(NASDAQ.M15[,’COMP.Open’],nFast = 12, nSlow = 26,
nSig = 9, maType = «EMA»)
Stoch.NASDAQ <- stoch(data.stoch.NASDAQ, nFastK = 5, nFastD = 3,
nSlowD = 3, maType = «EMA», bounded = FALSE,
smooth = 3)
RSI.Open.NASDAQ <- RSI(NASDAQ.M15[,’COMP.Open’], n = 14, maType = «SMA»)
RSI.Close.NASDAQ <- RSI(NASDAQ.M15[,’COMP.Close’], n = 14, maType = «SMA»)
# SP500
Op.Px.SP500 <- Op(SP500.M15)
Op.lag1.Px.SP500 <- lag(Op(SP500.M15), k=1)
Op.lag2.Px.SP500 <- lag(Op(SP500.M15), k=2)
Op.lag3.Px.SP500 <- lag(Op(SP500.M15), k=3)
Op.lag4.Px.SP500 <- lag(Op(SP500.M15), k=4)
Op.lag5.Px.SP500 <- lag(Op(SP500.M15), k=5)
Op.lag6.Px.SP500 <- lag(Op(SP500.M15), k=6)
Op.lag7.Px.SP500 <- lag(Op(SP500.M15), k=7)
Op.lag8.Px.SP500 <- lag(Op(SP500.M15), k=8)
Op.lag9.Px.SP500 <- lag(Op(SP500.M15), k=9)
Op.lag10.Px.SP500 <- lag(Op(SP500.M15), k=10)
Op.lag11.Px.SP500 <- lag(Op(SP500.M15), k=11)
Op.lag12.Px.SP500 <- lag(Op(SP500.M15), k=12)
Op.lag13.Px.SP500 <- lag(Op(SP500.M15), k=13)
Op.lag14.Px.SP500 <- lag(Op(SP500.M15), k=14)
dOp.Px.SP500 <- (Op.Px.SP500 — Op.lag1.Px.SP500)/Op.lag1.Px.SP500
dOp.lag2.Px.SP500 <- (Op.Px.SP500 — Op.lag2.Px.SP500)/Op.lag2.Px.SP500
dOp.lag3.Px.SP500 <- (Op.Px.SP500 — Op.lag3.Px.SP500)/Op.lag3.Px.SP500
dOp.lag4.Px.SP500 <- (Op.Px.SP500 — Op.lag4.Px.SP500)/Op.lag4.Px.SP500
dOp.lag5.Px.SP500 <- (Op.Px.SP500 — Op.lag5.Px.SP500)/Op.lag5.Px.SP500
dOp.lag6.Px.SP500 <- (Op.Px.SP500 — Op.lag6.Px.SP500)/Op.lag6.Px.SP500
dOp.lag7.Px.SP500 <- (Op.Px.SP500 — Op.lag7.Px.SP500)/Op.lag7.Px.SP500
dOp.lag8.Px.SP500 <- (Op.Px.SP500 — Op.lag8.Px.SP500)/Op.lag8.Px.SP500
dOp.lag9.Px.SP500 <- (Op.Px.SP500 — Op.lag9.Px.SP500)/Op.lag9.Px.SP500
dOp.lag10.Px.SP500 <- (Op.Px.SP500 — Op.lag10.Px.SP500)/Op.lag10.Px.SP500
dOp.lag11.Px.SP500 <- (Op.Px.SP500 — Op.lag11.Px.SP500)/Op.lag11.Px.SP500
dOp.lag12.Px.SP500 <- (Op.Px.SP500 — Op.lag12.Px.SP500)/Op.lag12.Px.SP500
dOp.lag13.Px.SP500 <- (Op.Px.SP500 — Op.lag13.Px.SP500)/Op.lag13.Px.SP500
dOp.lag14.Px.SP500 <- (Op.Px.SP500 — Op.lag14.Px.SP500)/Op.lag14.Px.SP500
Cl.Px.SP500 <- Cl(SP500.M15)
Cl.lag1.Px.SP500 <- lag(Cl(SP500.M15), k=1)
Cl.lag2.Px.SP500 <- lag(Cl(SP500.M15), k=2)
Cl.lag3.Px.SP500 <- lag(Cl(SP500.M15), k=3)
Cl.lag4.Px.SP500 <- lag(Cl(SP500.M15), k=4)
Cl.lag5.Px.SP500 <- lag(Cl(SP500.M15), k=5)
Cl.lag6.Px.SP500 <- lag(Cl(SP500.M15), k=6)
Cl.lag7.Px.SP500 <- lag(Cl(SP500.M15), k=7)
Cl.lag8.Px.SP500 <- lag(Cl(SP500.M15), k=8)
Cl.lag9.Px.SP500 <- lag(Cl(SP500.M15), k=9)
Cl.lag10.Px.SP500 <- lag(Cl(SP500.M15), k=10)
Cl.lag11.Px.SP500 <- lag(Cl(SP500.M15), k=11)
Cl.lag12.Px.SP500 <- lag(Cl(SP500.M15), k=12)
Cl.lag13.Px.SP500 <- lag(Cl(SP500.M15), k=13)
Cl.lag14.Px.SP500 <- lag(Cl(SP500.M15), k=14)
dCl.Px.SP500 <- (Cl.Px.SP500 — Cl.lag1.Px.SP500)/Cl.lag1.Px.SP500
dCl.lag2.Px.SP500 <- (Cl.Px.SP500 — Cl.lag2.Px.SP500)/Cl.lag2.Px.SP500
dCl.lag3.Px.SP500 <- (Cl.Px.SP500 — Cl.lag3.Px.SP500)/Cl.lag3.Px.SP500
dCl.lag4.Px.SP500 <- (Cl.Px.SP500 — Cl.lag4.Px.SP500)/Cl.lag4.Px.SP500
dCl.lag5.Px.SP500 <- (Cl.Px.SP500 — Cl.lag5.Px.SP500)/Cl.lag5.Px.SP500
dCl.lag6.Px.SP500 <- (Cl.Px.SP500 — Cl.lag6.Px.SP500)/Cl.lag6.Px.SP500
dCl.lag7.Px.SP500 <- (Cl.Px.SP500 — Cl.lag7.Px.SP500)/Cl.lag7.Px.SP500
dCl.lag8.Px.SP500 <- (Cl.Px.SP500 — Cl.lag8.Px.SP500)/Cl.lag8.Px.SP500
dCl.lag9.Px.SP500 <- (Cl.Px.SP500 — Cl.lag9.Px.SP500)/Cl.lag9.Px.SP500
dCl.lag10.Px.SP500 <- (Cl.Px.SP500 — Cl.lag10.Px.SP500)/Cl.lag10.Px.SP500
dCl.lag11.Px.SP500 <- (Cl.Px.SP500 — Cl.lag11.Px.SP500)/Cl.lag11.Px.SP500
dCl.lag12.Px.SP500 <- (Cl.Px.SP500 — Cl.lag12.Px.SP500)/Cl.lag12.Px.SP500
dCl.lag13.Px.SP500 <- (Cl.Px.SP500 — Cl.lag13.Px.SP500)/Cl.lag13.Px.SP500
dCl.lag14.Px.SP500 <- (Cl.Px.SP500 — Cl.lag14.Px.SP500)/Cl.lag14.Px.SP500
High.Px.SP500 <- Hi(SP500.M15)
Low.Px.SP500 <- Lo(SP500.M15)
Vo.SP500 <- Vo(SP500.M15)
# Fixing ejections in Vo.SP500
ejections <- which(Vo.SP500 == 0)
replace.list <- c(length(ejections))
for(i in(1 : length(ejections))){
replace.list[i]<- mean(Vo.SP500[(ejections[i] — 5) : ejections[i]])
Vo.SP500 <-replace(Vo.SP500, ejections, replace.list)
rm(i, ejections, replace.list)
Vo.lag1.SP500 <- lag(Vo.SP500, k=1)
Vo.lag2.SP500 <- lag(Vo.SP500, k=2)
Vo.lag3.SP500 <- lag(Vo.SP500, k=3)
Vo.lag4.SP500 <- lag(Vo.SP500, k=4)
Vo.lag5.SP500 <- lag(Vo.SP500, k=5)
Vo.lag6.SP500 <- lag(Vo.SP500, k=6)
Vo.lag7.SP500 <- lag(Vo.SP500, k=7)
Vo.lag8.SP500 <- lag(Vo.SP500, k=8)
Vo.lag9.SP500 <- lag(Vo.SP500, k=9)
Vo.lag10.SP500 <- lag(Vo.SP500, k=10)
Vo.lag11.SP500 <- lag(Vo.SP500, k=11)
Vo.lag12.SP500 <- lag(Vo.SP500, k=12)
Vo.lag13.SP500 <- lag(Vo.SP500, k=13)
Vo.lag14.SP500 <- lag(Vo.SP500, k=14)
dVo.Px.SP500 <- (Vo.SP500 — Vo.lag1.SP500)/Vo.lag1.SP500
dVo.lag2.SP500 <- (Vo.SP500 — Vo.lag2.SP500)/Vo.lag2.SP500
dVo.lag3.SP500 <- (Vo.SP500 — Vo.lag3.SP500)/Vo.lag3.SP500
dVo.lag4.SP500 <- (Vo.SP500 — Vo.lag4.SP500)/Vo.lag4.SP500
dVo.lag5.SP500 <- (Vo.SP500 — Vo.lag5.SP500)/Vo.lag5.SP500
dVo.lag6.SP500 <- (Vo.SP500 — Vo.lag6.SP500)/Vo.lag6.SP500
dVo.lag7.SP500 <- (Vo.SP500 — Vo.lag7.SP500)/Vo.lag7.SP500
dVo.lag8.SP500 <- (Vo.SP500 — Vo.lag8.SP500)/Vo.lag8.SP500
dVo.lag9.SP500 <- (Vo.SP500 — Vo.lag9.SP500)/Vo.lag9.SP500
dVo.lag10.SP500 <- (Vo.SP500 — Vo.lag10.SP500)/Vo.lag10.SP500
dVo.lag11.SP500 <- (Vo.SP500 — Vo.lag11.SP500)/Vo.lag11.SP500
dVo.lag12.SP500 <- (Vo.SP500 — Vo.lag12.SP500)/Vo.lag12.SP500
dVo.lag13.SP500 <- (Vo.SP500 — Vo.lag13.SP500)/Vo.lag13.SP500
dVo.lag14.SP500 <- (Vo.SP500 — Vo.lag14.SP500)/Vo.lag14.SP500
MACD.Open.SP500 <- MACD(SP500.M15[,’SP500.Open’],nFast = 12, nSlow = 26,
nSig = 9, maType = «EMA»)
MACD.Volume.SP500 <- MACD(SP500.M15[,’SP500.Volume’],nFast = 12, nSlow = 26,
nSig = 9, maType = «EMA»)
Stoch.SP500 <- stoch(data.stoch, nFastK = 5, nFastD = 3, nSlowD = 3,
maType = «EMA», bounded = FALSE,smooth = 3)
RSI.Open.SP500 <- RSI(SP500.M15[,’SP500.Open’], n = 14, maType = «SMA»)
RSI.Close.SP500 <- RSI(SP500.M15[,’SP500.Close’], n = 14, maType = «SMA»)
# Fixing Stoch shotness
Stoch.Missing.Row <- Stoch[nrow(Stoch),]
Stoch.NASDAQ <- rbind(Stoch, Stoch.Missing.Row)
rm(Stoch.Missing.Row)
Stoch.Missing.Row <- Stoch.NASDAQ[nrow(Stoch.NASDAQ),]
Stoch.NASDAQ <- rbind(Stoch.NASDAQ, Stoch.Missing.Row)
rm(Stoch.Missing.Row)
Stoch.Missing.Row <- Stoch.SP500[nrow(Stoch.SP500),]
Stoch.NASDAQ <- rbind(Stoch.SP500, Stoch.Missing.Row)
rm(Stoch.Missing.Row)
# Grouping data
Data.AAPL <- cbind(Op.Px,
Op.lag1.Px,
Op.lag2.Px,
Op.lag3.Px,
Op.lag4.Px,
Op.lag5.Px,
Op.lag6.Px,
Op.lag7.Px,
Op.lag8.Px,
Op.lag9.Px,
Op.lag10.Px,
Op.lag11.Px,
Op.lag12.Px,
Op.lag13.Px,
Op.lag14.Px,
dOp.Px,
dOp.lag2.Px,
dOp.lag3.Px,
dOp.lag4.Px,
dOp.lag5.Px,
dOp.lag6.Px,
dOp.lag7.Px,
dOp.lag8.Px,
dOp.lag9.Px,
dOp.lag10.Px,
dOp.lag11.Px,
dOp.lag12.Px,
dOp.lag13.Px,
dOp.lag14.Px,
Cl.Px,
Cl.lag1.Px,
Cl.lag2.Px,
Cl.lag3.Px,
Cl.lag4.Px,
Cl.lag5.Px,
Cl.lag6.Px,
Cl.lag7.Px,
Cl.lag8.Px,
Cl.lag9.Px,
Cl.lag10.Px,
Cl.lag11.Px,
Cl.lag12.Px,
Cl.lag13.Px,
Cl.lag14.Px,
dCl.Px,
dCl.lag2.Px,
dCl.lag3.Px,
dCl.lag4.Px,
dCl.lag5.Px,
dCl.lag6.Px,
dCl.lag7.Px,
dCl.lag8.Px,
dCl.lag9.Px,
dCl.lag10.Px,
dCl.lag11.Px,
dCl.lag12.Px,
dCl.lag13.Px,
dCl.lag14.Px,
High.Px,
Low.Px,
Vo.lag1,
Vo.lag2,
Vo.lag3,
Vo.lag4,
Vo.lag5,
Vo.lag6,
Vo.lag7,
Vo.lag8,
Vo.lag9,
Vo.lag10,
Vo.lag11,
Vo.lag12,
Vo.lag13,
Vo.lag14,
dVo.Px,
dVo.lag2,
dVo.lag3,
dVo.lag4,
dVo.lag5,
dVo.lag6,
dVo.lag7,
dVo.lag8,
dVo.lag9,
dVo.lag10,
dVo.lag11,
dVo.lag12,
dVo.lag13,
dVo.lag14,
MACD.Open,
MACD.Volume,
Stoch,
RSI.Open,
RSI.Close)
Data.NASDAQ <- cbind(dOp.Px.NASDAQ,
dOp.lag2.Px.NASDAQ,
dOp.lag3.Px.NASDAQ,
dOp.lag4.Px.NASDAQ,
dOp.lag5.Px.NASDAQ,
dOp.lag6.Px.NASDAQ,
dOp.lag7.Px.NASDAQ,
dOp.lag8.Px.NASDAQ,
dOp.lag9.Px.NASDAQ,
dOp.lag10.Px.NASDAQ,
dOp.lag11.Px.NASDAQ,
dOp.lag12.Px.NASDAQ,
dOp.lag13.Px.NASDAQ,
dOp.lag14.Px.NASDAQ,
dCl.Px.NASDAQ,
dCl.lag2.Px.NASDAQ,
dCl.lag3.Px.NASDAQ,
dCl.lag4.Px.NASDAQ,
dCl.lag5.Px.NASDAQ,
dCl.lag6.Px.NASDAQ,
dCl.lag7.Px.NASDAQ,
dCl.lag8.Px.NASDAQ,
dCl.lag9.Px.NASDAQ,
dCl.lag10.Px.NASDAQ,
dCl.lag11.Px.NASDAQ,
dCl.lag12.Px.NASDAQ,
dCl.lag13.Px.NASDAQ,
dCl.lag14.Px.NASDAQ)
Data.SP500 <- cbind(dOp.Px.SP500,
dOp.lag2.Px.SP500,
dOp.lag3.Px.SP500,
dOp.lag4.Px.SP500,
dOp.lag5.Px.SP500,
dOp.lag6.Px.SP500,
dOp.lag7.Px.SP500,
dOp.lag8.Px.SP500,
dOp.lag9.Px.SP500,
dOp.lag10.Px.SP500,
dOp.lag11.Px.SP500,
dOp.lag12.Px.SP500,
dOp.lag13.Px.SP500,
dOp.lag14.Px.SP500,
dCl.Px.SP500,
dCl.lag2.Px.SP500,
dCl.lag3.Px.SP500,
dCl.lag4.Px.SP500,
dCl.lag5.Px.SP500,
dCl.lag6.Px.SP500,
dCl.lag7.Px.SP500,
dCl.lag8.Px.SP500,
dCl.lag9.Px.SP500,
dCl.lag10.Px.SP500,
dCl.lag11.Px.SP500,
dCl.lag12.Px.SP500,
dCl.lag13.Px.SP500,
dCl.lag14.Px.SP500,
Vo.SP500,
Vo.lag1.SP500,
Vo.lag2.SP500,
Vo.lag3.SP500,
Vo.lag4.SP500,
Vo.lag5.SP500,
Vo.lag6.SP500,
Vo.lag7.SP500,
Vo.lag8.SP500,
Vo.lag9.SP500,
Vo.lag10.SP500,
Vo.lag11.SP500,
Vo.lag12.SP500,
Vo.lag13.SP500,
Vo.lag14.SP500,
dVo.Px.SP500,
dVo.lag2.SP500,
dVo.lag3.SP500,
dVo.lag4.SP500,
dVo.lag5.SP500,
dVo.lag6.SP500,
dVo.lag7.SP500,
dVo.lag8.SP500,
dVo.lag9.SP500,
dVo.lag10.SP500,
dVo.lag11.SP500,
dVo.lag12.SP500,
dVo.lag13.SP500,
dVo.lag14.SP500)
# Renaming columns
names(Data.AAPL)<- c(‘Op.Px’,
‘Op.lag1.Px’,
‘Op.lag2.Px’,
‘Op.lag3.Px’,
‘Op.lag4.Px’,
‘Op.lag5.Px’,
‘Op.lag6.Px’,
‘Op.lag7.Px’,
‘Op.lag8.Px’,
‘Op.lag9.Px’,
‘Op.lag10.Px’,
‘Op.lag11.Px’,
‘Op.lag12.Px’,
‘Op.lag13.Px’,
‘Op.lag14.Px’,
‘dOp.Px’,
‘dOp.lag2.Px’,
‘dOp.lag3.Px’,
‘dOp.lag4.Px’,
‘dOp.lag5.Px’,
‘dOp.lag6.Px’,
‘dOp.lag7.Px’,
‘dOp.lag8.Px’,
‘dOp.lag9.Px’,
‘dOp.lag10.Px’,
‘dOp.lag11.Px’,
‘dOp.lag12.Px’,
‘dOp.lag13.Px’,
‘dOp.lag14.Px’,
‘Cl.Px’,
‘Cl.lag1.Px’,
‘Cl.lag2.Px’,
‘Cl.lag3.Px’,
‘Cl.lag4.Px’,
‘Cl.lag5.Px’,
‘Cl.lag6.Px’,
‘Cl.lag7.Px’,
‘Cl.lag8.Px’,
‘Cl.lag9.Px’,
‘Cl.lag10.Px’,
‘Cl.lag11.Px’,
‘Cl.lag12.Px’,
‘Cl.lag13.Px’,
‘Cl.lag14.Px’,
‘dCl.Px’,
‘dCl.lag2.Px’,
‘dCl.lag3.Px’,
‘dCl.lag4.Px’,
‘dCl.lag5.Px’,
‘dCl.lag6.Px’,
‘dCl.lag7.Px’,
‘dCl.lag8.Px’,
‘dCl.lag9.Px’,
‘dCl.lag10.Px’,
‘dCl.lag11.Px’,
‘dCl.lag12.Px’,
‘dCl.lag13.Px’,
‘dCl.lag14.Px’,
‘High.Px’,
‘Low.Px’,
‘Vo’,
‘Vo.lag1’,
‘Vo.lag2’,
‘Vo.lag3’,
‘Vo.lag4’,
‘Vo.lag5’,
‘Vo.lag6’,
‘Vo.lag7’,
‘Vo.lag8’,
‘Vo.lag9’,
‘Vo.lag10’,
‘Vo.lag11’,
‘Vo.lag12’,
‘Vo.lag13’,
‘Vo.lag14’,
‘dVo.Px’,
‘dVo.lag2’,
‘dVo.lag3’,
‘dVo.lag4’,
‘dVo.lag5’,
‘dVo.lag6’,
‘dVo.lag7’,
‘dVo.lag8’,
‘dVo.lag9’,
‘dVo.lag10’,
‘dVo.lag11’,
‘dVo.lag12’,
‘dVo.lag13’,
‘dVo.lag14’,
‘MACD.Open’,
‘MACD.Open.signal’,
‘MACD.Volume’,
‘MACD.Volume.signal’,
‘Stoch.fastK’,
‘Stoch.fastD’,
‘Stoch.slowD’,
‘RSI.Open’,
‘RSI.Close’)
names(Data.NASDAQ)<- c(‘dOp.Px.NASDAQ’,
‘dOp.lag2.Px.NASDAQ’,
‘dOp.lag3.Px.NASDAQ’,
‘dOp.lag4.Px.NASDAQ’,
‘dOp.lag5.Px.NASDAQ’,
‘dOp.lag6.Px.NASDAQ’,
‘dOp.lag7.Px.NASDAQ’,
‘dOp.lag8.Px.NASDAQ’,
‘dOp.lag9.Px.NASDAQ’,
‘dOp.lag10.Px.NASDAQ’,
‘dOp.lag11.Px.NASDAQ’,
‘dOp.lag12.Px.NASDAQ’,
‘dOp.lag13.Px.NASDAQ’,
‘dOp.lag14.Px.NASDAQ’,
‘dCl.Px.NASDAQ’,
‘dCl.lag2.Px.NASDAQ’,
‘dCl.lag3.Px.NASDAQ’,
‘dCl.lag4.Px.NASDAQ’,
‘dCl.lag5.Px.NASDAQ’,
‘dCl.lag6.Px.NASDAQ’,
‘dCl.lag7.Px.NASDAQ’,
‘dCl.lag8.Px.NASDAQ’,
‘dCl.lag9.Px.NASDAQ’,
‘dCl.lag10.Px.NASDAQ’,
‘dCl.lag11.Px.NASDAQ’,
‘dCl.lag12.Px.NASDAQ’,
‘dCl.lag13.Px.NASDAQ’,
‘dCl.lag14.Px.NASDAQ’)
names(Data.SP500)<- c(‘dOp.Px.SP500’,
‘dOp.lag2.Px.SP500’,
‘dOp.lag3.Px.SP500’,
‘dOp.lag4.Px.SP500’,
‘dOp.lag5.Px.SP500’,
‘dOp.lag6.Px.SP500’,
‘dOp.lag7.Px.SP500’,
‘dOp.lag8.Px.SP500’,
‘dOp.lag9.Px.SP500’,
‘dOp.lag10.Px.SP500’,
‘dOp.lag11.Px.SP500’,
‘dOp.lag12.Px.SP500’,
‘dOp.lag13.Px.SP500’,
‘dOp.lag14.Px.SP500’,
‘dCl.Px.SP500’,
‘dCl.lag2.Px.SP500’,
‘dCl.lag3.Px.SP500’,
‘dCl.lag4.Px.SP500’,
‘dCl.lag5.Px.SP500’,
‘dCl.lag6.Px.SP500’,
‘dCl.lag7.Px.SP500’,
‘dCl.lag8.Px.SP500’,
‘dCl.lag9.Px.SP500’,
‘dCl.lag10.Px.SP500’,
‘dCl.lag11.Px.SP500’,
‘dCl.lag12.Px.SP500’,
‘dCl.lag13.Px.SP500’,
‘dCl.lag14.Px.SP500’,
‘Vo.SP500’,
‘Vo.lag1.SP500’,
‘Vo.lag2.SP500’,
‘Vo.lag3.SP500’,
‘Vo.lag4.SP500’,
‘Vo.lag5.SP500’,
‘Vo.lag6.SP500’,
‘Vo.lag7.SP500’,
‘Vo.lag8.SP500’,
‘Vo.lag9.SP500’,
‘Vo.lag10.SP500’,
‘Vo.lag11.SP500’,
‘Vo.lag12.SP500’,
‘Vo.lag13.SP500’,
‘Vo.lag14.SP500’,
‘dVo.Px.SP500’,
‘dVo.lag2.SP500’,
‘dVo.lag3.SP500’,
‘dVo.lag4.SP500’,
‘dVo.lag5.SP500’,
‘dVo.lag6.SP500’,
‘dVo.lag7.SP500’,
‘dVo.lag8.SP500’,
‘dVo.lag9.SP500’,
‘dVo.lag10.SP500’,
‘dVo.lag11.SP500’,
‘dVo.lag12.SP500’,
‘dVo.lag13.SP500’,
‘dVo.lag14.SP500’)
# Removing excessive variables from the environment
rm(Op.Px, Op.lag1.Px,
Op.lag2.Px,
Op.lag3.Px,
Op.lag4.Px,
Op.lag5.Px,
Op.lag6.Px,
Op.lag7.Px,
Op.lag8.Px,
Op.lag9.Px,
Op.lag10.Px,
Op.lag11.Px,
Op.lag12.Px,
Op.lag13.Px,
Op.lag14.Px,
dOp.Px,
dOp.lag2.Px,
dOp.lag3.Px,
dOp.lag4.Px,
dOp.lag5.Px,
dOp.lag6.Px,
dOp.lag7.Px,
dOp.lag8.Px,
dOp.lag9.Px,
dOp.lag10.Px,
dOp.lag11.Px,
dOp.lag12.Px,
dOp.lag13.Px,
dOp.lag14.Px,
Cl.Px,
Cl.lag1.Px,
Cl.lag2.Px,
Cl.lag3.Px,
Cl.lag4.Px,
Cl.lag5.Px,
Cl.lag6.Px,
Cl.lag7.Px,
Cl.lag8.Px,
Cl.lag9.Px,
Cl.lag10.Px,
Cl.lag11.Px,
Cl.lag12.Px,
Cl.lag13.Px,
Cl.lag14.Px,
dCl.Px,
dCl.lag2.Px,
dCl.lag3.Px,
dCl.lag4.Px,
dCl.lag5.Px,
dCl.lag6.Px,
dCl.lag7.Px,
dCl.lag8.Px,
dCl.lag9.Px,
dCl.lag10.Px,
dCl.lag11.Px,
dCl.lag12.Px,
dCl.lag13.Px,
dCl.lag14.Px,
High.Px,
Low.Px,
Vo.lag1,
Vo.lag2,
Vo.lag3,
Vo.lag4,
Vo.lag5,
Vo.lag6,
Vo.lag7,
Vo.lag8,
Vo.lag9,
Vo.lag10,
Vo.lag11,
Vo.lag12,
Vo.lag13,
Vo.lag14,
dVo.Px,
dVo.lag2,
dVo.lag3,
dVo.lag4,
dVo.lag5,
dVo.lag6,
dVo.lag7,
dVo.lag8,
dVo.lag9,
dVo.lag10,
dVo.lag11,
dVo.lag12,
dVo.lag13,
dVo.lag14,
MACD.Open,
MACD.Volume,
Stoch,
RSI.Open,
RSI.Close,
Op.Px.NASDAQ,
Op.lag1.Px.NASDAQ,
Op.lag2.Px.NASDAQ,
Op.lag3.Px.NASDAQ,
Op.lag4.Px.NASDAQ,
Op.lag5.Px.NASDAQ,
Op.lag6.Px.NASDAQ,
Op.lag7.Px.NASDAQ,
Op.lag8.Px.NASDAQ,
Op.lag9.Px.NASDAQ,
Op.lag10.Px.NASDAQ,
Op.lag11.Px.NASDAQ,
Op.lag12.Px.NASDAQ,
Op.lag13.Px.NASDAQ,
Op.lag14.Px.NASDAQ,
dOp.Px.NASDAQ,
dOp.lag2.Px.NASDAQ,
dOp.lag3.Px.NASDAQ,
dOp.lag4.Px.NASDAQ,
dOp.lag5.Px.NASDAQ,
dOp.lag6.Px.NASDAQ,
dOp.lag7.Px.NASDAQ,
dOp.lag8.Px.NASDAQ,
dOp.lag9.Px.NASDAQ,
dOp.lag10.Px.NASDAQ,
dOp.lag11.Px.NASDAQ,
dOp.lag12.Px.NASDAQ,
dOp.lag13.Px.NASDAQ,
dOp.lag14.Px.NASDAQ,
Cl.Px.NASDAQ,
Cl.lag1.Px.NASDAQ,
Cl.lag2.Px.NASDAQ,
Cl.lag3.Px.NASDAQ,
Cl.lag4.Px.NASDAQ,
Cl.lag5.Px.NASDAQ,
Cl.lag6.Px.NASDAQ,
Cl.lag7.Px.NASDAQ,
Cl.lag8.Px.NASDAQ,
Cl.lag9.Px.NASDAQ,
Cl.lag10.Px.NASDAQ,
Cl.lag11.Px.NASDAQ,
Cl.lag12.Px.NASDAQ,
Cl.lag13.Px.NASDAQ,
Cl.lag14.Px.NASDAQ,
dCl.Px.NASDAQ,
dCl.lag2.Px.NASDAQ,
dCl.lag3.Px.NASDAQ,
dCl.lag4.Px.NASDAQ,
dCl.lag5.Px.NASDAQ,
dCl.lag6.Px.NASDAQ,
dCl.lag7.Px.NASDAQ,
dCl.lag8.Px.NASDAQ,
dCl.lag9.Px.NASDAQ,
dCl.lag10.Px.NASDAQ,
dCl.lag11.Px.NASDAQ,
dCl.lag12.Px.NASDAQ,
dCl.lag13.Px.NASDAQ,
dCl.lag14.Px.NASDAQ,
Vo.NASDAQ,
High.Px.NASDAQ,
Low.Px.NASDAQ,
MACD.Open.NASDAQ,
Stoch.NASDAQ,
RSI.Open.NASDAQ,
RSI.Close.NASDAQ,
Op.Px.SP500,
Op.lag1.Px.SP500,
Op.lag2.Px.SP500,
Op.lag3.Px.SP500,
Op.lag4.Px.SP500,
Op.lag5.Px.SP500,
Op.lag6.Px.SP500,
Op.lag7.Px.SP500,
Op.lag8.Px.SP500,
Op.lag9.Px.SP500,
Op.lag10.Px.SP500,
Op.lag11.Px.SP500,
Op.lag12.Px.SP500,
Op.lag13.Px.SP500,
Op.lag14.Px.SP500,
dOp.Px.SP500,
dOp.lag2.Px.SP500,
dOp.lag3.Px.SP500,
dOp.lag4.Px.SP500,
dOp.lag5.Px.SP500,
dOp.lag6.Px.SP500,
dOp.lag7.Px.SP500,
dOp.lag8.Px.SP500,
dOp.lag9.Px.SP500,
dOp.lag10.Px.SP500,
dOp.lag11.Px.SP500,
dOp.lag12.Px.SP500,
dOp.lag13.Px.SP500,
dOp.lag14.Px.SP500,
Cl.Px.SP500,
Cl.lag1.Px.SP500,
Cl.lag2.Px.SP500,
Cl.lag3.Px.SP500,
Cl.lag4.Px.SP500,
Cl.lag5.Px.SP500,
Cl.lag6.Px.SP500,
Cl.lag7.Px.SP500,
Cl.lag8.Px.SP500,
Cl.lag9.Px.SP500,
Cl.lag10.Px.SP500,
Cl.lag11.Px.SP500,
Cl.lag12.Px.SP500,
Cl.lag13.Px.SP500,
Cl.lag14.Px.SP500,
dCl.Px.SP500,
dCl.lag2.Px.SP500,
dCl.lag3.Px.SP500,
dCl.lag4.Px.SP500,
dCl.lag5.Px.SP500,
dCl.lag6.Px.SP500,
dCl.lag7.Px.SP500,
dCl.lag8.Px.SP500,
dCl.lag9.Px.SP500,
dCl.lag10.Px.SP500,
dCl.lag11.Px.SP500,
dCl.lag12.Px.SP500,
dCl.lag13.Px.SP500,
dCl.lag14.Px.SP500,
High.Px.SP500,
Low.Px.SP500,
Vo.SP500,
Vo.lag1.SP500,
Vo.lag2.SP500,
Vo.lag3.SP500,
Vo.lag4.SP500,
Vo.lag5.SP500,
Vo.lag6.SP500,
Vo.lag7.SP500,
Vo.lag8.SP500,
Vo.lag9.SP500,
Vo.lag10.SP500,
Vo.lag11.SP500,
Vo.lag12.SP500,
Vo.lag13.SP500,
Vo.lag14.SP500,
dVo.Px.SP500,
dVo.lag2.SP500,
dVo.lag3.SP500,
dVo.lag4.SP500,
dVo.lag5.SP500,
dVo.lag6.SP500,
dVo.lag7.SP500,
dVo.lag8.SP500,
dVo.lag9.SP500,
dVo.lag10.SP500,
dVo.lag11.SP500,
dVo.lag12.SP500,
dVo.lag13.SP500,
dVo.lag14.SP500,
MACD.Open.SP500,
MACD.Volume.SP500,
Stoch.SP500,
RSI.Open.SP500,
RSI.Close.SP500,
data.stoch,
data.stoch.NASDAQ,
data.stoch.SP500,
kTimeframe)
# Fixing tails of lagging and fixing fix of shortness xD
Data.AAPL <- Data.AAPL[complete.cases(Data.AAPL[1:(nrow(Data.AAPL) — 1),]),]
Data.NASDAQ <- Data.NASDAQ[complete.cases(Data.NASDAQ[1:(nrow(Data.NASDAQ) — 1),]),]
Data.SP500 <- Data.SP500[complete.cases(Data.SP500[1:(nrow(Data.SP500) — 1),]),]
# Combaning data
Data <- cbind(Data.AAPL, Data.SP500)
Data <- Data[complete.cases(Data),]
#============================================Visualization=====================
par(col = «black», bty = «l»)
plot(AAPL.M1$AAPL.Close, type = «l», main = «Timeframe composition»,
xlab = «time», ylab = «quote»)
lines(AAPL.M15$AAPL.Close,col = «red»)
rm(AAPL.M1, AAPL.M15, Data.AAPL, Data.NASDAQ, Data.SP500, NASDAQ.M1,
NASDAQ.M15, SP500.M1, SP500.M15, timeframe)
save.image(«I:/DataMining/#PROJECTS/Diplom/DATA/Data.tidyed.RData»)
Приложение 2
#Establishing library
library(quantmod)
library(FSelector)
#Loading tydied data
load(«I:/DataMining/#PROJECTS/Diplom/DATA/Data.tidyed.RData»)
#====================================================Filtering=================
# Linear correlations
lin.corr <- linear.correlation(dCl.Px ~ Op.Px + Op.lag1.Px + Op.lag2.Px + Op.lag3.Px + Op.lag4.Px + Op.lag5.Px + Op.lag6.Px + Op.lag7.Px + Op.lag8.Px + Op.lag9.Px + Op.lag10.Px + Op.lag11.Px +Op.lag12.Px + Op.lag13.Px + Op.lag14.Px + dOp.Px + dOp.lag2.Px + dOp.lag3.Px + dOp.lag4.Px + dOp.lag5.Px + dOp.lag6.Px + dOp.lag7.Px + dOp.lag8.Px + dOp.lag9.Px + dOp.lag10.Px + dOp.lag11.Px + dOp.lag12.Px + dOp.lag13.Px + dOp.lag14.Px + Cl.Px + Cl.lag1.Px + Cl.lag2.Px + Cl.lag3.Px + Cl.lag4.Px + Cl.lag5.Px + Cl.lag6.Px + Cl.lag7.Px +Cl.lag8.Px + Cl.lag9.Px + Cl.lag10.Px+ Cl.lag11.Px + Cl.lag12.Px + Cl.lag13.Px + Cl.lag14.Px + dCl.lag2.Px + dCl.lag3.Px + dCl.lag4.Px + dCl.lag5.Px + dCl.lag6.Px + dCl.lag7.Px + dCl.lag8.Px + dCl.lag9.Px + dCl.lag10.Px + dCl.lag11.Px + dCl.lag12.Px + dCl.lag13.Px + dCl.lag14.Px + High.Px + Low.Px + Vo + Vo.lag1 + Vo.lag2 + Vo.lag3 + Vo.lag4 + Vo.lag5 + Vo.lag6 + Vo.lag7 + Vo.lag8 + Vo.lag9 + Vo.lag10 + Vo.lag11 + Vo.lag12 + Vo.lag13 + Vo.lag14 + dVo.Px + dVo.lag2 + dVo.lag3 + dVo.lag4 + dVo.lag5 + dVo.lag6 + dVo.lag7 + dVo.lag8 + dVo.lag9 + dVo.lag10 + dVo.lag11 + dVo.lag12 + dVo.lag13 + dVo.lag14 + MACD.Open + MACD.Open.signal + MACD.Volume + MACD.Volume.signal + Stoch.fastK + Stoch.fastD + Stoch.slowD + RSI.Open + RSI.Close + dOp.Px.SP500 + dOp.lag2.Px.SP500 + dOp.lag3.Px.SP500 + dOp.lag4.Px.SP500 + dOp.lag5.Px.SP500+ dOp.lag6.Px.SP500 + dOp.lag7.Px.SP500 + dOp.lag8.Px.SP500 + dOp.lag9.Px.SP500 + dOp.lag10.Px.SP500 + dOp.lag11.Px.SP500 + dOp.lag12.Px.SP500 + dOp.lag13.Px.SP500 + dOp.lag14.Px.SP500 + dCl.Px.SP500 + dCl.lag2.Px.SP500 + dCl.lag3.Px.SP500 + dCl.lag4.Px.SP500 + dCl.lag5.Px.SP500 + dCl.lag6.Px.SP500 + dCl.lag7.Px.SP500 + dCl.lag8.Px.SP500 + dCl.lag9.Px.SP500+ dCl.lag10.Px.SP500 + dCl.lag11.Px.SP500 + dCl.lag12.Px.SP500 + dCl.lag13.Px.SP500 + dCl.lag14.Px.SP500 + Vo.SP500+ Vo.lag1.SP500 + Vo.lag2.SP500 + Vo.lag3.SP500 + Vo.lag4.SP500 + Vo.lag5.SP500 + Vo.lag6.SP500 + Vo.lag7.SP500+ Vo.lag8.SP500 + Vo.lag9.SP500 + Vo.lag10.SP500 + Vo.lag11.SP500 + Vo.lag12.SP500 + Vo.lag13.SP500 + Vo.lag14.SP500+ dVo.Px.SP500 + dVo.lag2.SP500 + dVo.lag3.SP500 + dVo.lag4.SP500 + dVo.lag5.SP500 + dVo.lag6.SP500 + dVo.lag7.SP500+ dVo.lag8.SP500 + dVo.lag9.SP500 + dVo.lag10.SP500 + dVo.lag11.SP500 + dVo.lag12.SP500 + dVo.lag13.SP500+ dVo.lag14.SP500,data = Data)
# Information entropy
information.entropy <- information.gain(dCl.Px ~ Op.Px + Op.lag1.Px + Op.lag2.Px + Op.lag3.Px + Op.lag4.Px + Op.lag5.Px + Op.lag6.Px + Op.lag7.Px + Op.lag8.Px + Op.lag9.Px + Op.lag10.Px + Op.lag11.Px +Op.lag12.Px + Op.lag13.Px + Op.lag14.Px + dOp.Px + dOp.lag2.Px + dOp.lag3.Px + dOp.lag4.Px + dOp.lag5.Px + dOp.lag6.Px + dOp.lag7.Px + dOp.lag8.Px + dOp.lag9.Px + dOp.lag10.Px + dOp.lag11.Px + dOp.lag12.Px + dOp.lag13.Px + dOp.lag14.Px + Cl.Px + Cl.lag1.Px + Cl.lag2.Px + Cl.lag3.Px + Cl.lag4.Px + Cl.lag5.Px + Cl.lag6.Px + Cl.lag7.Px +Cl.lag8.Px + Cl.lag9.Px + Cl.lag10.Px+ Cl.lag11.Px + Cl.lag12.Px + Cl.lag13.Px + Cl.lag14.Px + dCl.lag2.Px + dCl.lag3.Px + dCl.lag4.Px + dCl.lag5.Px + dCl.lag6.Px + dCl.lag7.Px + dCl.lag8.Px + dCl.lag9.Px + dCl.lag10.Px + dCl.lag11.Px + dCl.lag12.Px + dCl.lag13.Px + dCl.lag14.Px + High.Px + Low.Px + Vo + Vo.lag1 + Vo.lag2 + Vo.lag3 + Vo.lag4 + Vo.lag5 + Vo.lag6 + Vo.lag7 + Vo.lag8 + Vo.lag9 + Vo.lag10 + Vo.lag11 + Vo.lag12 + Vo.lag13 + Vo.lag14 + dVo.Px + dVo.lag2 + dVo.lag3 + dVo.lag4 + dVo.lag5 + dVo.lag6 + dVo.lag7 + dVo.lag8 + dVo.lag9 + dVo.lag10 + dVo.lag11 + dVo.lag12 + dVo.lag13 + dVo.lag14 + MACD.Open + MACD.Open.signal + MACD.Volume + MACD.Volume.signal + Stoch.fastK + Stoch.fastD + Stoch.slowD + RSI.Open + RSI.Close + dOp.Px.SP500 + dOp.lag2.Px.SP500 + dOp.lag3.Px.SP500 + dOp.lag4.Px.SP500 + dOp.lag5.Px.SP500+ dOp.lag6.Px.SP500 + dOp.lag7.Px.SP500 + dOp.lag8.Px.SP500 + dOp.lag9.Px.SP500 + dOp.lag10.Px.SP500 + dOp.lag11.Px.SP500 + dOp.lag12.Px.SP500 + dOp.lag13.Px.SP500 + dOp.lag14.Px.SP500 + dCl.Px.SP500 + dCl.lag2.Px.SP500 + dCl.lag3.Px.SP500 + dCl.lag4.Px.SP500 + dCl.lag5.Px.SP500 + dCl.lag6.Px.SP500 + dCl.lag7.Px.SP500 + dCl.lag8.Px.SP500 + dCl.lag9.Px.SP500+ dCl.lag10.Px.SP500 + dCl.lag11.Px.SP500 + dCl.lag12.Px.SP500 + dCl.lag13.Px.SP500 + dCl.lag14.Px.SP500 + Vo.SP500 + Vo.lag1.SP500 + Vo.lag2.SP500 + Vo.lag3.SP500 + Vo.lag4.SP500 + Vo.lag5.SP500 + Vo.lag6.SP500 + Vo.lag7.SP500 + Vo.lag8.SP500 + Vo.lag9.SP500 + Vo.lag10.SP500 + Vo.lag11.SP500 + Vo.lag12.SP500 + Vo.lag13.SP500 + Vo.lag14.SP500 + dVo.Px.SP500 + dVo.lag2.SP500 + dVo.lag3.SP500 + dVo.lag4.SP500 + dVo.lag5.SP500 + dVo.lag6.SP500 + dVo.lag7.SP500+ dVo.lag8.SP500 + dVo.lag9.SP500 + dVo.lag10.SP500 + dVo.lag11.SP500 + dVo.lag12.SP500 + dVo.lag13.SP500 + dVo.lag14.SP500,data = Data)
#====================================================Data output===============
names(lin.corr)<- c(‘linear correlation’)
names(information.entropy)<- c(‘ informational entropy’)
data.output <- cbind(lin.corr, information.entropy)
write.table(data.output,file = «I:/DataMining/#PROJECTS/Diplom/Materials/Feature selection.txt», sep = » «)
featured.variables <- c(‘dOp.Px’,
‘dOp.lag2.Px’,
‘dCl.lag2.Px’,
‘dCl.lag3.Px’,
‘dCl.lag4.Px’,
‘dCl.lag5.Px’,
‘dCl.lag6.Px’,
‘dCl.lag7.Px’,
‘dCl.lag8.Px’,
‘dCl.lag9.Px’,
‘dCl.lag10.Px’,
‘dCl.lag11.Px’,
‘dCl.lag12.Px’,
‘Vo’,
‘Stoch.fastK’,
‘Stoch.fastD’,
‘RSI.Close’,
‘dCl.Px.SP500’,
‘dCl.lag2.Px.SP500’,
‘dCl.lag3.Px.SP500’,
‘dCl.lag4.Px.SP500’)
rm(information.entropy, lin.corr, data.output)
Data.featured <- Data[,featured.variables]
Data.featured <- cbind(Data$dCl.Px, Data.featured)
#====================================================Visualization=============
# Visualization correlations
panel.cor <- function(x, y, digits = 2, pref = «», cex.cor){
usr <- par(«usr»);on.exit(par(usr))
par(usr = c(0,1,0,1))
r <- abs(cor(x, y, use = «complete.obs»))
txt <- format(c(r,0.123456789), digits = digits)[1]
txt <- paste(pref, txt, sep=»»)
if(missing(cex.cor)) cex <- 0.8/strwidth(txt)
text(0.5,0.5, txt, cex = cex * r)
pairs(dCl.Px ~ dOp.Px + dOp.lag2.Px + dCl.lag2.Px + dCl.lag3.Px + Vo +
Stoch.fastK + Stoch.fastD + RSI.Close + dCl.lag2.Px.SP500 +
dCl.lag3.Px.SP500 + dCl.lag4.Px.SP500,data = Data,
lower.panel = panel.smooth, upper.panel = panel.cor)
rm(panel.cor)
Приложение 3
# Establishing library
library(rpart)
library(adabag)
library(parallel)
# Loading tydied data
load(«I:/DataMining/#PROJECTS/Diplom/DATA/Data.tidyed.RData»)
# Creating dataframe
dF <- data.frame(Data[1:520, featured.variables])# 1:6551 is a range of 2005 year
# Checking NA’s
which(is.na(dF))
kN <- 501# Range of valuation. Need for comparibility
kM <- 3# Range of prediction
parametr.valuation <- expand.grid(kN, n = c(300,350,400,450,500),
parameter.maxdepth = c(8:24),
mfinal = 30)
index <- c(1:100)# Range of application of the function
index.par <- (1:nrow(parametr.valuation))# Range of valuation in grid
FunFitAndPred <- function(dF, index.par, index){
# Function split rolling window on train and test parts. Next step is modeling
# using rpart algorithms the model on the train sample. Futhermore this model
# boosts in ADAboost algorithm. Last step is predicting tests on the both
# samples — test and train.
# Agrs:
# dF: dataframe, where rolling window exist.
# index.par: index of matrix in global environment, which include sets of
# parameters. Set of parameters uses for fitting and modelling.
# index: index of dataframe, establishing rolling window position
# Returns:
# vector of errors in train and test sample
par<- parametr.valuation[index.par,]
# Routing parameters
N <- as.numeric(par[1])
n <- as.numeric(par[2])
m <- as.numeric(par[3])
control<- rpart.control(maxdepth = as.numeric(par[4]), xval = 0)
mfinal <- as.numeric(par[5])
# Training sample
train <- dF[(kN — n — 1 + index):(kN — 1 + index),]
train.predictand <- factor(ifelse(tail(train$dCl.Px, -1)>0,1,0),
levels = c(1,0))
train.predictand <- as.matrix(train.predictand)
colnames(train.predictand)<- c(‘predictand’)
train.predictors <- head(train[,c(1:21)], -1)
train.data <- cbind(train.predictand, train.predictors)
# Fiting tree and ADAboosting
fit <- boosting(predictand ~ dOp.Px + dOp.lag2.Px + dCl.lag2.Px + dCl.lag3.Px
+ dCl.lag4.Px + dCl.lag5.Px + dCl.lag6.Px + dCl.lag7.Px
+ dCl.lag8.Px + dCl.lag9.Px + dCl.lag10.Px + dCl.lag11.Px
+ dCl.lag12.Px + Vo + Stoch.fastK + Stoch.fastD + RSI.Close
+ dCl.Px.SP500 + dCl.lag2.Px.SP500 + dCl.lag3.Px.SP500
+ dCl.lag4.Px.SP500,data = train.data, mfinal = mfinal,
coeflearn = ‘Breiman’,control = control)
# Test sample
test <- dF[(kN + index):(kN + kM + index),]
test.predictand <- factor(ifelse(tail(test$dCl.Px, -1)>0,1,0),
levels = c(1,0))
test.predictand <- as.matrix(test.predictand)
colnames(test.predictand)<- c(‘predictand’)
test.predictors <- head(test[,c(1:21)], -1)
test.data <- cbind(test.predictand, test.predictors)
# Predicting
train.predict <- predict(fit, train.data)
test.predict <- predict(fit, test.data)
output <- c(test.predict[6])
print(«PROCESSING»)
return(output)
# Evaluating model
FunEval <- function(dF, index.par){
# Function evaluates model function FunFitandPred in loop.
# Agrs:
# dF: dataframe, where rolling window exist.
# index.par: index of matrix in global environment, which include sets of
# parameters. Set of parameters uses for fitting and modelling.
# Returns:
# list of vector of predictions with current used set of parameters
internal.loop <- as.character(sapply(index, FunFitAndPred, dF = dF,
index.par= index.par))
print(«==================LOOP==================»)
return(internal.loop)
optim.grid <- lapply(index.par, FunEval, dF = dF)
# Counting performance
time.FunFitandPred <- system.time(FunFitAndPred(dF = dF, index.par = 1,
index =1))
time.lapply.index <- system.time(lapply(index, FunFitAndPred, dF = dF,
index.par = index.par))
time.sapply.index <- system.time(sapply(index, FunFitAndPred, dF = dF,
index.par = index.par))
time.as.character.sapply.index <- system.time(as.character(sapply(index,
FunFitAndPred,
dF = dF,
index.par = index.par)))
time.optim.grid <- system.time(lapply(index.par, FunEval, dF = dF))
# Counting av efficient
optim.result.1 <- as.numeric(optim.grid[[1]])
for(i in1:84){
optim.result.0 <- as.numeric(optim.grid[[i+1]])
optim.result.1 <-rbind(optim.result.1, optim.result.0)
optim.result <- optim.result.1
rm(i, optim.result.1, optim.result.0)
optim.result <- as.data.frame(t(optim.result))
colnames(optim.result)<- 1:85
rownames(optim.result)<- 1:100
optim.result.mean <- as.data.frame(colMeans(optim.result))
optim.set.parameters.index <- which(optim.result.mean == min(optim.result.mean))
optim.set.parameters <- parametr.valuation[optim.set.parameters.index,]
rm(optim.result, optim.result.mean, kM, kN, index, index.par, parametr.valuation)
save.image(«I:/DataMining/#PROJECTS/Diplom/DATA/Data.optimized.RData»)
Приложение 4
# Establishing library
library(rpart)
library(adabag)
library(parallel)
# Loading data
load(«I:/DataMining/#PROJECTS/Diplom/DATA/Data.optimized.RData»)
# Model parameters
kN.optim <- 501# Range of valuation. Need for comparibility
kn.optim <- 500
kM.optim <- 3# Range of prediction
kparameter.maxdepth.optim = 17
kmfinal.optim = 30
index.optim <- c(101:2101)# Range of application of the function
FunFitAndPredOptimized <- function(dF, index.optim){
# Function split rolling window on train and test parts. Next step is modeling
# using rpart algorithms the model on the train sample. Futhermore this model
# boosts in ADAboost algorithm. Last step is predicting tests on the both
# samples — test and train.
# Agrs:
# dF: dataframe, where rolling window exist.
# index: index of dataframe, establishing rolling window position
# Returns:
# vector of errors in train and test sample
# Routing parameters
N <- kN.optim
n <- kn.optim
m <- kM.optim
control<- rpart.control(maxdepth = kparameter.maxdepth.optim, xval = 0)
mfinal <- kmfinal.optim
# Training sample
train <- dF[(N — n — 1 + index.optim):(N — 1 + index.optim),]
train.predictand <- factor(ifelse(tail(train$dCl.Px, -1)>0,1,0),
levels = c(1,0))
train.predictand <- as.matrix(train.predictand)
colnames(train.predictand)<- c(‘predictand’)
train.predictors <- head(train[,c(1:21)], -1)
train.data <- cbind(train.predictand, train.predictors)
# Fiting tree and ADAboosting
fit <- boosting(predictand ~ dOp.Px + dOp.lag2.Px + dCl.lag2.Px + dCl.lag3.Px
+ dCl.lag4.Px + dCl.lag5.Px + dCl.lag6.Px + dCl.lag7.Px
+ dCl.lag8.Px + dCl.lag9.Px + dCl.lag10.Px + dCl.lag11.Px
+ dCl.lag12.Px + Vo + Stoch.fastK + Stoch.fastD + RSI.Close
+ dCl.Px.SP500 + dCl.lag2.Px.SP500 + dCl.lag3.Px.SP500
+ dCl.lag4.Px.SP500,data = train.data, mfinal = mfinal,
coeflearn = ‘Breiman’,control = control)
# Test sample
test <- dF[(N + index.optim):(N + m + index.optim),]
test.predictand <- factor(ifelse(tail(test$dCl.Px, -1)>0,1,0),
levels = c(1,0))
test.predictand <- as.matrix(test.predictand)
colnames(test.predictand)<- c(‘predictand’)
test.predictors <- head(test[,c(1:21)], -1)
test.data <- cbind(test.predictand, test.predictors)
# Predicting
train.predict <- predict(fit, train.data)
test.predict <- predict(fit, test.data)
output <- c(test.predict[6])
print(«PROCESSING»)
return(output)
model.error <- sapply(index.optim, FunFitAndPredOptimized, dF = dF)
model.error.0 <- as.numeric(model.error[[1]])
for(i in1:2000){
model.error.1 <- as.numeric(model.error[[i+1]])
model.error.0 <-rbind(model.error.0, model.error.1)
model.error <- model.error.0
rm(i, model.error.1, model.error.0)
av.error <- colMeans(as.data.frame(model.error))
Размещено на