|
CopyRight © 2012, Yury V.
Reshetov
Почему переобучается нейросеть?
Многие трейдеры используют
нейронные сети для прогнозирования изменений биржевых котировок. И им
приходилось сталкиваться с так называемым переобучением нейросетей.
В чем заключается переобучение? Если взять набор обучающих примеров и
разделить его на две части – обучающая выборка и тестовая выборка,
после чего на обучающей части натренировать нейросеть, а потом
проверить на обоих выборках, то часто оказывается, что на тестовой
выборке нейросеть выдает очень большое количество ошибок по сравнению с
выборкой обучающей. Такая разница в результатах называется
переобучением.
С чем это связано? На самом деле тому может быть несколько причин:
- Количество примеров в обучающей выборке недостаточно, чтобы
решать задачи вне выборки.
- Входные данные неравномерно распределены по степени
корреляции к выходным данным в различных выборках, что очень часто
бывает в случаях обработки нестационарных данных. Например, в обучающей
выборке корреляция какого либо входного параметра или нескольких
входных параметров по отношению к выходным значениям значительно выше,
чем в выборке тестовой или хуже того, коэффициенты корреляции в разных
выборках различаются по знаку. Это легко проверить, вычислив
коэффициенты корреляции для всех параметров в разных выборках, причем
еще до обучения нейросети. И избавиться от этого недостатка тоже
достаточно просто, а именно обучающие примеры разложить по выборкам
случайным образом.
- Входные параметры не связаны с выходными, т.е. между ними
нет никакой причинно-следственной связи – они нерепрезентативны, а
соответственно и обучать нейросеть нечему. И проверка на предмет
наличия корреляций между входными и выходными данными покажет
корреляцию близкую к нулевой. В этом случае необходимо поискать другие
входные данные, на которых и обучать нейросеть.
- Входные данные сильно коррелируют между собой. В этом
случае необходимо оставить входные данные с максимальной корреляцией по
отношению к выходным, удалив остальные, хорошо коррелирующие с
оставшимися.
Все вышеописанные причины переобучения и методы их устранения являются
общеизвестными, т.к. ранее описывались в различной литературе или
статьях, посвященных нейросетевым технологиям.
Другое дело, если мы взяли некие обучающие примеры, провели все
вышеуказанные процедуры для устранения недостатков и тем не менее опять
же получили переобучение. В чем еще может быть причина?
А выяснить причину удалось случайно. Меня пригласили поучаствовать в
одном проекте, связанном с технологиями Data Mining (не буду
напоминать, что данный термин является синонимом искусственного
интеллекта и применяется гораздо чаще по той простой причине, что
термин «искусственный интеллект» имеет "подмоченную" репутацию в связи
с провальным международным проектом так называемых «машин пятого
поколения», т.е. всего лишь произошла смена вывески, но внутреннее
содержание осталось прежним). Мне поручили заняться в проекте той
частью, которая связана с линейной логистической регрессией. Некоторых
может запутать терминология и они поспешат восполнить свои знания с
помощью википедии. Не стоит торопиться. Логистическая регрессия на
самом деле достаточно примитивна, а именно берем однослойный перцептрон
(см. статью "Как
найти
прибыльную
торговую
стратегию"), а на его выход ставим
сигмоид именуемый логистической функцией. Т.е. примитивнейшая
двуслойная нейросеть. Принцип действия, судя по описанию метода, должен
сводиться к тому, что если взять обучающую выборку и обучить
вышеуказанную нейросеть, то она якобы способна на выходе выдавать
вероятности.
Основным свойством логистической регрессии помимо специфического
сигмоида - логистической функции на выходе, является то, что в
обучающей выборке все выходные данные являются бинарными, т.е.
принимают одно из двух значений: либо 0 или 1, но чаще всего для
удобства -1 или 1. Помимо всего прочего, в логистической регрессии не
используется отсекающий порог на выходе нейросети, т.е. выходные
данные, несмотря на то, что они в обучающей выборке строго бинарны, но
после обучения уже непрерывны. Отсутствие отсекающего порога на выходе
компенсируется дальнейшей постобработкой результатов с целью уточнения
доверительных интервалов, например, с помощью ROC анализа.
Т.е. логистическая регрессия является частным случаем примитивной
нейросети и предназначается для решения некоторых узкоспециальных задач
классификации.
Первое, что меня насторожило – это чрезмерно смелое допущение, которое
гласит о том, что логистическая регрессия способна вычислять
вероятности. Знакомство с логистической функцией развеивало сомнения,
т.к. данный сигмоид имеет достаточные математические обоснования в
данной области применения. Подозрения вызвало то обстоятельство, что
однослойные перцептроны никакого отношения к теории вероятности не
имеют, но тут разработчики метода основывались на допущении, что
логистическая функция в качестве сигмоида устраняет данный недостаток
искусственного нейрона, якобы подгоняя его выходные данные под
распределение Бернулли.
Это мне и предстояло проверить, т.к. успешность проекта напрямую
зависела именно от результатов логистической регрессии. Т.е. мне
необходимо было выяснить, есть ли смысл использовать в проекте линейную
логистическую регрессию, либо отказаться от нее и применить более
адекватную методику.
Чтобы проверить гипотезу о возможности нейрона выдавать на выходах
вероятности, я взял несколько примитивных примеров для экспертных
систем, базирующихся на теореме Байеса. Примитивных для того, чтобы
нейрон мог их запросто аппроксимировать, а также для того, чтобы
вычисление вероятностей исходов в зависимости от наличия признаков, не
вызывала затруднений. Далее, подавая промежуточные данные экспертной
системе и модели логистической регрессии, получил результаты, которые
говорили о том, что в отличие от экспертных систем, логистическая
регрессия очень редко выдает корректные значения, а гораздо чаще
далекие от истины, особенно когда значение на выходе нейрона не
является бинарным.
Почему так происходит? Давайте
разберемся.
Возьмем для примера классическую задачу по распознаванию летающих
объектов: птица, плане, самолет и муха из [2]. У данных объектов могут
присутствовать или отсутствовать такие признаки, как: крылья, клюв,
хвост, оперение, двигатель и шасси.
Вполне понятно, для того, чтобы воспользоваться статистикой для
проверки вероятностей, реальные летающие объекты не подойдут, т.к. про
мух лишь известно, что их очень много, но сколько точно – определить
никак невозможно. Птиц чуть поменьше, чем мух, но тоже очень много и
пока полную перепись по ним никто проводить не решался. С планерами и
самолетами гораздо проще в плане статистики, хотя собрать эту
статистику воедино, на самом деле, тоже практически нереально.
По этой причине, мы предположим что имеем дело с четырьмя муляжами
(макетами) объектов, по одному на каждый объект, что позволяет
воспользоваться статистикой из расчета вероятности 0.25 на каждый
муляж, даже при отсутствии каких либо вычислительных средств, кроме
головы, т.к. все можно подсчитать на примитивном калькуляторе.
Выпишем в виде таблицы соответствия объектов и их признаков,
обозначив признаки в бинарном виде: 0 – отсутствие признака, 1 –
принадлежность объекту.
Объект \ Признак
|
Крылья
|
Хвост |
Клюв
|
Двигатель |
Оперение |
Шасси
|
Птица
|
1
|
1
|
1
|
0
|
1
|
0
|
Планер
|
1
|
1
|
0
|
0
|
0
|
1
|
Самолет
|
1
|
1
|
0
|
1
|
0
|
1
|
Муха
|
1
|
0
|
0
|
0
|
0
|
0
|
Обозначим признаки объектов в виде переменных:
- Крылья – х0
- Хвост – х1
- Клюв – х2
- Двигатель – х3
- Оперение – х4
- Шасси – х5
Создадим обучающие примеры для распознавания планера:
y - Выход
|
x0 - Вход крылья
|
x1 - Вход хвост
|
х2 -Вход клюв
|
x3 - Вход двигатель
|
x4 - Вход оперение
|
x5 - Вход шасси
|
0
|
1
|
1
|
1
|
0
|
1
|
0
|
1
|
1
|
1
|
0
|
0
|
0
|
1
|
0
|
1
|
1
|
0
|
1
|
0
|
1
|
0
|
1
|
0
|
0
|
0
|
0
|
0
|
Попробуем обучить искусственный нейрон этим самым правилам и получим:
y = -1 * x3 + 1 * x5
где: y – значение на выходе нейрона
Как видим, данная аппроксимация соответствует обучающей выборке по всем
примерам, т.е. дает точное значение на выходе в зависимости от входных
данных.
Предположим, что мы идентифицируем некий объект на предмет того,
является ли он планером или нет, а также смогли точно установить, что
он имеет в наличии шасси, т.е. (вероятность наличия у объекта этого
признака равна 1), но пока не удалось доподлинно выяснить наличие у
него двигателя, (вероятность наличия этого признака равна 0.5). Какова
вероятность принадлежности объекта к классу – планер? Легко вычислить,
что наличие шасси говорит о принадлежности объекта только двум классам
из четырех, а следовательно отсутствие информации о наличии двигателя
даст вероятность 50%. Т.е. приняв гипотезу об отсутствии двигателя, мы
рискуем ошибиться наполовину, т.к. ее опровержение будет означать, что
объект – самолет.
Попробуем решить эту задачу с помощью обученного искусственного
нейрона.
y = -1 * 0.5 + 1 * 1 = 0.5
Результат оказался верным.
Логит-функция в данном случае ничего не скорректирует, т.к. ее входные
данные равны выходным при трех значениях – 0, 0.5 и 1. Так, что
результат линейной логистической регрессии здесь оказался точным.
Теперь разберем еще один вариант. Предположим, мы выяснили, что у
объекта точно есть двигатель, но нам неизвестно, есть ли у него шасси.
Какова вероятность принадлежности к планеру? Наличие двигателя сразу
обнуляет вероятность принадлежности нашего объекта к планерам и к
биологическим объектам. Следовательно, вероятность того, что объект -
планер равна 0.
Что нам сообщит по этому поводу искусственный нейрон:
y = -1 * 1 + 1 * 0.5 = -0.5
Да уж! Нейросеть оказалась в явно проигрышном положении по
сравнению даже с весьма посредственным студентом, которому хотя бы
известно, что вероятность никак не может быть отрицательной. Конечно
же, сигмоид логистическая функция на выходе такого безобразия не
допустит и выставит вероятность пренебрежительно малой, т.е. чуть выше
нулевой.
Рассмотрим еще один пример, предположим что нам удалось засечь
летающий объект, но никаких признаков у него выявить вообще не удалось.
В этом случае вероятности наличия двигателя и шасси будут равны 0.5.
Что нам скажет по этому поводу нейрон?
y = -1 * 0.5 + 1 * 0.5 = 0
Т.е. по мнению логистической
регрессии наш объект не может быть планером ни при каких
обстоятельствах, т.к. вероятность подобного исхода нулевая. Эдакая
самоуверенность.
Более корректно в данном случае использовать какие либо нелинейные
математические выражения, которые не способны ни при каких
обстоятельствах выдавать результаты выходящие за допустимые пределы.
Например:
y = x5 – x3 * x5
В этом случае при любых значения
x3 и x5 в пределах от 0 до 1 включительно, значение функции также будет
изменяться лишь в пределах в пределах от 0 до 1 включительно.
Далее можно уже не разбираться, т.к. выводы ясны: даже если
искусственный нейрон и способен к аппроксимации, то абсолютно
непригоден для интерполяции. То же самые выводы, соответственно
распространяются и на непригодность нейронов к экстраполяции.
Безусловно, многослойные нейронные сети в той или иной степени с
подобными проблемами справляются. Но факт остается фактом: даже
стационарность данных в обучающей выборке и отсутствие противоречий в
ней, не являются помехой для ошибок при интерполяции. Поскольку,
погрешности имеют свойство накапливаться при усложнении вычислений, то
«улучшение» нейросети многослойностью в некоторых случаях приведет
только к еще более худшим результатам.
Что касается применения линейной логистической регрессии на
одном нейроне, особенно в медицинской диагностике, то она явно
некорректна для прикладных областей, поскольку ни для каких функций,
кроме шарлатанских, в том виде, в каком этот метод в данный момент
используется, она совершенно не пригодна.
Теорема Тарского о неполноте
формальных систем
Существуют формальные системы, для
которых всякая интерпретация приводит к выражениям одновременно
истинным и недоказуемым (с) 1935, А. Тарский[1 3.6 стр. 114]
В частности, к формальным
системам которые подпадают под теорему Тарского, т.е. во всякой
интерпретации проводят к выражениям одновременно истинным и
недоказуемым, являются формальные арифметики первого порядка. Например,
к таковым относятся формальная арифметика Гильберта и аксиомы Пеано,
неполнота которых доказана во второй теореме К. Геделя в 1931 г [1
3.5.2 стр. 106].
В соответствии теоремой Тарского,
как было показано выше, одиночный нейрон может давать выражения
одновременно истинные в аппроксимации и недоказуемые (выходящие за
пределы диапазона истинности и ложности) в интерполяции. В тоже самое
время мы убедились, что существует множество других решений, которые
также дают истинные значения в аппроксимации, но не выходят за пределы
истинности и ложности при интерполяции.
Наша задача сформулировать
необходимые и достаточные условия для формальной системы, которая во
всех интерпретация приводила бы к выражениям одновременно истинным и
доказуемым.
Экспертная (формальная) система
Экспертная система – это система
искусственного интеллекта, содержащая набор правил, интерпретируемых на
понятный людям язык. Понятный не всем людям, а только тем, кто знает
теорию вероятностей, т.е. язык имеется в виду не разговорный, а в
рамках математической терминологии. Интерпретация необходима для того,
чтобы специалист в той области, в которой используется экспертная
система, мог понять и разобраться в корне проблемы.
Существует достаточно большое количество экспертных систем,
используемых в различных прикладных областях. Количество алгоритмов,
применяемых в экспертных системах также весьма разнообразно.
Мы не будем на них останавливаться, т.к. большая часть этих систем
предназначена для ручного ввода правил в систему, а алгоритмы способны
лишь обнаруживать и устранять противоречия, уже содержащиеся в
правилах. Скажем так: наиболее известные алгоритмы и методы построения
экспертных систем нам явно не подходят.
Нам необходимо построить такую экспертную систему, которая из готового
набора примеров, автоматически отберет и настроит лишь необходимое
количество правил. Т.е. никакой ручной работы, все должно быть строго
автоматически, как это делается в случаях применения логистической
регрессии.
Ставим задачу. Пусть у нас есть три технических индикатора, а точнее
осциллятора, каждый из которых выдает значения от 0 до 1 включительно.
Нам необходимо создать и настроить набор правил для этих самых
осцилляторов, которые будут максимально корректно прогнозировать
вероятность направления будущего движения цены. Вероятность тоже может
принимать значения от 0 до 1 включительно и при этом не выходить за
пределы допустимого диапазона.
Правила для экспертной системы
Пусть наша экспертная система
считывает показания осцилляторов и присваивает их значения в переменные
с идентификаторами: A, B и C.
Тогда правило может выглядеть примерно так:
r0 = A * B * C * p0
Где: A, B и C – показания - значения осцилляторов.
p0 – вероятность того, что открытая короткая позиция даст в
ближайшем
будущем профит, если значения осцилляторов А = B = C = 1
r0 – вероятность профитности короткой позиции для правила 0
Интерпретация данного правила гласит: если показания всех трех
осцилляторов равны 1, то вероятность того, что короткая позиция будет
профитна в ближайшем будущем равна вероятности p0.
Предположим, что нам необходимо сформулировать правило для случая,
когда два осциллятора A и B дают показания со значением 1, а показания
осциллятора с идентификатором C выдает показания со значением 0.
В этом случае запишем еще одно правило:
r1 = A * B * (1 - C) * p1
Теоретически такая запись правил для экспертной системы не
противоречит теории вероятности, если допустить что показания
независимых осцилляторов прямо пропорциональны вероятности неких
торговых сигналов, который в свою очередь дает правильные показания с
некой вероятностью pi, если торговые сигналы A и B принимают значения
1, а торговый сигнал С имеет значение 0.
Выражение (1 - С) соответствует теории вероятности [3], т.к. с
его помощью вычисляется вероятность того, что событие С не произойдет.
Чтобы проще разобраться, продемонстрируем электрическую схему:

На данной схеме мы имеем три электромеханических реле A, B и C,
контакты которых подключены последовательно в электрическую цепь,
подающую электрический ток для реле D. Если на реле D поступит
электричество, то замкнется его контакт, который в свою очередь
замкнется и подаст напряжение для электрической лампочки. Предположим,
что мы подали электрический ток в нашу схему. В этом случае, контакты
реле A, B и C замкнутся и сработает реле D, которое в свою очередь
замкнет контакт и лампочка загорится. Но, что если все четыре
электромеханических реле у нас ненадежны и вероятности их срабатываний
(замыканий и размыканий контактов) не равны 1. В таком случае
вероятность того, что лампочка загорится равна:
pA, B, C, D = pA
* pB * pC * pD
где: pX - вероятность (надежность) срабатывания
реле X
Если возьмем упрощенные выражения вероятностей: A = pA,
B
=
pB, C = pC и D = p0
То мы получаем правило для нашей экспертной системы, которое уже было
продемонстрировано:
r0 = A * B * C * p0
Т.е. наши правила в экспертной системе не противоречат теории
вероятности, а полностью ей соответствуют.
Вполне понятно, что для полноты формальной системы мы должны собрать
полный набор всех возможных правил, таким образом, чтобы они описывали
все возможные исходы.
Для этого необходимо и достаточно взять набор лишь тех правил, которые
являются взаимоисключающими для крайних значений A, B и С для всех pi
=
1. Взаимоисключающие события в теории вероятности именуются
несовместными.
Для чего нужен именно полный набор несовместных правил? Полный набор
нужен для того, чтобы наша экспертная система соответствовала теореме о
полной вероятности [3], которая, как известно гласит о том, что полная
вероятность, т.е. сумма всех возможных потенциальных событий равна 1.
Вторая причина для такого набора правил заключается в том, что все
вероятности несовместных событий можно просто суммировать друг с
другом, согласно теореме сложения вероятностей [3]. Если правила будут
в той или иной степени совместны (например, как в нейроне
перцептронного типа), то вычисление результирующей вероятности для всех
правил значительно усложняется и простейшим суммированием вероятностей
правил уже не обойтись.
Если мы имеем набор из n признаков (торговых осцилляторов) события
(торгового сигнала), то количество несовместных правил для него равно 2n.
Как получить этот самый полный набор: целые числа в диапазоне
от 0 до 2n – 1 включительно – номера правил. Выпишем каждый
номер правила в виде двоичного числа, лучше всего в виде такой вот
таблицы:
Номер правила
|
А |
B |
C |
0
|
0
|
0
|
0
|
1
|
0
|
0
|
1
|
2
|
0
|
1
|
0
|
3
|
0
|
1
|
1
|
4
|
1
|
0
|
0
|
5
|
1
|
0
|
1
|
6
|
1
|
1
|
0
|
7
|
1
|
1
|
1
|
Теперь выписываем сами правила, заменяя в произведении
значения 1 на идентификаторы колонки, а значения 0 на разницу единицы и
идентификатора колонки и дополняя каждое правило произведением его
вероятности:
|
r0 = (1 – A) * (1 – B) * (1 – C) * p0
r1 = (1 – A) * (1 – B) * C * p1
r2 = (1 – A) * B * (1 – C) * p2
r3 = (1 – A) * B * C * p3
r4 = A * (1 – B) * (1 – C) * p4
r5 = A * (1 – B) * C * p5
r6 = A * B * (1 – C) * p6
r7 = A * B * C * p7
|
Проверим наш набор на
несовместность. Присвоим всем вероятностям правил значение 1, т. е.: p0
= p1 = p2 = p3 = p4 = p5
= p6 = p7 = 1. В данном случае мы настроили
экспертную систему на тот режим, когда независимо от значений на ее
входах находящихся в диапазоне от 0 до 1 включительно, на выходе всегда
будет максимальное значение вероятности, т.е. 1.
Если мы будем присваивать значения для различных строк взятых из
вышеуказанной таблицы значениям A, B и С, взятых из соответствующих
колонок, то только то, правило, которое соответствует номеру строки из
таблицы будет равно 1, а все остальные правила дадут в результате 0.
Т.е. мы имеем несовместность для всех правил без исключения по
отношению к любым другим правилам. Поскольку никаких других комбинаций
нулей и единичек не существует, кроме как указанных в таблице, то имеем
полный набор всех возможных правил для наших входных переменных.
Проверим наш набор на соответствие теореме о полной вероятности [3].
Для этого возьмем для переменных A, B и С произвольные значения от 0
исключительно и до 1 исключительно. В этом случае каждое правило будет
давать в результате какое либо значении также в диапазоне больше 0 и
менее 1, но итоговая сумма значений для всех правил будет равна 1.
В случае, когда значения для A = B = C = 0.5, все правила дадут в
результате значение 0.125, т.е. что говорит о том, что они равноправны
т.к. неопределенности распределяются равномерно.
Вполне естественно, что если мы примем нулевые значения для
вероятностей (pi) для всех правил, и присвоим всем вероятностям правил
значение 0, т.е. p0 = p1 = p2 = p3
= p4 = p5 = p6 = p7 = 0, то
результаты вычислений покажут, что все правила также выдают значение 0,
независимо от того, какие значения присваиваются для аргументов A, B и
C.
Значит соответствие правил теории
вероятности у нас строгое и набор этих самых правил полный.
Значение вероятности, выдаваемое
каждым отдельным правилом экспертной системы, соответствует вероятности
схожести (соответствия) входных значений экспертной системы с
соответствующим правилом.
Наша экспертная система
соответствует необходимым и достаточным условиям для соблюдения полноты
и непротиворечивости.
Может ли экспертная система решать логические задачи?
Мы уже убедились, что экспертная
система способна правильно интерполировать значения для задач по теории
вероятностей. А как обстоит дело с логическими функциями? Вопрос далеко
не праздный, поскольку однослойный перцептрон не способен решить задачу
XOR (исключающее ИЛИ). К тому же в прикладных целях часто возникает
необходимость применения нечеткой логики (fuzzy logic).
Попробуем разобраться. Соберем
экспертную систему для двух входных значений A и B:
|
y = (1 - A) * (1 - B) * p0
+
(1 - A) * B * p1
+
A * (1 - B) * p2
+
A * B * p3
|
Очевидно, что если p0
= p3 = 0 и
p1 = p2 = 1, то экспертная система
запрограммирована на решение задачи
XOR, т.е. после упрощения выражений получаем:
y = (1 - A) * B + A * (1 - B) = A
+ B - 2 * A * B
Т.е. если значения для А и B
бинарные (0 либо 1) и A = B, то y = 0. Если A ≠ B, то y = 1. Это
и есть
классическое решение задачи XOR.
Если проанализировать далее, то при
p0 = 0 и p1 = p2 = p3 = 1,
экспертная система будет решать задачу OR
(логическое ИЛИ). При p0 = p1 = p2 = 0
и p3 = 1 мы получим решение
задачи AND (логическое И). При p0 = p1 = 1 и p1
= p2 = 0 мы получим
решение задачи NOT A (логическое НЕ).
Т.е. подставляя бинарные значения
для переменных pi, мы можем синтезировать экспертной системой,
состоящей из полного набора взаимоисключающих правил любую логическую
функцию. А если входные значения и значения вероятностей будут
непрерывны в пределах от 0 до 1 включительно, то можно синтезировать и
любые нечеткие логические и вероятностные функции.
Конечно же, данная экспертная
система не в состоянии аппроксимировать и интерполировать все возможные
непрерывные функции от многих переменных, но нам в этого и не нужно,
т.к. для решения прикладных задач необходимо и достаточно ограничиться
лишь аппроксимацией и интерполяцией функций исключающих любые
логические и вероятностные противоречия.
Обучение экспертной системы
Теоретически, мы можем, как и для
наиболее распространенных экспертных систем, собрать статистику и
вручную подобрать и необходимые для базы знаний правила и значения
вероятностей для этих самых правил.
- Но, это очень долго, к тому же
не исключен человеческий фактор, который заключается в том, что человек
менее оперативен по сравнению с компьютером и способен совершить
большее количество ошибок.
- Наша экспертная система
предназначена для нестационарной области, а следовательно
статистические данные придется все время обновлять по мере их
устаревания.
- Статистические данные для
нашего набора правил будут корректны только лишь в том случае, когда
статистика будет подобрана только при значениях технических
осцилляторов находящихся в крайних состояниях, т.е. либо 0 либо 1. А
такое маловероятно. Ведь гораздо чаще показания технических
осцилляторов будут находиться в промежуточных состояниях между 0 и 1.
Зачем делать что-то вручную, если
задачу можно автоматизировать?
Проще говоря, подбор адекватных значений вероятностей для нашего набора
правил, мы поручим генетическому алгоритму.
Мы возьмем два участка исторических данных, на одном из которых
(обучающая выборка) обучим, т.е. аппроксимируем под торговые сигналы
нашу экспертную систему, а на другом (тестовая выборка, именуемая
форвардным тестом) проверим систему на правильность интерполяции.
Создание советника,
принимающего торговые решения на основе выводов экспертной системы
Для того, чтобы убедиться в
эффективности экспертной системы, создадим код советника (механической
торговой системы), считывающего торговые сигналы с осциллятора Relative
Strength Index (RSI) с периодом 9. На входы экспертной системы мы
подадим три лаговых показания RSI со смещением вглубь истории на 0, 9 и
18 баров. Соответственно, нам понадобится три входа, для каждого
показания осциллятора и 8 несовместных обучающих правил экспертной
системы. Вероятности для каждого правила будем подбирать с помощью
генетического алгоритма, встроенного в тестер стратегий терминала
МetaTrader 5.
Зададим входные переменные для
нашего советника:
extern int x0 = 50; extern int x1 = 50; extern int x2 = 50; extern int x3 = 50; extern int x4 = 50; extern int x5 = 50; extern int x6 = 50; extern int x7 = 50;
Вход в рынок у нашей торговой
системы будет осуществляться по показаниям экспертной системы, а выход
по фиксированным защитным стоплоссу либо тейкпрофиту. Объем открываемой
позиции также будет фиксированным. Торговая система будет работать и
осуществлять технический анализ только по ценам открытия баров, поэтому
необходимо также запоминать время открытия последнего бара. Добавим
необходимые входные параметры:
extern double sl = 500.0; extern double lots = 1.0; extern int mn = 888; static int prevtime = 0;
Добавим в код нашего советника
экспертную систему:
double getProbability(double p1, double p2, double p3) {
double y0 = x0; double y1 = x1; double y2 = x2; double y3 = x3; double y4 = x4; double y5 = x5; double y6 = x6; double y7 = x7;
double pn1 = 1.0 - p1; double pn2 = 1.0 - p2; double pn3 = 1.0 - p3;
double probability = pn1 * (pn2 * (pn3 * y0 + p3 * y1) + p2 * (pn3 * y2 + p3 * y3)) + p1 * (pn2 * (pn3 * y4 + p3 * y5) + p2 * (pn3 * y6 + p3 * y7));
probability = probability / 100.0;
return (probability);
}
Также нам понадобится функция,
которая будет считывать лаговые показания осциллятора, вычислять по ним
вероятности и выдавать результаты в виде торговых сигналов:
double tradesSingal() { double a1 = input(18, 0); double a2 = sigmoid(a1 - input(18, 1)); double a3 = sigmoid(a1 - input(18, 2));
double result = getProbability(a1, a2, a3); string s = Symbol() + ", Probability for Short (Sell) position: " + DoubleToStr(result, 4);
if (result > 0.5) { Print(s); } else { double r = 1.0 - result; s = Symbol() + ", Probability for Long (Buy) position: " + DoubleToStr(r, 4); Print(s); } SendMail(s, s); result = result * 2.0 - 1.0; Print("Result = ", result); return (result); }
Осталось только добавить код
торговой системы, исполняющей торговые приказы по сигналам:
int start() { if (Time[0] == prevtime) { return(0); } prevtime = Time[0]; if(! IsTradeAllowed()) { Print("Trades not allowed"); again(); return(0); }
int total = OrdersTotal(); for(int i = total - 1; i >= 0; i--) { OrderSelect(i, SELECT_BY_POS, MODE_TRADES); if ((OrderSymbol() == Symbol()) && (OrderMagicNumber() == mn)) { return(0); } }
double sp = tradesSingal();
double stoploss = 0.0; double takeprofit = 0.0; double lt = lots; if (IsOptimization()) { lt = getLots(MathAbs(sp)); } RefreshRates(); string s = ""; int ticket = -1; if (sp < 0.0) { stoploss = Bid - sl * Point; takeprofit = Bid + sl * Point; ticket = OrderSend(Symbol(), OP_BUY, lt, Ask, 1, stoploss, takeprofit, WindowExpertName(), mn, 0, Blue); if (ticket < 0) { Print("OrderSend failed with error #", GetLastError()); again(); } else { s = "Open " + Symbol() + " #" + DoubleToStr(ticket, 0) + " Buy , Price:" + Ask + ", " + DoubleToStr(lots, 2) + " lots, SL: " + DoubleToStr(stoploss, 5) + ", TP: " + DoubleToStr(takeprofit, 5); SendMail("Open Buy position of " + Symbol(), s); } } else { stoploss = Ask + sl * Point; takeprofit = Ask - sl * Point; ticket = OrderSend(Symbol(), OP_SELL, lt, Bid, 1, stoploss, takeprofit, WindowExpertName(), mn, 0, Red); if (ticket < 0) { Print("OrderSend failed with error #", GetLastError()); again(); } else { s = "Open " + Symbol() + " #" + DoubleToStr(ticket, 0) + " Sell , Price:" + Bid + ", " + DoubleToStr(lots, 2) + " lots, SL: " + DoubleToStr(stoploss, 5) + ", TP: " + DoubleToStr(takeprofit, 5); SendMail("Open Sell position of " + Symbol(), s); } }
return(0); }
Также добавим остальные необходимые функции:
int init() { prevtime = Time[0]; return(0); }
void again() { prevtime = Time[1]; Sleep(30000); }
double input(int p, int shift) { double result = iRSI(Symbol(), 0, p, PRICE_OPEN, shift * p) / 100.0; return (result); }
double sigmoid(double x) { return((x + 1.0) / 2.0); }
double getLots(double sp) { double result = lots * sp; if (result < 0.1) { result = 0.1; } result = NormalizeDouble(result, 1); return(result); }
Обучение и испытание экспертной системы
Мы создали алгоритм торговой
системы, принимающей торговые решения на основании вероятностей,
вычисляемых встроенной экспертной системой по лаговым показаниям
оссциллятора RSI. Настало время проверить ее в действии, т.е. обучить
на выборке исторических данных и дополнительно проверить на участке
исторических данных вне выборки, а также провести дополнительную
проверку на устойчивость к рыночным изменениям.
Зададим диапазоны входных данных:


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

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

Теперь можно перейти во вкладку
"Настройки" и нажав клавишу "Старт", запустить оптимизацию.
Отсортируем их в колонке "Прибыль" по возрастанию, кликнув по
соответствующему заголовку в таблице результатов:

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

Убираем галочку с использовать дату:

Нажимаем кнопку "Старт" и по
завершении теста смотрим график баланса - эквити:

Первые 145 сделок - это результат
оптимизации, а оставшиеся - форвардный тест на котором оптимизация не
проводилась.
Смотрим результаты:
Достоинства и недостатки экспертной системы
Достоинства:
- По сравнению с наиболее
распространенными экспертными системами, данная обладает тем
преимуществом, что ее настройка происходит в полностью автоматическом
режиме по набору обучающих примеров.
- По сравнению с нейронными
сетями все экспертные системы не являются черными ящиками и имеют базу
знаний в виде набора правил понятных для тех, кто знаком с основами
теории вероятности, а также с теми областями знаний в которых
экспертные системы применяются.
- Экспертная система при полном
наборе правил и вероятностной несовместности этих самых правил, вполне
корректно выполняет задачи интерполяции, т.е. не подпадает под
ограничения теорем о неполноте формальных арифметик Тарского и вторую
Геделя. Ошибки на выходе такой экспертной системы, приводящие к выходам
результатов за пределы допустимых значений, исключены.
- Экспертные системы могут
применяться для вычисления вероятностей тех или иных исходов, без
дополнительной коррекции сигмоидами на выходе. Нейронные сети для таких
же целей необходимо объединять в комитеты. Данное свойство позволяет
использовать экспертные системы для оперативного анализа рыночной
ситуации в торговых системах с управлением капиталом и риском.
Недостатки:
- Количество всех потенциальных
правил в полной базе знаний возрастает экспоненциально в зависимости от
количества входов и равно 2n для n входов. Это не позволяет
создавать экспертные системы с большим количеством входов, т.к. полный
набор правил может не уместиться в памяти компьютера и даже если и
уместиться, то потребуются значительные вычислительные ресурсы для
автоматического обучения многовходовой системы. Нейронная сеть в данном
случае значительно выигрывает в потреблении вычислительных ресурсов,
т.к. при большом количестве входов она может выбрать только наиболее
значимые, исключив остальные. По этой причине нейросеть более гибка и
менее требовательная к ресурсам. Но не стоит забывать, что с
увеличением количества входов, также необходимо увеличивать и
количество обучающих примеров в той же самой экспоненциальной
прогрессии, т.к. если примеров будет недостаточно для анализа всех
потенциальных входных комбинаций, то произойдет недообучение нейронной
сети или экспертной системы.
- Корректное вычисление
вероятностей на выходе экспертной системы возможно только при условии,
когда значения на входах прямо пропорциональны вероятностям торговых
сигналов, а сами входные сигналы строго независимы друг от друга. Во
многих прикладных областях добиться полного выполнения данных условий
весьма затруднительно, либо вообще невозможно. Частично экспертная
система способна исправить такие недостатки, но полностью, т.е. с
высокой точностью выдавать на выходах корректные значения вероятностей
при несоблюдении вышеуказанных условий, она уже не в состоянии.
Исправить данный недостаток можно путем дополнительного исследования
распределений вероятностей для всего диапазона значений входных
сигналов, чтобы на основе этих самых распределений создать
корректирующие сигмоиды на входах.
Заключение
В данной статье были рассмотрены
теоретические и практические возможности экспертной системы,
вычисляющей вероятности из полного набора несовместных правил.
Практические испытания показали,
что данный тип экспертных систем вполне адекватен даже в нестационарных
областях, таких, как прогнозирование финансовых рынков.
Не исключено, что данная
публикация окажет значительное влияние на более широкое распространение
подобных экспертных систем, а также на их дальнейшее усовершенствование.
Юрий Вячеславович Решетов
г. Ташкент, 8 февраля 2012 г.
Литература
- Лорьер Ж.-Л.,
Системы искусственного интеллекта: Пер. с франц. - М.: Мир, 1991. 568
с.: ил. ISBN 5-03-001408-X
- Нейлор К., Как
построить свою экспертную систему: Пер. с англ. - М.: Энергоатомиздат,
1991. - 286 с.: ил. ISBN 5-283-02502-0
- Колмогоров А.
Н., Журбенко И. Г., Прохоров А. В.: Введение в теорию вероятностей. -
М.: Наука. Главная редакция физико-математической литературы, 1982, 160
с. - (Библиотечка "Квант". Вып. 23)
|