Блог им. 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. Нужно исследовать распределение качества в предсказании классов, подав на вход больше как прямых ценовых сигналов, так и сигналов индикаторов.

А теперь скажите мне, где и в чём я ошибся :)

★8
23 комментария
Сеть тебе говорит, что лучше сидеть на заборе и остальное все стохастический непредсказуемый процесс :)))
avatar
я в стакан смотрю при торговле (еще). + торговля же — это лента сделок. и кому ее разглядывать если не роботам )
avatar
Виктор, я считаю, что стакан на высоколиквидных инструментах — это телевизор кукла)
avatar
Период: 14.12.2020 — 17.03.2021
Trainable params: 1,325,827
Сколько у вас наблюдений в обучающей выборке? (кол-во наблюдений за день или кол-во наблюдений на один параметр тоже сойдут)

Как обстоят дела с доверительными интервалами для параметров?
avatar
Eugene Logunov, по числу баров за период, 52569. Что вы подразумеваете под параметрами? Входы?
avatar
bascomo, 
Что вы подразумеваете под параметрами?
Кол-во коэффициентов, которые подбираются в процессе обучения.

по числу баров за период, 52569
Ясно-понятно :)
avatar

1. Какой таймфрейм свечек?
2. Вечерняя сессия включена в данные?
3. При нормализации данных для определения min/max использовали всю выборку?
4. При разметке какие получились минимальное/максимальное/среднее время удержания позиции? Перенос позиции на следующий день разрешен?

avatar
r0man, 
1. 1 min
2. да
3. да, но внутри сети есть слои батч норм, которые ещё и в рамках семпла нормализацию делают
4. 20-30 минут в отсутствие тренда и до нескольких часов при ярко выраженном тренде
5. всегда в рынке = означает перенос позиции и на следующий день, и через выходные. Выход из лонга и вход в шорт на одной и той же свечке и наоборот.
avatar
С научной точки зрения, сначала следует убедиться в том, что исторических данных OHLCV достаточно для долгосрочного извлечения прибыли.

На чем строится Ваше убеждение о достаточности данных? На роликах Жени Черных?
avatar
$100, данных ОХЛСВ достаточно. Проблема в том, что большая их часть ни о чем — мусор, а НС искренне считает, что все данные одинаково значимы.
avatar
3Qu, чтобы она так не считала, есть веса классов, и в данном случае они были посчитаны и использованы при обучении.
avatar
А теперь скажите мне, где и в чём я ошибся :)
Ошибка в том, что вы не знаете чему конкретно учить сеть. Как говорят: на входе мусор — на выходе мусор.
Сеть, пойди туда, не знаю куда, и принеси мне прибыль не прокатывает.
avatar
3Qu, сеть училась предсказывать разворотные бары на размеченных данных. Вероятно, вы невнимательно читали публикацию.
avatar
bascomo, признаться, я это не понял. Но откуда известно, что эти самые разворотные бары что-то вообще означают? Может, нет? — Потому НС ничего и не выделила. Вообще, НС оч неплохи для проверки стат гипотез — не нашла, стало быть гипотеза ни к черту.
ЗЫ Мильон нейронов — это до фига. НС со 100-200 нейронами с реальной гипотезой справляются на раз.
avatar
3Qu, я в принципе начал заниматься вопросом трейдинга с использованием нейросетей по двум причинам:

1) если есть в потоке котировок закономерности — то вероятность того, что нейросеть их выявит и сможет использовать, однозначно выше, чем у человека.
2) по порядка 40 сигналам, которые я посчитал на оснвое ценовых данных и данных индикаторов вроде ma fast/slow — stochastic — rsi — macd — etc., было видно, что в моменты, когда нужно входить или выходить в лонг или шорт, баланс количества сигналов резко меняется, и для каждого таймфрейма такой закон выглядит чуть иначе. Поскольку писать громоздкие if и проверять глазами и руками все возможные варианты корреляции — задача малорешаемая, неэффективная и неприятная, я попробовал привлечь к этому делу нейросеть.

Размеченные для обучения бары очевидно имеют смысл, поскольку соответствуют локальным экстремумам цены (вниз или вверх) или не принадлежат таким экстремумам (для третьего класса).

Число нейронов, в данном случае, не принципиально, главное, чтобы оно было достаточным. На точность сетей вообще в большей степени оказывает влияние архитектура, а не число нейронов, как показывает мой личный опыт.
avatar
bascomo, 
1. Однозначно, нет.
2. В общем, я тоже использую НС для построения логики системы, точнее, уже предполагаемой!!! системы. Если не прокатывает, значит предположения неверные и там ничего нет. Был топик на эту тему.

ОХЛСВ — вполне достаточно, НС все эти фичи- предикторы в состоянии построить самостоятельно из исходных данных. Лучше фильтровать ОХЛСВ ещё до входа в НС.
Попробуйте, кстати, леса-деревья. Имеет смысл. Думаю и Байеса тоже можно — у меня руки не дошли.
avatar
классы не сбалансированы поэтому сеть обучилась под самый большой (по примерм) класс — в книжных примерах все классы сбалансированы, гугл в помощь 
avatar
nbvehrfr, 

avatar
bascomo, а че такой батч большой?
avatar
Корректных предсказаний: 154, а в выборке: 361, и это в %: 42.7
Ошибочных предсказаний: 902
Верных предсказаний, %: 14.6

 

В таком формате, конечно, очень сложно понять, что имеется в виду — что за отношение, что в знаменателе и т.д.

 

А в целом: ну, нейросеть, которая говорит когда лучше не торговать, она, пожалуй, будет намного ценнее той, которая говорит куда и когда торговать). Так что нейросеть, у которой отдельным классом идет класс «сидеть за заборе» это уже что-то интересное. 

В моих нейросетях класс «на заборе» присутствовал неявно. Тип купи/продай с недостаточной вероятность — это и есть «на заборе». Что лучше работает — хз.

 

Кстати, на графике, оранжевый график — это на отложенной выборке?? Как-то подозрительно хорошо график идет. Ну или, действительно, целевая метрика некорректно выбрана и нейросеть поощряется когда она начинает понимать, что просто сидеть на заборе — вообще отличный сценарий.

avatar
class_weights = class_weight.compute_class_weight('balanced',
                                                 np.unique(y_train),
                                                 y_train)
avatar
а если в тестовой выбрать такое же количество сэмплов для «НИЧЕГО НЕ ДЕЛАТЬ» как и в «ПОКУПАТЬ» и «ПРОДАВАТЬ» сетка сойдется?
avatar
еще одна идея :) количество сэмплов для двух интересующих классов меньше нейронов, я думаю сетка просто переобучилась на этих двух классах — итог «резать»
avatar

теги блога bascomo

....все тэги



UPDONW