1 августа 2022

Дневник разработки деривативной криптобиржи #1

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

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

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

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

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

Кроме этого, индекс имеет свою ценность только после накопления истории. Не так важно фактическое значение здесь и сейчас. Трейдеры зачастую  ориентируются именно на изменение значений индекса, а не его фактическое значение.  

Кроме формул выведения индекса, важнейший критерий — непрерывность расчета и интервал. Для деривативов разные индексы считают по своим интервалам — от секунд до минут и часов. В Biqutex мы изначально приняли решение ориентироваться на интервал расчета 1 секунда, а там, где нет надобности в столь быстрых измерениях — 1 минута (и эта минута собирается как взвешенное среднее из серии ежесекундных расчетов, поэтому фактически — все показатели рассчитываются в одном темпе — раз в секунду). 

И так, деривативы оценивают по индексам, которые для каждого контракта составляет  группу или семейство индексов:

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

Mark Price (или Fair Price) — это так называемая цена маркировки (или справедливая цена), по которой в каждый момент времени производится оценка позиций трейдера. Именно на нее ориентируются при расчете uPnL (Unrealized Profit and Loss).

Impact Price — цена влияния. Интересный и недооцененный по своему влиянию показатель. Вкратце, это средняя цена покупки/продажи актива, если бы вы в текущий момент купили/продали большой, значительный лот. Само название подразумевает, что такая сделка приведет к воздействию (impact) на рынок и сместит текущие цены. 

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

Статья года и самый читаемый материал Hub-а — Понимаем Uniswap: Иллюстрированное руководство 

Если вы сосредоточены на торговле самыми топ-ликвидными контрактами, тот же BTC/USD или ETH, то здесь уместно считать, что Impact price равен просто текущей рыночной цене. Ведь на таких рынках столько ликвидности, что любой большой, для каждого отдельного трейдера ордер, пусть хоть на 100К или даже 1M USD будет поглощен, ликвидность по самой лучшей цене в стакане (Best Bid/Ask или Top-of-Book в терминах биржи). 

Но рынок — это не только шоколадное или ванильное мороженое (кто не понял — это отсылка к одной из самых ярких сцен культового фильма  “Здесь курят” или Thank You for Smoking). Для контрактов, которые не могут похвастаться такой рыночной активностью, как BTC и ETH, Impact Price уже будет сильно и непредсказуемо отличаться от текущей рыночной цены. Поэтому биржи и считают этот показатель для всех индексов (всех контрактов) хоть по механике расчетов это самый ресурсоемкий и сложный показатель. Но надо — значит надо. 

Читайте подробнее в одом из наших материалов — перевод руководства биржи Delta.Exchange о всех ньюансах Fair Price

Interest rate — процентная ставка, а если быть точнее — разница процентных ставок по базовому активу контракта и валюте, в которой он котируется (а если максимально точно — то по валюте или корзине валют, в которых номинирована маржа контракта). Один из самых интересных и сложных показателей. 

Как и в предыдущем случае, для самых топ-валют все достаточно просто — текущие рыночные ставки можно посмотреть на разных порталах. А вот для более экзотических контрактов их может и попросту не быть вовсе. Ну вот нет кредитного рынка для какого-то условного токена Х, а контракт X/USD-PERP считать нужно. 

В Biqutex мы применили оригинальный подход с использованием настоящих реальных процентных ставок, которые мы к тому же постоянно обновляем (раз в 15 минут). Учитывая наши контракты, мы используем целый набор разных ставок. 

Для токенов и монет — если существуют рынки, мы берем среднюю ставку (APY). Контракты на монеты, которые не являются стейблкоинами, маркируются в “условном USD”, для которого мы берем в качестве процентной ставки — ставку по казначейским облигациям Федерального резерва (U.S. Treasure Interest rate) сроком на 2 года. Здесь для фин-инженерии есть еще много моментов для исследований — можно выбрать другие ставки, вводить поправочные коэффициенты и т.п. 

Для стейблов же (например, контракт USDT/USD-PERP или USDJ/USD-PERP) в качестве валюты маржирования используют корзину стейблкоинов, включающую в себя все котируемые стейблы. Процентные ставки в DeFi постоянно меняются, зависят от разных моментов, поэтому мы ограничили выборку только достаточно надежными источниками (например, TLV не менее 1М USD), а сама процентная ставка не просто среднее, а взвешенное по TLV среднее между всех проектов (увы, более точный алгоритм мы пока не раскрываем). 

Premium Index — по факту, этот индекс указывает, насколько текущая справедливая цена оценки позиций (mark price) отличается от рыночной спот-цены. Вот именно так — с какой премией оценивают текущий фьючерс против наличного рынка.  

Funding rate — наверное, главный показатель, ради чего все эти расчеты и затевались. В мире Perpetual контрактов это важнейший параметр, обозначающий размер периодической выплаты одной из сторон (держателей шорт-позиции лонгам или наоборот), которая призвана проводить такой себе “псевдо”-сеттелмент контрактов, поскольку перпетуал не имеют ограничений срока. Эта выплата — своего рода поощрение тем, кто следует за трендом рынка, или наоборот — награда за стойкость удержания позиции, когда все ломанулись куда-то не туда.  

Подробнее об этом показателе писали наши коллеги по рынку из Kraken Futures — Краткое руководство по ставкам финансирования

И каждый этот индекс зависит от предыдущего, а часто и от своей истории. Чаще всего используют не мгновенное значение, а усреднение предыдущих значений. Мы в Biqutex используем EMA (exponential moving average) — экспоненциальное скользящее среднее, чтобы уравновесить возможные кратковременные рыночные флуктуации. Больше о вычислении EMA индикаторов можно почитать (с формулами и картинками) здесь.

А самое в этом всем важное — у нас нет времени на все эти расчеты! Вот так просто нет и все. Ведь мы считаем все эти индексы (да-да, не один из них, а все, и более того — все индексы для всех торгуемых контрактов, которых у нас запланировано — многие десятки, если не сотни) каждую секунду! И ведь нельзя потратить всю эту секунду только на расчеты — биржа должна успеть что-то с этими цифрами сделать. И таких контрактов много. 

На сейчас наша первая система индексного движка выдает итоговые индексы за время менее 1 миллисекунды — типичное время, если быть точнее — 0.625 мс. За это время мы успеваем получить актуальные значения, необходимые для расчетов, исторические данные, просчитать все цифры, вывести итоговые индексы и записать все в несколько разных специальных хранилищ для того, чтобы другие модули биржи могли далее с ними работать. 

Теоретически, верхний предел сейчас 1600 контрактов — для такого количества торгуемых инструментов мы можем выполнить расчеты за 1 секунду. Однако эта задача очень хорошо параллелится, что позволяет легко и просто масштабировать, добавляя сервера, разделив между ними работы — первый сервер считает для первой тысячи контрактов, второй — для следующей и так далее. Наши внутренние метрики и будущая оптимизация направлена на то, чтобы максимально быстро считать и записывать индексы. В идеале, это 0.2 мс. на обсчет всех необходимых индексов по одному контракту. 

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

Спасибо всем и до новых встреч.

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

А еще у нас есть рубрика для тех, кому этого мало. Такой себе Advanced level. Вот вам несколько крутейших статей, чтобы понять глубже разные аспекты крипто-финансов. Но будет сложно, мы предупредили!