Так как путем использования логики я уже понял, что систематическое извлечение прибыли из финансовых рынков возможно.
Следующий шаг — это создание торговой системы, конечным результатом которой и будет та самая прибыль. Базовые принципы, на которых строится торговая система, давно известны, так что изобретать колесо к счастью мне не пришлось. Лично я все это нашел в материале Александра Горчакова, в одном видео он подробно описал всю базовую структуру.
Как ни странно, за 8 лет — 8,3 тыс. просмотров. Ссылка на видео.
https://www.youtube.com/watch?v=kYSkbzjm9FYВооружившись базовыми знаниями о теории вероятностей и путем проведения большого количества попыток, а что-то минимально рабочее у меня получилось только с 39-й попытки, я пришел к следующим этапам создания торговой системы.
1. Сбор и подготовка данных
2. Событийное поле, разметка и анализ
3. Построение векторов
4. Психологическая устойчивость
6. Базовый технический стек
7. Постобработка как метод анализа Edge
8. Предобработка как метод улучшения Win Rate
9. Циклические итерации для оптимизации параметров
10. MVP
11. Отладка
12. Полноценный запуск и интеграция в КСУП
13. Использование и мониторинг
Первое, с чего я начал, — это поиск данных. В моём случае всё просто, я могу скачать данные с Bybit. Если вы торгуете в Америке, то знаете, что данные — это то, за что надо платить, и скачать их просто так очень сложно. Особенно когда нужны минутные свечи по всем тикетам за всю историю. Сам пока Америку не скачивал, но, наверное, буду брать отсюда: massive.com, вроде не так дорого.
Я скачал всю историю Bybit в минутных свечах за всё время, используя REST API. Важно брать именно минутки, так на них и будет запущено ядро бэктеста. В моём случае оно построено на C++ и CUDA.
Для дальнейшего использования этих данных был написан скрипт, который агрегирует эти данные во все необходимые диапазоны от 5-минутных до дневных баров.
Важный момент на этом этапе — это валидация данных. То есть, сделали себе датасет, не поленитесь скачать неделю данных с биржи, чтобы сравнить их.
Проверка временной последовательности, пропусков, нормальности данных.
Я делал систему 4 дня, а потом результаты нанёс на график TradingView через Pine Script и очень удивился, когда увидел сделки там, где нет баров — просто в разрозненных местах стопы и тейки на экране. Было, скажем так, очень неприятно, а ошибка была в агрегации данных. То есть я просто сделал кривой скрипт и собрал кривой датасет. И на нём делал 4 дня систему. Важно не пренебрегать этим.
Я не буду углубляться в техническое исполнение, просто напишу, что скрипт был на Python, БД на ClickHouse, всё на моём сервере скачивалось около 7 дней и 2 650 000 миллионов баров.
Скрипт стартует при каждом запуске сервера через systemd для поддержания данных в актуальном состоянии.
Всего 479 тикетов, только перпы, так как мне нужен leverage, а на споте его нет.
И да, сразу давайте напишу, я торгую весь рынок сразу, так как базовым событием торговой системы является именно простая рыночная функция.
Дальше я сформировал бины для временного слоя.
Один бин — это один торговый день, и в нём сразу минутные данные по всем тикетам.
Такой подход позволяет избежать look-ahead bias (заглядывания в будущее) и позволяет торговать как будто вы торгуете в реальности: данные поступают минута за минутой, сразу по всем тикетам. То есть схожесть с реальным торговым днём почти 100 процентов, только в тысячи раз быстрее.
Стандартные библиотеки вроде Backtrader я выкинул после того, как бэктест крутился 3 часа. C++ и CUDA сделали этот тест за 78 секунд. Так я понял, что движок для бэктестов нужен свой.
Можно ещё сделать бины для каждого тикета для индивидуальной оптимизации, но я пока не дошёл до этого.
Как итог, у меня есть 3 слоя данных:
1. Сырые в Click House.
2. Агрегированные через Python для анализа событийного поля.
3. Временной слой в бинах для тестов.
Продолжение в след. статье