WLM1ke / poptimizer

Оптимизация долгосрочного портфеля акций
The Unlicense
154 stars 28 forks source link

Для чего нужен параметр TRADES? #47

Closed RomaKoks closed 3 years ago

RomaKoks commented 4 years ago

https://github.com/WLM1ke/poptimizer/blob/b70d715dfb82e90b115bfd5db8622b76beca853e/poptimizer/portfolio/optimizer.py#L16

Кажется, что из-за него возможны появления невозможных вариантов сделок: cash: 1737 SELL Q_SELL BUY Q_BUY GRAD_DIFF TURNOVER P_VALUE 1 SBERP 1 KLSB 1 0.059933 0.812051 0.000027 2 MVID 1 KRSBP 1 0.046613 0.847026 0.000007 3 AKRN 1 URKZ 1 0.046562 0.913750 0.034296 <- вот эта невозможна, так как 1737 + 6100 < 15600

WLM1ke commented 4 years ago

Не очень понял, что такое за числа "1737 + 6100 < 15600"?

RomaKoks commented 4 years ago

1737 - cash 6100 - текущая цена AKRN (размер лота = 1) 15600 - текущая цена URKZ (размер лота = 1)

WLM1ke commented 4 years ago

Понял. Там логика несколько другая и она описана тут:

https://github.com/WLM1ke/poptimizer/blob/b70d715dfb82e90b115bfd5db8622b76beca853e/poptimizer/portfolio/optimizer.py#L133

На покупку идет текущий Кеш, а не Кеш плюс выручка от продажи. Будете продавать у вас будет кэш расти и количество будет пересчитываться.

Продажа вычисляется как один процент от стоимости портфеля (настройка MAX_TRADE) - минус текущий Кэш, но не больше имеющегося количества.

Ну и как покупка, так и продажа делится на 5 (TRADES) операций. Объемы округляются вверх до ближайшего целого.

RomaKoks commented 4 years ago

Объемы округляются вверх до ближайшего целого

А почему не вниз?

как покупка, так и продажа делится на 5 (TRADES) операций.

так и не понял, зачем

WLM1ke commented 4 years ago

Нет это лоты.

Q_BUY рассчитывается исходя из текущего кэша - кэш делить на стоимость одно лота и на 5. TRADES = 5 чисто моя заморочка - я привык выставлять 5 заявок. Какого-то глубокого смысла в этом нет, кроме общих соображений немного замаскировать выставленный объем в стакане. Портфель у меня достойно большой, и если я выставлю в стакане одну заявку на миллион в каком-нибудь неликвиде народ может испугаться.

Q_SELL - величина в лотах одного процента от портфеля тоже разбита на 5 заявок.

Округление вверх выбрано из технических соображений. Когда осталось меньше 5 лотов и есть сигнал на продажу, я это увижу, а если округлять вниз, то будет 0 объем.

RomaKoks commented 4 years ago

Почему сразу не разделить MAX_TRADE на 5? Округление у Q_SELL вверх - понятно, у Q_BUY - не до конца, но учитывая что портфель большой, то ситуация невозможности покупки не актуальна. Думаю можно закрыть, более-менее прояснилось.

WLM1ke commented 4 years ago

Q_BUY примерно из таких же соображений сделано - если можно купить 3, не нельзя купить TRADES, то будет сигнал на покупку, но в принципе это действительно не так существенно если портфель большой. Когда-то так сделал из соображения своего удобства.

Почему есть два показателя MAX_TRADE и TRADE - для разделений сущностей.

Фактически все сделки по размеру вертятся около MAX_TRADE доли от портфеля. Доля должна быть маленькая, чтобы работала линейная аппроксимация на основе производных. Так же MAX_TRADE (как характерный размер операций) используется для расчета штрафов за ликвидность.

TRADE - какой-то содержательной роли не играет и связан с моей не любовью выставлять весь объем одной заявкой.

WLM1ke commented 4 years ago

@RomaKoks Кстати допилил тут загрузку данных с БКС и произвел беглое сравнение - получилось 19% ошибочных и отсутствующих значений по сравнению с моей базой. Еще собираюсь более детально глазами проанализировать ошибки, но среди них есть совсем неприятные, вроде отсутствующих последних дивидендов по Севестали. Казалось бы респектабельная ликвидная бумага. С последней отсечки почти уже два месяца прошло, а с предыдущей четыре - было время внести данные.

RomaKoks commented 4 years ago

Я видел в коммите что AKRN тоже пропущен. Могу попробовать спарсить investmint.ru. Идея составить рейтинг источников основываясь на различии с вашей базой, и по взвешенному голосованию источников выбрать порог, по которому вносятся дивиденды автоматически.

RomaKoks commented 4 years ago

Вообще неожиданная ситуация, так как у кого-кого, а у брокера должна быть валидная информация по всем эмитентам.

WLM1ke commented 4 years ago

Я полагаю брокерам это не нужно для каких-то количественных моделей, поэтому они ведут эти данные абы как без какой-то системы.

Я хотел понят в порядке обсуждения, а почему вас не устраивает текущая ситуация ведения базы в ручную? Если нужны какие-то бумаги, которых сейчас нет, то откройте тикер по каждой - я постепенно добавлю их в анализируемые и буду поддерживать актуальные данные.

Просто мне кажется городить огород из множества парсеров (которые будут регулярно ломаться при редезайне сайтов), потом придумывать какую-то систему рейтингов для получения конечного результата несколько оверкил по сравнению с текущим подходом.

Но с другой стороны нет проблем еще запарсить investmint.ru

По моему опыту очень хороший источник https://закрытияреестров.рф/_/ но никак руки не доходили парсер написать

RomaKoks commented 4 years ago

Все началось с того что я добавил все интересующие тикеры в базу руками, это было неудобно через compas mongodb. Потом через 2 дня база внезапно умерла полностью, а дампа не было и в гите тоже.

Тикеров много, а инвестор я молодой - многих публичных компаний просто не слышал, чтобы изучить какой-либо тикер мне нужно чтобы тот был "рекомендуем" к рассмотрению хотя бы с какой-либо позитивной стороны, дивиденды - одна из них.

То есть план такой, что компания появляется в списке сделок, я её "изучаю" и принимаю решение. Для этого плана в base.yaml нужны ~ все тикеры. Напрягать кого-либо (себя в том числе) заполением информации вручную о большом количестве субъективно "бесперспективных" компаний не хочется.

RomaKoks commented 4 years ago

Конечный план: добавить моломальский UI + отправка выжимок информации (включающий в себя историю дивидендов) на почту или telegram

WLM1ke commented 4 years ago

Учитывая, что я веду дивиденды для 116 акций еще добавить десяток не сложно.

Идею я понял. Наверное, если иметь пяток источников, можно было бы как-то выводить консенсус. Тут правда еще одна проблема. Прийдет каждый из сайтов источников бомбить множеством запросов. Надо подумать, как это организовать разумно, чтобы сайты не обиделись.

RomaKoks commented 4 years ago

Ну 200 запросов, не так уж много, как мне кажется. На крайний случай можно в настройках поставить таймаут около 5 секунд.

WLM1ke commented 4 years ago

Тут даже по времени немало получится: 5 сайтов по 5 секунд 200 тикеров - это уже больше часа. Конечно ничего страшного в этом нет, но надо продумать, как это лучше организовать.

RomaKoks commented 4 years ago

Ну запросы на различные сайты можно без таймаута. Те получится просто 5 * 200.

WLM1ke commented 4 years ago

В принципе да.

А вы программируете по основному месту работы? Я просто страшно далек от программирования.

RomaKoks commented 4 years ago

Да, но стиль программирования у меня существенно хуже вашего, сложно поверить, что далекий от программирования человек будет писать с тестами и asyncio.

WLM1ke commented 4 years ago

Я всю жизнь в Excel/Word проработал. Три года назад один знакомый про питон рассказал и несколько книжек порекомендовал - с тех пор увлёкся в качестве хобби, но так как не работал по профилю, то часто приходится очень по долгу разбираться с разными мелочами.

WLM1ke commented 4 years ago

Проанализировал и получилось, что процент ошибок/пропусков по трем источникам:

bcs = 14% dohod = 12% conomy = 9%

Если в качестве простого консенсуса взять медиану, то процент ошибок и пропусков 4%.

RomaKoks commented 4 years ago

А ошибки консенсуса можно как-то посмотреть? Чтобы перед тем как парсить новый источник, прикинуть может ли он улучшить ситуацию.

WLM1ke commented 4 years ago

Положил распечатку https://github.com/WLM1ke/poptimizer/blob/master/tmp/comp.txt

RomaKoks commented 4 years ago

Посмотрел, на вскидку, https://investmint.ru/ должен улучшить ситуацию.

медиану

Правда лучше думаю брать моду. Чтобы Nan мог победить)

WLM1ke commented 4 years ago

С модой не очень хорошо выходит. Часто дивиденды округлены и чуть-чуть по разному - несколько мод получается.

Я еще попытался делать NaN, где два из трех значения NaN. Но так только хуже выходит.

RomaKoks commented 4 years ago

СРАВНЕНИЕ ЛОКАЛЬНЫХ ДАННЫХ С IRAO

           LOCAL   SOURCE STATUS

2015-06-09 0.001040 0.00104
2016-06-21 0.017823 0.01780 ERROR <------------ Почему тут ошибка есть 2017-06-20 0.146820 0.14680 <------------ а тут, например, нет, хотя различия в одном и том же знаке? 2018-06-01 0.130383 0.13040 2019-05-31 0.171636 0.17160
2020-06-01 0.196193 0.19620

WLM1ke commented 4 years ago

Во втором случае дивиденды примерно в 10 раз больше, а соответсвенно относительная ошибка примерно в десять раз меньше. В настройках стоит критерий относительная ошибка 0.001