Недавно, после продолжительного перерыва, вернулся к занятиям машинным обучением (МО) и даже написал по этому поводу топик — Все надоело или Deep Lerning (Глубокое Обучение). С тех пор даже прочитал ~150 страниц книги «Глубокое обучение...» Искренне полагал, что за эти 150 страниц что-то узнал. Ан, нет, на 151 странице автор объявил, что это все так — объяснения для тех, кто вообще ничего о МО не слышал и автор, оказывается, только приступает к изложению материала.) Но кое что узнать все же было можно, автор показал несколько экземлов построения нейросетей (НС), прменяемых для классификации и регрессии, из которых уже можно попробовать сделать что-то свое.
Ну, и почему бы эти знания о НС не попробовать применить для построения торговой системы (ТС). Не, это не то, что вы можете подумать, вовсе не Грааль на НС — это просто попытка встроить НС в уже готовую ТС как дополнительный функционал, не ухудшающий, но, возможно, улучшающий характеристики ТС. Решено было начать с небольшой модернизации стопа.
В моей ТС используется классический трейлинг-стоп. Описывается он простым выражением — Сclose_deal = Сmax — Cstop. Система отслеживает максимальную цену актива Cmax, и при падении цены актива на величину Cstop от значения максимума Cmax, цена достигает значения Сclose_deal, и сделка закрывается.
У трейлинг стопа есть очень нехорошее свойство — с одной стороны, мы не можем определить максимум цены актива, пока цена не начнет падать, с другой — мы на каждой сделке вынуждены терять сумму, равную Cstop.
Возникает закономерный вопрос, а нельзя ли как-то уменьшить этот закономерный убыток трейлинга. Можно, если за несколько минут до достижения ценой Сclose_deal как-то спрогнозировать дальнейшее движение цены, и убедившись, что цена, таки да, достигнет это значение, закрыть сделку с меньшим убытком и большей прибылью.
И почему бы для такого прогнозирования не попробовать применить НС. Риска никакого, если НС ошибется, то как и прежде сделка закроется по тралу. Если не ошибется, сделка закроется раньше Сclose_deal, и мы получим дополнительную прибыль.
Давайте теперь сконструируем НС, оч простенькую — всего 3 слоя:
model = keras.Sequential([ layers.Dense(50, activation=«tanh»),
layers.Dense(50, activation=«tanh»),
layers.Dense(1)])
model.compile(optimizer=«adam», loss=«mse», metrics=[«mae»])
Обратите внимание, последний слой не содержит функции активации. Фактически, это встроенная в НС SVM.
В качестве исходных данных были взяты свечи OHLC, и на их базе был построен, точнее, смоделирован, последовательный временной ряд (ВР). Далее, из этого ВР случайным образом выбирались массивы данных для обучения и контрольные массивы, и все это подавалось на функцию обучения.
history = model.fit(train_data, train_targets, validation_data=(val_data, val_targets), \
epochs=num_epochs, batch_size=2048, verbose=2)
(val_data, val_targets) — это как раз контрольные массивы, которые никак не участвуют в обучении, но после каждой эпохи по ним производится контроль ошибок обучения.
После обучения получим примерно такой график ошибок.

Как видим, обучается оч быстро, и уже после первой эпохи ошибка входит в оч узкий диапазон значений, а после 50-й эпохи, дальнейшее обучение уже не приносит результатов.
Средняя ошибка прогнозирования составила 22 п. В разных циклах обучения ошибка составляла от 20 до 23 п., что достаточно стабильно. Ошибку можно немного уменьшить, если не использовать параметры обучения по умолчанию, а также, возможно, немного модифицировать саму НС, но для эксперимента это не столь важно.
Что касается реального применения, то в модели это еще надо посмотреть, а это долгая история. Для реала же, в этом виде, это никак не пойдет, реал надо обучать не на смоделированном ВР, а на реальных данных (реальном ВР).
вам с такой логикой надо книжки писать и инфоцыганить. А вот меня бы смутила ситуация когда HC преждевременно бы закрыла сделку и после этого бы произошёл разворот и +100500 прибыли было бы упущено.
А зачем тебе вообще нужны стопы?
Любая ТС — это некая форма прогноза цены актива. Если тебе ТС говорит, что актив развернулся, это кагбэ повод закрыть сделку или перевернуться.
А так получается, что ты входишь в сделку системно, а закрываешься по трейлинг-стопу.
Почему тогда не попробовать входить несистемно (например, по высокой волатильности), а выходить по системе?)
С уважением
Если мы не знаем расписания, прибытие автобуса можно считать случайным несколько раз. Но после достаточно продолжительного периода наблюдений расписание будет вычислено. Даже если там тысячи маршрутов.