Знания | Статьи | Софт / Программирование

Каким может быть стек технологий для торговли опционами на Московской бирже

25 февраля 2016  Источник / https://habrahabr.ru/company/itinvest/
Введение

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

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

У меня есть несколько жестких требований к моему опционному ПО:

Real-time market data;
Дешевое решение, а лучше free;
Гибкое в плане прайсинга опционов (очень важно! но немногие это понимают);
Простое в плане написания кода и использующее робастные методы (желательно, чтобы большая часть уже была сделана умными людьми и опытными девелоперами);
Удобное в плане разворачивания и sharing;
User-friendly интерфейс;
Bug и blunder protected (ошибки в прайсинге должны быть видны сразу и невооруженным глазом).

Что было не критично:

HFT (low latency) не нужна, тратить на нее ресурсы нет ни желания ни возможностей;
Информационная безопасность, управление правами юзеров и т.п. (есть – хорошо, нет – и ладно);
Защита авторских прав

Итак, посмотрим, к чему я пришел за эти два года.

Структура ПО схематично представлена на рис. 1. Ниже подробно описаны ее составные части.

Каким может быть стек технологий для торговли опционами на Московской бирже


Рис. 1. Общая схема организации ПО и оборудования

Hardware

В качестве железа использовался ноутбук с процессором Intel Core i7, 8 ГБ оперативной памяти и ОС Windows 7. Для работы Shiny Server нужен Linux, поэтому с помощью WMware Player (также free) была создана виртуальная машина под управлением Ubuntu Server 14.04.

Market Data

Рыночные данные – текущие котировки (bid, ask, last, volume, etc.) фьючерсов и опционов – с помощью ODBC экспорта поставляются из QUIK в базу данных PostgreSQL. Этот способ data feed хорошо себя зарекомендовал, работает стабильно и быстро.

Каким может быть стек технологий для торговли опционами на Московской бирже


Рис. 2. ODBC экспорт из QUIK в DB

Текущая позиция (портфель) загружается в БД с помощью API SmartCOM – разработка брокера ITinvest.

База данных

PostgreSQL установлена на Windows 7. Поступающие из QUIK данные с помощью триггеров и функций БД обрабатываются и сохраняются в специальные таблицы. Например, таблица mw_options, в которую экспортируется таблица QUIK с текущими рыночными данными опционов, содержит триггер:

CREATE TRIGGER trig_upsert_spec_options
AFTER INSERT OR UPDATE OF sec_code, sec_name, lot, tick, fee
ON mw_options
FOR EACH ROW
EXECUTE PROCEDURE func_upsert_spec_options();


вызывающий функцию:

CREATE OR REPLACE FUNCTION func_upsert_spec_options()
RETURNS trigger AS
$BODY$
BEGIN
UPDATE spec_options SET sec_name=NEW.sec_name, lot=NEW.lot, tick=NEW.tick, fee=NEW.fee WHERE sec_code=NEW.sec_code;
IF NOT found THEN
INSERT INTO spec_options(sec_code, sec_name, und_code, expiry, strike, type, lot, tick, fee)
VALUES (NEW.sec_code, NEW.sec_name, NEW.und_code, NEW.expiry, NEW.strike, NEW.type, NEW.lot, NEW.tick, NEW.fee);
END IF;
RETURN NEW;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
ALTER FUNCTION func_upsert_spec_options()
OWNER TO postgres;


которая добавляет/обновляет данные в таблице spec_options, где хранится спецификация опционных контрактов:

CREATE TABLE spec_options
(
sec_code character varying(16) NOT NULL,
sec_name character varying(32),
und_code character varying(8),
expiry date,
strike double precision,
type character varying(4),
lot integer,
tick double precision,
fee double precision,
CONSTRAINT spec_options_pkey PRIMARY KEY (sec_code)
)
WITH (
OIDS=FALSE
);
ALTER TABLE spec_options
OWNER TO postgres;


Shiny Server

Shiny Server нельзя установить на Windows, поэтому была создана виртуальная машина с Ubuntu (trusty).
Далее необходимо установить последнюю версию R. В Ubuntu уже есть ссылка на R, но как правило она устаревшая, поэтому лучше сделать так:

$ sudo sh -c 'echo "deb http://cran.rstudio.com/bin/linux/ubuntu trusty/" >> /etc/apt/sources.list'
$ gpg --keyserver keyserver.ubuntu.com --recv-key E084DAB9
$ gpg -a --export E084DAB9 | sudo apt-key add -
$ sudo apt-get update
$ sudo apt-get -y install r-base


Проверить версию можно запустив R:

$ R


Чтобы выйти из R надо ввести в нем команду:

> q(save = "no")


Потом устанавливаем необходимые R пакеты – shiny, devtools, rmarkdown и shinyjs:

$ sudo su - -c "R -e \"install.packages('shiny', repos = 'http://cran.rstudio.com/')\""
$ sudo apt-get -y install libcurl4-gnutls-dev libxml2-dev libssl-dev
$ sudo su - -c "R -e \"install.packages('devtools', repos='http://cran.rstudio.com/')\""
$ sudo su - -c "R -e \"install.packages('rmarkdown', repos='http://cran.rstudio.com/')\""
$ sudo su - -c "R -e \"devtools::install_github('daattali/shinyjs')\""


Далее инсталлируем Shiny Server. Инструкция по установке последней версии здесь, на момент написания этого топика версия была 1.4.1.759:

$ sudo apt-get install gdebi-core
$ wget https://download3.rstudio.org/ubuntu-12.04/x86_64/shiny-server-1.4.1.759-amd64.deb
$ sudo gdebi shiny-server-1.4.1.759-amd64.deb


Если все сделано правильно, то вызвав ссылку (ip_shiny_server – IP адрес вашей виртуальной машины)
ip_shiny_server:3838, вы увидите приветствуенную страницу вашего Shiny-сервера с двумя активными виджетами:

Каким может быть стек технологий для торговли опционами на Московской бирже


Рис. 3. Приветственная страница Shiny Server

Я рекомендую также установить очень удобную среду разработки Rstudio Server. Инструкция по установке последней версии здесь. Пример команд установки:

$ sudo apt-get install gdebi-core
$ wget https://download2.rstudio.org/rstudio-server-0.99.491-amd64.deb
$ sudo gdebi rstudio-server-0.99.491-amd64.deb


Также я рекомендую внести следующие изменения в конфигурацию Shiny сервера – файл /etc/shiny-server/shiny-server.conf:

server {
listen 3838;
location /users {
run_as :HOME_USER:;
user_dirs;
}
location /apps {
run_as shiny;
site_dir /srv/shiny-server;
log_dir /var/log/shiny-server;
directory_index on;
}
}


Это даст возможность удобно запускать shiny приложения, разработанные в Rstudio Server:

В Rstudio в корневом каталоге создается папка ShinyApps;
Далее File/New Project../New Directory/Shiny Web Application/;
Заполняете Directory name, например, test001;
Выбираете ShinyApps в качестве корневой директории проекта.

Для запуска созданного приложения в браузере достаточно ввести адрес:

ip_shiny_server:3838/users/ubuntu_user_name/test001/
где ip_shiny_server – IP адрес виртуальной машины, ubuntu_user_name – имя пользователя Ubuntu.

Еще необходимо установить PostgreSQL и пакет libpq-dev:

$ apt-get install postgresql-9.4
$ sudo apt-get install libpq-dev


Возможно вам также понадобится Apach, например, для обмена файлами, быстрого просмотра логов и т.п.:

$ sudo apt-get install apache2


Теперь, например, чтобы получить доступ к папке folder001 приложения test001, надо выполнить команду:

$ sudo ln -s /home/ubuntu_user_name/ShinyApps/test001/folder001 /var/www/html/shared_folder


После этого содержимое папки станет доступно по адресу: ip_shiny_server/shared_folder/

Веб-интерфейс

Огромным преимуществом серверных приложений Shiny, на мой взгляд, является: a) наличие у них веб-интерфейса и b) то, что они доступны на любом устройстве (ПК, ноутбук, планшет, смартфон) с выходом в интернет. Это отличное кросс-платформенное решение!

С запущенным Shiny сервером я имею возможность проводить анализ волатильности, прайсить опционы и следить за своей позицией в любой месте, где есть интернет.

Каким может быть стек технологий для торговли опционами на Московской бирже


Рис. 4. Интерфейс Shiny-приложения для анализа и моделирования улыбки волатильности

Rstudio Server также имеет веб-интерфейс, он доступен на любом устройстве с современной ОС и выходом в интернет – разрабатывайте, фиксите баги в любом месте с любого устройства.

Каким может быть стек технологий для торговли опционами на Московской бирже


Рис. 5. Интерфейс среды разработки Rstudio Server

Volatility Models

В настоящий момент для прайсинга и маркет-мейкинга я использую две модели:

Vanna-Volga
Risk-neutral moments

Подробнее о них вы может узнать из предыдущих топиков моего блога на quant-lab.com. Обе модели хорошо себя зарекомендовали в торговле опционами на USD/RUB.

Option Pricing

Shiny предоставляет возможность строить интерактивные графики. Можно навести указатель мыши или кликнуть на интересующую область графика и получить координаты этой точки. Например, мое приложения для прайсинга опционов обрабатывает полученные координаты и выдает: a) рыночную информацию в указанном страйке (best bid/ask в пунктах и волатильностях плюс их объемы; b) волатильность, теретические цены опционов call и put для данной волатильности и греки.

Каким может быть стек технологий для торговли опционами на Московской бирже


Рис. 6. Интерактивный опционный калькулятор

Portfolio Calculations

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

Каким может быть стек технологий для торговли опционами на Московской бирже


Рис. 7. Сценарии волатильности и показатели чувствительности книги

Каким может быть стек технологий для торговли опционами на Московской бирже


Рис. 8. P&L профиль книги для двух сценариев и на экспирацию ближней серии

Sharing

Еще одним приятным и полезным свойством Shiny приложений является простота, с которой вы можете ими делиться. Решений как минимум два: делиться целым приложением или только результатами. Чтобы поделиться приложением, размещенным на Shiny сервере, вам нужно пробросить порт 3838 и дать пользователю ссылку на IP адрес вашего роутера. Это не лучшее решение в плане безопасности. На мой взгляд гораздо лучше делиться только результатами – это очень просто организовать, например, с помощью сервиса plotly. Вы можете запостить график в облачный сервис plotly прямо из Shiny приложения:

pp <- plotly_POST(p, filename=plotly.name, fileopt="overwrite")


и дать пользователю ссылку на этот график. Более того графики plotly могут быть внедрены в ваш сайт или блог:

Каким может быть стек технологий для торговли опционами на Московской бирже


В качестве заключения хочу еще раз отметить основные моменты:
Созданное решение – бесплатное (Shiny Server, Rstudio Server, VMware – имеют бесплатные версии)
Shiny приложения кросс-платформенные, доступны с любого современного устройства из любой точки мира, где есть интернет
Использованные численные методы, модели и алгоритмы взяты из готовых пакетов (out of the box), созданных опытными программистами и математиками, робастные и протестированные большим числом опытных пользователей
Разработка приложений – не сложный и быстрый процесс
Интерактивность графических данных сильно упрощает прайсинг опционов и анализ позиций
При полном или частичном использовании материалов - ссылка обязательна http://elitetrader.ru/index.php?newsid=283556. Присылайте свои материалы для публикации на сайте. Об использовании информации.