Блог им. AleksandrBaryshnikov
Что едят нейросети
По мотивам предыдущего поста smart-lab.ru/blog/683242.php продолжаю экспериметы на тему «как обчистить рынок».
Сегодня будет прототип сети, подготовка данных, оценка и обучение результатов.
Инструмент: SPBFUT.SiH1
Период: 14.12.2020 — 17.03.2021
1. Архитектура сети
Сначала пару слов о сети — вот так она выглядит. Просто, примитивненько, но вполне достаточно для того, чтобы понять, будет ли это работать в принципе.
Если обучить её лучше, чем «угадай», то есть 50%, не получится, значит, что-то пошло не так.
У сети 4 входа и 1 выход. Кушать она будет цены, объёмы, сигналы ценовых данных и значения индикаторов.
Но сырыми она их есть не может, потому что случится у сети несварение, поэтому их нужно подготовить — нормализовать.
На выходе же у нас будет слой с тремя нейронами, каждый из которых будет содержать в себе вероятность действия (покупать, продавать, ничего не делать).
Мощность нейросети получилась относительно небольшая — чуть больше миллиона нейронов.
Total params: 1,328,387
Trainable params: 1,325,827
Non-trainable params: 2,560
Если сначала просто посмотреть на корреляции между входными параметрами, можно увидеть, что некоторые скармливать нейросети смысла большого нет. Так что разумно сначала проанализировать графическим, наглядным способом, а есть ли какие-то корреляции в данных.
Что мы тут видим? Это данные для всех баров покупок. И, например, видно, что покупки в подавляющем большинстве случаев осуществлялись на тех барах, где цена открытия стремилась к high, а цена закрытия стремилась к low (пересечения % open и % close). Парадоксально? Нет, всё на самом деле так и есть. Статистика — мощная вещь.
Так же видно, что покупки очень редко осуществляются, когда %K стохастика > 60%.
2. Нормализация данных
Нейросети очень не любят больших разбросов в данных, поэтому их входы лучше бы нормализовать перед тем, как начинать обучение.
Самый простой способ — привести значения к диапазону 0..1 или -1..1 или даже -3..3.
Я использовал простой метод: norm_price = price — min(price) / max(price) — min(price).
Точно так же я поступил со всеми остальными значениями, которые не являются сигналами — привёл их к диапазону 0..1.
Сами же сигналы у меня уже в этом диапазоне, например, тип свечи:
растущая (1 или 0)
падающая (1 или 0)
дожи/крест/звезда (1 или 0)
Таким образом, на третий вход поступает вектор из трёх нулей или единиц, а на остальные — нормализованные в диапазоне 0..1 значения.
Это эксперимент, поэтому много над сигналами я не размышлял, но посыл понятен — они должны быть закодированы нулём или единицей.
И, на мой взгляд, их должны быть два класса, поступающие на разные входы:
статические сигналы — это сигналы, для расчёта которых достатиочно данных одной свечки (например, дожи, как выше, или «значение индикатора в зоне перекпленности»),
динамические сигналы — это сигналы, для расчёта которых нужны данные нескольких свечек (например, три белых солдата, или «быстрая пересекла медленную»)
3. Разметка
Чтобы обучить нейросеть, необходимо подать ей на вход фичи и рядом показать, что они обозначают — в нашем случае покупку, продажу или ожидание.
Для этого нужно было разметить каждый бар так, чтобы он попадал в один из трёх классов — бары, хорошие для покупок, для продаж, или плохие и для того, и для другого.
На исторических данных это сделать было несложно, и много времени это не заняло.
Делалось это, разумеется не руками, а несложным алгоритмом, предусловием было только то, что прибыль должна быть максимальная, и позиция может только переворачиваться, то есть с начала и до экспирации мы в рынке, чтобы высосать весь профит полностью.
Таким образом, для каждого бара нарисовался вектор, тоже из нулей и единиц, длиной 3.
4. Обучение
Учились мы для надёжности на 5.000 эпохах, что заняло не очень много времени — десятки минут.
Точность на последней составила val_accuracy: 0.8919, что означает, что в 89% случаев НС угадала верно.
График обучения выглядел так:
Видно, что уже за первые 500 эпох точность подошла к 80%, и дальше увеличивалась уже гораздо медленнее.
5. Результаты
И вот что получилось в результате эксперимента:
Класс: 0 (покупать)
Корректных предсказаний: 154, а в выборке: 361, и это в %: 42.7
Ошибочных предсказаний: 902
Верных предсказаний, %: 14.6
Класс: 1 (продавать)
Корректных предсказаний: 148, а в выборке: 380, и это в %: 38.9
Ошибочных предсказаний: 1020
Верных предсказаний, %: 12.7
Класс: 2 (ждать)
Корректных предсказаний: 16307, а в выборке: 18224, и это в %: 89.5
Ошибочных предсказаний: 434
Верных предсказаний, %: 97.4
Из этого очевидно, следует несколько выводов:
1. Даже эта нейросеть будет неплохо фильтровать бары, на которых НЕ нужно совершать сделки. Она правильно отфильтрует 89% таких баров.
2. Использовать её непосредственно для входа в сделку в данном виде нельзя, потому что относительные ошибки для классов 0 и 1 очень велики.
3. Можно использовать её вместе с другими инструментами для взаимного подтверждения сигналов.
4. Нужно исследовать распределение качества в предсказании классов, подав на вход больше как прямых ценовых сигналов, так и сигналов индикаторов.
А теперь скажите мне, где и в чём я ошибся :)
1. Какой таймфрейм свечек?
2. Вечерняя сессия включена в данные?
3. При нормализации данных для определения min/max использовали всю выборку?
4. При разметке какие получились минимальное/максимальное/среднее время удержания позиции? Перенос позиции на следующий день разрешен?
1. 1 min
2. да
3. да, но внутри сети есть слои батч норм, которые ещё и в рамках семпла нормализацию делают
4. 20-30 минут в отсутствие тренда и до нескольких часов при ярко выраженном тренде
5. всегда в рынке = означает перенос позиции и на следующий день, и через выходные. Выход из лонга и вход в шорт на одной и той же свечке и наоборот.
На чем строится Ваше убеждение о достаточности данных? На роликах Жени Черных?
Сеть, пойди туда, не знаю куда, и принеси мне прибыль не прокатывает.
ЗЫ Мильон нейронов — это до фига. НС со 100-200 нейронами с реальной гипотезой справляются на раз.
1) если есть в потоке котировок закономерности — то вероятность того, что нейросеть их выявит и сможет использовать, однозначно выше, чем у человека.
2) по порядка 40 сигналам, которые я посчитал на оснвое ценовых данных и данных индикаторов вроде ma fast/slow — stochastic — rsi — macd — etc., было видно, что в моменты, когда нужно входить или выходить в лонг или шорт, баланс количества сигналов резко меняется, и для каждого таймфрейма такой закон выглядит чуть иначе. Поскольку писать громоздкие if и проверять глазами и руками все возможные варианты корреляции — задача малорешаемая, неэффективная и неприятная, я попробовал привлечь к этому делу нейросеть.
Размеченные для обучения бары очевидно имеют смысл, поскольку соответствуют локальным экстремумам цены (вниз или вверх) или не принадлежат таким экстремумам (для третьего класса).
Число нейронов, в данном случае, не принципиально, главное, чтобы оно было достаточным. На точность сетей вообще в большей степени оказывает влияние архитектура, а не число нейронов, как показывает мой личный опыт.
1. Однозначно, нет.
2. В общем, я тоже использую НС для построения логики системы, точнее, уже предполагаемой!!! системы. Если не прокатывает, значит предположения неверные и там ничего нет. Был топик на эту тему.
ОХЛСВ — вполне достаточно, НС все эти фичи- предикторы в состоянии построить самостоятельно из исходных данных. Лучше фильтровать ОХЛСВ ещё до входа в НС.
Попробуйте, кстати, леса-деревья. Имеет смысл. Думаю и Байеса тоже можно — у меня руки не дошли.
В таком формате, конечно, очень сложно понять, что имеется в виду — что за отношение, что в знаменателе и т.д.
А в целом: ну, нейросеть, которая говорит когда лучше не торговать, она, пожалуй, будет намного ценнее той, которая говорит куда и когда торговать). Так что нейросеть, у которой отдельным классом идет класс «сидеть за заборе» это уже что-то интересное.
В моих нейросетях класс «на заборе» присутствовал неявно. Тип купи/продай с недостаточной вероятность — это и есть «на заборе». Что лучше работает — хз.
Кстати, на графике, оранжевый график — это на отложенной выборке?? Как-то подозрительно хорошо график идет. Ну или, действительно, целевая метрика некорректно выбрана и нейросеть поощряется когда она начинает понимать, что просто сидеть на заборе — вообще отличный сценарий.
В подарок лично для НС мои 2 правила ...1-полюби убыток и 2-разлюби прибыль.Интересно -можно ли научить этому НС ?