Телеграмм-бот для анализа опционов

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

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

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

Автор статьи реализовал анализ опционов с помощью телеграмм-бота, что дает возможность быстрого получения информации об инвестиционном портфеле на смартфоне. 

Будем считать, что, кроме опционов, читатель знаком с телеграмм ботами. Поэтому здесь не будет описания создания бота от получения токена до обработки клавиатуры. Вместо этого перечислим концептуальные проблемы, которые возникли при создании программы, и способы их решения.

Запоминание состояния бота между вебхуками

Бот получает сообщения от пользователя через встроенный в телеграмм механизм вебхуков. Каждый вебхук  заново запускает программу, но для каждого пользователя необходим свой набор данных.  Идентификация пользователей осуществляется через просмотр потока ввода:

$id_init = file_get_contents('php://input');

$id=sbs($id_init, '"from":{"id":',',"is_bot":');  //в эту переменную записываем уникальный номер пользователя

function sbs ($str,$m1,$m2){     //из строки str возвращает подстроку между двумя метками-словами m1 и m2

$p1=strpos($str,$m1)+strlen($m1);  //длина слова-метки слева

$p2=strpos($str,$m2);

return substr($str,$p1,$p2-$p1);

}

Для каждого пользователя строится следующая структура данных:

  1. файл состояния: переменные – флажки , которые описывают в частности,  идентификационные номера сообщений ( message_Id) для дальнейшей их редакции, актуальное состояние ( ввод количества, ввод страйка и т.д.),  вспомогательные данные для построения графика

  2. файл данных по составу портфеля (  идентификационный номер ценной бумаги, тип, количество, цена, дата экспирации)  

  3. файлы для построения графика

После каждого вебхука происходит инициация данных в программе из указанных файлов.

Построение графика для анализа портфеля

График строится  по состоянию на момент экспирации опционов, что дает возможность упрощенно представить график каждого инструмента в виде y=kx+b, 

где  y – это  размер прибыли/убытка на момент экспирации

        х – стоимость базового актива

После  записи данных в портфель создаются файлы с расширением png с помощью библиотеки GD в несколько этапов:

1) определение Х-координат всех точек перелома на графике  (очевидно, что сумма всех линий даст ломанную кривую)

2) определение масштаба изображения (средняя всех  координат точек перелома по оси Х, максимальное отклонение от среднего,  и максимальный размер по оси Y)

3) создание ассоциативного массива точек, в котором координата X    это ключ, координата Y – величина, для всей цифровой полуплоскости:

$typ – опцион колл, пут или фьючерс

$q – количество ( отрицательное продажа)

$cena – цена приобретения ценной бумаги

$strike – страйк для опционов

$x0 – начальная координата по оси Х

$sx – масштаб по оси Х

function pparr($typ, $q, $cena, $strike,$x0,$sx){  //функция выдает одномерный массив - координаты x=>y точек по 

//типу цб, направлению (покупка продажа), цене приобретения и страйку (для опционов) 

    if ($q<0)  {    $q=-$q;

                    $drct='-';

            }                   

            else $drct='+';

     $a=array();

     $b=array();

     $delta=$sx;  //расстояние между точками   равно масштабу $scalx

     for ($i=0;$i<740;$i++){   //кол во точек 740 определено заранее

        $xkk=$x0+$delta*$i; //значение по оси X

        if ($typ=='fut') {

            if ($drct=='+') $a[$xkk]=($xkk-$cena)*$q;

            else $a[$xkk]=(-$xkk+$cena)*$q;

        }

        if ($typ=='call'){

            if ($drct=='+') {  if ($xkk<=$strike) $a[$xkk]=-$cena*$q; else $a[$xkk]=$q*($xkk-$strike-$cena);}

            else {  if ($xkk<=$strike) $a[$xkk]=$q*$cena; else $a[$xkk]=(-$xkk+$strike+$cena)*$q;}

            

        }

        if ($typ=='put'){

            if ($drct=='+') {  if ($xkk<=$strike) $a[$xkk]=(-$xkk+$strike-$cena)*$q; else $a[$xkk]=-$q*$cena;}

            else {  if ($xkk<=$strike) $a[$xkk]=($xkk-$strike+$cena)*$q; else $a[$xkk]=$cena*$q;}

            

        }

     $b[(string)$xkk]=(string)$a[$xkk];

     }

return $b;         

};

4)      создание файлов изображений, при этом одновременно строится график для каждой строки из портфеля ( зеленый цвет)  и результирующий для портфеля ( красный цвет). Кроме того, know-how заключается в том, что одновременно строится еще четыре изображения  для увеличения/уменьшения изображения по оси Х и по оси Y. За счет этого достигается эффект работы он-лайн с клавишами X+,X-,Y+,Y- под графиком. Таким образом, для каждого пользователя в каждый момент времени существует пять файлов изображения.

Анализ рисков опционного портфеля

В тесной связи с прибыльностью находится понятие риска.  В количественном выражении риск по опционному портфелю выражается в сумме так называемого гарантийного обеспечения. Гарантийное обеспечение – та сумма, которая списывается со счета трейдера при совершении сделки.  Фактически, исходя из данных на текущий момент, блокируется сумма максимального убытка (потерь).  Однако, и это самое главное, сумма гарантийного обеспечения, списанная с вашего счета, пересчитывается после каждого клиринга ( утро, обед и вечер).  Она может как увеличиваться, так и уменьшаться. При спокойном течении торгов (в пределах какого-то диапазона) вы можете увидеть, что  сумма на вашем счете растет за счет уменьшения ГО.  Однако, ГО может резко вырасти в экстренных ситуациях ( стихийные бедствия, санкции, войны)  и не только в экстренных (праздники) . В этом случае у вас может быть списана дополнительная сумма в рамках увеличения ГО.  Если денег на вашем счете не хватит для оплаты увеличившегося ГО, наступает маржин-колл, в рамках которого ваши ценные бумаги будут принудительно списаны  по текущей рыночной цене, что ведет к обнулению счета. 

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

Гарантийное обеспечение для фьючерсов считается по формуле, которая предложена самой Московской биржей:

ГО=БГО+(Цена-Расчетная_Цена)*БП;

где Расчетная_Цена определяется по результатам клиринга и практически равна цене базового актива на момент клиринга,  определяется в пунктах

БП – стоимость пункта  в рублях, зависит, в частности, от курса доллара,

БГО – базовое гарантийное обеспечение, определяется биржей, может произвольно увеличиваться, например, перед праздниками

  Таким образом, по фьючерсам ГО считается достаточно просто, поскольку все данные есть в открытом доступе. Что касается опционов и тем более сочетаний их в разных комбинациях, Московская биржа не дает однозначного рецепта, вернее не дает данных для их расчета, а предлагает купить модуль расчета ГО.

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

Вот как выглядит покупка колла в нашем боте:

Запись в портфеле покупки опциона "колл" страйк 75000 дата экспирации 03.06.2021 по цене 25
Запись в портфеле покупки опциона "колл" страйк 75000 дата экспирации 03.06.2021 по цене 25
График зависимости прибыли/убытка по купленному опциону "колл"
 в зависимости от стоимости базового актива на дату экспирации
График зависимости прибыли/убытка по купленному опциону "колл" в зависимости от стоимости базового актива на дату экспирации

Гарантийное обеспечение=23.

Что нам показывает график: если стоимость базового актива  ( в данном случае стоимость фьючерса на курс рубля к доллару) [вечером] 03.06.2021  будет 75000 и ниже,  то наш убыток составит 23 . При повышении этой стоимости до 75023 мы выйдем в безубыток, при дальнейшем росте получим прибыль.

Что мы имеем с точки зрения риска: не при каких обстоятельствах наш убыток не  превысит сумму 23. Следовательно, наш опцион совершенно не похож на фьючерс, и в расчете ГО мы можем записать просто сумму 23.

Покупка пута – примерно та же картина.

Продажа пута.

Запись в портфеле продажи опциона "пут" страйк 72750 по цене 44 с датой экспирации 03.06.2021
Запись в портфеле продажи опциона "пут" страйк 72750 по цене 44 с датой экспирации 03.06.2021
График зависимости прибыли/убытка по проданному опциону "пут" 
от стоимости базового актива на дату экспирации
График зависимости прибыли/убытка по проданному опциону "пут" от стоимости базового актива на дату экспирации

Гарантийное обеспечение= 5436.

Можно убедиться, что при стоимости базового актива выше 72750 мы имеем прибыль 44. При снижении стоимости БА до 72706 мы выходим в ноль. При дальнейшем падении стоимости БА наш убыток НИЧЕМ НЕ ОГРАНИЧИВАЕТСЯ.

С точки зрения рисков – это фьючерс, купленный по цене 72706. Подставляем это число в формулу ГО для фьючерса и получаем ГО для опциона!  Этот ГО достаточно велик  (5436), но может превратится в прибыль в течение нескольких дней.

Стоит ли овчинка выделки?  Если при условных затратах сегодня 5436 мы получим через несколько дней 44? Мне кажется, риск очень велик. С другой стороны, курс рубля к доллару был таким примерно 3 месяца назад.

С продажей колла будет аналогичная ситуация.

А если одновременно продать пут и кол?

Запись в портфеле продажи опциона "пут" страйк 72750 и продажи опциона  "колл" страйк 75000
Запись в портфеле продажи опциона "пут" страйк 72750 и продажи опциона "колл" страйк 75000
График зависимости прибыли/убытка по портфелю
 от стоимости базового актива на дату экспирации
График зависимости прибыли/убытка по портфелю от стоимости базового актива на дату экспирации

Гарантийное обеспечение не изменилось!

С точки зрения риска понятно почему – может реализоваться только один из сценариев – либо по фьючерсу, купленному по примерно по 72700  (левая «нога»)  либо по фьючерсу проданному по 75190 ( правая «нога»).  Из них выбираем вариант

с наибольшим ГО , оно и будет мерилом риска.

На графике можно увидеть, что прибыль мы имеем при стоимости базового актива  в диапазоне от примерно 72700 до 75190,  в остальных случаях получаем убыток, который ничем не ограничивается.

Интерфейс телеграмм-бота

На экране отображаются следующие группы данных:

  • подробная инструкция по работе с ботом

  • текущие котировки ближайших фьючерсов по трем базовым активам

  • таблица «Портфель»,  отображающая состав портфеля, сделанная с помощью интерфейса телеграмм  (  можно редактировать)

  • значение гарантийного обеспечения

  • таблица, дублирующая состав портфеля, построенная как изображение формата png, которую можно копировать и сохранять

  • нижняя клавиатура, которую можно скрывать,  с кнопками: «Добавить позицию в портфель», «Анализ портфеля с помощью графика», «Обновить котировки»  

Таблица «Портфель»  создана с помощью InlineKeyboard.

 При нажатии на клавиши в этой таблице происходят следующие действия:

  • клавиша в столбце «К-во» редактирует количество ценных бумаг, соответствующее строке, в которой нажата клавиша

  • клавишами в столбце «Цена»  можно ввести реальную цену приобретения ценной бумаги. По умолчанию цена вставляется по данным биржи, и для опционов она может значительно отличаться от рыночной

  • клавишей  Х  можно удалить строку.

Прочие клавиши в таблице заблокированы и служат только для передачи информации.

Значение гарантийного обеспечения пересчитывается каждый раз, когда  вы нажимаете кнопку  «Записать в портфель»( не показана, возникает в конце процедуры редактирования или добавления инструмента).

Заключение

В телеграмм-боте реализовано запоминание портфеля ценных бумаг для каждого пользователя.  Под ценными бумагами понимаются опционы и фьючерсы, базовым активом для которых являются: курс рубля к доллару (Si),  стоимость нефти брент (BR), а также индекс РТС (RI). Это самые высоколиквидные деривативы на московской бирже.

В телеграмм-бот заложен алгоритм подсчета гарантийного обеспечения, которое является мерой риска.

С помощью телеграмм-бота можно анализировать опционный портфель на графике прибылей/убытков (P/L  график).

Протестировать телеграмм-бота можно по ссылке t.me/@test09062020bot.  Или попробовать найти в телеграмме по названию «опционный портфель».

Источник: https://habr.com/ru/post/561360/


Интересные статьи

Интересные статьи

Лежу я ночью, пытаюсь уснуть. И как обычно тысяча мыслей, и среди них я сумел зацепился за одну. А звучала она так: "почему бы не сделать анализатора футбольных матчей, где нужно будет ли...
Компания «Деловой разговор» — Титановый партнер 3СХ — осуществила расширенную интеграцию IP-АТС 3CX с Битрикс 24. Ранее уже существовали отдельные модули, решающие конкретные задачи, напр...
SWAP (своп) — это механизм виртуальной памяти, при котором часть данных из оперативной памяти (ОЗУ) перемещается на хранение на HDD (жёсткий диск), SSD (твёрдотельный накоп...
Инструменты статического анализа кода ушли далеко вперёд. Это вовсе не те "линтеры", которые активно применялись 20 лет тому назад. Однако многие по-прежнему относятся к ним...
Что будет, если использовать всем известное in-memory-хранилище ключей и значений в качестве персистентной базы данных, не используя TTL? А если оно запущено с помощью надёжного, казалось бы,...