Избранное трейдера Александр Павлов
Всем, привет, давно в бэклоге лежала статья, но руки не доходили перепроверить данные на примере нашего рынка и ввиду сильной волатильности в последние дни имея работающего да же простого робота можно было бы неплохо заработать, но это как то не интересно/не спортивно и хотелось именно ML, так как без ML простой робот без волатильности начинает стабильно сливать, проверено на бэктестах еще давно.
Обучил сеточку минутками за 18-е число и торговал бэктесом 19-е число доходность по бэктестам 85,6%
Свечи
Таки собрался дописать вторую часть своих результатов применения трансформеров для предсказания на российском фондовом рынке. Может и хорошо что не спешил, так как пафос первой части о трансформерах дающих какие то уникальные результаты по сравнению с другими архитектурами нейросетей, оказался несколько преувеличенным, по крайней мере LSTM дал вполне сравнимый результат с трансформерами. Потом я попробовал градиентный бустинг, дерево решений и вновь получил схожий результат. Так что подавайте в нейросеть правильные признаки и многие модели покажут положительный результат. Тем не менее, раз я начал с трансформерах, и так как их архитектура хорошо отражает рынкок, о них и продолжу.
Для любителей вопросов о «таймфреймах, на чем обучал, какие акции, что в качестве таргета, какие параметры, время удержании позиции» итп итд. Акции МосБиржы, из числа наиболее ликвидных. Данные у меня с 2011 до 2021 (и это увы необходимость, так как именно с 2011 года время работы биржи стало 9 часов). Прогнозы строил следующим образом — выкидывал один год (это out-sample), а из оставшихся делал разбивку на train и test. Таким образом получил 10 одногодичных прогнозов. Для меня важно получить доходность на сделку пусть поменьше, но чтобы прибыльность подтверждалась на как можно большем диапазоне, и на всех акциях. Такое чтобы для каждой акции своя модель — для меня неприемлемо. И само собой никаких убыточных годов, как минимум. Знаю многие меняют системы каждые 3 года и для них это нормально, я предпочитаю вылавливать аномалии которые работают десятилетиями. Тут я никого не учу, рынок сам рассудит.
//@version=4 strategy(title="Random Entries Work", shorttitle="REW", overlay=true, pyramiding=0, default_qty_type=strategy.percent_of_equity, default_qty_value=100, currency=currency.USD,commission_type=strategy.commission.percent,commission_value=0) // === GENERAL INPUTS === strategy = input(defval="Long Only",title="Direction",options=["Long Only", "Short Only", "Random"]) enter_frequency = input(defval=10,minval=1,maxval=100,title="Percent Chance to Enter") exit_frequency = input(defval=3, minval=0,maxval=100,title="Percent Chance to Exit",tooltip="This should be much lower than Percent Chance to Enter. Higher values decrease time in market. Lower values increase time in market.") start_year = input(defval=2020, title="Start Year") // === LOGIC === r = random(0,100) enter = enter_frequency > r[0] exit = exit_frequency > r[0] direction = random(0,100) >= 50 // === STRATEGY - LONG POSITION EXECUTION === enterLong() => strategy.opentrades == 0 and enter and (strategy == "Long Only" or (strategy == "Random") and direction) and time > timestamp(start_year, 01, 01, 01, 01) exitLong() => exit strategy.entry(id="Long", long=strategy.long, when=enterLong()) strategy.close(id="Long", when=exitLong()) // === STRATEGY - SHORT POSITION EXECUTION === enterShort() => strategy.opentrades == 0 and enter and (strategy == "Short Only" or (strategy == "Random" and not direction)) and time > timestamp(start_year, 01, 01, 01, 01) exitShort() => exit strategy.entry(id="Short", long=strategy.short, when=enterShort()) strategy.close(id="Short", when=exitShort())
Активы достигли максимума «за всю историю наблюдений».
Но не стоит обольщаться. Любая политическая напряженность приведет к снижению фондового рынка России. Или другие события мирового масштаба и воздействия. И портфель просядет.
# подключаем либы from loguru import logger from notifiers.logging import NotificationHandler # прописываем параметры телеграм бота, от чьего имени и куда слать, где их взять думаю сами разберетесь params = { 'token': 'dfdfsfasdfljsahdfkljhasdfklj', 'chat_id': 'dfkdsflksdjfls;kfjas;ldkf' } tg_handler = NotificationHandler("telegram", defaults=params) # добавляем в logger правило, что все логи уровня info и выше отсылаются в телегу logger.add(tg_handler, level="INFO")
logger.info("Слава роботам! Убить всех человеков!")