Уважаемые участники сообщества Хабр, добрый день! Представлюсь, я Алексей Волков, руководитель нескольких IT проектов. И сейчас в данной коротенькой статье будет вам представлена проблематика тестирования торговых стратегий с приближением к реальности и мои пути решения. Также поделюсь личным опытом в выявлении перспективности какой-либо торговой стратегии. (это не машинное обучение, не нейросети, не гадание и не астрология). Главным нашим инструментом будет Python и Jupiter Notebook. Этого достаточно. Все по простому. В первую очередь эта статья будет полезна, тем кто пишет торговых роботов, или разрабатывает стратегию для сигнальных ботов, и даже тем, кто в поисках чего-то интересного и нового. Итак, начнем. Сегодня, как всем известно, популярность алготрейдинга очень высока. Возможно кто-то уже нашел свой "золотой грааль". Но мы здесь будем в поисках... Как это происходит: смотрите обзор общих стратегий, модифицируете ее, проводите риск-менеджмент, выходите на рынок с новым алгоритмом и .... сливаете депо. Затем алгоритм "пожертвований" повторяется. Почему делается идет упор на важность изучения ваших торговых стратегий? А все потому что из-за изменчивости конъюнктуры рынка ваша стратегия может просто перестать работать как прежде. Поэтому с изменением рынка, нужно подстраиваться подстраиваться под него = менять свое поведение на нем. Составим некий перечень ошибок, возможно что не учитывается, по крайней мере с чем столкнулся сам. (не исключаю, что возможно для вас очевидно, или вы сталкивались с чем-то большим и проблематичным) 0. Быть полностью уверенным что ваша стратегия точно работает.Излишний оптимизм не дает холоднокровному разумуприменить хотя бы методы статистического анализа. 1. Самый наглядный, это малый интервал тестирования стратегии.Изучите стратегию на ее устойчивость при разных рыночных условиях. Часто добавление тестирования на инвертированных графиках дает дополнительную гарантию устойчивости стратегии в несуществующих еще рыночных условиях. В данной статье будет использоваться именно малый интервал времени котировок. 2. Подстраивание "точных" настроек стратегии.Попытки поймать каждое движение на рынке терпит фиаско при частом не срабатывании ключевых для вашей стратегии паттернов, условий. Попробуем достичь "грубой" гибкости. 3. Отход от модели предполагаемой перспективной стратегии.Как правило в момент уже тестирования появляются мысли как можно "улучшить" стратегию, добавить что-то новое, поэксперементировать с дополнительными паттернами, желая забрать все движения с рынка. 4. Незнание слабых сторон стратегии.Например, применение болленджера в условиях, когда очень сильная волательность, резкие изменения цены.Или падение ликвидности инструмента вынуждает перебираться на более старшие таймфреймы. Для начала подгрузим данные об одном из финансовых инструментов с Binance биржи через api за последние 3 года. Рынок криптовалют очень волатильный, и это замечательно. Соберем базовый симулятор, с заранее обозначенными условиями. 1. Возьмем за гипотезу, что рынок это случайность (где все игроки с равноценными кошельками)2. Используем минутный таймфрейм, чтобы его преобразовать в другой тайм для торговой стратегии, а симмулятор будет двигаться с шагом в 1 минуту.3. Введем понятие максимального и минимального наблюдаемого профита. Пригодится для измерения потенциала стратегии. (оценка глубины роста и просадки)4. Добавим значение стоплосса (либо процент либо конкретная цена)5. Вводим фактор проскальзывания цены в 0.1%6. Учитываем комиссию на бирже с умножительным коэффициентом (я использую запас 100% комиссии)7. Нам понадобится также записывать все сделанные сделки симулятором в отдельный журнал. Очень пригодится, для того чтобы отдельные сделки можно было построить и вручную проверить работу симулятора, а также изучить статистические величины.8. Введем генератор стратегий на основе регулируемого количества полос боллинджера с генерацией случайных параметров.9. Добавим случайный перебор take profit и stop loss Затем построим симулятор с генератором случайной стратегии на основе линий боллинджера. Кстати, вы можете использовать свою стратегию, или/и добавить другие составляющие индикаторов, добавить дополнительные иные аспекты поведения алгоритма на рынке (час торгов, звезды, число упоминаний в новостях какого то слова, и т.д.). Но суть хочу показать, что можно легко строить очень сложные математические модели поведения и тут же тестировать их с перебором огромного количества параметров. Абсурдность в этом вся в том, сложность системы требует больше времени и исторического контента. Итак, начнем. Мы сделали простой симулятор, и прогнали на нем множество итераций. Каждая итерация генерировала случайные значения параметров.  Первые две серии итераций будут по коротким дистанциям. По одной неделе исторических данных. Затем эти интервалы будут увеличены с ростом фиксированных параметров. Выведем как выглядит наша одна случайная стратегия (график цены и линии боллинджера) Основной движок симулятора. Здесь используем только сделки в лонг. Генерируем как можно больше результатов. Оставляем генерацию на 96 часов. количество итераций 4326132  generate_params profit 1355114 {'ma_window': [934, 829, 385, 291, 901, 489, 8... 2509.731530 2748242 {'ma_window': [583, 786, 272, 374, 993, 322, 4... 2515.246686 1168352 {'ma_window': [444, 256, 466, 165, 640, 298, 3... 2528.583217 1056488 {'ma_window': [173, 174, 148, 888, 122, 361, 7... 2570.601539 4090771 {'ma_window': [690, 930, 603, 720, 432, 411, 7... 2600.638982 3174694 {'ma_window': [885, 970, 293, 296, 358, 586, 8... 2604.829127 326805 {'ma_window': [873, 6, 478, 957, 263, 717, 682... 2605.651078 301489 {'ma_window': [372, 474, 59, 65, 545, 820, 969... 2665.182816 3733749 {'ma_window': [176, 31, 183, 29, 92, 9, 552, 5... 2688.979172 863146 {'ma_window': [634, 463, 554, 237, 36, 637, 74... 2707.697915 4280661 {'ma_window': [764, 908, 824, 165, 911, 682, 4... 2749.313573 817925 {'ma_window': [13, 252, 12, 571, 959, 376, 12,... 3259.250233 989229 {'ma_window': [401, 259, 980, 609, 254, 927, 7... 3725.547182  Самый максимальный профит при случайном подборе параметров получился (3725 - 1000) / 1000 * 100% = 272,5% Итак. С помощью метода перебора параметров, можно найти интересные результаты, экспериментируя применяя возможность перебора параметров модели. В принципе на этом можно остановиться. Но нужно продолжить, чтобы поставить стратегию в неловкое положение. Сделаем следующее: для фиксации извлечем попарные параметры, найдем самые "популярные" параметры, и построим график изменчивости. Найдем устойчивые параметры. Устойчивые - означает в данном контексте, что интервал изменения параметра не большой в рамках всей таблицы параметров. Для начала выведем корреляционную зависимость между параметрами, усилив значения. array([14, 41, 42, 44, 45, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59]) Мы получили статистические характеристики каждого из интересующих параметров. Необходимо сейчас зафиксировать среднее значение параметра, чтобы снизить дисперсию случайных величин для остальных параметров (не забываем, что наша таблица параметров была уже отсортирована на начальном этапе по увеличению итогового профита). Для этого оставим последние 10000 статистически выведенных значений и выведем по ним средние значения. Затем добавим функцию с фиксированными нашими параметрами. Сделаем второй прогон на 96 часов. Теперь будут прогоны с данной модификацией по другому инструменту и с другими рыночными условиями. Помним, что в данной статье мы придерживаемся только "лонговых" сделок. Естественно не нашлось случая, когда стратегия перебором параметров (из оставшейся степени свободы) вывела профит в плюс. Поскольку мы подбирали параметры только для лонговых сделок, то и работать будут только на лонговых и боковиковых ситуациях рынка. Однако, фиксируя параметры (снижая степень свободы модели), нужно брать более большие интервалы времени. В заключении отмечу, что целью данной статьи является именно сама идея переборов параметров при выявлении подходящего поведения на рынке. Удачи. data science engeneer