Предлагаю развеить эти сомнения раз и на всегда и перевести дискурс из области «может предсказывать или не может» в область «хорошо предсказывает или плохо». И сделаем мы это простым, быстрым и наглядным способом. Я дам готовый инструмент и каждый сможет получить результат на своем компьютере. Поможет нам в этом бесплатный проект GoogleColaboratory. Это открытая платформа для совметной разработки, все вычисления происходят на серверах Google, всё взаимодействие через браузер, регистрация не нужна.
Код для нашей работы открыт и уже заряжен в GoogleColab. Результаты обучения нейросети для каждого будет индивидуальные. Это связано с тем, что начальные веса раздаются случайным образом и результаты немного отличаются. Так же учтите, что история котировок представляет из себя очень зашумленные данные, поэтому качество обучения низкое, но достаточное для того, что бы увидеть как будет прогнозировать нейросеть. Прогноз должен получиться примерно на уровне хорошего индикатора.
Единственное где мы сократим наш путь — это сбор данных на истории торговой пары. Сбор производится приложением к MetaTrader5, процесс не сложный, но требует навыков работы с тестером в MetaTrader5. Подробная инструкция потянет на отдельную статью, поэтому используем заранее подготовленные данные для пары Евро/Доллар (тем, кто пользуется MT5 ссылка на Expert в конце статьи). Убедиться в том, что заранее подготовленные данные «не подглядывают вперед» и не подсказывают нейросети, можно будет на последнем этапе когда перейдем к тестированию реальным рынком.
Начнем…
GoogleColaboratory
Наш «ноутбук» в GoogleColab можно найти по этой ссылке. Не забудьте сначала залогинится в свою учетную запись на Google (или Gmail).
Копируйте «ноутбук» себе.
![image](https://habrastorage.org/getpro/habr/post_images/80c/640/bde/80c640bdeb13105358330bb87eb7b2c9.jpg)
Теперь нужно последовательно запускать все блоки сверху вниз.
1. Установка библиотек
На этом этапе установится TensorFlow и другие библиотеки. Процесс закончится сам, ничего делать не требуется.
![image](https://habrastorage.org/getpro/habr/post_images/b78/3e0/6b6/b783e06b6f0f5a3b219572f39670343f.jpg)
2. Загрузка и подготовка данных для обучения
На этом этапе будет загружен датасет, а так же подготовлены отдельные массивы данных для обучения и тестирования. Датасет собран для пары EURUSD за период с начала 2015 года до сегодняшнего дня, шаг сбора данных — свеча M6. Последние 2 недели — тестовый участок. Данные в датасете — это набор из сотен тысяч строк каждая из которых примерно такая
0.32,0.26,0.00,0.43 ... 0.66,0.25,0.24,0.05,0,1,1600144440,1.189240
Предикторы идут через запятую, поля 3 и 4 с конца — это правильный ответ куда пошел тренд (0,1 — вниз; 1,0 — вверх). Второе поле с конца — id свечи. Последнее — цена на открытии свечи. Для обучения последние два поля не используются.
3. Обучение и тестирование модели
При первом запуске оставьте настройки нейросети по умолчанию. Обучение будет проходить в пять заходов пока не будет получен приемлемый результат. В случае успешного обучения появится примерно такая таблица:
+------------+---------+----------+-------------+------------+
| Ответ сети | Выиграл | Проиграл | Выиграл (%) | Сигналов (%)
+------------+---------+----------+-------------+------------+
| 0 | 7174 | 7173 | 50 | 100.0 |
| 2 | 6956 | 6731 | 50 | 95.4 |
| 4 | 6430 | 6224 | 50 | 88.2 |
| 6 | 5867 | 5630 | 51 | 80.1 |
| 8 | 5250 | 5065 | 50 | 71.9 |
| 10 | 4636 | 4450 | 51 | 63.3 |
| 12 | 3964 | 3772 | 51 | 53.9 |
| 14 | 3330 | 3152 | 51 | 45.2 |
| 16 | 2758 | 2539 | 52 | 36.9 |
| 18 | 2198 | 2012 | 52 | 29.3 |
| 20 | 1700 | 1544 | 52 | 22.6 |
| 22 | 1298 | 1167 | 52 | 17.2 |
| 24 | 958 | 825 | 53 | 12.4 |
| 26 | 699 | 517 | 57 | 8.5 |
| 28 | 446 | 278 | 61 | 5.0 |
| 30 | 246 | 127 | 65 | 2.6 |
+------------+---------+----------+-------------+------------+
Ответ нейросети — это бинарная классификация где [0 1] это «вниз», а [1 0] — «вверх». Но нейросеть никогда не отвечает целым значением, ее ответ, в зависимости от степени «уверенности», может быть типа [0.4 0.6]. В таком ответе нейросеть считает, что цена пойдет вниз, но не очень уверенна, а в ответе [0.1 0.9] тоже вниз, но уверенности намного больше. Вот как выглядит массив реальных ответов:
[[0.5084921 0.49150783]
[0.3930727 0.6069273 ]
[0.4930727 0.50692725]
...
[0.5189831 0.48101687]
[0.27955987 0.7204401 ]
[0.476914 0.5230861 ]]
Поле таблицы «Ответ сети» — это разница внутри этого бинарного ответа умноженная на 100. Очевидно, что эта разница характеризует «уверенность» сети в своем прогнозе. В итоге, после умножения на 100, мы имеем значения в диапазоне от 0 до 100. Теперь можно брать не все ответы, а выбирать только те, в которых нейросеть имеет значимую «уверенность». Что бы понять на сколько ответ влияет на результат прогноза, тестовый участок проверяется на правильность прогноза при разных уровнях этой «уверенности». Каждая строка таблицы — это проверка при новом большем значении «Ответа сети». Чем выше фильтр «Ответа сети», тем меньше ответов, но тем они качественнее. Это видно по полям «Выиграл» и «Проиграл». Процесс останавливается когда ответов (Сигналов) становится меньше 1% от всех тестовых данных.
Если при одном проходе сеть не обучилась просто перезапустите этот блок (данные заново подгружать не надо).
4. Результаты на торговом графике
Запустите этот блок. Тут все очевидно, на графике торговой пары из тестового набора отрисовываются сигналы нейросети, зеленый вверх, красный вниз.
![image](https://habrastorage.org/getpro/habr/post_images/d16/8bb/39c/d168bb39c5747b379dd9e230bdc25367.jpg)
5. Тестирование на реальном рынке
При этой проверке подгружаются данные для нейросети которые создаются по ходу добавления новых свечей в реальном времени. Т.е. последняя порция полученных данных создана на открытии свечи, в нашем случае нулевой свечи М6. Эти данные, естественно, не содержат правильного ответа, сети предлагается сделать реальный прогноз. Убедится в том, что данные не подменяются по ходу их движения в историю можно раскомментировав строку print(data) и сравнив значения конкретной строки при входе и спустя некоторое время.
def get_from_ennro(symbol, tfm, dim, lim):
...
# print(data)
...
Сигналов на реальном рынке может и не быть. Так бывает когда волатильность меньше чем на тестовом участке, в этом случае нейросеть не видит точек для входа.
Выводы
Да! Качество прогноза не годится для открытия позиций. Но мы такую задачу и не ставили, главное, что нейросеть обучается и что то распознает на графике, угадывает тренд, ее прогноз очевидно не хаотичен. Обратите внимание, что мы использовали простейшую конфигурацию нейросети — Sequential Dense с 2-мя слоями и всего 10 эпох для обучения. Тут есть куда развиваться дальше.
Решения качественно улучшающие прогноз уже есть, но о них в следующей статье.
P.S. Для тех, кто хочет сам собрать и подготовить данные для любой пары в MetaTrader5 читайте здесь и используйте GoogleColab который дан по этой ссылке.
evg_dc Автор
Три анонимных минуса за «Низкий технический уровень материала», кто их поставил могли бы здесь пояснить что не так с техническим уровнем. Если надо, могу дать дополнительные объяснения.