Если оперировать только техническими индикаторами, без использования нейросетей, то первая сложность, которая возникает — в оптимальном подборе параметров индикатора. И к этим параметрам добавляются ещё дополнительные, которые мы используем для генерации, собственно, сигнала.
Поясню. Вот стохастик.
У него четыре параметра — по два для %K и %D.
Допустим, мы хотим исследовать, какая их комбинация даст лучший результат.
Общее число эмуляций торгов, которые нужно будет произвести на исторически данных, будет равно произведению возможных значений всех индикаторов.
Допустим, мы задаём следующие условия:
- количество периодов для %K от 2 до 32
- сглаживание для %K от 2 до 32
- количество периодов для %D от 2 до 32
- виды MA — простая и экспоненциальная
Считаем: (32-2)*(32-2)*(32-2)*2=54K
Если мы написали эффективный алгоритм эмуляции торгов, то, допустим, на одну итерацию у него будет уходить одна секунда. Значит, 54K секунд = 15 часов потребуется нам на полный перебор всех вариантов.
И это было бы ещё ничего, но всё гораздо хуже и вот почему.
Для принятия решения о совершении сделки вам нужно не только рассчитать все значения индикатора для кривых %K и %D, но и совершать сделки исключительно в зонах перекупленности или перепроданности. Простое условие звучит как «продавай, когда белая сплошная %K пересекла желтую пунктирную %D в зоне перекупленности сверху вниз». Но зона перекупленности (или перепроданности) тоже опередляется диапазоном — по классике первые и последние 20% стохастика. Давайте это учтём.
- диапазон для зоны перепроданности от 5% до 40%
- диапазон для зоны перекупленности от 60% до 95%
Далее, несложными вычислениями наши 54K секунд превращаются *(40-5)*(95-60)=66M или 2 года непрерывных, круглосуточных машинных вычислений. Если же вы вдруг решили, что хотите посчитать для вариантов и с использованием границ (зон перекупленности/проданности), то добавляется ещё один параметр — использовать или нет это условие, имеющий 2 значения, и превращающий 2 года в 4.
Конечно, есть паралеллизм или кластерные вычисления. Есть даже квантовые вычисления. Есть суперкомпьютеры и мэйнфреймы. Но простым смертным они в подавляющем большинстве случаев недоступны.
Но даже если у вас есть возможность их использовать, то достаточно добавить в вашу систему всего лишь один индикатор и включить его параметры в перебор. И всё. на этом можно заканчивать, поскольку путь перебора нас ни к чему хорошему далее не приведёт.
Для решения подобного класса задач природой была придумана генетика, а человеком — генетические алгоритмы.
Схематически это выглядит так, как на картинке ниже.
То есть, вы создаёте кучу ботов, каждый — со своими параметрами, и это — первая популяция. Каждый бот эмулирует торги и зарабатывает или теряет некоторую сумму. По этому параметру вы определяете какое-то количество лучших из них (селекция), скрещиваете их между собой, чтобы создать новое поколение (скрещивание, crossover) и случайным образом с заданным коэффициентом вносите мутации в параметры. Далее опять каждый новый бот эмулирует торги, получает некий результат и эта история повторяется сколь угодно долго, пока либо не достигнут нужный результат, либо не пройдено некоторое, заранее определённое количество эпох.
Мой пример включает в себя
SiH1, за период с 14.12.2020 10.00 по
11.03.2021 23:39
Учитывалась фикс. комиссия за сделку — 3.15.
Сделки осуществлялись переворотом, торги — одним контрактом, без реинвестирования, всё время в рынке.
# параметры: геном, размер популяции, число выживших, число эпох, коэффициент мутации, фитнес-функция бота
sp = Species(g, 50, 10, 50, 0.4, eval)
Размер популяции был выбран = 50, число лучших на каждой эпохе = 10, число эпох = 50, коэффициент мутации = 0.4.
ТОП 5 лучших на первой эпохе,
в скобках — чистая прибыль:
Бот #47 => S: 28, K: 25, D: 7, UseB: True, UB: 82, DB: 6, MT: Simple (408.7)
Бот #26 => S: 26, K: 16, D: 10, UseB: True, UB: 92, DB: 7, MT: Exponential (38.85)
Бот #5 => S: 20, K: 21, D: 26, UseB: True, UB: 95, DB: 18, MT: Simple (0)
Бот #11 => S: 16, K: 3, D: 10, UseB: True, UB: 95, DB: 12, MT: Simple (0)
Бот #27 => S: 24, K: 30, D: 10, UseB: True, UB: 92, DB: 27, MT: Simple (0)
На 25-й:
=== Epoch: 25 / 50
TOP 5:
Бот #540 => S: 18, K: 28, D: 27, UseB: True, UB: 83, DB: 19, MT: Exponential (5516.05)
Бот #1040 => S: 23, K: 31, D: 27, UseB: True, UB: 82, DB: 17, MT: Simple (4609.75)
Бот #358 => S: 23, K: 30, D: 27, UseB: True, UB: 82, DB: 17, MT: Simple (4341.45)
Бот #1014 => S: 31, K: 28, D: 27, UseB: True, UB: 86, DB: 12, MT: Simple (4238.65)
Бот #1002 => S: 7, K: 14, D: 13, UseB: True, UB: 82, DB: 14, MT: Exponential (4169.1)
На 49-й:
=== Epoch: 49 / 50
TOP 5:
Бот #540 => S: 18, K: 28, D: 27, UseB: True, UB: 83, DB: 19, MT: Exponential (5516.05)
Бот #1374 => S: 19, K: 18, D: 15, UseB: True, UB: 83, DB: 12, MT: Exponential (5063.15)
Бот #1040 => S: 23, K: 31, D: 27, UseB: True, UB: 82, DB: 17, MT: Simple (4609.75)
Бот #1405 => S: 31, K: 24, D: 27, UseB: True, UB: 88, DB: 12, MT: Simple (4387.65)
Бот #358 => S: 23, K: 30, D: 27, UseB: True, UB: 82, DB: 17, MT: Simple (4341.45)
Принимая во внимание размер вчерашнего ГО по фьючерсу = 4.444, имеем доходность за 3 месяца больше 124%, или 496% годовых.
Возможно, это сказки булонского леса, но интересно в полученном результате другое — стабильность увеличения капитала. См. картинку далее.

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

Давайте теперь посмотрим на одного из лучших, чего он там понапокупал и напродавал.
Это бот #540 => S: 18, K: 28, D: 27, UseB: True, UB: 83, DB: 19, MT: Exponential (5516.05)
Его параметры означают следующие настройки стандартного индикатора Stochastic в QUIK (на картинке ниже), а выделенное жирным — что покупать нужно только когда он меньше 19%, а продавать — когда больше 83% — выше были подробности.

Перечень сделок рассматриваемого бота таков:
Тип сделки / дата, время и цена открытия / дата, время и цена закрытия / комиссия / прибыль / прибыль нарастающим
Short 20210126 195100 75780.0 20210126 223500 75564.0 3.15 212.85 0
Long 20210126 223500 75564.0 20210128 104400 76761.0 3.15 1193.85 212.85
Short 20210128 104400 76761.0 20210129 165400 75880.0 3.15 877.85 1406.69
Long 20210129 165400 75880.0 20210202 224800 76501.0 3.15 617.85 2284.54
Short 20210202 224800 76501.0 20210208 103100 74491.0 3.15 2006.85 2902.39
Long 20210208 103100 74491.0 20210218 183300 74380.0 3.15 -114.15 4909.25
Short 20210218 183300 74380.0 20210219 153600 74092.0 3.15 284.85 4795.1
Long 20210219 153600 74092.0 20210220 145500 74147.0 3.15 51.85 5079.95
Short 20210220 145500 74147.0 20210222 170700 74862.0 3.15 -718.15 5131.80
Long 20210222 170700 74862.0 20210224 161400 73862.0 3.15 -1003.15 4413.65
Short 20210224 161400 73862.0 20210225 100500 73594.0 3.15 264.85 3410.50
Long 20210225 100500 73594.0 20210225 231400 74799.0 3.15 1201.85 3675.35
Short 20210225 231400 74799.0 20210301 102100 74157.0 3.15 638.85 4877.20
Итоговая: 4.877+638=5.515
А вот на графике:

И рынок за то же время:

Сколько же времени заняли все эти вычисления?
Отнюдь не 4 года, а всего лишь 3min 13s. В этом мощь генетических алгоритмов.
Они осуществляют направленный рандомный поиск, а потому при каждом запуске результаты будут несколько различаться.
Расчёты производились на Python, с использованием ноутбуков Google Colab.
Могу дать ссылку, но это не для паблика.
Здравая, доброжелательная критика, рекомендации и прочее в тему поста — приветствуются.
Тролли и гномы и авторы злобных выпадов блокируются без специальных уведомлений.
Прогоните за весь 2020 год по всем четырем фьючерсам и посмотрите что получится.
Ну и перед тем как считать стохастик, желательно отфильтровать трендовую составляющую из изменений цены
А предварительный разведочный анализ достаточно сделать укрупненной сеткой (и лучше разбить параметры на пары, а шерстить все скопом), тогда никаких проблем со временем не будет
Я же считаю, что когда я от нескольких разных инструментов, работающих по разным методикам, получаю сигнал на сделку, тогда и нужно её совершать. Есть жирный минус у такого подхода — большая часть потенциальных успешных сделок будет непременно упущена.