Aspiring Data Science
319 subscribers
386 photos
10 videos
6 files
1.41K links
Заметки экономиста о программировании, прогнозировании и принятии решений, научном методе познания.
Контакт: @fingoldo

I call myself a data scientist because I know just enough math, economics & programming to be dangerous.
Download Telegram
#trading #tradingpolicy

По части 2, торговая политика, есть пока что только смутная идея простой стратегии. Если получится предсказывать движение актива, то разумным выглядит открытие минимальной позиции в сторону движения наибольшей вероятности (большей MIN_PROB), с установкой фиксированного перемещаемого стоп-лосса SL. Если направление прогноза меняется, опционально стоп-лосс можно подтягивать к рыночной цене. Ещё его опционально можно выводить в зону безубыточности, на это ответить должна оптимизация.

Следуя рекомендации "начинай ML-проекты без ML", мне нравится идея побэктестить этот подход, в качестве прогнозов движения цен на некоторый интервал тупо используя факт за такой же прошлый интервал. Если на бэктесте это будет давать не сильно большие убытки, можно это запустить в реале на минималках, чтобы погрузиться в реалии рынка, увидеть проблемные места, пофиксить баги. API у брокера я уже подключил. Запланирую это сделать в течение сл. 2 недель.
#trading #tradingpolicy #backtesting #optimization

Итак, продолжаем с трейдингом. В соответствии с предыдущим постом, я определился с несложной стратегией, которая открывает позицию на ожидании роста или падения цены актива, и закрывает её по стоп-лоссу или тейк-профиту. Согласно плану, надо её потестировать на истории (у нас есть 1 месяц срочного рынка ММВБ) без ML, и, если получится не сильно убыточно, попробовать внедрить, чтобы набить шишек, набраться опыта, и т.д.

У неё 3 параметра:

order_offset: float,
takeprofit_size: float,
stoploss_size: float.

Первый связан с открытием позиции (насколько далеко от прошлой сделки мы будем считать цену высокой или низкой), 2 остальных - с закрытием (по прибыли и убытку). Параметры могут быть заданы в единицах цены или ценовой волатильности (не знаю, что лучше, 2-е кажется более универсальным). Есть ещё размер заявки и максимальный риск позиции, но их мы будем считать фиксированными.

Для выбранного дня и инструмента каждое сочетание параметров в теории даёт свой поток сделок и, соответственно, свой профиль прибыли/риска. Причём эмпирически видно, что для определённого сочетания параметров за период профиль может варьироваться от крайне убыточного до достаточно прибыльного, но за следующий период смениться на полностью противоположный, Как же оценить жизнеспособность торговой стратегии в таких условиях?

Видимо, надо проверять некую связность параметров на последовательных интервалах. Если "лучшие" или "хорошие" параметры по инструменту изменяются от часа к часу достаточно плавно, есть надежда, что, подбирая "лучшие на текущий момент" параметры брутфорсом и применяя их следующий, скажем, час, мы приземлимся не очень далеко от "истинных лучших параметров" за этот будущий час, и имеем шансы заработать. (На самом деле, ещё более продвинута идея прогнозирования лучших будущих параметров, её продвигают ДеПрадо и Чан.)

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

Попробую проверить результаты следующего подхода: каждый час по каждому инструменту находим "лучшие" (в терминах прибыли, просадки, устойчивости) параметры с начала торгового дня до текущего момента, следующий час торгуем по ним. Под устойчивостью понимается тот факт, что небольшое изменение параметра не должно приводить к резкому изменению целевой функции. Для этого целевую функцию думаю оценивать не только в заданной точке M-мерного пространства параметров (в нашем случае M=3), но и в K ближайших (в смысле некоторой метрики, к примеру, эвклидовой) точках. Как оценку набора параметров можно брать отношение среднего (mean) целевой функции в этой и K ближайших точек к её вариации (std).

Как это можно реализовать:
1) сделать низкоуровневые черновые расчёты:

разбить все дни/инструменты на куски фиксированного размера, например, каждый 1 час, или каждые 10_000 сделок.
выбрать подлежащее проверке число сочетаний, например, P=1_000_000. Сгенерировать P случайных (но валидных) комбинаций параметров.
для каждого куска данных отправить на кластер задачи бэктеста всех этих P комбинаций для этого куска.
как результат, централизованно сохранить день, час, инструмент, параметры, итоговые метрики (прибыль, просадку, и тд)

2) провести, собственно, метабэктест:

каждый час находим, не забывая K точек окрестности, сочетание с лучшей оценкой (что лучше - за прошлый час или за весь день?), в качестве результата просто берём из базы уже известный кусок для этого сочетания и следующего часа. суммируем по всем дням и инструментам. тем самым и получим искомую оценку пригодности торговой стратегии.

Единственная проблема пока в том, что если открыта позиция на весь лимит риска, пока она не закроется, сделки в следующий период совершить будет нельзя, и расчёт теряет практический смысл. Но, наверное, это можно обойти большим депозитом и установкой "лимита на час".
#trading #erema #tradingpolicy

Допилил бэктестер, выяснилось, что полученной предсказуемости на акциях едва достаточно, чтобы побить комиссию. Но это я построил 1 модель без тюнинга на первом попавшемся таргете, относительно небольшом датасете. Торговая политика тоже была недостаточно проработанной: к примеру, даже если ей подавать истинные вероятности изменения цены вместо прогноза (читерство), торгуя 1 лотом Магнита (~5 т.р.), за день можно заработать чистыми 500р., при этом комиссия брокера составит 300р. Наверняка это можно улучшить. Осознал, что ML и торговую части можно прорабатывать почти независимо, если у моделек сохранять предсказания на всех OOS днях.