Как стать автором
Обновить

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

Время на прочтение43 мин
Количество просмотров35K
Автор оригинала: Matt Hurd

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


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


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


Однако, Orc не всегда вычислял цену по запросу, часто он использовал кэширование. Если исходные параметры оставались прежними, Orc просто возвращал цену из памяти, вместо того, чтобы пересчитывать её заново. Эта платформа была слишком медленной, чтобы соревноваться с собственной платформой Timber Hill (теперь Interactive Brokers) или же с Ord Liquidator у IMC, который был самой быстрой коробочной системой в то время. Она казалась слишком убогой, чтобы соревноваться с другими по производительности, вне зависимости от того, какие трюки я с ней проворачивал. Однако, с большим многомерным кэшем цен опционов (отсутствующие значения получались из него простой интерполяцией), постоянно обновляемым в несколько потоков кодом, которых был написан на 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. Причём, у неё не было явно прописанной в правилах процедуры повторного подключения, если вас когда-то выгнали, поэтому решение может быть совсем окончательным. Мы подсчитали, что наше преимущество было намного больше, чем задержки на файрволе, поэтому, пока эти клиенты не прослушивали всех и не резали пакеты, наше преимущество было вне опасности и те ребята лаяли не на то дерево. Недавно я узнал о другой местной группе, торгующей в обход межсетевого экрана в Корее. Так что такое случается, но сейчас это редкость.


Взлом FPGA


Нам также удалось улучшить наш хак для получения маркет-данных. Мы были маленькой фирмой с несколькими людьми по имени Томас. Это невероятно, но восемнадцатый нанятый работник стал нашим шестым Томасом. Часть вины за это лежала на мне – я знал о “проблеме Томасов” и ради забавы подыскивал аспирантов с этим именем в разных местах. Я заметил нового Томаса в университете UNSW в их группе NICTA. Он готовился к защите докторской степени и написал интересную работу о распределенной разделяемой памяти на Linux, включая версию для процессоров Itanium. Я когда-то раньше сталкивался с этим, поэтому договорился с ним, и он начал работать на неполный рабочий день, как только получил свою докторскую степень. Одна из крутых вещей, которые он сделал – взломал прошивку сетевой карты Sangoma, которые мы использовали. Эти карты были сделаны на базе маленького FPGA-чипа от XILINX, а именно на модели Spartan 3. Он получил доступ ко flash-памяти в FPGA и нашел некоторые регистры, которыми мы могли бы управлять. Вскоре у нас была своя рабочая прошивка для неё, и мы смогли полностью обойти штатную прошивку Sangoma с её promiscuous-режимом. Компания Sangoma стала основным поставщиком оборудования для нас. Открытие, что сетевой стек Sangoma стоил нам почти целую миллисекунду, стало шоком для нас. Задержки нашего самодельного сетевого стека укладывались всего в около десяти микросекунд.


Поскольку мы планировали выходить и на другие рынки, то начали исследовать FPGA внимательнее. Когда-то я почти начал использовать FPGA вместо конвертера Ethernet в InfiniBand от TopSpin. Поковыряв его в течение некоторого времени, я обратился к FPGA-компании под названием Celoxica еще в 2004 году, чтобы разузнать об их технологиях. Когда мы только начинали наш HFT-проект, я попросил Celoxica подумать над решением для получения данных по UDP. Трейдинг был для них тогда новым направлением, но они провели предварительные исследования и вернулись. Celoxica имела часть кода для декодирования UDP по Ethernet, которое они использовали в встраиваемой автомобильной развлекательной системе в Германии и его можно было перепрофилировать под нашу задачу. Мы немного его изучили, но этот вариант оказался слишком дорогим. Годы спустя я разговаривал с одним из CTO из большого Банка Уолл-Стрит, и тот рассказал, что начал говорить с Celoxica о трейдинге примерно в то же время, что и я. Поэтому Celoxica начала разработки в этом направлении и впоследствии это стало важным источником доходов для них. Их надстройка над VHDL, которую они назвали Handel-C был довольно красивой, но, к сожалению, она так и не смогла полностью соответствовать техническому заданию. Мы в конечном итоге всё-таки нырнули в разработку под FPGA, которая включала исследование еще одного языка, Impulse-C. Он был довольно крутым, но мы вернулись к VHDL, поскольку наша разработка лучше соответствовала его модели.


Наша новая прошивка SANGOMA отлично работала на нас. Однако, подобно тому как Эйнштейн представлял себя бегущим рядом со световым пучком, мы хотели попасть в первый бит, электрон или фотон, прилетающий к брокеру. Это значит, что мы должны быть подключены к общему оптоволоконному кабелю, входящему в здание. Это волокно было подключено к коммуникационному шкафу Telco, из которого торчали модемы E1. Мы хотели попасть сразу в оптическую линию, миновать все сетевые устройства и оставить медь E1 позади. В наше время вы можете легко купить множество FPGA-карт, которые уже имеют нужные сетевые разъёмы, но тогда мы не могли найти ничего, что могло бы работать на скорости 622 Мбит/с, которые показывал Koscom.


Так что мы разработали нашу собственную печатную плату для того, чтобы получить нужный нам PCIe-сетевой адаптер. Мы напрямую завели SFP-разъем на FPGA-чип от XILINX и больше ничего. Ранее мы уже делали некоторые монтажные платы для адаптеров T1/E1, которые мы упаковали в небольшой черный пластиковый корпус, призванный упростить нашу инфраструктуру. Те монтажные платы стоили всего десяток-другой центов каждая и они помогли сохранить наши нервы, поскольку мы больше не нуждались в активных переходниках от NetOptics и наша схема кабельных подключений стала более простой. Наш FPGA-адаптер был очень несложным по меркам FPGA-устройств, но непростой штукой для нас. Мы привезли эти адаптеры и несколько пассивных оптических конвертеров NetOptics в Корею. После полуночи, когда всё было тихо, мы врезались в кабели и подключили наши адаптеры в разрыв соединения. Теперь у нас был сигнал, но он был совершенно непонятен.


Вернувшись в Сидней, мы анализировали отзеркаленный битовый поток и изо всех сил пытались понять сигнал. В конце концов мы догадались, что архитектурная схема, которая висела на стойках в Корее, была неправильной. Мы фактически получали оптическую несущую STS-3/STM-1 со скоростью 155 Mbps по спецификации OC3 и теперь мы могли декодировать этот поток. У нас стало больше доступной пропускной способности и мы смогли даже отыскать наши собственные ордера в пакетах данных, что сильно обрадовало нас. Ордера других клиентов были зашифрованы (и это к лучшему.) Теперь, когда сканировать нужно было гораздо больше каналов 64 кбит/с, нам пришлось написать свои инструменты, чтобы искать необходимые данные, ибо всё менялось слишком часто. В конце концов, мы всё равно перешли к нашей собственной оптической схеме “звезда” в стойке возле кампуса KRX, используя наши FPGA-адаптеры для, которые оказались вполне подходящими для арбитража и координации уже восьми точек присутствия.


Предварительный ордер


Теперь я хотел попробовать тот новый трюк с ордерами KRX. Так как это был протокол TCP, мы тоже могли бы сразу отправить часть пакета с ордером в канал до того момента, как получен и декодирован весь входящий пакет – это ведь просто байты. Вторичный TCP-заголовок был в порядке, поэтому мы сэкономили бы довольно много. Однако у нас было две проблемы. Во-первых, если бы у нас не было готового к отправке ордера, что тогда нужно делать? Каждые N секунд мы должны были посылать пакет heartbeat, если PID не использовался. Мы не могли отправлять мусорный пакет на биржу, поскольку тогда мы могли бы привлечь излишнее внимание. Поскольку мы стояли за межсетевым экраном, мы могли работать только с содержимым IP-пакетов, и никакие инвалидации контрольной суммы Ethernet-пакета или другие аналогичные трюки на более низком уровне не работали отсюда.


Команда отмены в отношении уже отменённого или исполненного ордера казалась подходящим сообщением – это часто происходило в ходе обычной работы движка. Так что её мы и посылали. Каждый раз мы случайно выбирали ID ордера, чтобы не было повторений. Нам иногда приходили письма с вопросами насчет этих отмен (которые посылал один умный брокер), поэтому мы сделали маскировку – когда на рынке было затишье, движок возвращался к тактике посылки heartbeats-пакетов. Всё это отлично работало в незашифрованном тестовом сегменте сети, но нам всё равно пришлось решать проблему с шифром ARIA.


Стоит отметить, что и на канале 1Gbps с протоколом FIX 4.2 (такие использовались на бирже BATS в США до повсеместного перехода на 10G), экономия на такой предварительной отправке по-прежнему работает, если вы используете FPGA. На каждые 25 байт вы экономите 200 наносекунд. Отправка неверной контрольной суммы Ethernet-пакета в конце как правило, предотвращает обработку такого пакета коммутатором.


Взлом шифра ARIA


Я написал письмо в Сеульский университет, который был владельцем шифра, и они прислали исходный C-код для 8-ми 32-битных версий шифра. Мы посмотрели его и смогли изменить процесс хендшейка, чтобы транслировать наружу сеансовый ключ и после этого уже смогли правильно зашифровать сообщения. Был некоторый сомнительный аспект во всей бизнес-модели шифрования, поскольку вам приходилось платить фирме роялти в несколько тысяч долларов в год, чтобы использовать их официальную библиотеку шифрования с открытым исходным кодом, однако все в Корее платили за это.


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


Теперь мы могли бы, наконец, отправить предварительный ордер по TCP. На этом мы сэкономили сперва несколько миллисекунд, потом этот выигрыш постепенно сокращался до сотен микросекунд с увеличением скорости каналов. Наше преимущество было на самом деле еще больше, чем простое снижение латентности. Свичи Koscom работали по принципу “сохранить в буфере, потом отправить”, так что мелкие пакеты быстрее проходили через всю систему и итоговое улучшения времени отклика оказались еще немного лучше, чем мы ожидали.


Сегодня есть много других открытых реализаций для шифра ARIA и ваша корейская жизнь может оказаться проще, чем наша.


Встряхнуть крыльями


Мы также попробовали некоторые методы фрагментации пакетов. Сетевое устройство может разделить пакет на фрагменты по разным причинам. Стек Unix по умолчанию будет удерживать фрагменты в буфере в течение шестидесяти секунд и собирать их заново. Если ничего больше не придет, пакеты будут отброшены. Идея состояла в том, чтобы сперва передать возможные заключительные фрагменты пакета, а затем передать корректный средний или начальный фрагмент и позволить коммутатору собрать весь пакет. Скорость линии была настолько медленной, что на этом можно было сэкономить сотни микросекунд.


Мы подправили код сетевого стека, чтобы проверить эту идею. Фрагментированные пакеты сначала не работали. Однако, после сокращения интервала между фрагментами до менее двух секунд всё славно завелось. Похоже, что коммутатор рассматривал фрагменты пакетов как атаку типа "отказ в обслуживании" или что-то подобное, если интервал был слишком большим. Он, вероятно, должен был бы не пропускать их вообще, но кто мы такие, чтобы с ним спорить? Используя этот подход, вы могли бы иметь заготовленные пакеты, ожидающие прямо в пути, чтобы потом быть объединёнными с другими фрагментами. Однако, двухсекундный интервал был проблемой, поскольку мы потребляли много ценной пропускной способности, пытаясь сохранить этот временный кэш пакетов живым. У нас была идея получше.


Мы уже отправили первую часть сообщения в первом пакете. Почему бы не отправить более позднюю часть пакета со следующим порядковым номером TCP плюс один, а затем отправить среднюю часть последовательности вне этой нумерации, содержащую тикер, цену и количество?
Эта заключительная часть пакета имела довольно большие пользовательские поля, поэтому мы сэкономили бы огромное количество времени и получили бы гораздо больше, чем с предварительной отправкой, которую мы уже делали. Было лишь одно большое препятствие для этого плана.


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


image


Если бы последние байты пакета с ордером могли быть случайным мусором, это не имело бы значения, так как расшифровка превратила бы мусор в мусор (что было бы приемлемо.) К сожалению, должны быть заполнены некоторые важные поля после большого пользовательского поля в хвосте пакета. Кроме того, биржа KRX боялась нулевых байт в пакетах. Она и её технологический провайдер этого не допускали. У Koscom, казалось, был необоснованный страх, что что-то может взорваться или преждевременно завершиться, если бы в пакете присутствовал нулевой байт. Однако, иметь кучу нулей в зашифрованном потоке разрешалось, поскольку его они не могли контролировать. Шифротекст с нулями как бы заставлял сделать мини-перезагрузку (сброс состояния) в последовательности блоков из-за операции CBC XOR с одним нулевым операндом. То есть достаточно сгенерировать данные, после шифрования которых возникал нулевой байт, чтобы прервать цепочку зависимости блоков друг от друга. Эти сгенерированные данные могут приводить к чему угодно после расшифровки, даже к незаконным нулевым байтам.


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


Машинное обучение


Самое значительное улучшение, которое мы когда-либо внесли в стратегию, пришло не от этих низкоуровневых трюков. Мы использовали случайный лес (RF) для работы в качестве слоя машинного обучения для предсказания будущей теоретической цены. Сначала я поручил эту задачу одному из моих PhD в фирме (у нас их было шесть.) Он, казалось, был гением математики и имел PhD по физике по какой-то сингулярной космологической модели, а также был моим хорошим другом, которого я нанял несколько лет назад и научил его C++. Впоследствии он читал лекции по C++ в университете Квинсленда. Я также нанял одного из его аспирантов, которых он учил С++ (забавно, что в компании было несколько поколений обучавшихся этому языку.) Я поручил ему разработать для стратегии слой машинного обучения с помощью RF. Он вернулся через пару месяцев и показал мне все вещи, которые он пробовал и которые не работали, а затем объяснил мне, почему это вообще никогда не будет работать и почему это всё пустая трата времени.


Я уже сталкивался с этим методом в аспирантуре, поэтому решил, что лучше опять всё делать самому. Я взял пакет OpenDT v5.2, который работал через MPI на нашем кластере из mini-ITX плат. Сейчас он вырос до более чем тысячи ядер с материнскими платами, прикрученными шурупами к полкам стеллажа из ДСП-панелей и источниками питания, расположенными на металлических полках с дырками сверху. Две недели работы OpenDT на этом кластере помогли мне сделать достойное решение. Я мог бы повторить тот результат, используя оригинальный код от автора метода Random Forest, Лео Бримана. Я перекинул свои наработки через забор мистеру Л. (тому парню, который отправил тысячу ордеров в секунду на биржу, что почти убило нас тогда) чтобы выкатить в продакшн. Он был приличным программистом (хотя и замкнутым чуваком) и всё было готово через две недели. Мы увидели немедленный прирост прибыли примерно на треть – это был хороший месяц.


Дальнейшие улучшения и корректировки в ML-слое дали большую отдачу. Мы стали очень зависимы от этого. Создание случайного леса с быстрым откликом было тяжелой работой, так как доступ к огромному объему памяти в случайном порядке является проклятием low latency. В более поздних проектах я делал это чуть лучше. Примерно через год или около того стало ясно, что если мы отключим ML – мы вообще не будем зарабатывать деньги. Однако, мы никогда толком не исследовали вопрос, было ли это связано с нашей стратегией или одной низкой задержки больше не было достаточно, чтобы выигрывать. Я подозреваю, что второе. Я видел умных игроков, таких как Jump, устанавливающих десятки серверов в Корее, и они явно не использовали их на холостом ходу. В воздухе витало достаточное количество ML.


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


Канарейка


Еще один хак, который я, вероятно, должен упомянуть, является общеизвестным – это технология канарейки. CME была подвергнута критике многими трейдерами некоторое время назад, поскольку Wall Street Journal опубликовал исследование, в котором показал, что некоторые трейдеры получали исполнение своих ордеров еще до прихода рыночных данных, которые привели бы к выставлению этих ордеров, и этот выигрыш в скорости давал им преимущество над обычными участниками. Это ошибочный аргумент, поскольку скорости двух таких разных процессов никогда не смогут быть одинаковыми. Это скорее повод для введения дополнительного кода обработки, чтобы получать информацию одновременно из медленного канала маркет-данных и быстрого канал уведомлений об исполнении ордера.


Есть несколько бирж, где ситуация другая. Nasdaq была одной из первых бирж, на которой рыночные данные приходили быстрее, чем уведомления о ордерах. Это была ловушка для молодых игроков, не ожидавших такого.


В мои первые опыты на KRX канарейка могла бы сработать за секунду до получения рыночных данных. Напомню, что канарейка – это лимитный ордер, который вы заранее выставили в глубине стакана, а не на лучшем уровне. Таким образом, когда рынок внезапно перескакивает на новый ценовой уровень, ваша канарейка начинает петь, позволяя вам узнать о движении за секунду до остального рынка. Если вы не можете заработать и на этом, ваш череп, должно быть, заполнен камнями вместо мозгов. Ну, и я нашел несколько камней в своей голове.


Это было странно. Иногда, отличия в ценах по двум этим каналам было настолько велики, что вы могли видеть, как рынок идёт вверх, а затем вниз. Если наивно купить на этом первом движении вверх, рынок может создать вам проблемы, когда он пойдет вниз. Вы же могли бы вместо этого попытаться определить заранее время этих событий, чтобы вы могли купить внизу и сразу же продать свои контракты.


Слишком много знаний было забавной проблемой. Мы интегрировали этот код в наш обработчик данных. Один из парней, мистер Ф., назвал это событие "звездной силой", как у братьев Марио.


Джиттер против задержки


Вы можете вспомнить, как интеграция трех бирж в KRX на самом деле не повлияла на фьючерсы и опционы KOSPI, поскольку они уже торговались в Сеуле на KSE. Объединённая биржа KRX закрыла дата-центр в Пусане и все переехали в Сеул. Однако, правительство не достигло своих политических целей и пусанский дата-центр в конце концов снова открылся.


Банками и брокерами в Сеуле было потрачено много денег на эти переезды. Иногда получалось, что между двумя дата-центрами в Пусане не было пиринга, и рыночные данные сперва уходили в Сеул, а затем обратно. Непорядок. Только сейчас, в 2016 году, биржа KRX переехала обратно, чтобы всё было сосредоточено в Пусане. До этого лучшим решением было собирать маркет-данные в Сеуле, а ордера отправлять в Пусан – дорого и неэффективно. Все HFT-фирмы (такие же как мы) рассматривали возможность строительства собственных линий между Сеулом и Пусаном, однако, Koscom запретил делать это, чтобы не потерять свои доходы. Вы могли только покупать дорогие линии от Koscom, что и делали все брокеры. Как правило, вы боролись за каналы, которые давали задержку от 2.9 до 3.1 миллисекунд. Довольно медленно для 300 км прямого кабеля или 400-километровой автомобильной дороги. Лишь в последние пару лет появилось несколько микроволновых радиорелейных линий.


В то же время дата-центр KRX превратился из крупнейшей в мире коммерческой платформы на оборудовании HP/Compaq/Tandem в платформу на AIX, работающую на архитектуре IBM PowerPC. Перед этой миграцией мы получали пинг 11-12 мс в оба конца (RTT) на линиях отправки ордеров с джиттером около 130 мс. После переезда в Пусан, пинг стал более 20ms, но джиттер снизился до 30ms. Несмотря на то, что задержки в среднем удвоились, уменьшение джиттера сделало нашу стратегию более эффективной.


Это похоже на тот случай, когда CME уменьшила джиттер заменив свои шлюзы на оборудование от iLink на базе FPGA. Случайность уменьшается и скорость становится более важной. Разница с Кореей заключалась в том, что задержка фактически выросла для KRX, но как трейдеров нас это не волнует, важнее ответ на другой вопрос – стоят ли мои усилия этого? Новая платформа улучшила нашу рентабельность инвестиций в Корее. Точно так же я ожидаю, что меньший джиттер, как следствие постоянного уменьшения задержек внутри биржи (не только на CME, но и на биржах по всему миру) будет продолжать разделять трейдеров на умеющих быстро торговать и не умеющих. Задержки продолжают иметь значение, даже если и не являются критическим моментом.


Соревнование


Стоит упомянуть, что произошло, когда в Корею пришёл Getco. Я мало что о них знаю в практическом смысле. Первое, что я услышал, это постоянные жалобы от брокеров. Getco управляет довольно трудными сделками и, раз, они умеют на этом зарабатывать, это сработало и в Корее. Ходили слухи о потрясающих сделках с самими брокерами, чтобы те могли увеличить свою долю рынка. Возможно, это не слишком отличается от канадской сделки с CIBC? По слухам, тогда Getco заплатила очень низкую фиксированную цену (возможно, всего в несколько тысяч долларов) за канадского брокера, чтобы обеспечить долю рынка для CIBC.


Я начал читать отчёты о занятии Getco 5% рынка. Кто-то сказал мне, что эта цифра была ближе к 15%. Многие брокеры жалуются на своих клиентов, не получая от тех достаточного количества комиссии. Местное сообщество довольно громко и расстроенно обсуждало приход Getco. Но мы не расстраивались ни капли, вообще. Мы были достаточно диверсифицированы и торговали стратегии, которых не было у других, поэтому очень немногие люди вообще могли понять, что у нас происходит. Однако это послужило уроком – Getco привёл новых людей, торгуя более эффективные стратегии. Многие люди лишаются доходов и жалуются, пресса раскручивает скандал. Вы начинаете читать истории о том, насколько несправедлив рынок. Это не так – просто эхо от криков проигравших. Это печальная история, которую вы слышите на рынках снова и снова, когда трейдеры борются за рыночные неэффективности и эффективность своих технологий. Рынок улучшается, но жалобы становятся всё громче.


То, что делали мы, работало и было приемлемо в Корее, и это было приемлемо во многих других странах. Но не, например, в Eurex. Правила различаются от рынка к рынку. Если вы портфельный менеджер, теперь вы понимаете, что уже не хотите играть в эту игру. Это жесткая конкуренция, с сотнями умных трейдеров, вроде меня, постоянно готовящих новые стратегии. Но играть именно на этом поле вам не и нужно. Высокочастотный трейдер вроде меня ориентирован на следующий тик. Это всё, что нас волнует. Мы тратим огромные объемы ресурсов на то, чтобы вытеснить наших коллег-HFTшников на следующий тик. Мне плевать на вашу портфельную альфу. Это за пределами моего горизонта, вне моей заботы.


Я много проигрываю и много выигрываю в течение дня. Описываемую тут HFT-фирму, которую основал в мае 2005 года я покинул в январе 2011. У нас было всего восемь убыточных дней за всё это время по нашей основной торговой стратегии. В четыре из них убыток составил менее 1000 USD и во все из них он был меньше 10 000 долларов США. Это не так хорошо, как у знаменитой компании Virtu (1 день из примерно 1200 по их документам для IPO), но я смирился. Однако помните, что среди сделок очень много таких, которые не могут похвастаться высоким финансовым результатом. Мы зарабатываем только маленькую часть спреда, обычно 10% в обычный день, 5% в плохой и 20% в хороший день. Дни экспираций опционов иногда давали нам 50%, так как многие трейдеры стараются не торговать такие пятницы каждый месяц.


Закон больших чисел позволяет HFT зарабатывать деньги каждый день. Тот же самый закон указывает, что если мы потеряем технологическое преимущество – мы либо не сможем торговать вообще, либо будем терять деньги каждый день. HFT-компании часто разоряются и уходят. Это жёсткая индустрия, постоянно углубляющаяся в инфраструктуру и микроструктуру рынка для того чтобы улучшить свою эффективность. И это будет неблагодарной работой, если люди не понимают, что сегодняшний петух может мгновенно превратиться в перьевую подушку, когда такая компания, как Getco, приходит в ваш город. Я уверен, что приход Jump также вызвал появление нескольких пыльных подушек.


Корея – забавное место, так как в инфраструктуре биржи KRX всё ещё полный бардак. Существует гораздо больше идей, которые можно реализовать в медленной, неуклюжей и тайной инфраструктуре. HFTшники любят беспорядок, поскольку они могут копаться в нём и найти преимущества для себя. Это не так сложно, просто нужно больше внимания к самым мелким деталям, ведь любая сложность состоит из простых вещей. Как ни странно, HFTшники ненавидят колокацию на бирже и низкую задержку, поскольку там найти себе преимущество гораздо сложнее. HFTшники также любят площадки, о которых мало кому известно… Никто не хочет попасть в засаду.


Портфельному управляющему


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


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


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


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




Ранее было опубликовано под псевдонимом Томас Андерсон. В этом тексте отсутствуют секс, наркотики и рок-н-ролл из оригинального черновика, поскольку это не добавило бы ничего к торговой истории. Возможно, это поможет оправдать моё решение отказаться от работы, которая мне нравилась. Во всяком случае, всё это лучше оставить недосказанным, даже если будет упущено какое-то личное отношение.

Теги:
Хабы:
Всего голосов 41: ↑38 и ↓3+35
Комментарии79

Публикации

Истории

Ближайшие события

7 – 8 ноября
Конференция byteoilgas_conf 2024
МоскваОнлайн
7 – 8 ноября
Конференция «Матемаркетинг»
МоскваОнлайн
15 – 16 ноября
IT-конференция Merge Skolkovo
Москва
28 ноября
Конференция «TechRec: ITHR CAMPUS»
МоскваОнлайн
25 – 26 апреля
IT-конференция Merge Tatarstan 2025
Казань