Вы находитесь на странице: 1из 43

Правительство Российской Федерации

Нижегородский Филиал
Федерального Государственного Автономного
Образовательного Учреждения Высшего Профессионального
Образования
Национальный Исследовательский Университет
"Высшая Школа Экономики"
Факультет информатики, математики и компьютерных наук

ВЫПУСКНАЯ КВАЛИФИКАЦИОННАЯ РАБОТА


На тему «Исследование компонент рыночно нейтральных стратегий »

Студент группы № 13ПМИ


Клыков Вячеслав Алексеевич

Научный руководитель
Старший преподаватель кафедры ПМИ
факультета БИиПМ
Пономаренко Александр Александрович
Консультант
Доцент кафедры финансового менеджмента
Факультета экономики
Россохин Владимир Валерьевич

Нижний Новгород
2017
ОГЛАВЛЕНИЕ:
Глава 1 Введение…………………………………………………3
Парный Трейдинг……………………………………...4
Постановка задач по данной проблеме……………...5
Хороший и плохой временные ряды………………...6
Глава 2 Комплекс статистических методов анализа
Графика…………………………………………………10
Глава 3 Использование исследования, машинное обучение,

проверка актуальности, пути модификации. ………………..20

Проблема совместного использования……………....20

Машинное обучение……………………………………22
Практика – критерий истины………………………...27
Возможные модификации……………………………..30
Дальнейшее развитие темы…………………………...31
Список используемой литературы…………………...32
Приложения……………………………………………..33

2
ГЛАВА 1. Введение.

Фондовый рынок – открытая площадка для совершения сделок с участием


ценных бумаг. Инвестиции в ценные бумаги являются неплохим решением,
если у инвестора есть достаточные капитал и уровень знаний. Стоимость
каждого актива на фондовом рынке непрерывно изменяется, давая
возможность для заработка. Покупка подешевевшего актива и через
некоторый промежуток времени продажа его за большую цену есть основной
инструмент для обогащения. Безусловно, для такого исхода необходимо
неизбежное повышение цены актива. Как следствие, существует проблема
непредсказуемости поведения актива (или корзины активов – далее просто
«актива») Очевидно, что в случае неблагоприятного изменения цены актива
инвестор может не только не приобрести, но и потерять часть
инвестируемого капитала.

Существует предположение, что вся необходимая информация о поведении


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

Порталы, организовывающие площадки для совершения сделок, с некоторого


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

Для игры на фондовом рынке(под игрой на фондовом рынке подразумеваем


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

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

Парный Трейдинг

Как показывает практика, вероятность успешного прогноза котировок редко


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

Как мы заметили, сделать достоверный прогноз – задача, которую ещё не


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

Рассмотрим эту модель на примере акций «Лукойла» и «Газпрома».


Предположим что в какой-то момент времени качественные характеристики
этих бумаг можно было считать полностью идентичными, при этом цена
акций «Лукойла» составляла 1000р (PRluc ) а «Газпрома» 110р(PRgazp ). Таким
образом соотношение стоимости этих бумаг было равно PRluc / PRgazp =

4
1000/110 или около 9, что в рассматриваемых условиях можно принять за
«справедливое» значение (далее Justice coef «J») Если бы по какой-то
причине цена акций «Лукойла» выросла на 50%(до 1500р) а цена «Газпрома»
всего на 24%(до 136р) Соотношение цен J= PRluc / PRgazp = 1500/136 что
примерно равно 11. В этом случае рациональные инвесторы начали бы
покупать бумаги «Газпрома» одновременно продавая акции «Лукойла»
способствуя росту предложения последних. Через некоторое время это
привело бы соотношение цен к справедливому уровню J=9

Таким образом, основной принцип стратегий парного трейдинга заключается


в покупке спреда инструмент А против инструмента Б при ΔJ<0(где ΔJ
является разницей в отношении активов друг к другу в конкретный момент
времени и справедливом отношении активов) и продажа спреда при ΔJ>0.
Покупка спреда заключается в одновременном открытии длинной позиции
по активу А и короткой по Б, для продажи наоборот. Объёмы позиций
должны быть эквивалентны. Закрытие осуществляется по мере приближения
ΔJ к нулевому значению.

Постановка задач по данной проблеме.

Наиболее важной задачей для данной стратегии является нахождение


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

5
дополнении первым. В сумме эти два подхода могут дать вполне полезный
результат.

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


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

Для начала определим шаги, необходимые для получения пары корзин,


приемлемых для реализации стратегий парного трейдинга.

- Разбор понятия хорошей и плохой пары корзин

- Создание комплекта статистических критериев для корзины активов.

- Расчет и анализ временного ряда с помощью созданного комплекта


критериев.

- Проверка временных рядов, полученных при помощи обработки


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

-Автоматизация и создание продукта для определения качества временного


ряда.

Хороший и плохой временные ряды.

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


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

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

Рассмотрим несколько временых рядов.

На первом графике иллюстрируется изменение соотношения цен двух


корзин, одна полностью состоит из актива ALRS (Акционерная компания
"АЛРОСА" ) Вторая на 80% состоит из акций компании MOEX(Московская
фондовая биржа) и на 20% из акций компании PIKK(ОАО Группа Компаний
ПИК) Временной ряд содержит около 1000 значений, что приблизительно
соответствует 4 годам активных торгов.

На втором графике иллюстрируется изменение соотношения цен двух


корзин, одна на 40% состоит из актива VSMO(ОАО Корпорация ВСМПО-
АВИСМА) и на 60% из актива URKA(Публичное акционерное общество
"Уралкалий"), вторая на 40% состоит из актива RTKMP(Публичное
акционерное общество междугородной и международной  электрической
связи "Ростелеком", акция привилегированная), на 40% состоит из актива
MOEX(Московская фондовая биржа), на 10% из актива GMKN(ОАО ГМК
Норильский никель) и на 10% из актива TRNFP( Публичное акционерное
общество "Транснефть") Временной ряд содержит около 750 значений, что
приблизительно соответствует 3 годам активных торгов.

Попробуем охарактеризовать графики с точки зрения их приемлемости для


реализации парного трейдинга.

7
Первый график имеет заметную тенденцию роста показателя J (наглядно
иллюстрируется линией линейного тренда) И, хотя график довольно часто
пересекает линию тренда, это не помогает в нашей задаче, потому что
определить справедливый J для двух этих графиков невозможно, он
постоянно изменяется. Поэтому эту пару активов можно охарактеризовать
как «плохую», ввиду её непригодности к осуществлению стратегии парного
трейдинга, с точки зрения участника фондового рынка.

Второй график имеет куда более постоянный тренд. За период торгов


приблизительно равный трем годам соотношение цен двух этих активов
колебалось постоянно, но не отклонялось более чем на 25% от своего
базового значения. Это даёт определенные предпосылки считать, что у этой
пары корзин есть справедливое значение J(и оно близко к единице). Более
того, отклонения носят довольно стабильный характер, то есть имеется
возможность размеренно выбрать момент для совершения сделки(можно
заметить что цикл операции отклонения и возврат к J происходит в течении
150 дней. Таким образом эту пару корзин можно охарактеризовать как
«хорошую» ввиду того факта что она является приемлемой для
осуществления стратегии парного трейдинга, с точки зрения участника
фондового рынка.

8
Рисунок 1. График изменения J для корзин(ALRS(1.0)) -(MOEX(0.8),PIKK(0.2)

Рисунок 2. График изменения J для корзин (VSMO(0.4), URKA(0.6))-(RTKMP(0.4),MOEX(0.4),


GMKN(0.1),TRNFP(0.1)

9
ГЛАВА 2. Комплекс статистических методов анализа графика

1.

Первый и наиболее естественный шаг в разборе временного ряда –


построение линейного тренда.

Линейный тренд графика - это линейная аппроксимация формата k*x+b.


(получается методом наименьших квадратов).

Для нашей задачи можно однозначно сказать, что «хорошее» значение для
коэффициента k=>0 так как в этом случае линия горизонтальна, а реальные
данные колеблются вокруг постоянного значения, которое и можно будет
считать справедливым J. Хорошее и плохое значение коэффициента b нельзя
определить так однозначно, хотя для наглядности и удобства желательно
чтобы b>>k.

Впрочем, по отдельности эти параметры не дают возможности оценить


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

Обратим внимание, что нас интересует разница между первой и последней


точкой тренда. Естественная интерпретация этого заключается в том,
насколько сильно изменился коэфицент J за количество дней N(количество
точек временного ряда)

Визуально это можно увидеть на графике:

Рисунок 3

S1

S2
10
Площадь S1 – смещение за всё время наблюдения, S2 – постоянная,
низменная часть.

1 2 k∗N2S
Введем коэффициент качества линии тренда как Qual Reg= S = b (где k и b
2

коэффициенты линии линейного тренда. Линяя линейного тренда «хорошая»


для нашей задачи в том случае, если Qual Reg=>0.

2.

Логичная предпосылка для следующего шага – для каждого разумного


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

Рисунок 4

использовать этот разумный факт попробуем выделить у графика


«актуальную» часть. На рисунке 3 мы видим, что первые 500 точек графика
имеют тенденцию к непрерывному роста J. Общая форма и недостатки схожи
с графиком на рисунке 1, в то время как последние 250 точек довольно
неплохо балансируют около значения J=2,25. Своей формой и параметрами
качества вторая часть графика напоминает рисунок 2 и является приемлемой
для реализации парного трейдинга.

Создадим небольшой алгоритм: Предполагаем, что глобальную линию


тренда можно сделать точнее. Для этого нам понадобится модифицированная

11
линия тренда. Будем строить её из предположения что глобальная линия
тренда не может отличаться от модифицированной более чем на 50%.

Av_N(x) – среднее значение последних x точек из исследуемого временного


ряда

Mod_tr_line = (N-250*y+Av_N(x))/2 где x>499

Таким образом мы получаем горизонтальную линию, являющуюся чем-то


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

Рассчитывать модифицированную линию тренда будем только один раз из


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

Возьмём промежуток (500 точек) от конца временного ряда и будем


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

Su mup=∑ (J ( t )−Mod ¿ ) для всех J ( t ) −Mod ¿ >0

Su mdown =¿ ∑ (J ( t )−Mod ¿ )∨¿ ¿ для всех J ( t ) −Mod ¿ <0

Получаем коэффициент плоскостного перевеса, рассчитываемого для


последних n точек временного ряда

Su m up
S q coef ( n )= (1)
Su mdown

В случае, если S q coef (n)=1 ,наша модифицированная линия тренда отлично


описывает последние точки временного ряда.

Необходимо ввести так же ограничивающие значения, то есть значения


S q coef (n) ,при прохождении алгоритма через которые, необходимо
остановиться, то есть площадь над или под модифицированной линией
тренда становится сильно больше под или над соответственно.

12
Вполне разумным кажется допущение что в какие-то моменты график может
иметь сильный подъём или спад. Возьмем значения 0.75 и 1.33. Получаем
ограничение, что график необходимо обрезать если превышение площади
над или под графиком более чем на 30%

Рисунок 5

Результат расчета плоскостного коэффициента можно увидеть на рисунке 4.


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

3.

Воспользуемся стандартной характеристикой – корреляцией двух корзин.

covXY=M[(X-M(X))(Y-M(Y)]=M(XY)-M(X)M(Y)

Если PR1 – цена первой корзины в момент времени t, PR2- цена второй
корзины в тот же момент времени а PR 1 и PR 2 средние значения цена первой
и второй корзин соответственно, то корреляция двух корзин вычисляется по
формуле:

13
Cov PR 1−PR 2 ∑ ( PR 1−PR 1)(PR 2−PR 2)
Cor r coef = =
σ PR 1 σ PR 2 √∑ ¿ ¿ ¿ ¿
Корреляция наверняка может определить связь величин только в случае если

Cor r coef =1или Cor r coef =−1. В первом случае цены корзин строго связаны, во

втором связь так же строгая, но обратная. Для примера на рисунке 2


корреляция корзин равна 0.8, для пары активов на рисунке 1 корреляция
корзин равна 0.6. И хотя провести хорошее разграничение по корреляции в
нашей задаче сложно, её расчёт может оказаться довольно полезным.

4.

Довольно неплохой идеей является расчет Коэффициента корреляции знаков


Фехнера который рассчитывается по формуле:
C−H
i=
C+ H
(3)

Если считать парой две стоимости корзин одной даты, то

C — число пар, у которых знаки отклонений значений от их средних


совпадают.

H — число пар, у которых знаки отклонений значений от их средних не


совпадают.

Таким образом можно подсчитать частоту совпадений знаков отклонения


величин от своих средних значений.

Однако, работа со средним зачастую не приносит нам никакого результата,


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

14
Логическая предпосылка состоит в следующем – если корзины
удовлетворяют нашим требованиям, и их отношение цен не отклоняется от
их J сильно, то логично предположить, что поодиночке их цены совершают
частые синхронные подъёмы и понижения в цене. При том мы можем
сформулировать вполне логичное требование, что для появления изменений
в отношение цен, и как следствие появление возможности для совершения
сделки необходимо чтобы частота совпадений в поведении корзин была в
промежутке от 0.6 до 0.8. В случае большего значения коэффициента,
отклонения будут редки и едва ли ощутимы, а в случае меньшего поведение
корзин становится независимым друг от друга и как следствие перестаёт
удовлетворять первой предпосылке.

Таким образом, наш коэффициент симметричности поведения корзин будет


вычисляться по формуле:

Profi t 1
Simm=1 Если > 0(4 )
Profi t 2

Profi t 1
Simm=0 Если <0(5)
Profi t 2

¿ m coef =
∑ Simm (6)
N

Где Profit1 И Profit2 это доходности первой и второй корзин соответственно в


определенный момент времени. Опять же возвращаясь к рисунку 2 отметим
что его ¿ mcoef = 0.61. Что в итоге довольно неплохо доказывает нашу догадку.

5.

Задумаемся ещё над одним довольно очевидным, но необходимым


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

15
активы, по которым были совершены сделки. Лучше рассчитывать этот
показатель для точек уже отобранных в пункте 2.

6.

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

Рисунок 6

С математической точки зрения это колебание с высокой частотой и


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

Однако, не сложно догадаться, что на практике найти такую пару


невозможно. Но постараться проверить её на предмет характерной близости
к такой форме можно.

Воспользуемся преобразованием Фурье, чтобы найти колебания с


наибольшими амплитудами.

16 (7)
Это формула классического преобразования Фурье, мы же воспользуемся
формулой дискретного преобразования:
N−1 −2 πi
kn
x n= ∑ x n e N
(8)
n=0

N –число измерений

x n – Значение сигнала(в нашем случае значение отношения цен двух корзин)

в момент времени n

k – частота измерений

Преобразование Фурье позволит найти наибольшие амплитуды, которым


ставятся в соответствие их частоты. Будем считать колебания,

Рисунок 7

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


Пример преобразования Фурье для рисунка 2. В данном случае
преобразование выполнялось с возведением в квадрат , для более удобной
визуализации, нейтрализации мнимой части.

На преобразованном графике координата по оси Y соответствует амплитуде,


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

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

Стоит заметить, что количество значимых колебаний (тех, чьи амплитуды


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

В целях дальнейшего прогнозирования (с исключительно математической


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

Выделим наибольшие амплитуды и занулим остальные, проведём обратное


преобразование фурье. На выходе мы получаем довольно неплохую
аппроксимацию:

Рисунок 8

Итого на этом графике можно увидеть эмпирические данные базовую


линейную и модифицированную линии тренда (Зеленым и розовым
соответственно) В данном случае обрезание графика с точки зрения

18
плоскостного коэффициента оказало излишним, т.к. баланс площадей
соблюдён(0.87). Аппроксимация с помощью ряда Фурье в данном случае не
может считаться хорошей для прогнозирования соотношения цен. Хотя в
общем то остальные статистические показатели, описанные в работе у этого
ряда носят крайне положительный характер.

19
ГЛАВА 3. Использование исследования, машинное обучение,
проверка актуальности, пути модификации.

Проблема совместного использования.

В предыдущей главе мы рассмотрели ряд методов каждый из которых даёт


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

Однако попытаемся просуммировать критерии, чтобы получить общее


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

Рисунок 9

20
На рисунке 9 показана слабость первого критерия – линии линейного тренда
и коэффициента качества линейной аппроксимации. В данном случае график
более чем приемлем с точки зрения инвестора, однако будет иметь довольно
2 k∗N
слабые показатели с точки зрения отношения b

21
Рисунок 107

На рисунке 10 мы видим контрпример для коэффициента плоскостного


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

Корреляция двух корзин общепризнано не является надежным источником


информации, если она не принимает значение 1 или -1, и ввести точные
числовые границы приемлемых значений этого параметра не представляется
возможным.

Коэффициент симметричности поведения активов является уточняющим и


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

Анализ с использованием преобразования Фурье имеет схожую проблему с


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

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

22
Машинное обучение.

Для того чтобы выяснить связь критериев с итоговым качеством графика


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

Итак данные для обучения будут содержать следующие пункты:

 названия и процентное содержание активов в корзинах


 regress_coef_k – коэффициент k глобальной линии линейного тренда
 regress_coef_b – коэффициент b глобальной линии линейного тренда
 regress_qual –Качество глобальной линейной регрессии
 balanced points – количество точек, отсченных как точки сохраняющие
плоскостной баланс
 timeline balance – плоскостной коэффициент для данного количества
точек
 corr_coef – коээфициент корреляции 2 корзин(рассчитывается для всего
врменного ряда
 corr_p-value – p-value коэффициента корреляции
 simm_coef – коффициент симметрического поведения
 number_crosses_on_GP – количество пересечений модифицированной
линии тренда с временным рядом на отрезке balanced points
 fur_full_aprox_sin_number – количество синусоид, использованных в
глобальной аппроксимации фурье
 fur_full_aprox_qua - R-квадрат коэффициента для аппроксимации
предыдущего пункта
 fur_GP_aprox_sin_number - количество синусоид, использованных в
аппроксимации фурье для точек отобранных в пункте balanced points.

23
 fur_GP_aprox_qual R-квадрат коэффициента для аппроксимации
предыдущего пункта

Рисунок 8 Пример таблицы, содержащей примеры для обучения

24
Все показатели описанные выше рассчитывались автоматически и
выносились на визуализацию, пример такой визуализации приведен на
рисунке 7. Далее инвестор оценивал доверие к графику по шкале от 1го до
10ти с точки зрения ведения игры используя стратегию парного трейдинга.

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

Для работы использовался алгоритм Random Forest. (выбран как наиболее


универсальный)

Первой проблемой стала нехватка примеров с уровнями доверия 8, 9 и 10. То


есть наиболее интересных. Ввиду этого факта, алгоритм с зашкаливающей
ошибкой обучался подразделению временного ряда на 10 категорий, если
объединить категории 10-9, 8-7,6-5, 4-3, 2-1 то ошибка остается порядка 50%.
В итоге, для качественного обучения было принято решение подразделить
всю выборку на 2 класса(хорошие и плохие) где хорошие были с оценками
7+ а плохие 6 и ниже. Ошибка на тестовой выборке стала равняться 0.2%.

Теперь чтобы проверить успешность нашего обучения с точки зрения


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

Из 40 случайно сгенерированных пар эти 3 были выделены как «хорошие»

Так же приводим статистику важности признаков, выделенных в ходе


обучения:

Feature ranking:
1. feature 'corr_coef' (0.145439)
2. feature 'number_crosses_on_GP' (0.128011)
3. feature 'regress_qual' (0.114004)
4. feature 'fur_full_aprox_sin_number' (0.081072)

25
5. feature 'fur_full_aprox_qual' (0.080913)
6. feature 'fur_GP_aprox_qual' (0.074676)
7. feature 'regress_coef_k' (0.069925)
8. feature 'regress_coef_b' (0.069882)
9. feature 'balanced points' (0.066918)
10. feature 'timeline balance' (0.059878)
11. feature 'simm_coef' (0.055809)
12. feature 'fur_GP_aprox_sin_number' (0.050340)
13. feature 'corr_p-value' (0.003133)

Ниже приведены графики временных рядов для этих пар активов.

Рисунок 9 График активов

MOEX 1.0 MOEX MVID SNGS TATNP 0.1 0.3 0.2 0.4

Рисунок 13

MTSS VSMO PHOR NVTK 0.0 0.7 0.1 0.2 ALRS AKRN RSTI FEES 0.5 0.5 0.0 0.0

26
Рисунок 14

PHOR MSNG BANEP 0.4 0.1 0.5 NMTP ALRS GMKN LKOH 0.4 0.6 0.0 0.0

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


дальнейшего рассмотрения.

27
Практика – критерий истины

Итак, на текущий момент у нас есть алгоритмизированный,


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

Рассмотрим проанализированные временные ряды с данными, сделав


крайней дату 30 декабря 2016 года.

Рисунок 15.

На рисунке 15 временной ряд, ранее упомянутый на рисунках 2 и 8. Но


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

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

Рисунок 16

На рисунке 16 мы видим пару активов, построенную по принципу


предыдущего рисунка, но уже для пары с рисунка 11. Эту пару «советует»
компьютер после обучения. В общем то видно сильное отклонение, но его
период оказывается очень затяжным. Здесь график не возвращается к своей
линии тренда, однако ввиду того что отклонение не вернулось к своему J
сформулированному в предыдущем году незначительно и возможность

Рисунок 17

успешного заработка здесь очевидна.

29
На рисунке 17 мы видим временной ряд, ранее представленный на рисунке
13, расширенный по принципу предыдущих двух. В данном случае мы так же
видим, что пара продолжает незначительно отклоняться от своего J, которое
мы могли бы зафиксировать в начале 2016 года. В данном случае сделки
видны предпосылки для совершения нескольких сделок сравнительно
небольшой прибыльности каждая.

Рисунок 18

На рисунке 18 мы видим временной ряд, ранее представленный на рисунке


14, расширенный по тому же принципу. Этот ряд крайне интересен тем, что
на момент принятия решения временной ряд имеет явно заметные периоды
отклонения, длящиеся в среднем около 200-300 дней. На начало 2016 года мы
видим, что график находится в своей верхней фазе, мы вполне естественно
ожидаем понижения значения отношения цен двух корзин. И оно крайне
заметно происходит в течении следующего промежутка времени. Это
отличная и естественно понятная возможность сделать одну хорошую сделку
на протяжение года с очень значительной прибылью.

Как мы видим все пары активов, которые мы получаем как результат


машинного обучения ведут себя продуктивно.

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

31
Возможные модификации

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

Довольно неплохой идей выглядит проверка временного ряда на


стационарность. То есть проверка временно ряда на способность сохранять
свои статистические характеристики с течением времени. Однако наиболее
классический текст Дики-Фуллера повально списывает все ряды, даже
потенциально хорошие, как не стационарные, поэтому в данном случае
может быть использован только как проверка рядов уже обозначенных как
«хорошие» для большей убежденности в надежности пары, однако эта
проверка ни в коем случае не должна служить поводом обозначить
временной ряд «плохим», так же ввиду того факта, что во время работы, даты
с выбросами и пропущенными значениями выбрасывались. Это особенно
заметно на годах ранних торгов(2007 и ранее) где часть данных о сделках на
Московской Фондовой Бирже банально не сохранена.

Так же довольно неплохой кажется идея применения кросс-валидации,


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

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

1) Определенный интерес может представлять создание аналогичной работы,


с изменением метода фильтрации данных и формирования индивидуальных
для этих данных критериев(например кросс-валидация)

2) Проработка алгоритма улучшения уровня доверия к графику.


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

3) Определенное улучшение и возможность более точной классификации


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

4) Произведение оценки графиков с позиции нескольких инвесторов и


выставление средней оценки по всем. Это коммерческое улучшение,
направленное на более точное машинное обучение.

33
СПИСОК ИСПОЛЬЗОВАННОЙ ЛИТЕРАТУРЫ

1) Статья http://www.studfiles.ru/preview/3089726/ Математические модели


связей(Рязанский государственный радиотехнический университет)

2) Статья: https://habrahabr.ru/company/ods/blog/327242/) Открытый курс


машинного обучения. Тема 9. Анализ временных рядов с помощью Python.
Open Data Science

3) Давид Серебренников «Стратегии парного трейдинга» Журнал Financial


One №06 июнь 2013

4) Давид Серебренников «Рыночно нейтральные стратегии» Журнал о


биржевой торговле F&O №07 июль 2011

5) Pairs Trading: Performance of a Relative-Value Arbitrage Rule Author(s): Evan


Gatev, William N. Goetzmann and K. Geert Rouwenhorst Source: The Review of
Financial Studies, Vol. 19, No. 3 (Autumn, 2006), pp. 797-827 Published by:
Oxford University Press. Sponsor: The Society for Financial Studies. Stable URL:
http://www.jstor.org/stable/3844014 Accessed: 28-04-2017 13:11 UTC

6) Adaptive pairs trading strategy performance in Turkish derivatives exchange


with the companies listed on Istanbul stock exchange (Correspondence: Kaan
Evren Bolgu¨n, Kultur University, Economics Department, E5 Karayolu U¨ zeri,
Bakirko¨ y, 34156, I˙stanbul, Turkey)

7) Evaluation of pairs-trading strategy at the Brazilian financial market Received


(in revised form): 9th December 2008 (Correspondence: Marcelo Scherer Perlin,
ICMA/Reading University, Reading, UK)

34
ПРИЛОЖЕНИЕ

Код обработки данных (на языке python 3.0):


# coding=UTF-8
import matplotlib.pyplot as plt
import pandas as pd
import pickle
from scipy import stats
import numpy as np
import math
from math import *
from scipy.stats.stats import pearsonr
import xlrd
import xlwt
from pandas import read_csv, DataFrame
import statsmodels.api as sm
from statsmodels.iolib.table import SimpleTable
from sklearn.metrics import r2_score
names = ['AFKS', 'AFLT', 'AKRN', 'ALRS', 'BANE', 'BANEP', 'CHMF', 'DIXY',
'FEES', 'GAZP', 'GMKN', 'HYDR', 'IRAO', 'LKOH', 'LSRG', 'MAGN',
'MFON', 'MGNT', 'MOEX', 'MSNG', 'MTLR', 'MTSS', 'MVID', 'NLMK',
'NMTP', 'NVTK', 'PHOR', 'PIKK', 'PLZL', 'ROSN', 'RSTI', 'RTKM',
'RTKMP', 'RUAL', 'SBER', 'SBERP', 'SNGS', 'SNGSP', 'TATN', 'TATNP',
'TRNFP', 'URKA', 'VSMO','VTBR']

def basket_date_generation(activs, parts):


data = pd.read_excel('C:\\Users\\Слава\\Desktop\\Диплом\\Активы для
проверки\\xlsx активы\\' + activs[0] + '.xlsx')
dates_2=set(data["Date"])
for i in range (len(activs)-1):
data = pd.read_excel('C:\\Users\\Слава\\Desktop\\Диплом\\Активы для
проверки\\xlsx активы\\' + activs[i+1] + '.xlsx')
dates_1 = set(data["Date"])
dates_1 = dates_1.intersection(dates_2)
dates_2 = dates_1
dates = []
for date in dates_2:
dates.append(date)
dates.sort()
# В переменной dates отсортированные общие даты набора активов корзины
return dates
def baskets_intersecton(date1,date2):
dates=[]
dates_1=set(date1)
dates_2=set(date2)
dates_res=dates_1.intersection(dates_2)
for date in dates_res:
dates.append(date)
dates.sort()
return dates
def basket_price_generation(dates,parts,activs):
summ=10000
number_of_assets=[]
# print(dates) 'C:\\Users\\Слава\\Desktop\\Диплом\\Активы\\активы
Xlsx\\' БАЗОВЫЙ РАБОЧИЙ АДРЕСС
# print(len(dates)) 'C:\\Users\\Слава\\Desktop\\Диплом\\Активы для
проверки\\xlsx активы\\' ПРОВЕРОЧНЫЙ АДресс
for i in range (len(parts)):
data = pd.read_excel('C:\\Users\\Слава\\Desktop\\Диплом\\Активы для
проверки\\xlsx активы\\' + activs[i] + '.xlsx')
start_price = data.loc[data["Date"] == dates[10]]

35
["ClosingPrice"].values[0]
# print(start_price)
number_of_asset_x=(summ*parts[i]/start_price)
number_of_assets.append(summ*parts[i]/start_price)
# print(start_price*number_of_asset_x)
# print(number_of_assets)
#В перменной number_of_assets упорядоченные количества акций, согласно
долям указаным в переменной parts

def openfunction(shares):
result = {}
for share in shares:
data = pd.read_excel('C:\\Users\\Слава\\Desktop\\Диплом\\Активы
для проверки\\xlsx активы\\' + share + '.xlsx')
result[share] = data
return result
assets_data = openfunction(activs)
basket_prices=[]
for date in dates:
n=0#n - счетчик пройденых активов второго цикла
summ_all=0
#summ_all - суммарная стоимость корзины на момент времени date
for activ in activs:
activ_full_inf=assets_data[activ]
#activ_full_inf - полный набор данных об активе с названием activ
price_activ = activ_full_inf.loc[activ_full_inf["Date"] == date]
["ClosingPrice"].values[0]
#price_activ - цена актива activ на момент даты date
summ_current=price_activ*number_of_assets[n]
#summ_current суммарная стоимость актива active корзины на момент
времени date(стоимость умноженная на количество акций(изначальное)
summ_all=summ_all+summ_current
n=n+1
basket_prices.append(summ_all)
return basket_prices
def justice_basket_generation(prices1,prices2):
justice_coef=[]
if sum(prices1)>sum(prices2):
for i in range (len(prices1)):
current_just=prices1[i]/prices2[i]
justice_coef.append(current_just)
else:
for i in range (len(prices1)):
current_just=prices2[i]/prices1[i]
justice_coef.append(current_just)
return justice_coef
def time_line_visualisation(signal):
times=[i for i in range (len(signal))]
plt.plot(times,signal)
def first_block_trend_line(signal):
times = [i for i in range(len(signal))]
linr = stats.linregress(times, signal)
return linr
def second_block_regress_quality(k,b,signals):
smeshenie = abs(k*len(signals))
regress_quality=smeshenie*2/b
return regress_quality
def third_blok_good_points(times,signals):
linr = stats.linregress(times, signals)
#print(linr)
n = 500

36
regresspoint = linr.slope * (len(signals) - (n / 2)) + linr.intercept
#print(regresspoint)
last_signals = 0
number_signals = len(signals)
#print(number_signals)
for i in range(n):
last_signals = last_signals + signals[number_signals - i - 1]

average_last = last_signals / n
#print(average_last)
simmetric_line = (regresspoint + average_last) / 2

#print(simmetric_line)
sq_up = 0
sq_down = 0
sq_coef = 0
for i in range(n):
delta_sq = signals[len(signals) - i - 1] - simmetric_line
if delta_sq > 0:
sq_up = sq_up + delta_sq
else:
sq_down = sq_down + abs(delta_sq)
#print(sq_up, sq_down)
sq_coef = sq_up / sq_down
#print(sq_coef)
sq_up_cont = sq_up
sq_down_cont = sq_down
sq_coef_cont = 0
while n < len(signals):
delta_sq_cont = signals[len(signals) - n - 1] - simmetric_line
if delta_sq > 0:
sq_up_cont = sq_up_cont + delta_sq_cont
else:
sq_down_cont = sq_down_cont + abs(delta_sq_cont)
sq_coef_cont = sq_up_cont / sq_down_cont
if sq_coef_cont > 1.5 or sq_coef_cont < 0.8:
if sq_coef_cont > 1:
sq_coef_cont = sq_down_cont / sq_up_cont

break

n = n + 10
if n > len(signals):
total_points = (len(signals))
else:
total_points = n
sq_coef = sq_coef_cont
#print(total_points, sq_coef)
return total_points, sq_coef,simmetric_line
def fourth_block_profit_balance(price1,price2):
number_of_simmularytis=0
ful_number=len(price1)
for i in range (len(price2)-1):
delta_price1=price1[i+1]-price1[i]
delta_price2=price2[i+1]-price2[i]
if delta_price1/delta_price2>0:
number_of_simmularytis=number_of_simmularytis+1
coeff_simmular=number_of_simmularytis/ful_number
return coeff_simmular
def fifth_block_cross_coeff(justice):
cross_effective_line=sum(justice)/len(justice)
previous=justice[0]
n_cross=0
for i in range (len(justice)-1):

37
a=previous-cross_effective_line
b=justice[i+1]-cross_effective_line
if a/b<0:
n_cross=n_cross+1
previous=justice[i+1]
return (n_cross)
def fur_analis_block(signals):
flen=len(signals) # это количество различных частот(удвоенное)
Mass_Amplitud = ((np.fft.fft(signals, flen)))#**2))#[:flen//2]
#Собственно само преобразование Фурье
# print(Mass_Amplitud[38])
# print(Mass_Amplitud[986])
# result=np.fft.ifft(Mass_Amplitud)
Mass_Amplitud_2 = (np.abs(np.fft.fft(signals, flen)**2))[:flen//2]

ampl_work=[]
for i in range (len(Mass_Amplitud_2)-1):
ampl_work.append(Mass_Amplitud_2[i+1]) # Костыль, убираю
первую частоту дабы дальше работать без неё(она слишком большая и просто
является постоянной величиной, вроде sin[x]+k)
Max_ampl_work=max(ampl_work)
# illustrated=[i for i in range(len(ampl_work))]
# plt.plot(illustrated,ampl_work)
# plt.show()
nomera_nezanulyaemih_ampl=[]
for i in range(len(Mass_Amplitud_2)-1):
if Mass_Amplitud_2[i+1]>Max_ampl_work/10:
nomera_nezanulyaemih_ampl.append(i+1)

n=list(nomera_nezanulyaemih_ampl)
for i in n:
nomera_nezanulyaemih_ampl.append(flen-i)
nomera_nezanulyaemih_ampl.append(0)
# print(nomera_nezanulyaemih_ampl)
#Блок зануления малых амплитуд в оригинальном преобразовании Фурье

for i in range(len(Mass_Amplitud)):
for k in nomera_nezanulyaemih_ampl:
if k==i:
ind=1
break
else:
ind=0
if ind==0:
Mass_Amplitud[i]=0
# print(Mass_Amplitud)
result = np.fft.ifft(Mass_Amplitud)
number_of_work_ampl=len(nomera_nezanulyaemih_ampl)
return result,number_of_work_ampl

#############################################################################
###
#Основная часть
#############################################################################
###
#Пара активов на десяточку
# activs=['VSMO', 'URKA']
# parts=[ 0.4,0.6]
# activs2=[ 'RTKMP','MOEX', 'GMKN','TRNFP']
# parts2=[ 0.4, 0.4,0.1,0.1]
#Пара корзин после обучения(плохих)
# activs=['MOEX']
# parts=[1.0]
# activs2=[ 'MOEX', 'MVID', 'SNGS', 'TATNP']

38
# parts2=[ 0.1, 0.3, 0.2, 0.4]
#ещё одна пара активов после обучения неплохая
# activs=['VSMO', 'PHOR', 'NVTK']
# parts=[0.7, 0.1, 0.2]
# activs2=[ 'ALRS', 'AKRN']
# parts2=[ 0.5,0.5]
#Ещё одна пара с крутым предсказательным эффектом
# activs=['PHOR', 'MSNG', 'BANEP']
# parts=[0.4, 0.1, 0.5]
# activs2=['NMTP', 'ALRS']
# parts2=[ 0.5,0.5]

#берем даты первой корзины, фильтруем


first_basket_dates=basket_date_generation(activs,parts)
#берем даты второй корзины, фильтруем
second_basket_dates=basket_date_generation(activs2,parts2)
#берем общие даты двух корзин
justice_basket_dates=baskets_intersecton(first_basket_dates,second_basket_dat
es)
#Берем цены первой корзины
first_basket_prices=basket_price_generation(justice_basket_dates,parts,activs
)
#Берем цены второй корзины
second_basket_prices=basket_price_generation(justice_basket_dates,parts2,acti
vs2)
#считаем Just Для этих цен
justice_coef_full = justice_basket_generation(first_basket_prices,
second_basket_prices)
# if sum(first_basket_prices)>sum(second_basket_prices):
#
justice_coef_full=justice_basket_generation(first_basket_prices,second_basket
_prices)
# else:
# justice_coef_full =
justice_basket_generation(second_basket_prices,first_basket_prices)

#1 блок анализа(построение линейного тренда)


linr=first_block_trend_line(justice_coef_full)
k_coef=linr.slope
b_coef=linr.intercept
#print(k_coef,b_coef)

#2 блок анализа(Качество отклонения регрессии)


regress_quality=second_block_regress_quality(k_coef,b_coef,justice_coef_full)

#3 блок анализа(количество удовлетворяющих точек и обработка сигнала с точки


зрения первеса от отклонения)
time=[i for i in range(len(justice_coef_full))]
good_points,sq_coef,simmetric_line=third_blok_good_points(time,justice_coef_f
ull)
#3.1 создаём новый массив коэфицентов справедливости
justice_coef_goodp=[]
for i in range (good_points):
justice_coef_goodp.append(justice_coef_full[len(justice_coef_full)-
good_points+i])
#3.2 создаём новый массив цен первого актива
first_basket_prices_good=[]
for i in range (good_points):

first_basket_prices_good.append(first_basket_prices[len(first_basket_prices)-
good_points+i])

39
# 3.3 создаём новый массив цен второго актива
second_basket_prices_good=[]
for i in range (good_points):

second_basket_prices_good.append(second_basket_prices[len(second_basket_price
s)-good_points+i])
# 3.4 создаём новый массив дат
dates_goodN=[]
for i in range (good_points):
dates_goodN.append(justice_basket_dates[len(justice_basket_dates)-
good_points+i])

#4 блок анализа(Коррелируемость цен)


corr_prices_no_drob=pearsonr(first_basket_prices,second_basket_prices)
corr_prices=corr_prices_no_drob[0]
p_value_pr=corr_prices_no_drob[1]

#5 блок анализа(Проверка совпадений доходностей по знаку)


simm_coeff=fourth_block_profit_balance(first_basket_prices,second_basket_pric
es)

#6 блок анализа(Проверка частоты пересечения временным рядом линии симметрии)


n_cross=fifth_block_cross_coeff(justice_coef_goodp)
#7 блок анализа(Сравнение приближенности синусоидной аппроксимации фурье по
сравнению с временным рядом)
furier_transformed_points,number_sin=fur_analis_block(justice_coef_full)
furier_transformed__good_points,number_good_sin=fur_analis_block(justice_coef
_goodp)

#Строим график временного ряда для проверки

time_line_visualisation(justice_coef_full)#сам график коэфицента justice

aproxx=[((i*k_coef)+b_coef) for i in range (len(justice_coef_full)) ]


time_line_visualisation(aproxx)#линейная линия тренда всего графика

full_x_return = []
for i in range(len(justice_coef_full)):
full_x_return.append(i)
txtl1 = 'furier aproxx for full using ' + str(number_sin) + ' sinus'
plt.plot(full_x_return, furier_transformed_points, label=txtl1)#Фурье-
апроксимация всего графика

top_p=max(justice_coef_full)*1.5
low_p=0
# vertikal_coordinate = len(justice_coef_full)-len(justice_coef_goodp)
vertikal_coordinate = len(justice_coef_full)-250
x_c=[vertikal_coordinate,vertikal_coordinate]
y_c=[top_p,low_p]
plt.plot(x_c,y_c)
#блок построения линии, для обрезки координат с позиции хороших точек

good_points_x=[]
for i in range(len(justice_coef_goodp)):
good_points_x.append(len(justice_coef_full)-i)
good_points_y=[simmetric_line for i in range(len(good_points_x))]
plt.plot(good_points_x,good_points_y)#блок построения линейной апроксимации
на "хороших точках"
good_points_x_return=[]
for i in range(len(good_points_x)):
good_points_x_return.append(good_points_x[len(good_points_x)-i-1])
txtl='furier aproxx for good points using '+str(number_good_sin)+' sinus'

40
plt.plot(good_points_x_return,furier_transformed__good_points, label = txtl)
#Фурье-апроксимация для хороших точек
#print(len(furier_transformed_points))

graph_text='global regress(kx+b)='+str(round(k_coef,4))
+'x+'+str(round(b_coef,2))
graph_text=graph_text+' | '+'reg quality='+str(round(regress_quality,2))
graph_text=graph_text+' | '+'timeline balance '+str(round(sq_coef,2))+' for
'+str(good_points)+' points'
graph_text=graph_text+' | '+'baskets corr='+str(round(corr_prices,2))+' with
'+str(round(p_value_pr,2))+'pvalue'
graph_text=graph_text+' | '+'simm coef='+str(round(simm_coeff,2))
graph_text=graph_text+' | '+str(n_cross)+'times cross simmetic line'
plt.legend(title=graph_text)
plt.show()
test = sm.tsa.adfuller(justice_coef_full)
print ('adf: ', test[0])
print ('p-value: ', test[1])
print ('Critical values: ', test[4])
if test[0]> test[4]['5%']:
print ('есть единичные корни, ряд не стационарен')
else:
print ('единичных корней нет, ряд стационарен')

# print(k_coef,b_coef)
# print(regress_quality)
# print(good_points)
# print(sq_coef)
# print(corr_prices)
# print(simm_coeff)
# print(n_cross)

# print (basket_prices)
# times=[i for i in range (len(basket_prices))]
# plt.plot(times,basket_prices)

41
Машинное обучение на языке Python 3.0:
import numpy as np

import matplotlib.pyplot as plt

import pandas as pd

%matplotlib inline

data = pd.read_excel('C:\\Users\\Слава\\Desktop\\Диплом\\
mach_learn_full.xlsx',sheetname=0,header=0)

data2= pd.read_excel('C:\\Users\\Слава\\Desktop\\Диплом\\
Mach_learn_prep.xlsx',sheetname=0,header=0)

data=data.sample(frac=1)

data

X=data[['regress_coef_k','regress_coef_b','regress_qual','balanced
points','timeline balance','corr_coef','corr_p-value','simm_coef',

'number_crosses_on_GP','fur_full_aprox_sin_number','fur_full_aprox_qu
al','fur_GP_aprox_sin_number','fur_GP_aprox_qual']]

y=data[['Easy_trust']]

from sklearn.cross_validation import train_test_split

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.1,


random_state = 1)

N_train, _ = X_train.shape

N_test, _ = X_test.shape

print (N_train, N_test)

y_train= y_train.values.ravel()

y_test=y_test.values.ravel()

X_Exp=data2[['regress_coef_k','regress_coef_b','regress_qual','balanced
points','timeline balance','corr_coef','corr_p-value','simm_coef',

'number_crosses_on_GP','fur_full_aprox_sin_number','fur_full_aprox_qu
al','fur_GP_aprox_sin_number','fur_GP_aprox_qual']]

X_Exp

42
#Random Forest

from sklearn import ensemble

rf = ensemble.RandomForestClassifier(n_estimators = 1000)

rf.fit(X_train, y_train)

err_train = np.mean(y_train != rf.predict(X_train))

err_test = np.mean(y_test != rf.predict(X_test))

a2=rf.predict(X_Exp)

print(err_train, err_test)

print(a2)

np.sum(rf.feature_importances_)

N, d = X.shape

feature_names = X.columns

importances = rf.feature_importances_

indices = np.argsort(importances)[::-1]

print("Feature ranking:")

for f in range(d):

print("%2d. feature '%5s' (%f)" % (f + 1, feature_names[indices[f]],


importances[indices[f]]))

43

Вам также может понравиться