Блог им. ivanovr
Метод ГП по своим свойствам потенциально мог бы являться универсальным методом поиска алгоритма оптимизирующего заданную целевую функцию. И я как любитель эволюционной оптимизации не мог пройти мимо такой заманчивой идеи.
Торговый алгоритм ищу в виде набора элементарных функционалов. Каждый функционал может иметь любое количество входов и по крайней мере один выход. Вход и выход характеризуется типом данных. Выход одного функционала может быть подан на вход другого при условии, что тип данных входа и выхода совпадает.
Например, функционал вычисления минимума/максимума в заданном окне получает на вход интересующую величину и значение размера окна, а также имеет 4 выхода: минимум/максимум, позиция точки минимума/максимума в окне.
ГП должен подобрать функционалы и связать их входы и выходы так, чтобы в итоге получился единственный выход типа сигнал (сигнал есть либо нет), который и будет являться сигналом на покупку/продажу. Связанные функционалы с общем случае образуют граф. Целевой функцией является критерий Шарпа с поправкой — наказанием за информационную сложность алгоритма.
Пробовал разрабатывать алгоритмы по этому методу, но позже забросил, поскольку выхлопа получалось меньше чем от более простых способов описания алгоритмов. Да и вычислительная сложность оказалась чрезмерно велика. К тому же алгоритмы с точки зрения человека получались мягко говоря странные и поверить в их устойчивость было трудно.
Но недавно, проверяя на новой истории уже давно разработанные алгоритмы, обнаружил довольно неожиданный экземпляр. Питается он 5-минутными барами. Эквити изображена на рисунке. Синими вертикальными линиями показана область использованная при оптимизации ГП. Справа от черной линии новые данные, которые никак не могли использоваться при разработке стратегии. На новых данных пока 24 позиции, но с довольно убедительной статистикой. 16 последних позиций уже отработано в реале (естественно в полюс). Будем посмотреть.
Ниже показан граф алгоритма. Из него в первом приближении понятно как происходит вычисление. Число в начала строки — условный номер функционала. В скобках показано с чем связываются входы данного функционала. (<номер функционала — источника>, <номер выхода>).
Понятное дело, что человек в здравом уме не стал бы придумывать такую ахинею, но ахинея работает. Это еще одно подтверждение того, что алгоритм не обязательно должен быть понятен человеку.
0 TGF_PriceData
ValueIndex = viClose
1 TGF_BarNumber
Value = 33
2 TGF_MinMax (0,0)(1,0)
3 TGF_BarNumber
Value = 34 TGF_Delay (2,0)(3,0)
5 TGF_PriceData
ValueIndex = viLow
6 TGF_MovingAverageFunc (5,0)(3,0)
7 TGF_MovingAverageFunc (6,0)(3,0)
8 TGF_DFaverage0 (7,0)(3,0)
9 TGF_Subtractor (4,0)(8,0)
10 TGF_BarNumber
Value = 9
11 TGF_MinMax (9,0)(10,0)
12 TGF_BarNumber
Value = 5
13 TGF_DFaverage0 (11,0)(12,0)
14 TGF_MovingAverageFunc (13,0)(12,0)
15 TGF_One
Value = 0.18
16 TGF_IsGreateThen (14,0)(15,0)
17 TGF_Delay (16,0)(12,0)
18 TGF_BarNumber
Value = 91
19 TGF_SignalTail (17,0)(18,0)
20 TGF_BarNumber
Value = 53
21 TGF_SignalTail (19,0)(20,0)
22 TGF_SignalFrontDetector (21,0)
Results (22,0)
Разве кого-то можно удивить такой доходностью на ЛЧИ?
В проектах заняться «арбитраж/парный/баскет». хфт — не мое.
Верите в кукла?
А сколько параметров в алгоритме из исходного поста? Нет ли там переподгонки? А то в одной книге в разделе про опасность оверфиттинга прочитал смешную шутку: «дайте мне 4 параметра, и я нарисую вам слона (подберу соответствующий функционал), дайте мне 5ый параметр — и я заставлю этого слона махать хоботом» :)
Один из способов оценить степень переподгонки — проверить на новых данных. Что я и делаю.