r0man
r0man личный блог
14 июня 2018, 20:32

Однажды в HFT-компании…

Спасибо _landy за перевод  статьи 

                           * * *

Моя личная история трейдинга, все совпадения случайны.
image
Я начал свою карьеру в HFT в австралийском филиале одной из крупнейших американских трейдерских компаний в качестве программиста на C++. В первый день меня встретил офис с огромными окнами с видом на сиднейскую гавань, на одном из которых было написано фломастером “< 2ms”. Это было главной задачей для дюжины разработчиков, но, пока что, не для меня. Итак...


Первоначальный шок

Один из ребят предложил идею торговли опционами на австралийской фондовой бирже (ASX), а точнее – опционными спредами и их комбинациями с обязательным хеджированием. Ему нужно было нечто, что могло бы справиться с кучей запутанных правил торговли и быть интегрировано с используемой нами торговой платформой, которая называлась Orc. Это были ранние двухтысячные и я написал для него свое решение на VB6 под Windows 2000. При этом я использовал C++, Boost и многопоточный парсер Spirit для интеграции с Orc. Последний рассчитывал биномиальные или триномиальные деревья для оценки американских опционов на бирже ASX по требованию. Для моего кода расчета цены я использовал чужой код на VBA, построчно переписанный на C++.


Однако, Orc не всегда вычислял цену по запросу, часто он использовал кэширование. Если исходные параметры оставались прежними, Orc просто возвращал цену из памяти, вместо того, чтобы пересчитывать её заново. Эта платформа была слишком медленной чтобы побороть конкурирующий софт от Timber Hill’s, самую быструю торговую систему на тот момент. Она казалась слишком убогой, чтобы соревноваться с другими по производительности, вне зависимости от того, какие трюки я с ней проворачивал. Однако, с большим многомерным кэшем цен опционов (отсутствующие значения получались из него простой интерполяцией), постоянно обновляемым в несколько потоков кодом, которых был написан на C++, неожиданно мы смогли совершать те сделки, которые были недоступны ранее.


При изменении процентной ставки или кривой волатильности в Orc Trader, мой кэш цен начинал заполняться снова. Конечно, это решение не было оригинальным. Впервые я прочитал о кэшировании цен опционов в старой статье несколькими годами ранее. Как в современном микропроцессоре с внеочередным исполнением ты можешь догадаться о следующих вычислениях, которые еще только может потребоваться сделать в будущем. Рыночные цены дискретны. Запомните, самые быстрые вычисления – те, которые не нужно делать. Следующей стала идея о том, что побить нулевую задержку тяжело, но не невозможно. Этот странный вывод о предсказании будущего я сделал из того, что самое быстрое сообщение – это то, которое не придется отправлять. По-моему, это даже более важно.


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


Мой хак для платформы Orc Trader был не идеальным решением, но он обрадовал нескольких людей сделками, которые раньше были невозможны. Они выглядели даже счастливыми, когда своими глазами увидели эти сделки в отчётах. Однако, в целом это был только незначительный успех. В дальнейшем он превратился в сотни ручных правил поиска сделок, окупая своим трейдингом лишь затраты на оператора. Но, по крайней мере мне было весело.


Сосредотачиваемся на “< 2ms”

Давайте вспомним про условие “< 2ms”, записанное на оконном стекле. Я написал статью, предлагающую более быстрый и более сложный способ достичь еще меньших задержек. Команда из трех программистов, включая меня, должна была реализовать его. Первый выбор пал на корейскую биржу. В этом проекте не было никакой необходимости в кешировании цен, поскольку модель расчета цен европейских опционов не намного сложнее простой интерполяции, даже в нескольких измерениях.


В это время процессоры с частотой 2-3 ГГц только начали появляться. Наша метрика производительности была несколько неправильной – мы в основном измеряли задержки внутри нашего кода, нежели те, которые лежат внутри операционной системы (которые на самом деле гораздо больше.) Это еще работало, когда данные поступали с миллисекундными интервалами, поскольку в те времена сетевой стек тратил на обработку пакета от 50 до 100 микросекунд. Главное, что тут нужно запомнить – когда процессор может исполнять более миллиарда операций в секунду, то в эти две миллисекунды влезает свыше миллиона инструкций. Честно говоря, это очень-очень плохой код, если этот миллион инструкций уходит на простые расчеты цен. Если принятие решения о сделке занимает у вас миллион шагов, увольняйтесь немедленно. Тут каждая наносекунда важна.


Оказалось, что меня прикрепили к не очень слаженной команде и как новый сотрудник, я должен был вести себя осторожно. В отделе разработки нас было всего трое. Один из членов команды (который на самом деле был отличным программистом) видимо, устал и стал тратить всё рабочее время на игры и форумы про видеоускорители. “Мистер GPU” раньше написал ключевые библиотеки компании для многопоточности, и они были неплохи, хотя и страдали проблемами с дизайном. Вся синхронизация была сделана через мьютексы и любая операция требовала блокировок. В итоге я снова пришел к использованию C++ библиотеки Boost. “Мистер GPU”, по всей видимости, не получал удовольствия от проекта и выглядел участвующим в какой-то забастовке. Он, несомненно, был раздражен необходимостью работать над моей идеей. Другой парень был менее способным, но все же минимально компетентным. Обычно он очень много ел и постоянно уходил в переговорную комнату, чтобы посмотреть там очередной фильм на DVD.


Но нам нужно было как-то справляться, чтобы одолеть эти две миллисекунды. Как оказалось, мне нужно было написать больше кода, чем ожидалось – приходилось несколько раз оставаться допоздна. “Мистер GPU” сделал работу по интеграции, в то время как “Отстраненный чувак” не сделал вообще ничего. В результате наша новая система показывала задержки чуть менее пяти микросекунд. Мне казалось, что это был огромный успех. Однако, эта цифра не учитывала сетевые задержки. Определенно, они сейчас имеют гораздо большее значение, чем месяц назад.


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


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


Поиск новой работы

Я списался с несколькими HFT-компаниями и поделился своими мыслями о том, что можно сделать. Одна неплохая голландская трейдинговая компания выслушала меня очень внимательно, но ничего не предложила. Годы спустя я узнал, что их команда начала реализовывать нечто вроде того, о чем мы говорили на интервью, на следующей же неделе после него. Я слышал, что подход оказался успешным. Они назвали его “implied base method”, в котором все сводилось к предсказанию теоретической цены фьючерса или базового актива. Мне нравится их название для моего метода, несмотря на то, что оно выглядит карго-культом. Ну, это тот способ, которым финансовые компании обычно ведут дела. Несмотря на обман с их стороны, я был польщен.


Затем я переговорил с одной австралийской компанией с командой из около дюжины разработчиков, сосредоточенной на трейдинге на бирже ASX. Их платформа была в основном даже медленнее Orc Trader, затрачивая многие миллисекунды на расчеты. Я напросился на встречу с главой компании, который был гораздо успешнее и гораздо моложе меня. Он был одним из ребят со сверхвысокой зарплатой, чей доход должен был быть задекларирован по австралийским законам.


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


Еще мне понравился один из инвестиционных банков, с представителем которого я разговаривал. Это был филиал большой конторы с Уолл-Стрит. Я уже успел отработать несколько лет в такого рода среде. Входной порог казался довольно низким – они не хотели зарабатывать деньги, они просто хотели создать биржевой оборот без каких-либо затрат, поэтому их финансовый департамент мог петь серенады этому филиалу. Это казалось мне хорошим вариантом, и я был уверен, что они не будут возражать против создания оборота, а также против получения дополнительной прибыли. Прибыль вообще редко вызывает жалобы.


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


Затем довольно неожиданно возникла другая возможность.


Однажды я обедал с парнем, которого знал по курсу computer science в университете Тасмании, который теперь работал на ITG. Он предложил мне поговорить с ITG, так как они занимались частным трейдингом. Для меня это было новостью – я думал, что они просто брокеры. Я встретился с их генеральным директором по Азиатско-Тихоокеанскому региону, и он подробно рассказал про их арбитражную платформу, которая работает с акциями, номинированными в USD и CAD. Затем я познакомился с генеральным директором по США Рэем Киллианом, когда он был в поездке в Австралию. Встреча прошла хорошо, и, похоже, больше не оставалось преград для того, чтобы развивать высокочастотный трейдинг в ITG. Генеральный директор Азиатско-Тихоокеанского региона плюс их председатель, который также был членом правления включенной в список NYSE компании ITG Inc., в конце концов повёз импровизированный бизнес-план и расчеты рисков в США на заседание правления.


Что произошло дальше, я не знаю – мне рассказали три совершенно разные версии в течение следующих нескольких лет. Согласно одной из версий, совет одобрил бизнес-план, но Киллиан отыграл всё взад. Согласно другой версии, некоторые члены правления не одобрили проект. По третьей версии, бизнес-план вообще не дошел до членов правления. Я не знаю, какие версии были ошибочными (возможно, все сразу), но это не имело значения. Ребята из ITG решили обойтись без своего работодателя и инвестировать личные средства. Это была не совсем та работа, которую я искал, но, если бы бизнес пошел хорошо – я смог бы заработать около четверти акций новой компании через опционы, полученные в течение нескольких лет по вестингу. Это было похоже на победу.


Рождение HFT-компании

Таким образом, получив инвестиции в размере 1,5 миллиона австралийских долларов, пришло время снова начать работать в одиночку с ноутбуком в офисе. Я настроил несколько серверов и рабочих станций, установил 64-битный SuSE Linux, нанял трех программистов – и часики, отмеряющие оплаченный инвесторами период, начали тикать. Оказалось, что я не очень хороший системный администратор Linux. Вскоре я устал делать плохо админские задачи и поручил их фрилансеру. Теперь нас было четыре с половиной человека. Но оказалось, что 64-битный SuSE Linux, особенно на процессорах AMD с их шиной Hypertransport, не был готов к нагрузкам в прайм-тайм, поэтому мы вернулись к 32-битной сборке RedHat/CentOS. Это было мудрое решение “мистера Сисадмина”, немного продвинувшее нас вперёд.


Через четыре месяца мы окинули взглядом перспективу. Мы должны были выбрать – запускаться у нас на ASX или идти в Корею. Три корейские биржи, KSE, KOSDAQ и KOFFEX, тогда как раз сливались в единую Корейскую биржу, KRX. Мы выбрали Корею, хотя и бизнес- и техническая среды там были более сложными и рискованными. Однако, возможностей там тоже было больше, плюс более простая математика в моделях ценообразования и небольшое количество инструментов обещали более легковесную кодовую базу.


Тогда же произошла одна забавная вещь. При создании новой системы вы обычно пытаетесь составить некоторые соглашения об именах, чтобы облегчить себе жизнь. Я решил использовать коды ISO или их часть для стандартизации. Однако из-за слияния корейских бирж еще не было назначено кода ISO для новой биржи. Я связался с ответственной группой ISO, которая оказалась единственным парнем с excel-таблицей, сидящим где-то в Европе. Он решил, что новым кодом для объединенной биржи будет XKOX. Я ойкнул и написал ему, что это сочетание не очень благозвучно звучит по-английски. Возможно, лучшей идеей будет использовать очевидные коды KRX или XKRX? Мы посмеялись и так XKRX стал новым кодом ISO. Так что теперь я могу утверждать, что именно я создал код ISO для объединённой корейской биржи.


В те давние времена в Корее трейдеры, даже высокочастотные, не могли получить прямого доступа к бирже. Вы должны были пройти через шлюз брокера и использовать их специфичный API для подключения. Не было вообще никакой коллокации. Среди клиентов возникала большая разница в задержках, не контролируемая брокером, просто из-за разного местоположения и технологии взаимодействия. На бирже KOFFEX торговались фьючерсы и опционы. Сама KOFFEX располагалась в Пусане, портовом городе на расстоянии чуть больше трёхсот километров от Сеула. Производные контракты на индекс KOSPI 200 имели маленький номинал, но большой размер лота. Из-за этого они были самыми оборотистыми производными инструментами в мире с десятикратным отрывом от остальных. Контракт евро/доллар на CME был номером два, а опционы на KOSPI 200 были номером один. Этого оказалось слишком много для KOFFEX, поэтому основные торги этими инструментами велись от их имени на бирже KSE в Сеуле. Стало быть, всё, что нам было нужно от биржи, располагалось в одной точке в Сеуле, хотя сама она была основана в Пусане.


К этому моменту я уже знал, что сетевой стек вносит самые значительные задержки, которыми я смог управлять в нашей новой реализации. Я нашел аппаратный конвертер протокола Ethernet в InfiniBand, который вносил задержку в 3 микросекунды. Он был выполнен в виде модуля, который подключался к коммутатору TopSpin InfiniBand. Шина Hypertransport (HTX) от AMD, альтернатива PCI Express, была более современной, что обеспечило меньшую внутреннюю задержку. Я купил несколько сетевых карт Pathscale HTX Infinipath и материнских плат с поддержкой HTX (они тогда существовали только в альфа-версиях, например, у одной из них был серийный номер 0x0000045!), собрал все эти разношёрстные детали в большой корпус и получил недешевый, но чрезвычайно быстрый сетевой стек, которым я был очень доволен. Он выглядел, конечно, несколько неуклюже и топорно, но зато был одним из самых конкурентоспособных в мире. Еще в течение нескольких лет обычные сетевые карты не могли сравниться с моей конфигурацией.


Выбор брокера

После этого мы отправились в Сеул, чтобы найти брокера и место в дата-центре. Я пошёл с одним из инвесторов, человеком по имени Bubble, который затем стал нашим сотрудником. Сначала он разрывался между между ITG и HFT, но позже перешел полностью в наше распоряжение, поскольку и генеральный директор, и председатель по АТР, а также другие сотрудники ITG были нашими инвесторами. Именно ему поручили забронировать отель в Сеуле. Оказалось, что он выбрал мотель с почасовой оплатой, соблазнившись очень живописным художественным описанием, скрывшим истинную картину – захудалые, грязные, комнаты с облупленным кондиционером, зараженный вирусами компьютер. Не очень хорошее начало. Несколько брокеров заезжали к нам и выражали удивление по поводу нашего района. Неловко, но смешно. Поездка получилась довольно продуктивной, мы заключили потрясающе невероятную сделку.


Хорошая сделка

Контора Muppetz Securities предложила нам услугу DMA. У большой фирмы, из которой я уволился, не было прямого доступа. Перед этим я приценивался к системе от HP/Compaq/Tandem на старой работе, поскольку это был один из способов попасть во внутреннюю сеть конкретного брокера, чтобы стать ближе к бирже. Это стоило около 500 000 долларов США за небольшую коробку, созданную в рамках специальной внутренней программы разработки приложений от HP. Соблазнительно, но не для бизнеса, который доживает свои последние дни. Предлагаемая же нам сейчас услуга DMA была реализована на базе протокола Х.25, что было тогда для меня новаторским. Эта сделка с брокером была довольно дорогой, но, поскольку настоящий прямой доступ был неслыханным прежде явлением, я подписал контракт через несколько дней.


В то время я познакомился с “мистером Ри” из местной компании RTS, который проездом был в Сеуле, разбираясь со своими делами. Мы помогали друг другу в поисках брокеров в Корее. Мы использовали внутреннюю информационную систему RTS в качестве резервного хранилища для наших сделок, чтобы акционеры могли сравнить наши данные с теми, что транслируют независимые поставщики. Вы можете подумать, что логичным выбором была бы платформа Orc. Я был знаком с Orc, и на этом этапе он имел самый удобный пользовательский интерфейс. Тем не менее, RTS имел гораздо более удобный API и стоил дополнительных 10% от ежемесячных затрат.


Вернувшись в Сидней, я смотрел на всё это дорогое оборудование под InfiniBand. Теперь это было бесполезным – мы собирались переходить на X.25. Неожиданный, но приятный поворот событий. Затем я получил сообщение от брокера Muppetz Securities о том, что он отменяет нашу сделку, несмотря на уже подписанный контракт.


Некоторое время спустя я узнал, что Muppetz пошел в большую контору, в которой я работал раньше. X.25 был очень ограниченным и редким ресурсом. Зачем отдавать его какой-то маленькой стартаперской HFT-фирме, которая ещё даже не торгует, когда вы можете пойти на уровень выше и заключить сделку с реальными трейдерами? Умный ход, хотя и неэтичный.


Оказывается, выражение „нет“ ослабило мозг некоторых брокеров. Я полагаю, что очень многие HFT-фирмы думали о том, как получить прямой доступ. Должно быть, пришло время. Однако, аннулирование контракта с Muppetz привело к другим, гораздо лучшим предложениям. Одно от мистера М., настоящего джентльмена и просто потрясающего парня с хорошей командой. Его цена была намного лучше, чем у Muppetz и, хотя технологически это подключение являлось брокерским доступом, расположение было потрясающим – точка подключения была прямо в здании биржи!


Я понятия не имел, что там можно торговать. Оказывается, у этой фирмы была пыльная, простая комната без кондиционера в пристройке к старому зданию KRX. Это старое здание, в отличие от новой постройки, недавно возведенной на территории кампуса, было соединено коридором с главной башней, где располагался движок биржи в нескольких этажах под землей. Эта комната использовалась как место для аварийных терминалов. Там стоял маленький стол в узкой комнате с терминалами со старыми CRT-мониторами. Если бы всему миру пришел конец, нужно было послать туда сотрудников, чтобы ввести ключи. Эта комната не была приспособлена для серверной инфраструктуры. Будет ли нам интересна эта маленькая отстойная комната, которая является самым лучшим, что они могли предложить на данный момент? Я пытался скрыть своё волнение, отвечая “да”.


Решение Muppetz на базе X.25 было технологически более быстрым, но точка подключения была в здании снаружи кампуса KRX, что вносило дополнительную задержку. Кто-то собирался заплатить большую премию за решение, которое не было таким крутым, как то, к которому мы только что пришли.


X.25 и технологии

Платформа биржевой инфраструктуры на базе X.25 была интересной. Вы могли рассчитывать на линию класса T1 или E1 (биржа имела оба варианта и использовала их поочередно) от Koscom, главного технологического и сетевого провайдера KRX. Внутри линии выделялись виртуальные каналы на 64 килобит в секунду (kbps) по принципу чередования времени. Интересно, что из-за этого чередования, вы по сути имеете параллельный доступ ко всему каналу в одно и то же время. Брокер имеет ограниченное количество линий, но много параллельных (хотя и медленных) каналов.


Я провел небольшое тестирование и сперва купил сетевые платы стандарта X.25 у продавца в Великобритании. Достаточно популярные, достойные упоминаний, они казались вполне промышленного качества. Когда-то много лет назад я разрабатывал информационную систему для учета лизинга автомобилей в Ситибанке, и она использовала протокол X.25. Развлечение, которое мне доставила эта разработка, стало возможным только потому, что у меня была неудачная молодость в доинтернетные дни – BBS, FIDO, Z-modem, Y-modem, вот это всё. Большая часть времени в Ситибанке была посвящена ковыряниям с модемами и другим оборудованием, только для того, чтобы заставить всё это работать вместе. После этого всё было просто. Но не с этими сетевыми платами. Ни мы, ни поставщик карт не могли заставить их нормально работать. В конце концов, между нами состоялся разговор на повышенных тонах, после которого продавец просто перестал брать трубку. Затем мы купили несколько дешевых сетевых адаптеров у канадской компании Sangoma, которые сразу заработали как надо.


В нашей пыльной рабочей комнате мы поставили свою серверную стойку. Я пришел с собранными вручную серверами в сумке. Коммуникационных линий для нас еще не выделили. Канал до биржи появится немного позже, а сейчас нам срочно нужны были рыночные данные, чтобы подготовить и настроить нашу инфраструктуру. HFT требует много, очень много данных. Биржа решила эту проблему, пропустив витую пару по воздуху снаружи здания и заведя её через откидное окно в нашу комнату, которое мы должны были всегда держать открытым. Когда шел дождь, воды в комнату попадало чуть меньше, чем можно было бы ожидать. Витая пара подключена к модемам T1. Модемы, в свою очередь, подключены к последовательным портам. Гигантские разъемы X.25, наследие шестидесятых годов, торчат из наших плат Sangoma. Медленные биты – большие биты.


Вскоре подключили линию от биржи для отправки ордеров с еще более гигантскими ответными разъемами X.25. У нас были модули для работы с Postgresql (вскоре замененные на версии с плоскими файлами), торговый движок на C++, сервис для расчета волатильности и т.д. Вместо выделенных линий, как мы изначально договаривались, мы использовали обычные интернет-каналы. Мы взяли трех поставщиков, которые обещали географическую независимость и прописали маршруты для обеспечения избыточности. Гораздо дешевле, выше пропускная способность и более надежно, чем выделенные линии. Это было необычно в то время, но многие делают то же самое сейчас.


(Фаль)старт торговли

Через девять месяцев после запуска мы закончили тестирование. Никаких сертификаций от биржи тогда не требовалось. В то время это действительно была земля ковбоев. Мы начали торговать – по опционам было 85% исполнений! Это означает, что либо вы не можете верно оценить опционы (и кто угодно может продать вам контракты по плохим ценам), либо вы всегда первые в очереди и вы преуспеваете. У нас было в основном последнее.


Но мы не могли заработать денег.


Изначально наш план состоял в том, чтобы просто покупать “сочные” опционы и хеджировать их фьючерсами. Мы потратили почти миллион долларов на разработку платформы для этого, а остаток в полмиллиона оставался на брокерском счету как обеспечение для нашей торговли, мы не могли его трогать. Мы можем успеть схватить опцион, но вся прибыль испарится, если мы не сможем его правильно хеджировать. Мы постоянно работали над этим, и всё понемногу улучшалось, но проблема не была решена до конца. Я ночевал в офисе, а остальная часть команды также усердно работала. Производительность нашего торгового движка была недостаточной. Я поймал зубами пулю и переписал его за 72 часа непрерывной работы. После этого стало намного лучше, но мы нашли ошибку в новом торговом движке. Внутренние задержки приложений маскировали её, но она была заметна при внешних измерениях. Тред, который писал логи, потреблял кванты времени основного потока, и это стоило нам много времени. Правильное разрешение не было простым, поскольку нам пришлось бы выставлять глобальные флаги. Я просто решил назначить основному потоку приоритет реального времени с соответствующими понижением приоритетов остальных и… ура! – проблема исправлена. Хотя это было по сути костылём, мы получили стабильную задержку, измеряемую двузначным числом в микросекундах.


Получение кривой подразумеваемой волатильности (IV) всегда было искусством. В моей старой конторе трейдеры использовали ручной процесс аппроксимации IV, и каждые пять или десять минут (или час) они корректировали свою кривую в соответствии с рынком. Умный количественный трейдер в конечном итоге построил бы аккуратный и надежный автоматический процесс. Здесь я тоже хотел, чтобы коррекция IV была полностью автоматизирована, но выбрал другой подход. Использование квадратичных кривых для оценки меня не устраивало, поскольку это часто приводило к неудобному разрыву в точке выхода опциона в деньги. Мы использовали более подходящие сплайны из библиотек языка R, добавили некоторые небольшие медианные фильтры и некоторые другие статистические фокусы. Теперь мы рассчитывали и публиковали кривую IV каждую секунду. Позже мы даже перешли на четверть- или полусекундные интервалы, но секундных было достаточно. Это несколько улучшило ситуацию и наша оценка опциона, казалось, была очень близкой к реальности. Однако, как правило, мы не зарабатывали денег (или зарабатывали очень мало.) Время и текущие расходы убивали нас, а не торговые потери.


У нас был ещё один примечательный прокол. Мистер Л. внес некоторые изменения в механизм хеджирования фьючерсами, которое мы выкатили в прод. В ту же секунду, как мы включили систему, она мгновенно купила и продала по рынку около тысячи лотов фьючерсов за несколько секунд. Мы должны были убить его немедленно. Компания могла умереть прямо тогда, но нам повезло выскочить из позиции.


Мы пытались, но всё равно не могли заработать. И это были уже не задержки. Цены не были страшными. Наш механизм хеджирования фьючерсами был просто недостаточно эффективным. У нас не было капитала для “рисования” уровней и использования их для улучшения нашего финансового результата. Мы пытались делать пассивный маркет-мейкинг на фьючерсах перед тем, как торговать опционам, но это всё было неважным. Прошло девять месяцев, вынашивание этого ребёнка было завершено и сон в офисе давал всё меньше пользы. Пришло время молиться.


Стратегия Zero

Когда вы торгуете на бирже, считается, что вам повезло, если вы получили в свою пользу часть спреда. В то время в Корее опционы ATM и дешевле, имели размер тика 0.01 ценового пункта. Эти 0.01 стоили около доллара с одного контракта. Торгуя высокочастотным роботом сразу сериями опционов, если вам повезёт, то вы выходите из сделки в среднем с десятью или двадцатью центами. Одной из моих целей на этой работе было превзойти те показатели оборота, что я видел ранее. Мне вспоминается, что рекорд на прошлом месте был 1.13 млн. контрактов в день. Если бы вы могли проторговать миллион опционов и взять 10 или 20 центов за каждый, вы были бы очень счастливы. В теории, нет разницы между практикой и теорией. Осознать это оказалось для меня довольно трудным.


Затем я вспомнил разговор одного из трейдеров, мистера Б., с кем-то на кухне в старой фирме (кстати, в конечном итоге он и возглавил фирму.) Мистера Б. спросили, если он купил по хорошему торговому сигналу и получил прибыль, почему он сразу не закрывает позицию? Он ответил, что если бы все было так просто – он бы зарабатывал намного больше денег, чем сейчас. У нас были отличные показатели задержек с хорошим расположением и прямым X.25-каналом. Технология работала, модель оценки давала верные цены. Может быть, мы могли бы сделать невозможное?


Я поговорил с акционерами и сказал им, что мне нужно еще 25 000 AUD, чтобы пережить месяц и попробовать что-то новое. Основной инвестор выдал кредит в размере 25 000 AUD. Мистер Ф., один из первоначальных сотрудников, закодил то, что мы называли стратегией Zero. Все было просто – не иметь направленной позиции, ждать появления в стакане опциона, чья цена отличается от нашей оценки хотя бы на тик. Затем бить по нему. Ждать. Потом сбросить его и взять тиковую прибыль. Могло ли это сработать?


Мы будем жить!

Наш месячный доход от трейдинга стал измеряться здоровыми шестью знаками. Стратегия Zero сработала. Мы увеличили торговый капитал, чтобы можно было купить 500 или 1000 опционов ATM, а затем развернуться и сбросить их обратно. Здесь нет умного маркет-мейкинга. Мы просто были агрессивным тейкером.


Быть тейкером на рынке может быть более проблематично, чем мейкером. Как маркет-мейкер, вы должны уходить с пути рынка, когда он идёт против вас, но вы должны быть достаточным стоиком, чтобы не становиться слишком взбалмошными и не терять ценное место в очереди. Как правило, ваш ценовой порог, после преодоления которого вам нужно убегать из стакана для предотвращения убытка, меньше, чем у агрессора, который использует торговое преимущество. Похоже на странную игру, в которой агрессор фактически имеет гандикап по задержке, ибо он готов двигаться только после того, как мейкер уже сделал свой ход, при прочих равных условиях. Или это похоже на 100-метровый спринт, где у мейкера есть преимущество в 50 метров, и вы должны как-то преследовать его. Такая аналогия в значительной степени описывает стратегию Zero. Прямого подключения через X.25 проводами, проходящими через окно и расположения на территории кампуса было достаточно, чтобы преодолеть наивность нашей стратегии в те первые дни. Фортуна улыбнулась нам.


Было своеобразным развлечением наблюдать за тем, как деньги как бы сами по себе появляются на банковском счете после получения прибыли. Это было немного сюрреалистично. Мы торгуем индексными опционами в Корее, а австралийские доллары появляются на банковском счете в Сиднее.


Немного заработанных денег ушло на домашний кластер в нашем недавно арендованном офисе на Hunter-стрит в 200 квадратных метров, много маленьких компьютеров в формате mini-ITX на дешевом стеллаже из хозяйственного магазина, платы оперативной памяти, источники питания ATX и сетевой коммутатор. Моделирование подразумеваемой волатильности, историческое тестирование и сама стратегия – все улучшилось с появлением нескольких сотен дополнительных ядер.


Следующим шагом в нашем трейдинге стал переход от стратегии Zero к полноценной торговой стратегии с хеджированием. Вместо того, чтобы пытаться хеджировать позицию через фьючерсы, мы обратились к хеджированию другими опционами. Мы не хотели переносить позиции через ночь, но были рады удерживать их в течение дня. Стратегия Zero держала суммарную экспозицию в несколько секунд в течение дня. Новая стратегия заставила нас держать позицию весь день. Эта идея сработала очень хорошо. Около двух третей рынка KRX составляли опционы с низкой дельтой и довольно статичным ценообразованием. Не было необычным видеть более миллиона лотов на бидах или асках в крошечных опционах. Однако, купите этих дешевых опционов и вам будет весьма непросто сбросить их до закрытия рынка. Поэтому мы просто сосредоточились на опционах с более узкими спредами и с большими дельтами, с тиками размера 0.01 с ценами ниже 3.00. Они составляли около трети среднего объема рынка. В конечном итоге мы выросли до типичной доли в 6-7% рынка, а иногда и более 10%. Поразительно, что мы проторговывали около трети объема того рынка, на котором сфокусировались. Нормальный такой кусок пирога. Преодоление прошлого рекорда оборотов состоялось.


Разбираясь с проводами

Идея первого значительного хака пришла после рассмотрения витой пары, которая была проложена через окно. Модемы для линий T1 и E1 передавали этот сигнал через неуклюжие соединения, ведущие в еще большую коробку, которая затем подключалась через огромные разъемы к последовательным картам. Немного исследований и родился очевидный план. Я купил несколько новых карт Sangoma, в которые подключили витой парой T1/E1-каналы от NetOptics и установил эту сборку в Корее. Когда меня спросили, для чего это – я ответил, что для мониторинга состояния линии и измерения задержек. Это утверждение было технически верным, но неполным.


Новые карты Sangoma поддерживали смешанный режим, при котором карты просто принимают все биты из канала. Я начал их анализировать и понял, как выглядели потоки. Виртуальные каналы X.25 были сгруппированы в каналы для рыночных данных. Они имели склонность идти последовательно друг за другом. Были еще другие группы каналов для опционов пут, колл и фьючерсов. Мне пришлось самому разбирать слой HDLC, но вскоре у меня были декодированные пакеты, соответствующие каналам KRX. Такой обход модема и сетевого устройства экономил около миллисекунды.


Это не было незнакомой территорией. Биржа Eurex когда-то предоставляла закрытый API – и его взломали и сделали реверс-инжиниринг протокола обмена. После этого официальный документ о техническом регулировании членства на бирже был скорректирован так, чтобы это стало нарушением правил. Тогда эта практика была прекращена, но в Корее такого правила не было. Точно так же, когда биржа ASX открыла свою первую небольшую точку колокации в местечке Bondi, я отметил, что у нескольких клиентских фирм были установлены 1U серверы от Dell, безо всяких модемов. Реверс-инжиниринг протокола Nasdaq не был столь необычным явлением, как я надеялся – есть много умных хакеров.


Отрезать и выбросить

В Корее все стало ещё лучше. Теперь, когда у меня был поток битов один за одним (ну или, по крайней мере, байт за байтом) я мог видеть, что пакеты теряют очень много времени именно в проводах. Миллисекунды. Распространенным методом в сетевом мониторинге является slice, когда вы просто отрезаете первую часть пакета. Я реализовал это с моим кодом обхода слоя HDLC и теперь мы были намного впереди, поскольку нужным нам поля bid и ask располагались в начале пакета котировок. Сохрани 100 байт на скорости 128 Кбит/с и ты впереди на 6.1 мс. По мере роста параметров спецификаций и ускорения каналов KRX наше преимущество уменьшалось, но всё равно осталось приемлемым. Теперь мы отправляли свои ордера еще до того, как входной пакет данных с ценами был полностью принят.


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


Ещё одна попытка

Пришлось побороться, чтобы найти нам новый дом. Мы сосредоточились на поиске сразу нескольких точек, чтобы бизнес был чуть более устойчивым. Протокол X.25 еще не стал общеизвестным, но больше не был необычным. Кто-то по имени Доктор С. пришел нам на помощь и разместил наше оборудование в ЦОДе через дорогу. Этот брокер был немного умнее и понимал, что если мы видим весь физический поток данных, то мы потенциально можем видеть и ордера других клиентов. Он был прав – технически мы могли, но пока не делали этого. Мы должны были настроить отдельную инфраструктуру для нашей собственной конфигурации потоков рыночных данных. Этот брокер проделал большую работу и мы были благодарны ему за плавную миграцию. Опыт с Muppetz оказался исключением. Брокеры в Корее – хорошие люди.


Мы развернули ту же самую инфраструктуру на новом месте и продолжали искать. Мы заметили, что скорость рыночных данных на разных площадках сильно отличалась. Мы не могли получить GPS-сигнал для синхронизации локальных часов по сети, но Корея использовала стандарт мобильной связи CDMA. Местный производитель Endrun Technologies продавал миленькую пластиковую коробочку, с помощью которой мы смогли получить стабильный сигнал точного времени. Этот прибор получал сигнал GPS внутри CDMA и передавал по последовательному порту данные NMEA плюс (по другому кабелю) импульсы со сверхточными интервалами. Спецификация CDMA обещает джиттер для сигналов точного времени не более 10 микросекунд, по факту же мы получили в Сеуле около одной микросекунды. Для сравнения, один канадский CDMA-оператор показывал точность около 5 или 6 микросекунд.


В конечном итоге мы разместились на колокацию в подземном дата-центре KRX. Попасть внутрь было довольно непросто из-за строгой охраны. Проделав долгий путь под землей, я заметил, что внутри дата-центра ловился сигнал сотового телефона. Я поставил наш приемник CDMA в стойку и это работало – мы получали точное время от прерывающегося сигнала сотовой связи, пока что-то там внутри не сгорело. Подозревая, что нужно поставить более эффективную антенну, перед очередной поездкой в Сеул я купил белую гибкую антенну длиной в метр и припаял на неё разъем SMA. Когда я спустился в подземный бункер дата-центра KRX и положил большую белую антенну на нашу стойку, ребята из Koscom посмотрели на меня очень подозрительно. Я не знаю, что они там себе надумали, но несколько других людей за эти годы упоминали, что видели, как моя белая антенна лежала наверху стойки в KRX.


Теперь у нас было точное время на всех точках присутствия и нам нужно было наладить обмен данными между ними. Мы обнаружили, что в нескольких кварталах от кампуса мы получали 300-микросекундную задержку между нашими точками через десятимегабитное Ethernet-подключение городского провайдера. Это было очень хорошим показателем и мы координировали все наши рыночные данные и ордера по этим интернет-линиям. В Корее замечательный интернет и нам тогда его хватало. Миллисекунды преимущества от получения рыночных данных сразу по всем точкам присутствия улучшили торговлю. В то время как наши лучшие ордера исходили из биржевого кампуса, самые быстрые рыночные данные приходили из точки за несколько кварталов от него. Это оказалось довольно неожиданным и та локация оставалась лучшим местом для получения маркет-данных в течение нескольких лет.


Чуть позднее на новой точке в пристройке к зданию биржи KRX мы настроили получение рыночных данных и задержки там оказались огромными. Это был первый раз, когда я столкнулся с компанией Citadel в Корее, я смог это определить по временным отметкам в сетевых пакетах – они могут рассказать обо всём, если вы умеете их слушать. Мы попросили отключить этот канал, Koscom остановил передачу и физически отключил линию. Через месяц или два мы заплатили за повторное подключение, они включили ту же самую линию, ничего не меняя, и теперь она была одной из лучших. Таковы были капризы жизни в Корее. Я подозреваю, что какой-то новый вид round-robin балансировщика где-то посередине смог улучшить ситуацию. Для других наблюдаемых там странностей я не смог придумать никакой очевидной причины.


Виртуальные каналы для отправки ордеров по X.25 были по 64 кбит/с каждый – этой крайне медленно. Я подумал, что мы могли бы использовать тот же хак с картами Sangoma и начал писать код, который отправлял бы пакет с ордером еще до того момента, как он будет полностью сформирован в памяти, что сэкономило бы нам миллисекунды. После отправки ордера мы могли бы превратить пакет в недопустимый, если вдруг рыночная ситуация успела измениться и отправляемый ордер больше не был нужен. Однако, наша небольшая команда была и так сильно загружена, а эта задача не была приоритетной, ибо наши торговые показатели и так были достаточно хороши. Мы больше учились моделированию подразумеваемой волатильности и дорабатывали стратегии.


Постоянны только изменения

Биржи никогда не стоят на месте и KRX не была исключением. Они начали отказываться от протокола X.25 и переходили на Ethernet и TCP/IP. Биржа планировала использовать TCP для отправки ордеров и UDP для рыночных данных. Торговая эффективность нашего хака X.25 начинала исчезать. Мы стали слишком толстыми с нашим торговым движком и стратегией. Производительность нашего торгового движка не сильно улучшилась относительно изначальных трехсот микросекунд, он раздулся. Ребята на каком-то этапе повторили мой 72-часовой хакатон и превратили движок в нечто более традиционное, простое и быстрое. Как ни странно, нас сейчас не слишком волновали сто микросекунд здесь или там, ибо мы преследовали стратегические и тактические цели. По сравнению с остальными у нас фактически была отрицательная задержка из-за работы сетевого адаптера в promiscuous-режиме, обхода модема и собственного парсера HDLC. Наши ордера все ещё уходили до поступления рыночных данных к остальным участникам рынка.


Мы хотели попробовать предварительную отправку ордеров по X.25, но у нас не было свободных людей, чтобы потратить пару месяцев на программирование, особенно учитывая то, что использование X.25 подходит к концу. Весь код под X.25 стал бы бесполезен через несколько месяцев после завершения этого проекта. Однако, идею надо было проверить, и я поговорил с парнем, который написал большую часть программного обеспечения в Sangoma. Он был главным разработчиком и сделал основную работу по написанию драйвера устройства. Может, он сможет кого-нибудь порекомендовать? Он сказал, что сделает это сам как сторонний проект из дома. Возникли некоторые проблемы, поскольку код этих драйверов был сильно запутанными с обилием операторов перехода goto на C, но, даже если это и не очень хороший стиль, драйверы работали стабильно. Этот код не должен был прожить больше нескольких месяцев, так что это казалось приемлемым риском. Тестирование заняло немного больше времени, чем ожидалось, и предварительная отправка заработала, но производительность была ужасна. Код был настолько дьявольским, что “быстрый” путь работал медленнее, чем обычный путь. Однако, у нас не было времени ещё раз переписывать весь код под эту идею.


Изменения для поддержки TCP на KRX оказались простым отображением виртуальных каналов X.25 на TCP-сессии. У вас может быть несколько одновременно открытых TCP-сессий (которые они называют PID) для отправки ордеров. Формат передачи рыночных данных был без изменений портирован для работы поверх UDP. Я уже не помню, добавили ли они шифрование в TCP-версию сразу при запуске или чуть позже, но теперь при отправке ордера весь пакет с данными, идущий сразу после TCP-заголовка, должен быть зашифрован с помощью шифра ARIA, и это было обязательным требование. ARIA – национальный корейский шифр. Он очень похож на AES с немного другим расположением S-Box. Это хороший шифр.


Мы видели, что новая архитектура на базе TCP собиралась встряхнуть рынок и потенциально уничтожить большую часть бизнеса крупных брокеров. Старый добрый X.25 был медленным, но чередование каналов означало, что у вас было много параллельных путей для отправки ордера, которые можно было разделять между собой. В новом мире TCP было ограниченное количество сессий, две или четыре, и все клиенты должны были поочерёдно отправлять свои ордера через эти соединения несмотря на, казалось бы, наличие многих PID. В итоге этой сериализации клиентские заявки вставали в очередь у брокера. Состояние гонки возникало теперь не только на бирже, но и внутри каждого брокера. Крупные брокеры могли потерять свои доли рынка, так как имеющиеся линии связи могли поддерживать только ограниченное количество HFT-клиентов. Кроме того, скорость отправки ордеров увеличивалась, размеры пакетов маркет-данных тоже увеличивались, а скорость поступления рыночных данных не росла пропорционально, чтобы идти нога в ногу. Биржа уверенно двигалась к полному бардаку и мы понимали, что должны как-то опередить этот процесс. Настало время для увеличения количества наших каналов связи, что означало ещё больше брокеров, в которых нужно было открывать счета.


Мы поехали в Сеул посмотреть на обстановку и смогли получить несколько архитектурных диаграмм, которые провайдер Koscom любезно прикреплял к стойкам брокеров. Там был изображен бэкбон с пропускной способностью 622 Mbps, охватывающий кольцом весь город и имеющий несколько ответвлений, которые шли к брокерам. В стойках мы видели наших старых друзей – модемы T1 и E1. Это была хорошая новость – мы могли продолжать использовать старые трюки для получения маркет-данных. Наша новая конфигурация включала несколько модемов T1, которые были подключены в относительно недорогие коммутаторы Cisco. Если бы мы смогли прослушивать поток в витой паре T1 после того, как главный коммутатор расшифровал пакеты из общего оптического канала, всё было бы в порядке.


Переход на TCP внёс много беспорядка для KRX и всё произошло именно так, как мы ожидали. Крупные брокеры, такие как Samsung Securities, потеряли свою рыночную долю, поскольку они были обмануты биржей насчёт их способности эффективно обслуживать свою большую базу клиентов. Задержки маркет-данных стали обычным делом, поскольку биржа теперь принимала ордера быстрее без пропорционального увеличения производительности ветки раздачи. Но мы уже хорошо справлялись с этим, используя биржевые отметки времени для отслеживания задержек в рыночных данных. Опционы пут, колл и фьючерсы поступали по разным каналам и задерживался, как правило, только один (а иногда и два.) Мы почувствовали этот дисбаланс задержек и переключились в режим хеджирования. Несколько раз мы рассуждали о том, чтобы можно воспользоваться ситуацией в те моменты, когда мы точно знали, что другие получают сильно искажённые рыночные данные, но в рабочие планы эти доработки не включали. Иногда дисбаланс каналов приводил к серьезным задержкам – когда данные отставали уже на десятки минут – мы останавливали всё. Как только дисбаланс исчезал, наш движок автоматически возобновлял торговлю.


Работать с сетью в promiscuous-режиме было интересно и не нарушало правил, поскольку я не думаю, что их составители о таком вообще знали. Переход на TCP/IP вместо X.25 потребовал обязательного использования файрволов, но мы узнали, что некоторые местные трейдеры обходили их. Это было явно против правил и поэтому мы не были готовы такое сделать. Если вы нарушите явно прописанное правило – вас могут полностью отключить от биржи KRX. Причём, у неё не было явно прописанной в правилах процедуры повторного подключения, если вас когда-то выгнали, поэтому решение может быть совсем окончательным. Мы подсчитали, что наше преимущество было намного больше, чем задержки на файрволе, поэтому, пока эти клиенты не прослушивали всех и не резали пакеты, наше преимущество было вне опасности и те ребята лаяли не на то дерево. Недавно я узнал о другой местной группе, торгующей в обход межсетевого экрана в Корее. Так что такое случается, но сейчас это редкость...

Где-то тут заканчивается сорокатысячный символ, а ограничения смартлаба не позволяют вставить текст больше. Но вы можете продолжить это увлекательное чтение по ссылкам в начале поста.
9 Комментариев
  • Ukflbfnjh
    14 июня 2018, 22:52
    Слов нет…
  • Boris Litvinov
    14 июня 2018, 23:15
    Крутой чел
  • trader_95
    14 июня 2018, 23:29
    и что там ловить после таких парней…
  • Гриша
    15 июня 2018, 10:31
    взахлеб, в 2004 тоже изучал с++ )) эх не знал я про биржу тогда
  • Сергей Затылкин
    15 июня 2018, 11:08
    Человек легенда!
  • Херня какая-то ниочем с использованием умных слов...
    потратить лямы баксов на разработку какой-то херни, которая не торгует в профит… ну-ну…
  • Михаил Ершов
    16 июня 2018, 20:43
    в раздел опционы бы пометить, интересная статья и их тоже касается
  • Lexa83
    22 июня 2018, 19:25
    Шикарная статья, читал на хабре

Активные форумы
Что сейчас обсуждают

Старый дизайн
Старый
дизайн