Избранное трейдера Евгений Юодвиршис
Можно ли жить на див портфель?
В апреле/мае 2008 по просьбе/угрозе/пожеланию/мольбе дражайшей супруги были закрыты все позиции на рынках и начался поиск квартиры. Квартира была «успешно» куплена на пике цен, но слава яйцам все для ремонта и обстановки было куплено до кризиса.
В марте 2009 неожиданно был выплачен бонус, и на эти деньги+зажатые от жены, в апреле 2009 был набран портфель из 10 бумаг, равными долями, почти на 3 мио руб:
Акрон, Уралкалий, МТС, Северсталь, НЛМК, Лензолото преф, Магнит, ЛСР, НКНХ преф, ВМСПО
Портфель практически не трогался до 2015г. (в 2011 была куплена МосБиржа). В 2015 почти полностью убран Магнит и Уралкалий, и куплены ИнтерРао, ФСК, Протек и ММК.
Но речь не о переоценке портфеля, а о див доходе, по годам:
415 тыщ 2011, 478 тыщ 2012, 595 тыщ 2013, 615 тыщ 2014, 875 тыщ 2015, ожидаемый доход за 2016 около 1,2 мио руб.
Можно ли жить на эти деньги? У всех свои потребности.
Доволен ли я результатом? Вполне
p.s. дивы не реинвестируются
Что бы выяснить. Когда можно увеличивать размер позиции. Разберем условную стратегию. Стратегию монетки (как в простой задачке по теории вероятности, подкидывание монетки). Имеем показатели: соотношение прибыльных сделок к убыточных равно 1:1. Примем прибыльную сделку за 1, а убыточную за 0. В теории имеем, что за 10 сделок мы получим вот такую последовательность сделок:
1) 1010101010
Дело в том. Что на практике так редко бывает. Вместо этой последовательности, можем получить и вот такие:
2) 1110110000
3) 0001001111
Предположим. Что за сделку мы имеем прибыль равный 1, убыток равный -1.
Мы сделали 5 сделок. Нам выпала 2-ая последовательность. И мы на счете имеем уже прибыль, равную трем. Что будет, если мы увеличим размер позиции в два раза? Последующие 5 сделок принесут нам минус шесть. И итогом получим минус три убытка. Вместо нуля для данной стратегии. Когда чаще всего увеличивают позиции? Когда на счете мы уже имеем деньги. На простом примере видим. Как такой подход создаст убыток по стратегии в целом.
Продолжаем разработку универсального робота!
Выкладываю код OUR-0.3, который в настоящий момент еще далеко не полный – это только основа, скачать можно здесь https://yadi.sk/d/l3uic67yruCxa
Код прокомментирован подробно, но дам дополнительное описание общего плана, чтобы логику работы робота можно было представить.
Итак, по порядку:
Робот состоит из двух файлов: OUR.lua содержит основные функции (OnInit, main, коолбэки – пока только один OnStop), FunOUR.lua содержит вспомогательные функции – все остальные. Дополнительно приложен файл с информацией и файл с образцом котировок.
Функция OnInit
1 Первоначально котировки с сервера поступают в источник – таблицу с барами TBar (там все заполняется автоматически при подключении источника).
2 Далее робот делает различные вычисления, результаты которых он помещает в таблицу с данными TDat (также туда копируются параметры баров из TBar), эту таблицу нужно заполнять самому, ключи таблицы на свое усмотрение, но конечно часть ключей в алгоритм уже заложены, это «key»,«O»,«H»,«L»,«C»,«V»,«T» от них идут все вычисления. TDat – это таблица, содержащая таблицы по каждому бару, ключ соответствует номеру бара в источнике. Структура такого типа:
TDat = { [1321] = {"O","H","L","C","SMAf","SMAs"…}, [1322] = {"O","H","L","C","SMAf","SMAs"…}, … }
Небольшая статья с ресурса http://www.talaikis.com/ о построении простой стратегии, использующую наивный байесовский классификатор при создании процесса возврата к среднему. Весь код в статье приведен на языке Python.
Это достаточно большая область исследований, но расскажем все очень кратко. Мы попытаемся найти взаимоотношение между временными сериями (в данном случае возьмем в качестве сигнала взаимный фонд XLF из финансового сектора, сдвинутый по времени на 1 день назад), а нашей целью будет фьючерс S&P500 в форме CFD. Будем входить в длинную позицию по этой бумаге при нулевой вероятности приращения. Логически нулевая вероятность ни о чем не говорит, другими словами, будем покупать возврат к среднему.
1. Получение данных
Y = read_mongo(dbase, "S&P5001440") X = read_mongo(dbase, syms[s]).shift() #готовим набор данных res = pd.concat([X.CLOSE, Y.CLOSE], axis=1, join_axes=[X.index]).pct_change().dropna() res.columns = ['X', 'Y']