В блоге на Хабре мы много пишем об использующемся для работы на фондовом рынке железе и софте. Не так давно мы рассматривали стек технологий для высокочастотной торговли, а сегодня речь пойдет о том, какие инструменты можно использовать для торговли опционами на Московской бирже. Материал на эту тему написал эксперт 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), созданных опытными программистами и математиками, робастные и протестированные большим числом опытных пользователей
- Разработка приложений – не сложный и быстрый процесс
- Интерактивность графических данных сильно упрощает прайсинг опционов и анализ позиций
Другие материалы о разработке торгового софта:
- How-to: Объектно-ориентированная система бэктестинга на Python
- Создание торговых роботов: 11 инструментов разработки
- How-to: пошаговое руководство по разработке торговой системы для работы на фондовом рынке
- How-to: как выбрать язык программирования для создания торгового робота
- Назад в будущее: проверка работоспособности торгового робота с помощью исторических данных
- How-to: Что нужно учитывать при разработке первого торгового робота
- How-to: Что нужно учитывать при разработке стратегии для торгового робота
- Книги и образовательные ресурсы по алгоритмической торговле
- Алгоритмическая и автоматизированная торговля: 13 книг по теме
Комментарии (11)
symbix
24.02.2016 23:04В хранимке, пытающейся делать upsert, очевидный race condition.
atikhonov
25.02.2016 09:29Почему? Данные приходят с определенной частотой, срабатывает триггер, вызывается функция на другую таблицу.
IgorMetechko
25.02.2016 11:23RC, вероятно, вы заметили при режиме READ_COMMITED UPDATE, а следующий за ним INSERT провалится если кто-то запишет в таблицу тоже самое, однако, в ту таблицу никто кроме этого триггера не пишет данные, а RC сам с собой для данного случая невозможен.
symbix
26.02.2016 01:58В зависимости от уровня изоляции может быть или RC, или дедлок.
Если больше никто не пишет и все это в один поток, то, конечно, беспокоиться не о чем.
fivelife
25.02.2016 00:29А с какой частотой запрашиваете маркетдату для опционов? И откуда конкретно берете параметры инструментов?
IgorMetechko
25.02.2016 11:26-1Зависит от желания юзера. Параметры из mw_options, например. Для фьючерсов есть аналогичная таблица.
Fafnir
А у вас по-прежнему нет нормального API? Только вот эта устаревшая виндовая хрень на COM объектах родом из 90х?
При этом вы пишите:
Это же facepalm. Т.е. пользователю априори предлагается заморачиваться с зоопарком технологий.
atikhonov
Более-менее нормальная торговля опционами,
это уже не совсем уровень пользователя,
и установить linux на виртуалку не так сложно.
Но если так затруднительно пользоваться Linux,
то все работу можно вести или сразу в RStudio
или же залить приложение в shiny облако (shinyapps),
там знаний Linux вовсе не потребуется.
Fafnir
Вы не поняли, я не против Linux, я наоборот — за 2мя руками. Но их API работает только под Windows, в этом проблема.
atd
Если нужен нормальный API, но не требуется HFT, то покупайте FIX-аккаунт и вперёд, никакие говноподелия брокеров не нужны. Цена вопроса 2к рублей всего-лишь (+ндс).
Siper
Я тоже выпал от такой наглости )) но, надо полагать, подразумевается прямое подключение, т.к. через смартком никто серьезно не торгует.