Избранное трейдера Ajax
Начинающие (да и не только) инвесторы часто задаются вопросом о том, как отобрать для себя идеальное соотношение активов входящих в портфель. Часто (или не очень, но знаю про двух точно) у некоторых брокеров эту функцию выполняет торговый робот. Но заложенные в них алгоритмы не раскрываются.
В этом посте будет рассмотрено то, как оптимизировать портфель при помощи Python и симуляции Монте Карло. Под оптимизацией портфеля понимается такое соотношение весов, которое будет удовлетворять одному из условий:
Для расчета возьмем девять акций, которые рекомендовал торговый робот одного из брокеров на начало января 2020 года и так же он устанавливал по ним оптимальные веса в портфеле: 'ATVI','BA','CNP','CMA', 'STZ','GPN','MPC','NEM' и 'PKI'. Для анализа будет взяты данные по акциям за последние три года.
#Загружаем библиотеки import pandas as pd import yfinance as yf import numpy as np import matplotlib.pyplot as plt # Получаем данные по акциям ticker = ['ATVI','BA','CNP','CMA', 'STZ','GPN','MPC','NEM', 'PKI'] stock = yf.download(ticker,'2017-01-01', '2019-01-31')
9 Что было, то и будет; и что делалось, то и будет делаться, и нет ничего нового под солнцем.
10 Бывает нечто, о чём говорят: «смотри, вот, это новое»; но это было уже в веках, бывших прежде нас.
11 Нет памяти о прежнем; да и о том, что будет, не останется памяти у тех, которые будут после.
Екклесиаст 1 глава – Библия: bible.by/syn/21/1/
Причина страданий по кризису, лежит в самих людях и их действиях. Вернее, в их неразумном отношении к тем ресурсам которые они имеют. Большинство людей пытаются прожрать все ресурсы, которые попали в их распоряжение, и еще сверху набрать кредитов.
Вся суть разных подходов в одной картинке:
import requests import datetime import pathlib SECIDs = ["GAZP", "BANEP", "LKOH"] DISK = "E" for SECID in SECIDs: from_date = "2020-05-04" to_date = "2005-01-03" while str(to_date) != from_date: to_date = str(to_date) to_date = to_date.split('-') a = datetime.date(int(to_date[0]), int(to_date[1]), int(to_date[2])) b = datetime.timedelta(days=140) to_date = a + b pathlib.Path("{}:/{}/{}".format(DISK, "Database_MOEX", SECID)).mkdir(parents=True, exist_ok=True) filename = SECID + "_" + str(to_date) + ".csv" with requests.get("http://iss.moex.com/iss/history/engines/stock/markets/shares/boards/tqbr/securities/{}.csv?date={}".format(SECID, to_date)) as response: with open("{}:/Database_MOEX/{}/{}".format(DISK, SECID, filename), 'wb') as f: for chunk in response.iter_content(): f.write(chunk)Для начала пройдемся по его плюсам и минусам. Самый главный минус, что этот парсер качает только определенный период, который уникален для каждой акции, судя по всему для увеличения этого периода надо кинуть бирже на лапу:), и то что информация предоставляется за день, теперь перейдем к плюсам: можно выкачивать историю за определенный период для нескольких инструментов сразу (их количество ограничивается лишь количеством инструментов на мосбиржи), есть возможность назначать диск для сохранения информации, быстрота выгрузки данных.
Я написал два поста про волатильность в рамках тем по развитию финансовой грамотности. Я показал, что ценовую волатильность можно измерять с помощью показателя Average True Range (ATR) и с помощью него неплохо можно выставлять ордера на ограничения потерь (stop loss). Полезно тем, кто активно торгует.
Второй показатель волатильности — это стандартное (среднеквадратичное) отклонение. Применяется для показателей доходности актива и удобен при составление своего портфеля и его последующей оптимизации. (Кстати, на встречи в прошлую субботу в рамках вебинара из курса ТРИ КИТА ИНВЕСТИЦИЙ, я как раз показывал как с помощью Excel можно искать оптимальный портфель для себя, зная доходность и волатильность. В эту субботу я покажу как использовать бету для составления собственного портфеля и как его оптимизировать, а также поговорим о пассивных и активных стратегиях управления портфелем. Кому интересно научиться инвестировать на уровне профессионала — присоединяйтесь. Действует скидка❗️
Кол+Пут= ATR(Н1)*КОРЕНЬ(N)*0,5, где N количество торговых часов до экспирации.
как описано здесь smart-lab.ru/blog/474365.phpPORTFOLIO_EX LUK; DESCRIPTION Объёмы купли/продажи за интервал; CLIENTS_LIST ALL_CLIENTS; FIRMS_LIST FIRMID; PROGRAM 'Автор: Михаил Булычев 'Что делает: ' подсчитывается объёмы купли\продажи по определённому инструменту за ' заданный интервал 'Как использовать: ' В следующих строках следует указать код бумаги и код класса для ' отслеживаемого инструмента '=============================НАСТРОЙКИ=============================== SecCode="LKOH" ' Код инструмента ClassCode="TQBR" 'Код класса interv=3600 'является интервалом в секундах razn = 0 'смещение часового пояса относительно времени торговой системы. '=============================НАСТРОЙКИ=============================== FUNC is_in_interval(interval, trade_time, sys_time, hour_shift) csys_time_value=0 c_time_value=0 csys_time_value =0 + (0 + get_value(sys_time, "Hour") + hour_shift)*3600 + _ get_value(sys_time, "Min")*60 + _ get_value(sys_time, "Sec") c_time_value=0 + ((0 + substr("" & trade_time, 0, 2)) * 3600) + ((0 + substr("" & trade_time, 2, 2)) * 60) + ((0 + substr("" & trade_time, 4, 2))) csys_time_value = csys_time_value + 0 c_time_value = c_time_value + 0 k=csys_time_value - c_time_value if k <= interval result=1 else result=0 end if END FUNC buy_value=0 sell_value=0 total_value=0 sys_time = GET_DATETIME() delete_all_items() mString=create_map() j=0 n=get_number_of("ALL_TRADES") for i from 0 to n mTrade=get_item("ALL_TRADES", n-i) trade_time=get_value(mTrade, "TIME") if (get_value(mTrade, "SECCODE")= SecCode) AND (get_value(mTrade, "CLASSCODE")= ClassCode) if is_in_interval(interv, trade_time, sys_time, 0-razn) = 1 value=0+get_value(mTrade, "VALUE") j=j+1 if (get_value(mTrade, "OPERATION") = "BUY") buy_value=buy_value+value else sell_value=sell_value+value end if total_value=total_value+value else break end if end if end for mString=set_value(mString, "vol", total_value) mString=set_value(mString, "volbuy", buy_value) mString=set_value(mString, "volsell", sell_value) add_item(1, mString) END_PROGRAM PARAMETER vol; PARAMETER_TITLE vol; PARAMETER_DESCRIPTION Купили; PARAMETER_TYPE NUMERIC(10,0); END PARAMETER volbuy; PARAMETER_TITLE volbuy; PARAMETER_DESCRIPTION Купили; PARAMETER_TYPE NUMERIC(10,0); END PARAMETER volsell; PARAMETER_TITLE volsell; PARAMETER_DESCRIPTION Продали; PARAMETER_TYPE NUMERIC(10,0); END END_PORTFOLIO_EX
Я страшно злюсь на инвесторов. Еще злюсь на бухгалтеров. Из книжки в книжку, из статьи в статью гуляют определения, при виде которых простой смертный начинает хлопать глазами. Его мозг перестает воспринимать информацию.
Неужели так сложно объяснить простыми словами то, что лежит на поверхности? Давайте попробуем разобраться.
Представьте, если вы вдруг захотите купить какой-нибудь маленький бизнес. Салон красоты, палатку с шаурмой, ресторан. Что угодно. Какие вопросы вы будете задавать продавцу:
Возможности новой версии
1. Реализован функционал быстрого фильтра в таблицах. Для активации \ деактивации быстрого фильтра используется пункт «Включить быстрый фильтр» \ «Выключить быстрый фильтр» контекстного меню, открываемого для заголовка самого левого столбца таблицы. Данный функционал позволяет фильтровать информацию в таблицах QUIK с наглядным отображением критериев фильтрации.
Сегодня сделал извращение на волатильностях Si и RTS. Это были недельные опционы с экспирацией 23/04/2020. На центральном 107500 страйке RTS волатильность была 60 , а на центральном 75000 страйке Si волатильность опустилась до 20.
Волатильность Si я купил, а RTS продал. Сделал я это через стредлы.
Пропорции выбирал следующим образом. Фьючерс RTS в рублях стоит 158709 руб., а фьючерс Si =75000 руб. На один RTS приходится 2,116 Si .
Поскольку Si я покупал, а RTS продавал, то пропорцию взял с запасом 1:3
Дальше подразумевалось дельтахеджирование по следующим правилам:
Когда у RTS дельта становится 1, выравнивать ее в ноль, и в этот же момент выравнивать в ноль позицию Si. Ведущей должна быть проданная позиция.
Позицию я сделал в 12:30, а к 16:20 волатильности немного сошлись. Закрыл позицию с прибылью 5400 руб.
Ждать не стал, поскольку у меня нет математического описания для таких позиций. Делаю я так редко и по интуиции. Но если в рублях выразить центры стредлов, то Si примерно на 18-19 тыс. руб. дешевле, чем RTS. Так что, 5 тысяч мне для получения удовольствия вполне хвалило. Жадничать не надо.