Избранное трейдера S&P
Это исследование я сделал под влиянием бурной дискуссии на форуме о распределении «хвостов» приращений логарифмов цен, возникшей, казалось, на «пустом месте»: насколько корректны доверительные интервалы для оценок параметров линейной регрессии в альфа-бета модели?
Кроме указанной ссылки, дискуссия продолжилась в еще двух ветках: тут и тут.
Действительно, эти оценки в классическом случае строятся на основе центральной предельной теоремы для статистик оценок параметров линейной регрессии. Однако, как я уже писал на смартлабе, необходимым условием которой является скорость роста дисперсии суммы слагаемых как О(N), N – число слагаемых, а для быстрой сходимости в центральной области еще и требуется конечность абсолютного третьего момента любого слагаемого (если говорить о сходимости на всей прямой, включая «большие уклонения», то еще требуется и конечность всех моментов отдельных слагаемых). Однако эти условия не выполняются для части распределений Парето и Стьюдента с полиномиальной скоростью убывания «хвостов» и поэтому для «хорошего» приближения суммы таких слагаемых нормальным законом требуется очень большое число испытаний, которых, как правило, в альфа-бета модели, построенной на дневных данных, нет. А значит традиционные методы построения доверительных интервалов для оценок параметров этой модели «не работают».
# В КВИКе запускаем луа-скрипт 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()
Многие жалуются, что подорожали квартиры и в стране высокая инфляция. Вместо этого нужно посмотреть на цифры, и порадоваться, потому что инфляция обесценивает ипотеку до такой степени, что вы можете получить квартиру в ипотеку дешевле ее текущей рыночной цены.
Рассмотрим пример. Покупаем квартиру в Москве стоимостью 12 млн. руб., с первоначальным взносом 2 млн. руб. В кредит берем 10 млн. руб. на 20 лет по ставкам 8% и 10% годовых. Рассмотрим 2 базовых сценария, в которых в следующие 20 лет инфляция в России составит 10% и 5% годовых. И вот что получается.
Всех приветствую!
Решил коротко подвести итоги по прошедшему году. Фактическая доходность составила +129,5%. Максимальная просадка пришлась на декабрь 23,9%. Результат хороший, однако «руки нужно связывать». В четвертом квартале дважды вмешался в торговлю ботов. Для оценки потерь построил еще две теоретические эквити.
Первое вмешательство.
21 октября принял решение реинвестировать весь накопившийся доход за текущий год. Увеличил риски в два раза в одижании продолжения высокой волотильности. Однако ноябрь и декабрь оказались не лучшими месяцами для моего портфеля на Si. Теоретическая доходность без реинвестирования составила бы +141,3%, максимальная просадка 15,1%.
Второе вмешательство.
3 ноября боты набрали большую шортовую позицию, которую я решил не переносить через выходные в связи с выборами в штатах. Посчитал, что реация рубля может быть негативной (непредсказуемой). Застраховался от гэпа вверх, плечо было большое. На гэпе 5 ноября недозаработал около 7%. Теоретическая доходность без ручных вмешательств составила бы +156,7%, максимальная просадка 9,4%.
Естественно, расстроен. В дальнейшем реинвестировать накопленный доход планирую частями на текущих просадках. Ну а, ручные вмешательства в открытые позиции ботов не обсуждается). «Рынки движутся на гэпах» — записал на подкорке.
Доходность за 3 года с учетом реинвестирования составила 458,4%. Реинвестирование осуществлялось трижды: в начале 2019 года, в начале и в конце 2020 года.
Всем здоровья и бодрого расположения духа!
В статье «Визуализация рекомендаций Романа Андреева на Python» мы разобрали как можно с помощью нескольких строк кода на Питоне разобрать текст, который выкладывает каждое утро в своем блоге Роман Андреев (далее по тексту Роман) — известный трейдер и блогер (или наоборот), и отобразить эти рекомендации в виде уровней и зон на графиках. В этом топике я покажу способ для извлечения информации из графических изображений с помощью технологий компьютерного зрения (но без использования нейронных сетей) на примере таблиц-рекомендаций из блога Романа Андреева.
Надеюсь, что я не напугал читателей термином «компьютер вижн», скоро вы поймете, что это просто. И что любой юный прогер может написать код для распознавания внешними камерами номеров автомобилей, который впоследствии возненавидят все автолюбители мегаполисов, а МАДИ и ГИБДД будут собирать со всех нас миллиардные штрафы
У меня инженерные мозги. Это помогает, с одной стороны. С другой — я чувствую пробелы в гуманитарных знаниях. В данный момент нахожусь в поисках ответов на важные вопросы. Интересуюсь мнением более умудренных опытом коллег-инвесторов.
Александр Силаев, фото — соцсетиМы беседуем с Александром Силаевым, частным инвестором, трейдером и бывшим преподавателем философии. Александр написал трилогию книг: «Деньги без дураков», «Философия без дураков»,