Автоматизация биржевой торговли

Виды биржевой торговли. Методология автоматизации биржевых операций: структура, функции и алгоритм работы. Методы анализа движения биржевых цен. Блок работы с базой данных. Тестирование результатов анализа. Алгоритм работы системы, основной функционал.

Рубрика Программирование, компьютеры и кибернетика
Вид дипломная работа
Язык русский
Дата добавления 25.08.2017
Размер файла 942,7 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

где вектора - являются весовыми коэффициентами авторегрессионной и скользящей средней составляющих соответственно.

Интегрированная авторегрессионная модель - скользящего среднего - это модификация модели ARMA(p,q) для нестационарных рядов с разностью порядка d, которое делает ряд стационарным. Данная модель имеет следующее обозначение - ARIMA(p,d,q), однако данную модель можно записать как ARMA(p+d,q). Это значит, что при d=0 получается обычная модель ARMA(p,q). В общем виде модель ARIMA имеет вид:

где - является разностью порядка d.

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

где q - порядок модели, - коэффициенты модели, а

В случае, когда сумма всех коэффициентов модели меньше единицы - временной ряд является стационарным, если эта сумма равна 1, то получаем интегрированную ARCH.

Обобщенной версией модели ARCH является модель GARCH. Данная модель, в отличие от ARCH, предполагает, что значения условной дисперсии зависят не только от квадратов прошлых значений ряда, но и от квадратов прошлых значений условной дисперсии данного ряда. Таким образом формула GARCH-модели имеет вид:

В случае, когда сумма всех коэффициентов модели меньше единицы - временной ряд является стационарным, если эта сумма равна 1, то получаем интегрированную IGARCH.

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

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

2.1.5 Блок визуализации данных

Данный блок даёт возможность оценивать данные и модели, построенные по обучающим данным. Иногда зависимости можно заметить на графике, а также оценить качество той или иной модели.

Графики временных рядов позволяют оценить движение данных, а также то, насколько хорошо модель подходит к данному временному ряду (рисунок 10).

Рисунок 10. График временного ряда.

В системе реализованы графики для анализа тренда (рисунок 11). В местах перегибов происходит изменение тренда. Если линия переходит из значения 1 в значение (-1), значит открывается нисходящий тренд. Если линия переходит из значения (-1) в 1, значит открывается восходящий тренд.

Рисунок 11. График поиска трендов.

Более того, существует график, показывающий отклонения графика (рисунок 12). Данный график позволяет оценить и сравнить эффективность того или иного метода анализа визуально.

Рисунок 12. График разностей значений.

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

2.1.6 Блок тестирования результатов анализа

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

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

Таблица 2. Тестовые промежутки.

Тестовый временной промежуток 1

Тестовый временной промежуток 2

Тестовый временной промежуток 3

Тестовый временной промежуток 4

2017/1/1 - 2017/2/1

2017/1/1 - 2017/3/1

2017/1/1 - 2017/4/1

2017/1/1 - 2017/5/1

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

В данной системе были выбраны и реализованы следующие критерии эффективности: средняя ошибка, абсолютная средняя ошибка, средний процент ошибок, средний абсолютный процент ошибок, средняя квадратичная ошибка, коэффициент детерминации, информационный критерий Аике, байесовский информационный критерий.

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

2.1.7 Торговый блок

Данный блок предназначен, чтобы тестировать модели и предположения, которые были созданы системой. Он организован с помощью специального модуля backtesting'а на python, который позволяет имитировать торги.

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

2.1.8 Блок взаимодействия с пользователем

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

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

Рисунок 13. Интерфейс пользовательского блока.

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

Группа элементов «Аналитический блок» - это та часть, куда пользователь вводит искомые данные. Данная группа элементов содержит две другие группы элементов («Начало периода» и «Конец периода»), поле ввода названия акции, а также кнопку «Анализ». Группа элементов «Начало периода» содержит поля для ввода года, месяца и дня начало периода для анализа. Группа элементов «Конец периода» содержит поля для ввода года, месяца и дня начало периода для анализа. При нажатии кнопки «Анализ» инициируется процесс анализа данных.

Группа элементов «Результат анализа» - тот блок, который содержит в себе таблицу, в которую выводятся результаты анализа.

Группа элементов «Графики» - это блок визуализации результатов анализа, который содержит в себе элемент по выводу графика и поле для ввода названия модели, чей график нужно отобразить. А также три кнопки, которые отвечают за свой тип графика: «График временного ряда», «График анализа тренда» и «График разностей». Каждая из кнопок выводит в поле для вывода графика запрошенный график.

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

2.2 Основной функционал системы

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

· скачивания данных;

· обработки и подготовки данных;

· архивации данных;

· визуализации данных;

· анализа данных;

· улучшения параметров аналитических моделей;

· тестирования работы моделей;

· проверки качества и эффективности моделей;

· имитации торговли.

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

Функция скачивания данных заключается в формировании запроса от пользователя, передачу его на сайт yahoo.finance.com и получение готовых данных с сайта. Данная функция позволяет получать данные практически по всем ценным бумага, представленным на сайте. Актуальность данной функции для системы велика, т.к. без данных анализ невозможен. Более того, в системе данная функция реализована таким образом, что пользователь способен получить данные за любой временной период. Блок, который реализует функцию не создаёт никаких лишних файлов и проверок, что позволяет исполнять скачивание данных за достаточно короткий промежуток времени.

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

Ещё одна функция, завязанная на обработке и работе с данными - это функция архивация данных. Её наличие не так очевидно и необходимо на первый взгляд. Учитывая, что получение данных не вызывает никаких проблем и занимает небольшое количество времени, как и сам анализ. Однако, стоит отметить при активном использовании системы и проведении множества тестов на различных данных возникнет вопрос о стабильности системы и сравнении результатов всех тестов, дабы выделить те модели и те критерии, которые показывают наиболее релевантные результаты. Отсюда исходит необходимость хранения истории работы с системой. Данная функция берёт загруженный набор данных для тестов и сохраняет их в специализированной базе данных. Более того, архивируются не только сами данные, но и качественные результаты эффективности работы каждой модели.

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

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

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

Функция тестирования результатов заключается в построении предсказания по всем моделям на данных, отличных от тех, на основе которых проводился анализ и последующее построение и оптимизация моделей. Данная функция позволяет оценить реальную работу моделей, то как они работают, и насколько близки предсказанные значения к реальным.

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

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

2.3 Алгоритм работы системы

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

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

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

Ещё блок взаимодействия с пользователем связан с торговым блоком, т.к. именно пользователь, оценивая результаты анализа решает, проводить имитационное моделирование торгов или нет.

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

Блок анализа данных напрямую связан только с тестовым блоком. После построения моделей данных об этих моделях передаются тестовому блоку для тестирования и проверки качества моделей.

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

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

Рисунок 14. Алгоритм работы системы.

Глава 3. Оценка эффективности автоматической биржевой системы

3.1 Выбор критериев эффективности

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

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

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

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

где - это реальное значение показателя, а - спрогнозированное системой.

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

где - это реальное значение показателя, а - спрогнозированное системой.

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

где - это значения множества, а - это среднее значение по всему множеству.

Ещё один критерий, который используется для оценки качества моделей - это коэффициент детерминации. R^2 - это доля дисперсии объясняемой переменной, моделирование которой происходит с помощью данного набора переменных. Иначе говоря, основной смысл данного критерия заключен в том, что чем ближе значение к 1, тем лучше построенная модель соответствует набору данных. Для адекватности модели значение показателя должны быть больше 0.5. Формула для расчёта данного коэффициента имеет вид:

где - дисперсия случайной ошибки модели, - дисперсия зависящей переменной.

Следующие три коэффициента относятся только к авторегрессионным моделям.

Первый такой критерий в системе - это информационный критерий Акаике (AIC). Данный критерий применяется только для оценки статистических моделей. Более того, статистическая модель должна строится с помощью метода максимального правдоподобия. Формула для расчета данного критерия в общем случае имеет вид:

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

где n - это число наблюдений, а RSS - остаточная сумма квадратов.

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

Ещё один критерий, который является аналогом AIC и BIC, называется критерий Ханна-Квин (HQC). Данный критерий также используется для выбора наилучшей модели.

3.2 Методика исследования эффективности

В данной работе проверка работы системы будет производится на акциях двух компаний, принадлежащих отрасли информационных технологий, а именно Microsoft. Анализ будет проводится на двух временных промежутках (таблица 3) с учётом ограничения, которое накладывается тестовым блоком. Временные промежутки для анализа представлены в таблице. Анализ будет проводится по цене закрытия.

Таблица 3. Временные промежутки для анализа.

Временной промежуток 1

Временной промежуток 2

2013/1/1 - 2016/12/31

2015/1/1 - 2016/12/31

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

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

Сначала происходит построение всех скользящих средних. Так как это всего лишь сглаживающие прямые, которые не зависят от размера обучающей выборки, то данные скользящие построены для второго временного промежутка. Простая, треугольная и экспоненциальная скользящие средние построены для трёх разных периодов: быстрого (10), среднего (50) и медленного (100). Такой выбор периодов обусловлен тем, что определение тренда зависит от пересечения или взаимного расположения скользящих средних разных периодов. В нашей системе проверяется верность данного утверждения. Для каждой скользящей средней из всех приведенных выше строится три графика - график временного ряда, график разностей и трендовый график. Для скользящих средних ещё вычисляются критерии MAE, MPE, MAPE и MSE. Данные критерии позволят оценить качество той или иной скользящей средней и сравнить их типы. Касаемо двойной и тройной экспоненциальных скользящих средних, то для них, помимо периодов 10, 50, 100, был выбран ряд параметров beta (для beta [0.25;0.5]) и gamma (для gamma [0.05;0.1]) и с помощью графиков и критериев эффективности, у нас появится возможность определить наилучший вариант с показателями.

Дальше происходит моделирование с помощью методов дискриминантного анализа: логистической регрессии, линейного и квадратичного дискриминантных анализов. Во-первых, в системе происходит сравнение двух типов входных данных: бинарного и количественного. Также происходит поиск оптимального количества переменных для анализа, с учётом минимизации количества параметров и максимизации показателей. В системе рассматривается несколько вариантов: 2, 5, 10, 25. Затем для проверки значений строятся прогнозы на тестовых данных. Для сравнения и оценки результатов производится расчёт показателей MPE для обучающей и тестовой выборок.

Финальная стадия моделирования реализует авторегрессионные модели для заданных рядов. Для заданных рядов сначала происходит определение стационарности ряда. Исходя из полученного значения, производится выбор в пользу интегрированных или не интегрированных моделей. Затем происходит построение моделей с разными порядками для авторегрессионной и скользящей средней составляющих в пределах от 1 до 5. После построения всех моделей выводятся графики моделей и происходит расчёт всех показателей эффективности для тестовых выборок.

3.3 Анализ результатов моделирования

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

Рисунок 15. Графики простой скользящей средней.

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

Другая скользящая средняя - это треугольная скользящая средняя. На графике временного ряда для данной кривой (рисунок 16) отчётливо видно, что кривая с наименьшим периодом повторяет линию реального временного ряда, наиболее качественным образом, тогда как скользящие средней и медленной скорости проявляют себя неадекватно заданному временному ряду.

Рисунок 16. Графики треугольной скользящей средней.

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

Рисунок 17. График экспоненциальной скользящей средней.

Следующий этап анализа заключается в построении моделей классификации методами дискриминантного анализа. Для начала нужно оценить, какого типа набор данных даёт качественные значения для прогнозирования: бинарный или количественный. В случае с моделью логистической регрессии процент верных предсказаний на обучающей выборке равен 55,34203 и на обучаемой выборке 51,41613 для бинарного набора данных, а для количественного набора данных 54,98242 на обучающей выборке и 50,91265 на обучаемой выборке. Данный показатель говорит, что в случае логистической регрессии целесообразнее использовать бинарный набор данных. Для линейного дискриминантного анализа для бинарного набора данных процентный показатель ошибки равен 56,23453 и 52,92742 для обучающей и обучаемой выборкой соответственно. Тогда как для количественного набора данных процентный показатель ошибки для обучающейся выборки равен 54,29462, а для обучаемой 51,39874. Однако, для квадратичного дискриминантного анализа количественный набор данных выдает процент корректных значений равный 57,32093 для обучающих и 53,83722 для обучаемых данных, тогда как для бинарного набора данных эти коэффициенты равны 55,39273 и 51,90234 соответственно. Исходя из этого, для данной системы логистическая регрессия и линейный дискриминантный анализ должны быть построены на бинарном наборе данных, а квадратичный дискриминантный анализ - на количественном.

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

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

Другой критерий, который может оказаться важным для построения итоговых моделей на основании дискриминантного анализа, количество параметров, на основе которых происходит построение моделей данных и их последующие анализ и прогнозирование. В данном исследовании для логистической регрессии наиболее релевантным оказалось наименьшее из рассмотренных значений количества параметров, как для обучающей, так и для обучаемой выборок. Для линейного дискриминантного анализа наиболее релевантными для обучающей выборки оказались значения в диапазоне от 10 до 25, тогда как для обучаемой выборки они проявили себя хуже, чем обычно. Соответственно, определить набор, который будет выдавать качественные результаты для метода линейного дискриминантного анализа оказалось невозможным. Касаясь дискриминантного анализа, то качество результатов повышается, исходя из критерия, вместе с увеличением количества переменных. Однако, стоит отметить, что разница между получаемыми значениями для обучающей и обучаемой выборок составляет больше 20%.

Заключение

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

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

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

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

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

Список литературы

1.Alpaydin, E. (2004). Introduction to Machine Learning.

2.Chan, E. P. (2009). Quantitative Trading: How to Build Your Own Algorithmic Trading Business. New Jersey: John Wiley & Sons, Inc.

3.Erlich, A. A. (1996). Technical Analysis Handbook for the Commodity and Financial Markets. Moscow: INFRA - M .

4.Kijanica, A. S. (2005). Fundamental Analysis of the Financial Markets. Saint-Petersburg: Piter.

5.Microsoft. (2017). социальная сеть разработчиков. Получено из MSDN: https://msdn.microsoft.com/ru-ru/dn308572.aspx

6.Narang, R. K. (2009). Inside The Black Box. New Jersey: John Wiley & Sons, Inc.

7.Schwager, J. D. (1996). Technical Analysis. New Jersey: John Wiley & Sons, Inc.

8.Soren Bisgaard, M. K. (2011). Time Series Analysis and Forecasting by Example.

9.Tsay, R. S. (2001). Analysis of Financial Time Series.

10.А.И.Орлов. (2009). Эконометрика : учебник для вузов. Ростов: Феникс.

11.Белова Е.В., О. Д. (2006). Технический анализ финансовых рынков. Москва.

12.Бокс, Д. (1970). Time series analysis, forecasting and control.

13.Тревор Хасти, Р. Т. (2001). The Elements of Statistical Learning.

Приложения

Блок анализа данных

import DataBlock as dbimport pandas as pdimport datetime as dtimport AnalysisBlock as abimport matplotlib.pyplot as pltimport TestBlock as tbimport statsmodels.tsa.stattools as tsa_testimport statsmodels.tsa.arima_model as ARIMAimport numpy as npfile = open('TestFile.Txt','r')n = file.readlines()Stock_Name = n[0].strip('\n')Stock_Start_Year = str(n[1].strip('\n'))Stock_Start_Month = str(n[2].strip('\n'))Stock_Start_Day = str(n[3].strip('\n'))Stock_End_Year = str(n[4].strip('\n'))Stock_End_Month = str(n[5].strip('\n'))Stock_End_Day = str(n[6].strip('\n'))Stock_Start_Year_Tr = '2016'Stock_Start_Month_Tr = '8'Stock_Start_Day_Tr = '9'Stock_End_Year_Tr = '2017'Stock_End_Month_Tr = '5'Stock_End_Day_Tr = '1'CloseData1 = pd.DataFrame(db.Get_Close_Percent(Stock_Name,dt.datetime(int(Stock_Start_Year), int(Stock_Start_Month), int(Stock_Start_Day)),dt.datetime(int(Stock_End_Year),int(Stock_End_Month), int(Stock_End_Day))))CloseData1Tr = pd.DataFrame(db.Get_Close_Percent(Stock_Name,dt.datetime(int(Stock_Start_Year_Tr), int(Stock_Start_Month_Tr), int(Stock_Start_Day_Tr)),dt.datetime(int(Stock_End_Year_Tr),int(Stock_End_Month_Tr), int(Stock_End_Day_Tr))))CloseData1B = pd.DataFrame(db.Get_Close_Direction(Stock_Name,dt.datetime(int(Stock_Start_Year), int(Stock_Start_Month), int(Stock_Start_Day)),dt.datetime(int(Stock_End_Year),int(Stock_End_Month), int(Stock_End_Day))))CloseData1TrB = pd.DataFrame(db.Get_Close_Direction(Stock_Name,dt.datetime(int(Stock_Start_Year_Tr), int(Stock_Start_Month_Tr), int(Stock_Start_Day_Tr)),dt.datetime(int(Stock_End_Year_Tr),int(Stock_End_Month_Tr), int(Stock_End_Day_Tr))))Stock_Start_Year = '2013'Stock_End_Month_Tr = '3'CloseData2 = pd.DataFrame(db.Get_Close_Percent(Stock_Name,dt.datetime(int(Stock_Start_Year), int(Stock_Start_Month), int(Stock_Start_Day)),dt.datetime(int(Stock_End_Year),int(Stock_End_Month), int(Stock_End_Day))))CloseData2Tr = pd.DataFrame(db.Get_Close_Percent(Stock_Name,dt.datetime(int(Stock_Start_Year_Tr), int(Stock_Start_Month_Tr), int(Stock_Start_Day_Tr)),dt.datetime(int(Stock_End_Year_Tr),int(Stock_End_Month_Tr), int(Stock_End_Day_Tr))))CloseData2B = pd.DataFrame(db.Get_Close_Direction(Stock_Name,dt.datetime(int(Stock_Start_Year), int(Stock_Start_Month), int(Stock_Start_Day)),dt.datetime(int(Stock_End_Year),int(Stock_End_Month), int(Stock_End_Day))))CloseData2TrB = pd.DataFrame(db.Get_Close_Direction(Stock_Name,dt.datetime(int(Stock_Start_Year_Tr), int(Stock_Start_Month_Tr), int(Stock_Start_Day_Tr)),dt.datetime(int(Stock_End_Year_Tr),int(Stock_End_Month_Tr), int(Stock_End_Day_Tr))))listErrors = []tssN = 0.0tssNT = 0.0ts1,ts2 = ab.LogisticRegressionModel(2,CloseData2,CloseData2Tr)tssN+=ts1tssNT+=ts2listErrors.append('#1 LogReg-N-2 MPE_tr: ' + str(ts1) + ' MPE_test: '+ str(ts2))ts1,ts2 = ab.LogisticRegressionModel(5,CloseData2,CloseData2Tr)tssN+=ts1tssNT+=ts2listErrors.append('#1 LogReg-N-5 MPE_tr: ' + str(ts1) + ' MPE_test: '+ str(ts2))ts1,ts2 = ab.LogisticRegressionModel(10,CloseData2,CloseData2Tr)tssN+=ts1tssNT+=ts2listErrors.append('#1 LogReg-N-10 MPE_tr: ' + str(ts1) + ' MPE_test: '+ str(ts2))ts1,ts2 = ab.LogisticRegressionModel(25,CloseData2,CloseData2Tr)tssN+=ts1tssNT+=ts2listErrors.append('#1 LogReg-N-25 MPE_tr: ' + str(ts1) + ' MPE_test: '+ str(ts2))ts1,ts2 = ab.LinearDiscriminantModel(2,CloseData2,CloseData2Tr)tssN+=ts1tssNT+=ts2listErrors.append('#1 LDA-N-2 MPE_tr: ' + str(ts1) + ' MPE_test: '+ str(ts2))ts1,ts2 = ab.LinearDiscriminantModel(5,CloseData2,CloseData2Tr)tssN+=ts1tssNT+=ts2listErrors.append('#1 LDA-N-5 MPE_tr: ' + str(ts1) + ' MPE_test: '+ str(ts2))ts1,ts2 = ab.LinearDiscriminantModel(10,CloseData2,CloseData2Tr)tssN+=ts1tssNT+=ts2listErrors.append('#1 LDA-N-10 MPE_tr: ' + str(ts1) + ' MPE_test: '+ str(ts2))ts1,ts2 = ab.LinearDiscriminantModel(25,CloseData2,CloseData2Tr)tssN+=ts1tssNT+=ts2listErrors.append('#1 LDA-N-25 MPE_tr: ' + str(ts1) + ' MPE_test: '+ str(ts2))ts1,ts2 = ab.QuadraticDiscriminantModel(2,CloseData2,CloseData2Tr)tssN+=ts1tssNT+=ts2listErrors.append('#1 QDA-N-2 MPE_tr: ' + str(ts1) + ' MPE_test: '+ str(ts2))ts1,ts2 = ab.QuadraticDiscriminantModel(5,CloseData2,CloseData2Tr)tssN+=ts1tssNT+=ts2listErrors.append('#1 QDA-N-5 MPE_tr: ' + str(ts1) + ' MPE_test: '+ str(ts2))ts1,ts2 = ab.QuadraticDiscriminantModel(10,CloseData2,CloseData2Tr)tssN+=ts1tssNT+=ts2listErrors.append('#1 QDA-N-10 MPE_tr: ' + str(ts1) + ' MPE_test: '+ str(ts2))ts1,ts2 = ab.QuadraticDiscriminantModel(25,CloseData2,CloseData2Tr)tssN+=ts1tssNT+=ts2listErrors.append('#1 QDA-N-25 MPE_tr: ' + str(ts1) + ' MPE_test: '+ str(ts2))ts1,ts2 = ab.LogisticRegressionModel(2,CloseData2B,CloseData2TrB)tssN+=ts1tssNT+=ts2listErrors.append('#1 LogReg-B-2 MPE_tr: ' + str(ts1) + ' MPE_test: '+ str(ts2))ts1,ts2 = ab.LogisticRegressionModel(5,CloseData2B,CloseData2TrB)tssN+=ts1tssNT+=ts2listErrors.append('#1 LogReg-B-5 MPE_tr: ' + str(ts1) + ' MPE_test: '+ str(ts2))ts1,ts2 = ab.LogisticRegressionModel(10,CloseData2B,CloseData2TrB)tssN+=ts1tssNT+=ts2listErrors.append('#1 LogReg-B-10 MPE_tr: ' + str(ts1) + ' MPE_test: '+ str(ts2))ts1,ts2 = ab.LogisticRegressionModel(25,CloseData2B,CloseData2TrB)tssN+=ts1tssNT+=ts2listErrors.append('#1 LogReg-B-25 MPE_tr: ' + str(ts1) + ' MPE_test: '+ str(ts2))ts1,ts2 = ab.LinearDiscriminantModel(2,CloseData2B,CloseData2TrB)tssN+=ts1tssNT+=ts2listErrors.append('#1 LDA-B-2 MPE_tr: ' + str(ts1) + ' MPE_test: '+ str(ts2))ts1,ts2 = ab.LinearDiscriminantModel(5,CloseData2B,CloseData2TrB)tssN+=ts1tssNT+=ts2listErrors.append('#1 LDA-B-5 MPE_tr: ' + str(ts1) + ' MPE_test: '+ str(ts2))ts1,ts2 = ab.LinearDiscriminantModel(10,CloseData2B,CloseData2TrB)tssN+=ts1tssNT+=ts2listErrors.append('#1 LDA-B-10 MPE_tr: ' + str(ts1) + ' MPE_test: '+ str(ts2))ts1,ts2 = ab.LinearDiscriminantModel(25,CloseData2B,CloseData2TrB)tssN+=ts1tssNT+=ts2listErrors.append('#1 LDA-B-25 MPE_tr: ' + str(ts1) + ' MPE_test: '+ str(ts2))ts1,ts2 = ab.QuadraticDiscriminantModel(2,CloseData2B,CloseData2TrB)tssN+=ts1tssNT+=ts2listErrors.append('#1 QDA-B-2 MPE_tr: ' + str(ts1) + ' MPE_test: '+ str(ts2))ts1,ts2 = ab.QuadraticDiscriminantModel(5,CloseData2B,CloseData2TrB)tssN+=ts1tssNT+=ts2listErrors.append('#1 QDA-B-5 MPE_tr: ' + str(ts1) + ' MPE_test: '+ str(ts2))ts1,ts2 = ab.QuadraticDiscriminantModel(10,CloseData2B,CloseData2TrB)tssN+=ts1tssNT+=ts2listErrors.append('#1 QDA-B-10 MPE_tr: ' + str(ts1) + ' MPE_test: '+ str(ts2))ts1,ts2 = ab.QuadraticDiscriminantModel(25,CloseData2B,CloseData2TrB)tssN+=ts1tssNT+=ts2listErrors.append('#1 QDA-B-25 MPE_tr: ' + str(ts1) + ' MPE_test: '+ str(ts2))print "Nmean: " , tssN/24print "NTmean: " , tssNT/24import mathimport sklearn.metrics as mdef get_MAE(real,predict): result = 0.0 for i in range(len(real)): result += abs(real[i] - predict[i]) result /= len(real) return resultdef get_MPE(real,predict): result = 0.0 for i in range(len(real)): result += (real[i] - predict[i])/real[i] result /= len(real) return result*100def get_MAPE(real,predict): result = 0.0 for i in range(len(real)): result += abs(real[i] - predict[i])/real[i] result /= len(real) return result*100def get_MSE(real,predict): result = 0.0 for i in range(len(real)): result += (real[i] - predict[i])*(real[i] - predict[i]) result /= (len(real)-1) return math.sqrt(result)def get_R_2(real,predict): return m.r2_score(real,predict)def get_all_mistakes(name,real,predict): return name + " MAE: " + str(get_MAE(real,predict)) + " MPE: " + str(get_MPE(real,predict)) + "% MAPE: " + str(get_MAPE(real,predict)) + "% MSE: " + str(get_MSE(real,predict))

import pandas as pdimport numpy as npfrom sklearn import preprocessingfrom sklearn import linear_modelfrom sklearn.discriminant_analysis import LinearDiscriminantAnalysis as LDA,QuadraticDiscriminantAnalysis as QDAdef DataTrend(sma1,name1,sma2,name2,count): sma1 = pd.DataFrame(sma1) sma1.rename(columns={'Today':name1},inplace=True) sma2 = pd.DataFrame(sma2) sma2.rename(columns = {'Today': name2}, inplace = True) TrendList = sma1.join(sma2, how='inner') TrendList = TrendList[count:] TrendList['Trend'] = np.sign(TrendList[name1]-TrendList[name2]) return TrendListdef SimpleMovingAverage(array, period): return array.rolling(window=period).mean()def TriangMovingAverage(array, period): return array.rolling(window=period, win_type='triang').mean()def ExponentialMovingAverage(array, period): alpha = 2.0/(period + 1.0) return array.ewm(alpha=alpha).mean()def DoubleExponentialSmoothing(series, period1, beta): alpha = 2.0 / (period1 + 1.0) result = [] for n in range(1, len(series)+1): if n == 1: level, trend = series[0], series[1] - series[0] if n >= len(series): value = result[-1] else: value = series[n] last_level, level = level, alpha*value + (1-alpha)*(level+trend) trend = beta*(level-last_level) + (1-beta)*trend result.append(level+trend) return resultclass HoltWinters: def __init__(self, series, slen, alpha, beta, gamma, n_preds, scaling_factor=1.96): self.series = series self.slen = slen self.alpha = alpha self.beta = beta self.gamma = gamma self.n_preds = n_preds self.scaling_factor = scaling_factor def initial_trend(self): sum = 0.0 for i in range(self.slen): sum += float(self.series[i+self.slen] - self.series[i]) / self.slen return sum / self.slen def initial_seasonal_components(self): seasonals = {} season_averages = [] n_seasons = int(len(self.series)/self.slen) for j in range(n_seasons): season_averages.append(sum(self.series[self.slen*j:self.slen*j+self.slen])/float(self.slen)) for i in range(self.slen): sum_of_vals_over_avg = 0.0 for j in range(n_seasons): sum_of_vals_over_avg += self.series[self.slen*j+i]-season_averages[j] seasonals[i] = sum_of_vals_over_avg/n_seasons return seasonals def triple_exponential_smoothing(self): self.result = [] self.Smooth = [] self.Season = [] self.Trend = [] self.PredictedDeviation = [] self.UpperBond = [] self.LowerBond = [] seasonals = self.initial_seasonal_components() for i in range(len(self.series)+self.n_preds): if i == 0: smooth = self.series[0] trend = self.initial_trend() self.result.append(self.series[0]) self.Smooth.append(smooth) self.Trend.append(trend) self.Season.append(seasonals[i%self.slen]) self.PredictedDeviation.append(0) self.UpperBond.append(self.result[0] + self.scaling_factor * self.PredictedDeviation[0]) self.LowerBond.append(self.result[0] - self.scaling_factor * self.PredictedDeviation[0]) continue if i >= len(self.series): m = i - len(self.series) + 1 self.result.append((smooth + m*trend) + seasonals[i%self.slen]) self.PredictedDeviation.append(self.PredictedDeviation[-1]*1.01) else: val = self.series[i] last_smooth, smooth = smooth, self.alpha*(val-seasonals[i%self.slen]) + (1-self.alpha)*(smooth+trend) trend = self.beta * (smooth-last_smooth) + (1-self.beta)*trend seasonals[i%self.slen] = self.gamma*(val-smooth) + (1-self.gamma)*seasonals[i%self.slen] self.result.append(smooth+trend+seasonals[i%self.slen]) self.PredictedDeviation.append(self.gamma * np.abs(self.series[i] - self.result[i]) + (1-self.gamma)*self.PredictedDeviation[-1]) self.UpperBond.append(self.result[-1] + self.scaling_factor * self.PredictedDeviation[-1]) self.LowerBond.append(self.result[-1] - self.scaling_factor * self.PredictedDeviation[-1]) self.Smooth.append(smooth) self.Trend.append(trend) self.Season.append(seasonals[i % self.slen])def LogisticRegressionModel(numb_params,Series,Series_tr): cols = [] for i in range(0, numb_params): cols.extend(["Lag%s" % str(i + 1)]) Series = pd.DataFrame(Series) x = Series[cols] y = Series["Direction"] d = pd.DataFrame(index=y.index) d["Actual"] = y Series_tr = pd.DataFrame(Series_tr) x_tr = Series_tr[cols] y_tr = Series_tr["Direction"] d_tr = pd.DataFrame(index=y_tr.index) d_tr["Actual"] = y_tr model1 = linear_model.LogisticRegression().fit(x, y) d['Predict_LR'] = model1.predict(x) d_tr['Predict_LR'] = model1.predict(x_tr) d["Correct_LR"] = (1.0 + d['Predict_LR'] * d["Actual"]) / 2.0 d_tr["Correct_LR"] = (1.0 + d_tr['Predict_LR'] * d_tr["Actual"]) / 2.0 hit_rate1 = np.mean(d["Correct_LR"]) hit_rate1_tr = np.mean(d_tr["Correct_LR"]) return (hit_rate1 * 100), (hit_rate1_tr * 100)def LinearDiscriminantModel(numb_params,Series,Series_tr): cols = [] for i in range(0, numb_params): cols.extend(["Lag%s" % str(i + 1)]) Series = pd.DataFrame(Series) x = Series[cols] y = Series["Direction"] d = pd.DataFrame(index=y.index) d["Actual"] = y Series_tr = pd.DataFrame(Series_tr) x_tr = Series_tr[cols] y_tr = Series_tr["Direction"] d_tr = pd.DataFrame(index=y_tr.index) d_tr["Actual"] = y_tr model1 = LDA().fit(x, y) d['Predict_LR'] = model1.predict(x) d_tr['Predict_LR'] = model1.predict(x_tr) d["Correct_LR"] = (1.0 + d['Predict_LR'] * d["Actual"]) / 2.0 d_tr["Correct_LR"] = (1.0 + d_tr['Predict_LR'] * d_tr["Actual"]) / 2.0 hit_rate1 = np.mean(d["Correct_LR"]) hit_rate1_tr = np.mean(d_tr["Correct_LR"]) return (hit_rate1 * 100), (hit_rate1_tr * 100)def QuadraticDiscriminantModel(numb_params,Series,Series_tr): cols = [] for i in range(0, numb_params): cols.extend(["Lag%s" % str(i + 1)]) Series = pd.DataFrame(Series) x = Series[cols] y = Series["Direction"] d = pd.DataFrame(index=y.index) d["Actual"] = y Series_tr = pd.DataFrame(Series_tr) x_tr = Series_tr[cols] y_tr = Series_tr["Direction"] d_tr = pd.DataFrame(index=y_tr.index) d_tr["Actual"] = y_tr model1 = QDA().fit(x, y) d['Predict_LR'] = model1.predict(x) d_tr['Predict_LR'] = model1.predict(x_tr) d["Correct_LR"] = (1.0 + d['Predict_LR'] * d["Actual"]) / 2.0 d_tr["Correct_LR"] = (1.0 + d_tr['Predict_LR'] * d_tr["Actual"]) / 2.0 hit_rate1 = np.mean(d["Correct_LR"]) hit_rate1_tr = np.mean(d_tr["Correct_LR"]) return (hit_rate1 * 100), (hit_rate1_tr * 100)

import pandas_datareader as drimport pandas as pdimport numpy as npdef Get_Data (stock_name,start_date,end_date): ts = dr.DataReader(stock_name, "google", start_date, end_date) return tsdef Get_Full_Data(stock_name,start_date,end_date): ts = dr.DataReader(stock_name, "google", start_date, end_date) ts['Median'] = (ts.High + ts.Low)/2 ts['Typical'] = (ts.High + ts.Low + ts.Close) / 3 ts['Weighted'] = (ts.High + ts.Low + 2*ts.Close) / 4 return tsdef Get_Deltas(stock_name,start_date,end_date): ts = Get_Data(stock_name, start_date, end_date) ts1 = pd.DataFrame(index=ts.index) ts1['DeltaHighLow'] = ts['High']-ts['Low'] ts1["DirectionHL"] = np.sign(ts['High']-ts['Low']) ts1['DeltaOpenClose'] = ts['Close']-ts['Open'] ts1["DirectionOC"] = np.sign(ts['Close']-ts['Open']) return ts1def Get_Open(stock_name, start_date, end_date): ts = Get_Data(stock_name, start_date, end_date) ts1 = pd.DataFrame(index=ts.index) ts1["Today"] = ts["Open"] count = 100 for i in range(0, count): ts1["Lag%s" % str(i + 1)] = ts["Open"].shift(i + 1) ts1 = ts1[count + 1:] return ts1def Get_Close(stock_name, start_date, end_date): ts = Get_Data(stock_name, start_date, end_date) ts1 = pd.DataFrame(index=ts.index) ts1["Today"] = ts["Close"] count = 25 for i in range(0, count): ts1["Lag%s" % str(i + 1)] = ts["Close"].shift(i + 1) ts1 = ts1[count + 1:] return ts1def Get_High(stock_name, start_date, end_date): ts = Get_Data(stock_name, start_date, end_date) ts1 = pd.DataFrame(index=ts.index) ts1["Today"] = ts["High"] count = 100 for i in range(0, count): ts1["Lag%s" % str(i + 1)] = ts["High"].shift(i + 1) return ts1def Get_Low(stock_name, start_date, end_date): ts = Get_Data(stock_name, start_date, end_date) ts1 = pd.DataFrame(index=ts.index) ts1["Today"] = ts["Low"] count = 100 for i in range(0, count): ts1["Lag%s" % str(i + 1)] = ts["Low"].shift(i + 1) return ts1def Get_AdjClose(stock_name, start_date, end_date): ts = Get_Data(stock_name, start_date, end_date) ts1 = pd.DataFrame(index=ts.index) ts1["Today"] = ts["Adj Close"] count = 100 for i in range(0, count): ts1["Lag%s" % str(i + 1)] = ts["Adj Close"].shift(i + 1) return ts1def Get_Median(stock_name, start_date, end_date): ts = Get_Full_Data(stock_name, start_date, end_date) ts1 = pd.DataFrame(index=ts.index) ts1["Today"] = ts["Median"] count = 100 for i in range(0, count): ts1["Lag%s" % str(i + 1)] = ts["Median"].shift(i + 1) return ts1def Get_Typical(stock_name, start_date, end_date): ts = Get_Full_Data(stock_name, start_date, end_date) ts1 = pd.DataFrame(index=ts.index) ts1["Today"] = ts["Typical"] count = 100 for i in range(0, count): ts1["Lag%s" % str(i + 1)] = ts["Typical"].shift(i + 1) return ts1def Get_Weighted(stock_name, start_date, end_date): ts = Get_Full_Data(stock_name, start_date, end_date) ts1 = pd.DataFrame(index=ts.index) ts1["Today"] = ts["Weighted"] count = 100 for i in range(0, count): ts1["Lag%s" % str(i + 1)] = ts["Weighted"].shift(i + 1) return ts1def Get_Open_Percent(stock_name, start_date, end_date): ts2 = Get_Open(stock_name, start_date, end_date) ts = pd.DataFrame(index=ts2.index) ts["Today"] = ts2["Today"].pct_change() * 100.0 for i, x in enumerate(ts2["Today"]): if (abs(x) < 0.0001): ts["Today"][i] = 0.0001 count = 100 for i in range(0, count): ts["Lag%s" % str(i + 1)] = ts2["Lag%s" % str(i + 1)].pct_change() * 100.0 ts = ts[count + 1:] ts["Direction"] = np.sign(ts["Today"]) return tsdef Get_Close_Percent(stock_name, start_date, end_date): ts2 = Get_Close(stock_name, start_date, end_date) ts = pd.DataFrame(index=ts2.index) ts["Today"] = ts2["Today"].pct_change() * 100.0 for i, x in enumerate(ts2["Today"]): if (abs(x) < 0.0001): ts["Today"][i] = 0.0001 count = 25 for i in range(0, count): ts["Lag%s" % str(i + 1)] = ts2["Lag%s" % str(i + 1)].pct_change() * 100.0 ts = ts[count + 1:] ts["Direction"] = np.sign(ts["Today"]) return tsdef Get_High_Percent(stock_name, start_date, end_date): ts2 = Get_High(stock_name, start_date, end_date) ts = pd.DataFrame(index=ts2.index) ts["Today"] = ts2["Today"].pct_change() * 100.0 for i, x in enumerate(ts2["Today"]): if (abs(x) < 0.0001): ts["Today"][i] = 0.0001 count = 100 for i in range(0, count): ts["Lag%s" % str(i + 1)] = ts2["Lag%s" % str(i + 1)].pct_change() * 100.0 ts = ts[count + 1:] ts["Direction"] = np.sign(ts["Today"]) return tsdef Get_Low_Percent(stock_name, start_date, end_date): ts2 = Get_Low(stock_name, start_date, end_date) ts = pd.DataFrame(index=ts2.index) ts["Today"] = ts2["Today"].pct_change() * 100.0 for i, x in enumerate(ts2["Today"]): if (abs(x) < 0.0001): ts["Today"][i] = 0.0001 count = 100 for i in range(0, count): ts["Lag%s" % str(i + 1)] = ts2["Lag%s" % str(i + 1)].pct_change() * 100.0 ts = ts[count + 1:] ts["Direction"] = np.sign(ts["Today"]) return tsdef Get_AdjClose_Percent(stock_name, start_date, end_date): ts2 = Get_AdjClose(stock_name, start_date, end_date) ts = pd.DataFrame(index=ts2.index) ts["Today"] = ts2["Today"].pct_change() * 100.0 for i, x in enumerate(ts2["Today"]): if (abs(x) < 0.0001): ts["Today"][i] = 0.0001 count = 25 for i in range(0, count): ts["Lag%s" % str(i + 1)] = ts2["Lag%s" % str(i + 1)].pct_change() * 100.0 ts = ts[count + 1:] ts["Direction"] = np.sign(ts["Today"]) return tsdef Get_Median_Percent(stock_name, start_date, end_date): ts2 = Get_Median(stock_name, start_date, end_date) ts = pd.DataFrame(index=ts2.index) ts["Today"] = ts2["Today"].pct_change() * 100.0 for i, x in enumerate(ts2["Today"]): if (abs(x) < 0.0001): ts["Today"][i] = 0.0001 count = 25 for i in range(0, count): ts["Lag%s" % str(i + 1)] = ts2["Lag%s" % str(i + 1)].pct_change() * 100.0 ts = ts[count + 1:] ts["Direction"] = np.sign(ts["Today"]) return tsdef Get_Typical_Percent(stock_name, start_date, end_date): ts2 = Get_Typical(stock_name, start_date, end_date) ts = pd.DataFrame(index=ts2.index) ts["Today"] = ts2["Today"].pct_change() * 100.0 for i, x in enumerate(ts2["Today"]): if (abs(x) < 0.0001): ts["Today"][i] = 0.0001 count = 25 for i in range(0, count): ts["Lag%s" % str(i + 1)] = ts2["Lag%s" % str(i + 1)].pct_change() * 100.0 ts = ts[count + 1:] ts["Direction"] = np.sign(ts["Today"]) return tsdef Get_Weighted_Percent(stock_name, start_date, end_date): ts2 = Get_Weighted(stock_name, start_date, end_date) ts = pd.DataFrame(index=ts2.index) ts["Today"] = ts2["Today"].pct_change() * 100.0 for i, x in enumerate(ts2["Today"]): if (abs(x) < 0.0001): ts["Today"][i] = 0.0001 count = 25 for i in range(0, count): ts["Lag%s" % str(i + 1)] = ts2["Lag%s" % str(i + 1)].pct_change() * 100.0 ts = ts[count + 1:] ts["Direction"] = np.sign(ts["Today"]) return tsdef Get_Open_Direction(stock_name, start_date, end_date): ts2 = Get_Open(stock_name, start_date, end_date) ts = pd.DataFrame(index=ts2.index) ts["Direction"] = ts2["Today"].pct_change() * 100.0 count = 25 for i in range(0, count): ts["DirectionLag%s" % str(i + 1)] = ts2["Lag%s" % str(i + 1)].pct_change() * 100.0 ts = ts[count + 1:] ts["Direction"] = np.sign(ts["Direction"]) for i in range(0, count): ts["DirectionLag%s" % str(i + 1)] = np.sign(ts["DirectionLag%s" % str(i + 1)]) return tsdef Get_Close_Direction(stock_name, start_date, end_date): ts2 = Get_Close(stock_name, start_date, end_date) ts = pd.DataFrame(index=ts2.index) ts["Direction"] = ts2["Today"].pct_change() * 100.0 count = 25 for i in range(0, count): ts["Lag%s" % str(i + 1)] = ts2["Lag%s" % str(i + 1)].pct_change() * 100.0 ts = ts[count + 1:] ts["Direction"] = np.sign(ts["Direction"]) for i in range(0, count): ts["Lag%s" % str(i + 1)] = np.sign(ts["Lag%s" % str(i + 1)]) return ts


Подобные документы

  • Назначение и цели создания системы автоматизации, ее устройство, принципы работы. Характеристика комплекса задач и функциональная структура, анализ входной и выходной информации. Логическая модель данных и алгоритм работы с ними. Инструкция пользователя.

    курсовая работа [1,0 M], добавлен 06.07.2016

  • Назначение и требования к автоматизированной системе обработки экономической информации. Общая структура отдела биржевых операций как объекта автоматизации. Техническое, системное программное, информационное и сетевое обеспечение, организация баз данных.

    аттестационная работа [415,7 K], добавлен 30.03.2010

  • Описание разработанной подсистемы автоматизации, алгоритм ее работы. Структуры базы данных и составных частей подсистемы. Затраты на разработку программного продукта и эффект от внедрения подсистемы. Руководство по работе с программным комплексом.

    дипломная работа [3,0 M], добавлен 02.02.2009

  • Принципы автоматизации делопроизводства. Общие понятия документооборота. Проектирование программного обеспечения. Стадии и этапы создания информационных систем, средства их разработки. Анализ алгоритмов работы с базой данных, разработка интерфейса.

    дипломная работа [3,4 M], добавлен 07.11.2015

  • Выполнение операций, хранения, редактирования, систематизации данных. Рассмотрение подсистем разрабатываемой системы управления базами данных продуктового магазина. Разработка алгоритма функционирования системы и приложения для работы с базой данных.

    курсовая работа [399,1 K], добавлен 26.08.2019

  • Анализ аналогов и выбор прототипа, разработка алгоритма и графического интерфейса, кодирование и тестирование. Логическая модель данных "Нотариальная контора". Особенности реализации в MS SQL. Требования к функциональным характеристикам базы данных.

    курсовая работа [1,3 M], добавлен 12.01.2013

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

    курсовая работа [5,5 M], добавлен 12.10.2011

  • Анализ предметной области и требований пользователей для разработки программного средства по автоматизации работы склада строительных материалов. Описание работы с базой данных Access, позволяющей добавлять и редактировать информацию, оформлять накладную.

    курсовая работа [601,1 K], добавлен 25.01.2013

  • Методы статического и динамического анализа зависимостей по данным для последовательных программ. Разработан и реализован алгоритм гибридного анализа, объединяющий достоинства обоих методов. Статическая библиотека представления базы данных САПФОР.

    дипломная работа [169,6 K], добавлен 21.11.2010

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

    курсовая работа [706,3 K], добавлен 07.08.2013

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.