Избранное трейдера Александр Павлов
Привет, Всем!
Хотел бы рассчитать размерность range баров, чтобы их количество в одном дне было бы как и количество 5 мин баров.
Написал скрипт но значения так разнятся. Может кто-то уже занимался таким вопросом?
Рассчитанное значение величины range в поле <RAZMER>
<code>""" Для расчета рендж баров эквивалентных 5 мин """ from pathlib import * import pandas as pd import talib def body(open: float, close: float) -> float: return abs(close - open) if __name__ == "__main__": # 198 баров 5м в дне (с 7:00) period: int = 198 source_file: Path = Path('c:\data_quote\data_finam_RTS_5m\SPFB.RTS_210301_220131.csv') df: pd = pd.read_csv(source_file, delimiter=',') # Считываем тиковые данные в DF # Преобразуем столбец <TIME>, где нужно добавив 0 перед часом df['<BODY>'] = df.apply(lambda x: body(x['<OPEN>'], x['<CLOSE>']), axis=1) df['<RAZMER>'] = talib.MA(df['<BODY>'], timeperiod=period, matype=0) df_15: pd = df.loc[df['<TIME>'] == 150000] # Бары в 15:00 print(df_15.tail(20)) """ Получается, что рендж бар для фьючерса RTS должен быть размером 250, чтобы количество баров в дне, примерно совпадало с с количеством 5 мин баров. """</code>
Всем, привет, давно в бэклоге лежала статья, но руки не доходили перепроверить данные на примере нашего рынка и ввиду сильной волатильности в последние дни имея работающего да же простого робота можно было бы неплохо заработать, но это как то не интересно/не спортивно и хотелось именно 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("Слава роботам! Убить всех человеков!")