Метод ГП по своим свойствам потенциально мог бы являться универсальным методом поиска алгоритма оптимизирующего заданную целевую функцию. И я как любитель эволюционной оптимизации не мог пройти мимо такой заманчивой идеи.
Торговый алгоритм ищу в виде набора элементарных функционалов. Каждый функционал может иметь любое количество входов и по крайней мере один выход. Вход и выход характеризуется типом данных. Выход одного функционала может быть подан на вход другого при условии, что тип данных входа и выхода совпадает.
Например, функционал вычисления минимума/максимума в заданном окне получает на вход интересующую величину и значение размера окна, а также имеет 4 выхода: минимум/максимум, позиция точки минимума/максимума в окне.
ГП должен подобрать функционалы и связать их входы и выходы так, чтобы в итоге получился единственный выход типа сигнал (сигнал есть либо нет), который и будет являться сигналом на покупку/продажу. Связанные функционалы с общем случае образуют граф. Целевой функцией является критерий Шарпа с поправкой — наказанием за информационную сложность алгоритма.
Сейчас я попробую разложить торговлю по полочкам, вычленить независимые составляющие и их проанализировать.
Пусть у нас есть торговый алгоритм, который выдает приказ на покупку или продажу. Для выхода используем тупой алгоритм типа таймаут, случайный выход, выхода по стоп-лосс, тейк-профит, трейлинг-стоп и т.п. Комиссию не учитываем.
Обозначим рекомендацию алгоритма O[i] = -1, 0, 1, где i — номер потенциальной сделки. -1 соответствует рекомендации продать, 1 — купить, 0 — ничего не делать. Объем сделки обозначим V[i] >= 0.
Результат сделки и при единичном объеме и при условии что только покупаем обозначим R[i]. Будем считать что на рынке на всем периоде торговли нет устойчивого тренда вверх т.е. стратегия “купил и держи” в среднем прибыли/убытка не приносит. Тогда матожидание (M) от произвольной сделки на покупку равно нулю M(R[i])=0.
Итого, мы разделили торговлю на три независимые составляющие:
import numpy as np
# создаем массив чисел, равномерно распределенных от -1 до 1
x = np.random.uniform(-1, 1, 10000000)
# каждое число возводим в квадрат (можно еще вычесть 1/3, если хотим нулевое матожидание)
y = x**2
# y полностью определяется x, значит x и y коррелированы в широком смысле
# но вычисление ЛИНЕЙНОГО коэффициента корреляции дает 0 (+- с учетом случайного разброса)
print(np.corrcoef(x,y))
Уже несколько лет слежу за там, как некий Andrea Rossi являет миру новый способ получения энергии. Речь о явлении, которое пока толком не изучено, но его предположительно связывают с возможным протеканием ядерных реакций при низких энергиях взаимодействующих частиц и потому называют LERN (low energy nuclear reactions). Подобные «открытия» появлялись и раньше, но вроде не подтвердились и эспериментаторы были разжалованы в шарлатаны.
Современная наука пока теоретически не может предположить возможность протекания подобных реакций, но несколько лет назад некий Andrea Rossi демонстрировал выделение большого количества энергии из смеси порошка никеля и водорода. При этом у Rossi была склонность скрывать детали процесса с целью первым запатентовать идею и вывести ее на промышленный уровень. На данный момент итог такой:
— планы выхода на промышленный выпуск в конце 2013 не оправдались
— патентное бюро США окончательно отклонило заявку (в интернете есть полный текст решения)
— Rossi продолжил заниматься якобы сделанной им установкой мегаваттного уровня для одного неизвестного заказчика (детали скрываются).