Написал скрипт, который переделывает тиковые данные в range заданной размерности.
Но есть нюанс, когда идет быстрый рынок, некоторые бары могут иметь одинаковое время открытия, что приводит к некоторому несоответствию range баров.
<code>""" Скрипт из файлов с тиковыми данными делает файл с рандже барами """ import re from datetime import datetime from pathlib import * import pandas as pd def zero_hour(cell): """ Функция преобразует время (с финама приходят часы без нулей (с марта 2021), которые pandas не воспринимает)""" cell = f'{int(cell)}' tmp_time = datetime.strptime(cell, "%H%M%S") return tmp_time.strftime("%H%M%S") def run(tick_files: list[Path], razmer: int, target_dir: Path): for ind_file, tick_file in enumerate(tick_files, start=1): # Итерация по тиковым файлам list_split = re.split('_', tick_file.name, maxsplit=0) # Разделение имени файла по '_' tiker = list_split[0] # Получение тикера из имени файла date_quote_file = re.findall(r'\d+', str(tick_file)) # Получение цифр из пути к файлу target_name = f'{tiker}_range{razmer}_{date_quote_file[0]}.txt' # Создание имени новому файлу target_file_range: Path = Path(target_dir / target_name) # Составление пути к новому файлу if Path.is_file(target_file_range): print(f'Файл уже существует {target_file_range}') continue else: df_ticks_file: pd = pd.read_csv(tick_file, delimiter=',') # Считываем тиковые данные в DF # Создание DF под рандже бары одного тикового файла df: pd = pd.DataFrame(columns='<DATE> <TIME> <OPEN> <HIGH> <LOW> <CLOSE> <VOL>'.split(' ')) for tick in df_ticks_file.itertuples(): # Итерация по строкам тикового DF print('\rCompleted file: {:.2f}%. Completed files: {:.2f}%'.format( tick[0] * 100 / len(df_ticks_file.index), ind_file * 100 / len(tick_files) ), end='' ) if tick[0] == 0: # Добавление строки в DF с рандже барами df.loc[len(df.index)] = [int(tick[1]), int(tick[2]), tick[3], tick[3], tick[3], tick[3], tick[4]] continue # Если бар сформирован по размеру возрастающий бар if df.loc[len(df.index) - 1, '<LOW>'] + razmer < tick[3]: df.loc[len(df.index) - 1, '<CLOSE>'] = df.loc[len(df.index) - 1, '<LOW>'] + razmer df.loc[len(df.index) - 1, '<HIGH>'] = df.loc[len(df.index) - 1, '<CLOSE>'] # Добавление строки в DF с дельта барами df.loc[len(df.index)] = [int(tick[1]), int(tick[2]), tick[3], tick[3], tick[3], tick[3], tick[4]] continue # break # Если бар сформирован по размеру падающий бар if df.loc[len(df) - 1, '<HIGH>'] - razmer > tick[3]: df.loc[len(df) - 1, '<CLOSE>'] = df.loc[len(df) - 1, '<HIGH>'] - razmer df.loc[len(df) - 1, '<LOW>'] = df.loc[len(df) - 1, '<CLOSE>'] # Добавление строки в DF с дельта барами df.loc[len(df.index)] = [int(tick[1]), int(tick[2]), tick[3], tick[3], tick[3], tick[3], tick[4]] continue # break # Заполняем(изменяем) последнюю строку DF с рандже баром -------------------------------------- # Записываем <CLOSE> -------------------------------------------------------------------------- df.loc[len(df.index) - 1, '<CLOSE>'] = tick[3] # Записываем последнюю цену как цену close бара # Записываем <HIGH> --------------------------------------------------------------------------- if float(tick[3]) > df.loc[len(df) - 1, '<HIGH>']: # Если цена последнего тика больше чем high df.loc[len(df.index) - 1, '<HIGH>'] = tick[3] # Записываем цену последнего тика как high # Записываем <LOW> ---------------------------------------------------------------------------- if float(tick[3]) < df.loc[len(df.index) - 1, '<LOW>']: df.loc[len(df.index) - 1, '<LOW>'] = tick[3] # Записываем цену последней сделки как low # Записываем <VOL> ---------------------------------------------------------------------------- df.loc[len(df.index) - 1, '<VOL>'] += tick[4] # Увеличиваем объем # Изменение типа колонок df[['<DATE>', '<TIME>', '<VOL>']] = df[['<DATE>', '<TIME>', '<VOL>']].astype(int) # Преобразуем столбец <TIME>, где нужно добавив 0 перед часом df['<TIME>'] = df.apply(lambda x: zero_hour(x['<TIME>']), axis=1) df.to_csv(target_file_range, index=False) # Запись в файл для одного тикового файла # break if __name__ == "__main__": razmer: int = 250 ticker: str = 'RTS' year_tick: str = '2022' source_dir_tick: Path = Path(f'c:/data_quote/data_finam_{ticker}_tick') # Путь к ресурсному каталогу target_dir: Path = Path(f'c:/data_quote/data_prepare_{ticker}_range') # Путь к целевому каталогу # Создание списка путей к файлам с тиками tick_files: list[Path] = list(source_dir_tick.glob(f'*{year_tick}*.csv')) run(tick_files, razmer, target_dir) </code>
Депозит 1.470.000 рублей.
Лимит на 1 акцию 210.000 рублей. Лимит на 1 сделку 30.000 рублей.
Текущая сетка динамической лесенки.
Газпром Long30.12 341,0 240 акций.
ГМКН Long30.12 22650 3 акции.
Лукойл Long05.01 6750 8 акций.
Новатэк Long12.01 1800 32 акции. Long 18.01 1600 19 акций.
Полюс Long30.12 12800 8 акций. Long17.01 11400 2 акции.
Роснефть Long30.12 595,0 100 акций.
Сбербанк Long30.12 294 270 акций. Long14.01 255 110 акций.
Текущая лесенка по акциям.
Всех приветствую!
Подвожу итоги за 2021 год, хоть и с опозданием. Решил не нарушать традицию. Пишу для себя, для анализа, рефлексии, разложить и сформулировать мысли — очень полезно. Итог -18,4%, счет проседал внутри года на 50,2%. От февральского максимума в +16,5% к минимуму октября -33,7%.
Торговля ведется трендовыми алгоритмами на валютном фьючерсе USD/RUB (Si).
1 квартал +7,9%
2 квартал -17,9%
3 квартал -14,3%
4 квартал +5,9%
Общий доход с учетом реинвестирования за 4 года составил 384%. Статистика по счету в Финаме теперь доступна только из личного кабинета. Ссылки на публичные счета отключили, неудобно.
ЧТО ПРОИСХОДИТ: занимаясь трейдингом с 2012 года постепенно дошел до алгоритмической торговли портфелей цикличных торговых систем. Работаю вместе с квалифицированным программистом. В 2020 году запустили одиночную торговую стратегию на $25 000 и забрали 39% годовых. В мае 2021 года запустили портфель торговых систем, который и торгуем сейчас. Цель — постепенное доведение управления до сложных глубоко-диверсифицированных портфелей торговых систем способных давать доходность больше 100% годовых с управляемыми рисками. Выше Equity моей публичной торговли, которую веду с 2013 года.
ОТЧЕТ
1. Портфель поддержки — начинает год сразу с большого убытка (хорошо хоть перед этим в декабре заработал 8%), закрывает в декабре 3 сделки и теряет — $2656 на контракт. Торговля дублируется на счетах общим депо ~$40 000
NASDAQ signals to BUY
Symbol: HALO
Recommended price: 33.7
Signal strength: 2 (BUY)
Prediction date: 04/02/2022
Issuer: Halozyme Therapeutics, Inc.
SL: -1% TP: 5%
Symbol: ALKS
Recommended price: 23.71
Signal strength: 1 (BUY)
Prediction date: 04/02/2022
Issuer: Alkermes Inc. plc
SL: -1% TP: 5%
Symbol: SRDX
Recommended price: 41.04
Signal strength: 1 (BUY)
Prediction date: 04/02/2022
Issuer: Surmodics, Inc. Common Stock
SL: -1% TP: 5%
NASDAQ signals to SELL
Symbol: TWKS
Recommended price: 22.91
Signal strength: -7 (SELL)
Prediction date: 04/02/2022
Issuer: Thoughtworks Holding, Inc. Common Stock
SL: -1% TP: 5%
Symbol: BBI
Recommended price: 0.28
Signal strength: -1 (SELL)
Prediction date: 04/02/2022
Issuer: Brickell Biotech, Inc. Common Stock
SL: -1.4% TP: 5%
Symbol: SWKS
Recommended price: 135.1
Signal strength: -1 (SELL)
Prediction date: 04/02/2022
Issuer: Skyworks Solutions Inc
SL: -1.4% TP: 5%
Наверно не только меня одного в профессию программиста привела тяга к компьютерным играм. Все эти новые вселенные, стрелялки, полеты на немыслимых самолетах. Всегда хочется что-то узнать большее об управляемом персонаже, защитить его, правильно им управлять. Возможно даже вырастить его в немыслимого супергероя. С годами игры меняются. Остается главное – страсть к чему-то новому исследовательскому. Открутить колесико от одной машинки и прикрутить его к другой. А вдруг!
Самое главное в этом процессе играть самому. По своим правилам и своими игрушками. Пусть даже и не выиграть. Но самое главное самому и по своим правилам. Руководить собственным маленьким, подчиняющимся только тебе «терминатором». Начнем с выбора персонажа. Пусть это буду акции российских и иностранных компаний доступные обычному человеку на Московской бирже через терминал QUIK. Спасибо разработчикам терминала. Они предоставляют механизмы экспорта/импорта информации во внешние системы анализа. Платформа для создания бизнес-приложений логично вписывается в эту нишу. При этом концепция «low code» позволяет в одиночку создать и поддерживать свои правила игры на своем поле. Даже человек, который ранее никогда не программировал может в приемлемый срок освоить встроенный в 1С Предприятие язык программирования и начать управлять небольшой торговой системой, закладывая в нее свою логику.
Ну, первое.
Заголовки общей ленты Смарта выглядят так:
12:03 Ты в Баню? — Иван Иванов
12.05 Нет я в Баню — Сергей Сэр Геев
12:07 Аааа, я думал, что ты в Баню — Иван Иванов
Прочитав заголовки, понимаешь что тут к чему.
Ну, а теперь про ежедневные торговые системы.
Трейдеры выдумывают системы с одной целью — всем о них рассказать, кому-нибудь продать, но не в коем случае не заработать денег.
В чем тут смысл?
Заработайте сначала себе денег.
Потом о вас и так узнают как о очем богатом человеке.
Не в коем случае не болтайте о них, не болтайте много.
Чем больше вы говорите, тем всем очевиднее, что у вас ничего нет.
Главное не пытайтесь ее продать. Ведь любая система продается только с автором.
Иначе она не работает.
Но, я вам больше скажу, что если вы продадите свою систему с автором, т.е. и себя в рабство продадите, то все равно ваша система работать не будет.
Так как изначально вы не хотели денег, с чего вам их начинать хотеть, если вы продали и себя и систему, да вы просто продажный предатель собственной системы.
Ну и так далее.
Вообще этот текст для покупателей систем.