Избранное трейдера OnlyHuman
Привет! Бегло полистал SL и обнаружил, что книжные обзоры делятся на 2 типа – инвесторские и хардкорное алго (HFT и опционы). Промежуточный вариант попытаюсь закрыть данным постом. По уровню сложности книги в обзоре находятся между зубодробительной подборкой от Eugene Logunov https://smart-lab.ru/blog/534237.php и приятным чтивом по фундаментальным стратегиям.
1) Lasse H. Pedersen – Efficiently Inefficient
Отличная книга и №1 по соотношению польза/сложность. Автор показывает, как кванты тестируют и отбирают стратегии в портфель. Условно ее можно разделить на 4 части: арбитраж, факторные стратегии, глобал макро и технические моменты запуска и финансирования фонда. HFT и опционные стратегии упоминаются вскользь. Наверное, книга подойдет и для совсем начинающих, т.к. все метрики (вплоть до волатильности) и базовые концепции раскрываются с 0.
LHP – один из боссов крупного хедж фонда в Гринвиче, но в отличие от Далио или Дракенмиллера, еще и хардкорный академик. Поэтому в книге любое утверждение подтверждается ссылками, а для глубокого погружения есть отличный список первоисточников. Понятно, что никаких секретов своего работодателя LHP не раскрывает, но профильные главы для меня оказались полезными в плане идей + отсылки туда, где копать глубже.
Приветствуем наших постоянных читателей и только вошедших, новых подписчиков. Надеемся, что здесь вы найдете что-то полезное для себя или уже нашли и следите за обновлениями)
Мы решили выпустить серию статей, посвященных объемному анализу и свечным паттернам.
У большинства трейдеров сформировались уже свои ассоциации при виде той или иной свечи. Кто-то определенные ситуации трактует как разворот рынка, другие же наоборот предполагают продолжение тенденции. Смысл здесь кроется больше в «предыстории» этого движения, а не в самих свечах. Давайте рассмотрим теорию на практике, на конкретных примерах.
В качестве примера возьмем большое тело свечи с крупным объемом(рисунок выше). Следом за ней идет свеча в обратную сторону, но по размеру больше, чем первая. То есть если закрытие второй ниже, чем открытие предыдущей на умеренном объеме – следом рынок развернется и пойдет в другую сторону. А теперь проверим частоту таких случаев, и приводят ли они к профиту (и как часто это происходит).
# В КВИКе запускаем луа-скрипт QuikLuaPython.lua import socket import threading from datetime import datetime, timezone import pandas as pd import finplot as fplt fplt.display_timezone = timezone.utc class DeltaBar(): def __init__(self): self.df = pd.DataFrame(columns='date_time open high low close delta delta_time_sec'.split(' ')) self.df.loc[len(self.df)] = [0, 0, 0, 0, 0, 0, 0] def parser(self, parse): if parse[0] == '1' and parse[1] == 'RIH1': if abs(self.df.iloc[len(self.df) - 1]['delta']) >= 500: self.df.loc[len(self.df)] = [0, 0, 0, 0, 0, 0, 0] # Добавляем строку в DF self.df.iloc[len(self.df) - 1]['close'] = float(parse[4]) # Записываем последнюю цену как цену close бара if self.df.iloc[len(self.df) - 1]['date_time'] == 0: self.df.iloc[len(self.df) - 1]['date_time'] = \ datetime.strptime(f'{parse[7]} {parse[8][0:-1]}', "%d.%m.%Y %H:%M:%S.%f").replace(microsecond=0) if self.df.iloc[len(self.df) - 1]['open'] == 0: self.df.iloc[len(self.df) - 1]['open'] = float(parse[4]) if float(parse[4]) > self.df.iloc[len(self.df) - 1]['high']: self.df.iloc[len(self.df) - 1]['high'] = float(parse[4]) if (float(parse[4]) < self.df.iloc[len(self.df) - 1]['low']) or \ (self.df.iloc[len(self.df) - 1]['low'] == 0): self.df.iloc[len(self.df) - 1]['low'] = float(parse[4]) if parse[5] == '1026': self.df.iloc[len(self.df) - 1]['delta'] += float(parse[6]) if parse[5] == '1025': self.df.iloc[len(self.df) - 1]['delta'] -= float(parse[6]) self.df.iloc[len(self.df) - 1]['delta_time_sec'] = \ datetime.strptime(f'{parse[7]} {parse[8][0:-1]}', "%d.%m.%Y %H:%M:%S.%f") - \ self.df.iloc[len(self.df) - 1]['date_time'] self.df.iloc[len(self.df) - 1]['delta_time_sec'] = self.df.iloc[len(self.df) - 1]['delta_time_sec'].seconds def service(): sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) sock.bind(('127.0.0.1', 3587)) # Хост-этот компьютер, порт - 3587 while True: res = sock.recv(2048).decode('utf-8') if res == '<qstp>\n': # строка приходит от клиента при остановке луа-скрипта в КВИКе break else: delta_bar.parser(res.split(' ')) # Здесь вызываете свой парсер. Для примера функция: parser (parse) sock.close() def update(): df = delta_bar.df # Меняем индекс и делаем его типом datetime df = df.set_index(pd.to_datetime(df['date_time'], format='%Y-%m-%d %H:%M:%S')) # print(delta_bar.df) # pick columns for our three data sources: candlesticks and TD candlesticks = df['open close high low'.split()] volumes = df['open close delta_time_sec'.split()] if not plots: # first time we create the plots global ax plots.append(fplt.candlestick_ochl(candlesticks)) plots.append(fplt.volume_ocv(volumes, ax=ax.overlay())) else: # every time after we just update the data sources on each plot plots[0].update_data(candlesticks) plots[1].update_data(volumes) if __name__ == '__main__': delta_bar = DeltaBar() # Запускаем сервер в своем потоке t = threading.Thread(name='service', target=service) t.start() plots = [] ax = fplt.create_plot('RIH1', init_zoom_periods=100, maximize=False) update() fplt.timer_callback(update, 2.0) # update (using synchronous rest call) every N seconds fplt.show()
Приветствуем Всех!
Кто торгует через TSLab, знают о ситуациях в «реверсных» алгоритмах, когда необходимо переворачивать позу. Сначала выставляется закрытие для текущей позиции, далее открытие для новой. В большинстве случаев, конечно это происходит крайне быстро и без проблемно, но любая транзакция имеет задержки, пусть 100-300мс но все же задержки есть. Этого не избежать в принципе никак. Но можно перестроить алгоритм, таким образом, чтобы вместо закрытий позиций, были просто «задвоеные» заявки. То есть получается, открыли лонг, далее например открываем шорт +1 к лонгу.
В итоге получим просто перевесы в размере позиции, то есть лонгов 144 шортов 145, в итоге текущая позиция просто 1лот шорт. Это слегка не привычно с точки зрения восприятия, но главное избегаем двух транзакций!
Скрипт построен на фьючерсе ртс, индикаторов в принципе нет, простенький паттерн используется для демонстрации системы.
Так выглядит график при таком «фокусе»
Сегодня темой нашей очередной статьи будет пример попытки улучшения своей доходности, при торговле по тренду.
Начальный алгоритм достаточно прост и стандартен — хай/лоу с периодом в 2000 баров. Тикер РТС Фьючерс. Специально был взят отрезок из прошлого, так как на нем он лучше всего «летал».
Параметр не подогнанный — начальный период в блоках TSLab обычно 20 и мы приписали пару нулей для увеличения продолжительности сделки.
Эквити в начальном виде.
Результаты показывать не будем, так как они будут более интересными, чем график дохода. Рекомендуем посмотреть как это работает на практике лично, если вы уже пользователь нашей программы)
Да — это не плохой график, но попытаемся сделать лучше! Выводим следующую формулу — открываем позицию, считаем доход/количество удерживаемых баров. Если значение растет, — значит рынок двигается с хорошей скоростью в нашу сторону. Если же начинает медленно падать или уходит в минус — значит перестал двигаться в нужном направлении. Пользуясь таким методом, алгоритм приближает стоп-лосс на 1 шаг цены с каждым баром. Для заметки: если работаете с историческими данными, то перепроверьте какой шаг цены вы указали. Иначе рискуете искать долго причину почему стоп не двигается ближе, как это было у меня!)
Приветствуем.
Работая с программой TSLab, иногда, а иногда часто), возникают пожелания, в виде необходимости новых блоков, которые в составе софта отсутствуют. Многие сложности, на самом деле решаемы имеющимся функционалом, хотя иногда конечно не обойтись без программирования.
В комментариях к предыдущей статье, попросили добавить блок — месяц года. Просто взять и добавить блок — чаще всего это цикл через 6 рук пройдет от тикета с требованием к реализации, далее принятие решение о срочности и тд и тп. не суть важна в бюрократии, а в том что сделать можно все своими руками!
Итак начнем. В тслаб имеется блок — дата, который транслирует дату в формате ггммдд, его и будем использовать чтобы получить месяцы.
Первый и самый важный шаг — вывести блок дата на график, чтобы узнать о формате, так как в разных блоках могут быть разные вариации написания.
Следующий шаг — построить логику в голове, каким образом достать месяц из данного варианта формата. Прежде всего не воспринимаем это как дату, а принимаем ее за обычную цифру. 161122. Чтобы добраться до месяцев — мне нужно прежде всего исключить год.