Выбор места для сервера и софта, тестирование рыночной неэффективности: как на самом деле создают торговых роботов

http://www.financial-hacker.com/hacking-hft-systems/
  • Перевод


Автор блога Financial Hacker рассказал о том, как на самом деле устроен процесс разработки высокочастотных стратегий для торговли на бирже — от важности анализа возможных задержек, до вопросов получения данных и тестирования (все с примерами кода). Для примера используется стратегия арбитражной торговли на американских биржах. Мы подготовили адаптированный перевод этого материала.

Введение


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

Преимущество HFT в получении рыночных данных и исполнении своих заявок раньше большинства участников. Итоговая прибыльность системы зависит от ее скорости задержки, временем между получением котировки и исполнением заявки в торговом ядре биржи. Задержка (latency) — наиболее релевантный фактор при оценке HFT-системы. Его можно оптимизировать двумя способами: минимизируя физическое расстояние до биржи, и увеличивая скорость работы самой системы. И первое гораздо важнее второго.

Местоположение


В идеале, HFT-сервер должен быть расположен прямо на бирже. И большинство торговых площадок в мире с удовольствием продают серверные места в своих дата-центрах — чем ближе к хабу главной сети биржи, тем лучше считается место. Электрические сигналы в экранированном проводе передаются со скоростью в 0,7 — 0,9 от скорости света (300 км/мс). Сокращение расстояния до источника сигнала на один метр выливается в целых 8 наносекунд преимущества в раундтрипе (времени от отправк заявки до получения информации об ее исполнении). Сколько торговых возможностей можно упустить за 8 наносекунд? Никто не знает, но люди готовы платить за каждую сэкономленную наносекунду.

К сожалению (или к счастью с точки зрения экономии — размещение в дата-центрах бирж стоит огромных денег), анализируемая в данной статье HFT-система по ряду причин не может быть размещена на колокации в ЦОД торговой площадки. При этом для торговли ей нужно получать данные с бирж NYSE в Нью-Йорке и CME (Чикаго) одновременно.

Между двумя этими городами протянуты высокоскоростные кабели, а также функционирует микроволновая сеть. В теории, идеальное расположение для системы c аналогичными требованиями — это городок Уоррен, штат Огайо. Он расположен ровно посередине между Нью-Йорком и Чикаго. Неизвестно, есть ли там хаб для высокоскоростных торговцев, однако расстояние в 357 миль до обеих бирж выливается примерно в 4 мс задержку раундтрипа.

image

Уоррен, Огайо – Мекка HFT торговцев (изображение: Jack Pearce / Wikipedia Commons)

Вне всяких сомнений, сервер в этом чудесном городке обойдется гораздо дешевле сервера в стойке на бирже в Нью-Йорка. Идея для стартапа: купить пару гаражей в Уоррене, подключиться к высокоскоростному кабелю между Нью-Йорков и Чикаго и зарабатывать, сдавая серверные стойки!

Софт


Когда вы уже вложили деньги в выбор оптимальной локации и каналы связи для HFT-системы, вам определенно захочется получить и софт, который будет соответствовать необходимой скорости. Коммерческие торговые платформы обычно недостаточно быстры, к тому же их код всегда закрыт, точно неизвестно, что и как в них работает. Поэтому HFT-системы почти никогда не базируются на существующих платформах, а пишутся с нуля. Не на R или Python, а на каком-либо из «быстрых» языков. В этот список входят:

  • C или C++ — отличная комбинация высокоуровневости и высокой скорости. C легко читать, при этом он почти также быстр и эффективен, как машинные языки.
  • Pentium Assembler — напишите свой алгоритм с помощью машинных инструкций и он обгонит даже разработанные на C системы. Из минусов такого подхода: поддерживать такой код будет непросто, все программисты знают, насколько тяжело читать программы на ассемблере, написанные кем-то другим.
  • CUDA, HLSL или ассемблер GPU — если алгоритм активно использует векторные или матричные операции, то запустить его на видеокарте может быть отличное идеей.
  • VHDL — если любой софт будет слишком медленным, а успех сделки для конкретного алгоритма будет зависеть от наносекунд, то «ультимативным решением» здесь будет кодирование системы напрямую в железе. В VHDL можно определять арифметические единицы, цифровые фильтры и секвенсоры FPGA чипов с тактовой частотой до нескольких сотен мегагерц. Такие чипы можно напрямую подключать к сетевому интерфейсу.

За исключением VHDL, все вышеописанное должно быть знакомо многим специалистам (особенном разработчикам компьютерных игр в 3D). Но стандартным языком для высокочастотной стратегии можно назвать C/C++. В этом материале используется именно он.

Алгоритм


Многие HFT-системы «охотятся» на трейдеров-конкурентов с помощью «методов обгона». Они замечают вашу заявку, а затем покупают тот же актив по той же цене на пару микросекунд раньше вас и продают его вам чуть дороже, зарабатывая на этом. На некоторых биржах такая торговля запрещена для создания равных условий для всех участников, другие площадки могут это разрешать, надеясь больше заработать на комиссиях. В примере из этой статьи подобные механизмы использоваться не будут, вместо этого будет описана арбитражная стратегия. Предположим, что наши серверы расположены в Уоррене и у нас есть высокоскоростной канал до Чикаго и Нью-Йорка.

Арбитраж будет происходить между финансовыми инструментами ES и SPY. ES — это торгуемый в Чикаго фьючерс S&P500. SPY — торгуемая в Нью-Йорке ETF, которая также привязана к индексу S&P500. Один пункт ES равняется 10 центам SPY, так что цена ES примерно в десять раз выше SPY. Поскольку оба актива основаны на одном и том же индексе, можно ожидать высокой корреляции их цен. Существуют публикации, авторы которых доказывают, что эта корреляция будет «ломаться» на небольших временных отрезках. Любая возникающая на короткое время разница в ценах пары ES-SPY, превышающая спред бид-аск, создает возможности для арбитража. Алгоритм из примера будет работать по следующей стратегии:

  • Определять разницу SPY-ES.
  • Определить ее отклонение от среднего.
  • Если отклонение превышает спред бид-аск и выходит за определенное пороговое значение, то открываются позиции в ES и SPY в противоположных направлениях.
  • Если отклонение разворачивает свое направление и превышает заданный (чуть меньший) порог, позиции закрываются.

Алгоритм записан на C. Если вы до этого никогда не видели кода HFT-алгоритмов, он может показаться немного странным:

#define THRESHOLD  0.4  // Entry/Exit threshold 

// Алгоритм HFT арбитража 
// возвращает 0 для закрытия всех позиций
// возвращает 1 для открытия длинной позиции по ES, короткой по SPY 
// возвращает 2 для открытия короткой позиции по SPY, длинной по ES
// в противном случае возвращает -1 
int tradeHFT(double AskSPY,double BidSPY,double AskES,double BidES)
{
	double SpreadSPY = AskSPY-BidSPY, SpreadES = AskES-BidES;
	double Arbitrage = 0.5*(AskSPY+BidSPY-AskES-BidES);

	static double ArbMean = Arbitrage;	
	ArbMean = 0.999*ArbMean + 0.001*Arbitrage;
	static double Deviation = 0;
	Deviation = 0.75*Deviation + 0.25*(Arbitrage - ArbMean);

	static int Position = 0;	
	if(Position == 0) {
		if(Deviation > SpreadSPY+THRESHOLD)
			return Position = 1;
		if(-Deviation > SpreadES+THRESHOLD)
			return Position = 2;
	} else {
		if(Position == 1 && -Deviation > SpreadES+THRESHOLD/2)
			return Position = 0;
		if(Position == 2 && Deviation > SpreadSPY+THRESHOLD/2)
			return Position = 0;
	}
	return -1;	
}

Функция traderHFT вызывается из некого фреймворка (в статье он не рассматривается), который получает котировки и отправляет приказы. В качестве параметров используются текущие лучшие цены на покупку и продажу по ES и SPY из верхней части книги заявок (предполагается, что цена SPY умножается на десять, чтобы оба актива находились в одном масштабе). Функция возвращает код, который говорит фреймворку, открывать или закрывать позиции, или ничего не делать. Переменная Arbitrage представляет средняя разница цен между SPY и ES. Ее среднее (ArbMean) фильтруется медленной экспоненциальной скользящей средней, а Deviation от среднего также фильтруется быстрой скользящей средней для предотвращение реакций на котировки вне нужного диапазона. Переменная Position обозначает машинное состояние, которое может принимать значение лонг, шорт и ничего. Пороговое значение для входа или выхода из позиции (Threshold) установлен на отметке в 40 центов. Это единственный регулируемый параметр системы. Если бы стратегия предназначалась для реальной торговли, нужно было бы также оптимизировать пороговое значение с использованием нескольких месяцев данных по ES и SPY.

Такую минималистичную систему совсем не трудно перевести на ассемблер или даже запрограммировать в чипе FPGA. Однако такой необходимости нет: даже если использовать для компиляции компилятор фреймворка Zorro (его развивает автор статьи), функция tradeHFT исполняется всего за 750 наносекунд. Если использовать более продвинутый компилятор вроде Microsoft VC++, это значение можно снизить до 650 наносекунд. Поскольку время между двумя котировками по ES составляет 10 микросекунд или более, скорости C вполне достаточно.

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

Данные


Для бэктестинга HFT-системы данные, которые можно обычно получить у брокеров бесплатно, не подойдут. Нужно раскошелиться на покупку данных по книге заявок в нужном разрешении или данных BBO (Best Bid and Offer), с включенными временными метками биржи. Без информации о том, в какое время котировка была получена на бирже, определить максимальную задержку не получится.

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

typedef struct T1    // single tick
{
	double time; // time stamp, OLE DATE format
	float fVal;  // positive = ask price, negative = bid price	
} T1; 

Одна из компаний, отслеживающих ситуацию на бирже CME, поставляет данные в формате CSV с множеством дополнительных полей, большинство из которых для решаемой задачи не нужны. Все котировки за день хранятся в одном CSV-файле. Ниже скрипт для «вытягивания» из него данных по ES за декабрь 2016 и его конвертации в датасет котировок Т1:


//////////////////////////////////////////////////////
// Convert price history from Nanotick BBO to .t1
//////////////////////////////////////////////////////

#define STARTDAY 20161004
#define ENDDAY   20161014

string InName = "History\\CME.%08d-%08d.E.BBO-C.310.ES.csv";  // name of a day file
string OutName = "History\\ES_201610.t1";
string Code = "ESZ";	// December contract symbol

string Format = "2,,%Y%m%d,%H:%M:%S,,,s,,,s,i,,";  // Nanotick csv format
void main()
{
	int N,Row,Record,Records;
	for(N = STARTDAY; N <= ENDDAY; N++)
	{
		string FileName = strf(InName,N,N+1);
		if(!file_date(FileName)) continue;
		Records = dataParse(1,Format,FileName);  // read BBO data
		printf("\n%d rows read",Records);
		dataNew(2,Records,2);  // create T1 dataset
		for(Record = 0,Row = 0; Record < Records; Record++)
		{
			if(!strstr(Code,dataStr(1,Record,1))) continue; // select only records with correct symbol
			T1* t1 = dataStr(2,Row,0);  // store record in T1 format
			float Price = 0.01 * dataInt(1,Record,3);  // price in cents
			if(Price < 1000) continue;  // no valid price
			string AskBid = dataStr(1,Record,2);
			if(AskBid[0] == 'B')  // negative price for Bid
				Price = -Price;
			t1->fVal = Price;
			t1->time = dataVar(1,Record,0) + 1./24.;  // add 1 hour Chicago-NY time difference
			Row++;
		}
		printf(", %d stored",Row);
		dataAppend(3,2,0,Row);  // append dataset
		if(!wait(0)) return;
	}
	dataSave(3,OutName);  // store complete dataset
}

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

Компания, отслеживающая Нью-Йоркскую биржу, поставляет данные в сильно сжатом специально формате NxCore Tape, его нужно сконвертировать во второй список Т1 с помощью специального плагина:

//////////////////////////////////////////////////////
// Convert price history from Nanex .nx2 to .t1
//////////////////////////////////////////////////////

#define STARTDAY 20161004
#define ENDDAY 	 20161014
#define BUFFER	 10000

string InName = "History\\%8d.GS.nx2";  // name of a single day tape
string OutName = "History\\SPY_201610.t1";
string Code = "eSPY";

int Row,Rows;

typedef struct QUOTE {
	char	Name[24];
	var	Time,Price,Size;
} QUOTE;

int callback(QUOTE *Quote)
{
	if(!strstr(Quote->Name,Code)) return 1;
	T1* t1 = dataStr(1,Row,0);  // store record in T1 format
	t1->time = Quote->Time;
	t1->fVal = Quote->Price;
	Row++; Rows++;
	if(Row >= BUFFER)	{   // dataset full?
		Row = 0;
		dataAppend(2,1);    // append to dataset 2
	}
	return 1;
}


void main()
{
	dataNew(1,BUFFER,2); // create a small dataset
	login(1);            // open the NxCore plugin
	
	int N;
	for(N = STARTDAY; N <= ENDDAY; N++) {
		string FileName = strf(InName,N);
		if(!file_date(FileName)) continue;
		printf("\n%s..",FileName);
		Row = Rows = 0;  // initialize global variables
		brokerCommand(SET_HISTORY,FileName); // parse the tape
		dataAppend(2,1,0,Row);  // append the rest to dataset 2
		printf("\n%d rows stored",Rows);
		if(!wait(0)) return;  // abort when [Stop] was hit
	}
	dataSave(2,OutName); // store complete dataset
}

Функция Callback вызывается любой котировкой в исходном файле, однако большая часть данных не нужна, поэтому отфильтровываются только котировки по SPY (“eSPY”).

Подтверждение рыночной неэффективности


Получив данные из двух источников, теперь мы можем сравнивать цены ES и SPY в высоком разрешении. Вот типичный десятисекундный семпл из кривых цен:

image

SPY (черный) vs. ES (красный), 5 октября, 2017, 10:01:25 – 10:01.35

Разрешение здесь — одна миллисекунда. ES отрисован в долларовых единицах, SPY — в десятицентовых. Цены на графики — это цены «аск» (запрашиваемая цена). Кажется, что цены сильно коррелируют даже на столь малом интервале. ES чуть отстает.

Возможность для арбитража возникает на участке в центре — примерно в 10:01:30 ES реагировал на изменения чуть медленнее, но сильнее. Причиной могло послужить какое-то событие вроде резкого скачка цен одной из акций, входящих в индекс S&P 500. На протяжение нескольких миллисекунд разница ES-SPY превысила спред бид-аск двух активов (обычно это 25 центов по ES и 1-4 цента по SPY). В идеале, здесь можно было бы продать ES и купить SPY. Таким образом, мы подтвердили ранее предполагаемое в теории наличие рыночной неэффективности, открывающей возможности для заработка.

Скрипт для отрисовки графиков в высоком разрешении:

#define ES_HISTORY	"ES_201610.t1"
#define SPY_HISTORY	"SPY_201610.t1"
#define TIMEFORMAT	"%Y%m%d %H:%M:%S"
#define FACTOR		10
#define OFFSET		3.575

void main()
{
	var StartTime = wdatef(TIMEFORMAT,"20161005 10:01:25"),
		EndTime = wdatef(TIMEFORMAT,"20161005 10:01:35");
	MaxBars = 10000;
	BarPeriod = 0.001/60.;	// 1 ms plot resolution
	Outlier = 1.002;  // filter out 0.2% outliers

	assetList("HFT.csv");
	dataLoad(1,ES_HISTORY,2);
	dataLoad(2,SPY_HISTORY,2);
	int RowES=0, RowSPY=0;
	
	while(Bar < MaxBars)
	{
		var TimeES = dataVar(1,RowES,0), 
			PriceES = dataVar(1,RowES,1), 
			TimeSPY = dataVar(2,RowSPY,0), 
			PriceSPY = dataVar(2,RowSPY,1);

		if(TimeES < TimeSPY) RowES++;
		else RowSPY++;

		if(min(TimeES,TimeSPY) < StartTime) continue;
		if(max(TimeES,TimeSPY) > EndTime) break;

		if(TimeES < TimeSPY) {
			asset("ES");
			priceQuote(TimeES,PriceES);
		} else {
			asset("SPY");
			priceQuote(TimeSPY,PriceSPY);
		}
		
		asset("ES");
		if(AssetBar > 0) plot("ES",AskPrice+OFFSET,LINE,RED);
		asset("SPY");
		if(AssetBar > 0) plot("SPY",FACTOR*AskPrice,LINE,BLACK);
	}
}

Сначала скрипт считывает два файла с историческими данными, которые мы создали ранее, а затем парсит их построчно.

Тестирование системы


Для бэктестинга получившейся HFT-системы необходимо немного изменить скрипт, и вызвать функцию tradeHFT в цикле:

#define LATENCY		4.0	// milliseconds

function main()
{
	var StartTime = wdatef(TIMEFORMAT,"20161005 09:30:00"),
		EndTime = wdatef(TIMEFORMAT,"20161005 15:30:00");
	MaxBars = 200000;
	BarPeriod = 0.1/60.;	// 100 ms bars 
	Outlier = 1.002;

	assetList("HFT.csv");
	dataLoad(1,ES_HISTORY,2);
	dataLoad(2,SPY_HISTORY,2);
	int RowES=0, RowSPY=0;
	
	EntryDelay = LATENCY/1000.;
	Hedge = 2;
	Fill = 8; // HFT fill mode;
	Slippage = 0;
	Lots = 100;
		
	while(Bar < MaxBars)
	{
		var TimeES = dataVar(1,RowES,0), 
			PriceES = dataVar(1,RowES,1),
			TimeSPY = dataVar(2,RowSPY,0),
			PriceSPY = dataVar(2,RowSPY,1);

		if(TimeES < TimeSPY) RowES++;
		else RowSPY++;

		if(min(TimeES,TimeSPY) < StartTime) continue;
		if(max(TimeES,TimeSPY) > EndTime) break;

		if(TimeES < TimeSPY) {
			asset("ES");
			priceQuote(TimeES,PriceES);
		} else {
			asset("SPY");
			priceQuote(TimeSPY,FACTOR*PriceSPY);
		}
		
		asset("ES");
		if(!AssetBar) continue;
		var AskES = AskPrice, BidES = AskPrice-Spread;
		asset("SPY");
		if(!AssetBar) continue;
		var AskSPY = AskPrice, BidSPY = AskPrice-Spread;

		int Order = tradeHFT(AskSPY,BidSPY,AskES,BidES);	
		switch(Order) {
			case 1: 
			asset("ES"); enterLong();
			asset("SPY"); enterShort();
			break;
		
			case 2: 
			asset("ES"); enterShort();
			asset("SPY"); enterLong();
			break;
		
			case 0:
			asset("ES"); exitLong(); exitShort();
			asset("SPY"); exitLong(); exitShort();
			break;
		}
	}
	printf("\nProfit %.2f at NY Time %s",
		Equity,strdate(TIMEFORMAT,dataVar(1,RowES,0)));
}

Скрипт запускает бэктест для одного торгового дня в период с 9:30 до 15:30 по Нью-Йорку. По сути, просто происходит вызов функции HFT с ценами ES и SPY, а затем выполняется код для переключения состояний. Он открывает позиции по ста единицам каждого актива (2 контракта по ES и 1000 по SPY). Задержка устанавливается с помощью переменной EntryDelay. В режиме HFT (Fill = 8) сделка проходит по последней цене после времени задержки. Это позволяет приблизить симуляцию к реальным условиям.

В таблице ниже показана прибыль по итогам симуляции с разными значениями задержки:
Задержка 0.5 мс 4.0 мс 6.0 мс 10 мс
Прибыль / день + $793 + $273 + $205 – $15

Как видно, арбитражная стратегия ES-SPY может зарабатывать по $800 в день — при нереалистично маленькой задержке в 500 микросекунд. К сожалению, при наличии 700 миль между NYSE и CME, чтобы добиться такого результата понадобится машина времени (или какой-то инструмент квантовой телепортации). Сервер в Уоррене, штат Огайо, при задержке в 4 мс принесет примерно $300 в день. Если сервер будет чуть в стороне от высокоскоростного канала между Нью-Йорков и Чикаго, прибыль составит $200. Если инфраструктура для торговли будет еще дальше — скажем, в Нэшвилле — то заработать не удастся ничего.

Даже $300 в день выльются в годовой доход на уровне $75 000. Но для достижения такого результата понадобится, помимо железа и софта, еще и много денег. Контракт SPY стоит $250, 100 единиц для торговли выльются в 100*$2500 + 100*10*$250 = полмиллиона долларов объема торгов. Так что годовой возврат на инвестиции не превысит 15%. Результаты, однако, можно улучшить, добавив больше пар финансовых инструментов для арбитража.

Выводы


  • Если система реагирует достаточно быстро, заработать она может даже очень примитивными методами, вроде арбитража между сильно коррелированными финансовыми инструментами на разных биржах.
  • Физическое расположение сервера очень важно в HFT.
  • ES-SPY арбитраж нельзя проводить откуда угодно. Вам придется соперничать с теми, кто уже этим занимается, и весьма вероятно из Уоррена в штате Огайо.

Другие материалы по теме финансов и фондового рынка от ITI Capital:


ITI Capital 175,72
Лучший онлайн-брокер для работы на бирже
Поделиться публикацией
Комментарии 33
    +1
    Электрические сигналы в экранированном проводе передаются со скоростью в 0,7 — 0,9 превышающую скорость света (300 км/мс).
    Это как?
    0
    	static int Position = 0;	
    	if(Position == 0) {
    

    хм
      0
      Так static же
        0

        Это же статическая переменная. Она инициализируется только один раз, при первом вызове функции, где она объявлена.

          0
          Так это ж статическая переменная. В первый раз ноль, потом неизвестно
            0
            Спасибо, пацаны. Я всё понял.
            0

            Такое впечатление, что все ошибки намеренно собраны в 1 статье


            1 Если использовать более продвинутый компилятор вроде Microsoft VC++, это значение можно снизить до 650 наносекунд.


            FPGA в HFT, насколько я знаю, используют не для того, чтобы ускорить выполнение одной итерации cpu bound кода, а для того, чтобы убрать передачу данных с сетевой на cpu и назад. Там будут задержки всяко побольше. Даже с использованием спец драйверов.


            2 Автор предлагает покупать данные с биржевыми метками таймстампа, но там нет реального времени, когда пакет пришел на сетевую. Таким образом можно узнать, когда возникла неэффективность, но хз, когда о ней можно было узнать, имея даже самую продвинутую коллокацию.


            3 Зачем-то автор решил поумничать и рассчитать годовую доходность, но любой человек, сделавший хоть 1 сделку, знает о плече. И для интрадея оно может и на шару обойтись, если день в день закрывать. А для фьючерсов вообще отдельная песня.

              0
              3 Зачем-то автор решил поумничать и рассчитать годовую доходность, но любой человек, сделавший хоть 1 сделку, знает о плече. И для интрадея оно может и на шару обойтись, если день в день закрывать. А для фьючерсов вообще отдельная песня.
              Могу и ошибаться. Но думаю, что весь вопрос в состоянии счета, для внутредневной торговли требования вроде выше чем для торговли вне одного дня.
                0
                DayTrading Pattern есть, но он лишь о том, что обладатели маленьких счетов (до 20 или 25К) не имеют право интрадеить в принципе (но в данном случае подразумеваются куда большие суммы, да и через проп конторки правило обходится). А так, наоборот, всегда лояльнее требования к гарантийному обеспечению внутри дня. Для брокера головная боль — когда клиент теряет больше денег. чем у него есть. А интрадей при таком же плече дает намного меньше риск, чем перенос через ночь
              0

              сделка проходит по последней цене после времени задержки


              Это тоже классно конечно. Особенно на инструментах с гигантским тиком, как es

                0
                > размещение в дата-центрах бирж стоит огромных денег
                миллион баксов? миллиард? триллион? «огромных денег» это сколько
                  0
                  > Многие HFT-системы «охотятся» на трейдеров-конкурентов с помощью «методов обгона». Они замечают вашу заявку
                  как?

                  >В примере из этой статьи подобные механизмы использоваться не будут,
                  уф. а я то думал сейчас будет срыв покровов и разоблачения. сколько раз слышал этот трындеж про front running и так ни один чел не показал как же он вообще в принципе работает. Даже Майкл Льюис внятно ничего объяснить не мог — как и каким образом кто что может увидеть мою заявку __до того__ как она обработалась торговым движком биржи
                    0
                    с помощью «методов обгона». Они замечают вашу заявку как?

                    Не уверен на 100%, но идея в том, что заявки доолжны исполняться по самой лучшей цене в Америке. Если, заявка исполнилась частично на площадке (ECN) A, а дальнейшее исполнение выгоднее на площадке B, то ее остаток будет переслан на исполнение на B. Если заявка реально крупная, и подвинет рынок, то HFT трейдеры, увидевшие ее на А, могут сыграть на опережение, и пробить по В быстрее (забрав себе выгодную цену), чем система В получит остаток от площадки А. Когда система В увидит заявку, то может оказаться, что на В уже нет той цены, ради которой заявка пришла на нее, и цена на В не самая выгодная во всей Америке. Тогда площадка В сравнивает цены остальных площадок, и шлет на самую выгодную (С), но пока заявка летит до С, высокочастотники успевают забрать вкусную цену и там. Таким образом, владелец заявки получит не оптимальное исполнение (и скорее всего, в итоге выкупит свой объем у тех же людей, которые успели скупит его ранее на В и С, но уже по цене на пару центов за акцию дороже).
                      0
                      > то HFT трейдеры, увидевшие ее на А
                      как они ее увидели на А? моя заявка исполнилась на А. я купил 100 лотов, где как таким волшебным магическим изомерическим каким образом HFT трейдеры могут определить что в моей заявке есть еще 200 незакрытых позиций?

                      при исполнении в маркетдата все что они увидят это что было куплено 100 лотов на А и все. откуда они могут узнать сколько осталось незакрытых лотов?

                      а если на основании первого исполнения они побегут скупать все на В и на С а моя заявка туда не придет, потому что мне надо было купить всего 100 лотов, что я и сделал на А, с чсем останутся ваши хваленые HFT трейдеры? со скупленными акциями которые у них никто не перекупил как они надеялись?

                      не вытанцовывается что-то архи-прибыльная пресловутая волшебная стратегия front-running.
                        0
                        Откуда информация о формате фида маркетдаты? Вы работали с ним? Вы знаете, какие именно поля там есть?
                          0
                          а маркетдата фид это такой сферический конь в вакууме? Или вы о конкретном фиде говорите? От какой биржи? Давайте спецификацию посмотрим и узнаем а?
                        0
                        Согласно вашей теории зловещим hft надо скупитьвсе акции по определенной цене на всех рынках. Потом скупить все акции по цене выше на один цент на всех рынках. Потом поставить свой ордер в очередь по цене выше на 2 цента и молить бога что очередь дойдет до них и цена не упадет вниз. При этом у них получается шанс 1/2 заработать меньше двух центов с учетом комиссий и платежей за взятие ликвидности с рынка а в случае неугадайки оказаться с кучей активов от которых надо еще избавиться. Вы представляете кто в здравом уме будет полагаться на такую стратегию?

                        Это при том еще что этим зловещим hft трейдерам надо еще догадаться неким магическим образом сколько именно незаполненых лотов в ордере клиента ушло на другой рынок. Что вообще из области фантастики
                          0
                          Льюис не очень достоверный источник, пишет он обо всем, но все-таки в большинстве о биржах. Ситуациям и стратегиям, которые у него описаны уже много лет. И не факт, что они до сих пор работают. Но суть описанной выше стратегии вообщем передана правильно. Там еще очень сильно влияли типы заявок.
                          Ну и бросьте вы уже этот сарказм про зловещих hft трейдеров.
                            0
                            Сомневаюсь что льюис вообще эксперт в биржевой торговле. До того как стать журналистом он торговал бондами в бог каком знает бородатом году когда еще и компьюетры были размерами с комнату. Поэтому я лично считаю что льюис вешает читателям лапшу на уши. Точнее перед нами эксземпляр желтой журналистики с жареными притянутыми за уши фактами от человека который не разббираясь в предмете наслушался сказок от таких же олухов вроде Брэда кацуямы.

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

                            Сарказм про зловещих гадких hft трейдеров идет из книжки льюиса в которых он их рисует чуть ли не чертями с рогами и хвастами которые обирают бедных несчастных менеджеров хедж фондов
                              0
                              Мне тяжело вам что-либо противопоставить, поскольку я не работаю в этой отрасли. Но по тому, что лет десять назад никто особо не поднимал шумиху по поводу HFT, могу предположить, что рынок не был столь насыщен и работать могли многие стратегии, которые сейчас из-за эволюции рынка и, в частности, HFT не работают.

                              А по поводу лапши, сарказма и зловещих трейдеров… На все можно смотреть с нескольких точек зрения. С идеалистической точки зрения HFT — это зло, внутредневная торговля не приносит никаких плюсов, с циничной точки зрения — спекулировать будут всегда и на всем. С идеалистической точки зрения — Льюис не знает современного рынка и просто накидывает лапшу про злободневные темы, с циничной — он уже заработал миллионы на книгах и экранизациях.
                                0
                                Десять лет назад это 2008 год самый расцвет hft трейдинга из за роста волатильности впредверии финансового кризиса. Стратегии которые работали тогда работают и сейчас: арбитраж кореляция маркетмейкинг а вот стратегия фронт раннинга не работала ни тогда ни сейчас и вообще никогда потому как противоречит здравому смыслу реалиям фондового рынка и выдумана только для того чтобы напугать обывателя страшными жадными hft трейдерами которые обирают… ну вы уже поняли как дальше.
                      0
                      > В теории, идеальное расположение для системы c аналогичными требованиями — это городок Уоррен, штат Огайо. Он расположен ровно посередине

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

                          На колокейшене вы отменили ордер и сразу получили ответ что онтотменен и вы можете ставить новый ордер по другой цене. А если отмену посылать из уоррена то пока кенсел дойдет из уоррена до чикаго а потом из чикаго до уоррена отмена после этого вы сможете послать новый ордер — пройдет больше времени из за расстояния. И все это время пока вы будете ждать ответов от биржи вы будете сидеть и волноваться отменился ваш ордер или его уже ктото исполнил. Чтобы было понятнее: это та же разница как командир отдает свои приказы рядовым на передовой или сидя за сто километров от окопов
                            0
                            С другой стороны, скорее всего, триггер на отмену будет с Нью-Йоркской биржи. А это — такая же ситуация.
                              0
                              не понимаю откуда вытекает скорей всего? статистика показывает что триггеры приходят на отмену с нью йорка чаще чем с чикаго? Значит тогда колокейшен должен быть в нью йорке. Что бы при получении тригера отменить ордер и выставить новый и не ждать пока ордера и подтверждения будут бегать триста миль
                                0
                                Я исхожу из поставленной задачи. Арбитраж ES и SPY. Решение о создании ордера или его отмены проводится на основании данных с обоих бирж. Соответственно для отмены понадобятся те же 8мс на передачу данных от Нью Йорка до Чикаго.
                                  0
                                  А на получение подтверждения об отмене на чикаго? Ну то есть проиграйте сценарий: получили триггер из ньюйорка отменили старый ордер на чикаго и после подтверждения об отмене выставили новый ордер на чикаго и получили подтверждение. Кто сделает это быстрее? Колокейшен или уоррен?
                                    0
                                    Или сценарий попроще: из ньюйорка летит триггер этот триггер инициирует ioc ордер на чикаго. Кто быстрее узнает об исполнении ioc ордера (заполнен он или отменен): колокейшен на чикаго или уоррен?
                                      0
                                      Я все равно не вижу особой разницы для арбитража по этим двум инструментам. Все равно, решение принимается на основании данных с двух бирж, т.е. 8мс никуда не денутся.
                                      В реальных же компаниях, скорее всего сервера стоят на обоих биржах, поскольку у них работают разные алгоритмы, а не только пара ES-SPY. И даже в этом случае, на двух биржах будут крутиться полностью идентичные алгоритмы, которые будут делать только одну заявку на локальную биржу, а не две на обе, как описано в статье. После чего будет проводится консенсус и, возможно, на одной из бирж будет сделана отмена, но чисто логически триггер на откат сделки обычно возникает на удаленной бирже, и на принятие решения понадобятся те же 8 мс. Хотя при сценарии, когда нужно провести, к примеру, откат на обоих биржах, вы действительно будете реагировать на ситуацию быстрее, но только на одной из двух бирж.
                                      Но в первом приближении стратегия для арбитража двух зависимых инструментов на CME и NYSE(строго говоря, это Нью Джерси, как я помню) вполне жизнеспособна.
                                      Ну и я особо не углублялся в тему, но как-то странно звучит необходимость ожидания подтверждения там, где пытаются выиграть микросекунды. Скорее всего, заявки делаются с учетом, что они будут подтверждены, и как раз получение отказа в размещении ордера будет триггером для отмены сделки на второй бирже.
                                        0
                                        Я не оспариваю стратегию. Я оспариваю утверждение автора чтотразмещение в уоррен даст ему преимущество. Если он будет все время опаздывать с отменой ордеров а колокейшен всегда будет успевать зачем тогда заморачиваться с уорреном? Ведь в hft второго места нет. Кто первый встал того и тапки. Посылать новй ордер не дождавшись отмены предыдущего очень легко может поставить вас в переполнение когда у вас на руках больше лотов чем вы хотели а избавиться от них — потерпеть убытки
                                          0
                                          С другой стороны, на утверждение решений после отправки ордеров между двумя серверами в колкейшенах понадобятся те же 8 мс. А так вы сразу решили этот вопрос по данным относительно без разницы в лагах.
                                          И как вы правильно заметили в этом случае вы будете уверены, что вторая система не отправила что-то еще за 8мс необходимых для получения данных от нее. Без довольно серьезного усложнения алгоритмов принятия решений.
                                          Короче, я уже выше написал, что у меня недостаточно знаний в этой теме чтобы аргументировано с вами спорить. Как по мне элегантное решение. Можете попробовать задать вопрос автору статьи, он в блоге довольно активно отвечает.

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

                        Самое читаемое