Блог им. AleksandrBaryshnikov

Использование ГА для подбора оптимальных настроек технических индикаторов на примере Stochastic

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

Поясню. Вот стохастик.
Использование ГА для подбора оптимальных настроек технических индикаторов на примере Stochastic

У него четыре параметра — по два для %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.

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

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

Для решения подобного класса задач природой была придумана генетика, а человеком — генетические алгоритмы.
Схематически это выглядит так, как на картинке ниже.
Использование ГА для подбора оптимальных настроек технических индикаторов на примере Stochastic


То есть, вы создаёте кучу ботов, каждый — со своими параметрами, и это — первая популяция. Каждый бот эмулирует торги и зарабатывает или теряет некоторую сумму. По этому параметру вы определяете какое-то количество лучших из них (селекция), скрещиваете их между собой, чтобы создать новое поколение (скрещивание, 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% годовых.
Возможно, это сказки булонского леса, но интересно в полученном результате другое — стабильность увеличения капитала. См. картинку далее.
Использование ГА для подбора оптимальных настроек технических индикаторов на примере Stochastic



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

Использование ГА для подбора оптимальных настроек технических индикаторов на примере Stochastic


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


Перечень сделок рассматриваемого бота таков:

Тип сделки / дата, время и цена открытия / дата, время и цена закрытия / комиссия / прибыль / прибыль нарастающим

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

А вот на графике:
Использование ГА для подбора оптимальных настроек технических индикаторов на примере Stochastic


И рынок за то же время:
Использование ГА для подбора оптимальных настроек технических индикаторов на примере Stochastic



Сколько же времени заняли все эти вычисления?
Отнюдь не 4 года, а всего лишь 3min 13s. В этом мощь генетических алгоритмов.
Они осуществляют направленный рандомный поиск, а потому при каждом запуске результаты будут несколько различаться.


Расчёты производились на Python, с использованием ноутбуков Google Colab.
Могу дать ссылку, но это не для паблика.

Здравая, доброжелательная критика, рекомендации и прочее в тему поста — приветствуются.

Тролли и гномы и авторы злобных выпадов блокируются без специальных уведомлений.
★3
23 комментария
а зачем подбирать параметры для индикатора, который является производным от цены, зачем индикатор подстраивать чтоб он красиво сочетался с ценой — какой в этом смысл?
avatar
описанное красиво работает в левой части графика… но спосообно ли это принести профит в правой части?.. далеко не факт
avatar
$100, а она — генетика, не работает даже в формате нахождения лучших параметров. По крайней мере. Все то. Что я тестировал (а тестировал я не много). Она найдет их если количество проходов будет 1/3 от полного перебора. Может быть при 1/10. А далее — бесполезно.

avatar
$100, ну надо проверять. Я склонен считать, что да, поскольку соотношение прибыльных/убыточных сделок, а так же абсолютных сумм прибылей и убытков говорит об этом
avatar
На последнем контракте в основном контртренд, поэтому работает.
Прогоните за весь 2020 год по всем четырем фьючерсам и посмотрите что получится.
Ну и перед тем как считать стохастик, желательно отфильтровать трендовую составляющую из изменений цены
avatar
Sergeyka, такие же результаты и по другим фьючерсам, и по акциям, уже тестировал. Не зависит от того, какой тренд
avatar
bascomo, то есть бот
Это бот #540 => S: 18, K: 28, D: 27, UseB: True, UB: 83, DB: 19, MT: Exponential (5516.05)
дает такую же высокую прибыль если его прогнать по всему 2020 году?
avatar
Sergeyka, не знаю, можете проверить самостоятельно :) у меня нет склеенных котировок фьючерса)
avatar
А скажите, Вы аж 540 ботов запускали? Или меняли номер у лучших «особей» в «популяции»? И какие боты использовали? И Да! Большое спасибо за статьи! Это не простой труд! )
Если зона «оптимума» маленькая, её и искать не стоит, переподгонка. Если зона «оптимума» достаточно пологая и широкая, есть относительно простые методы ускоренного перебора. 
avatar
SergeyJu, все пологие и широкие давно были вычислены и использованы, как я вижу. Осталось точечное, что человеку руками найти практически нереально
avatar
bascomo, я думаю иначе.
avatar
SergeyJu, ну прекрасно) я этот вопрос специально не исследовал, но что-то не попадалось васильевских спусков
avatar
Зачем спалили святой Грааль, теперь он перестанет работать же ....😎
avatar
Technotrade, не перестанет. Человек так торговать не сможет, а робота не каждому дано мозгов присобачить :)
avatar
Стохастик, машка, rsi — вечные граали. 
avatar
baza, macd ещё хороший. Хотя это те же ma
avatar
выглядит красиво, но в реальной работе бесполезно
avatar
wrmngr, почему? я тоже так думаю, но, видимо, у меня свои основания
avatar
bascomo, потому что разумный системостроитель не будет полагаться на результат ГА, а все равно будет смотреть параметры вблизи предполагаемого оптимума равномерной сеткой.
А предварительный разведочный анализ достаточно сделать укрупненной сеткой (и лучше разбить параметры на пары, а шерстить все скопом), тогда никаких проблем со временем не будет
avatar
wrmngr, ну, значит, всё же как часть реальной работы — может быть полезно. В подсказках, куда копать.

Я же считаю, что когда я от нескольких разных инструментов, работающих по разным методикам, получаю сигнал на сделку, тогда и нужно её совершать. Есть жирный минус у такого подхода — большая часть потенциальных успешных сделок будет непременно упущена.
avatar
Можно ли в ЛС ( Вы говорили, что не в блоге) прислать ссылку на Ваши коллабы ( тоже в них работаю)? моя почта valentinvd (собак) ya.ru Заранее Благодарю!

теги блога bascomo

....все тэги



UPDONW