Цифровая валютная высокочастотная стратегия

В 2020 году я написал статью, в которой представил высокочастотные стратегии, https://www.fmz.com/bbs-topic/9750. Хотя он получил довольно много внимания, он был не очень глубоким. С тех пор прошло более двух лет, и рынок изменился. После того, как эта статья была опубликована, моя высокочастотная стратегия могла стабильно приносить прибыль в течение длительного времени, но постепенно прибыль снижалась и даже останавливалась в какой-то момент. В последние месяцы я потратил некоторые усилия, чтобы обновить его, и теперь он все еще может приносить некоторую прибыль. В этой статье я представлю более подробное введение в мои идеи высокочастотной стратегии и некоторый упрощенный код в качестве отправной точки для обсуждения; общение и обратная связь приветствуются.

Высокочастотные торговые условия

  • Счета скидок, взяв Binance в качестве примера, в настоящее время он имеет скидку производителя 0,0005%. Если ежедневная сумма транзакции составляет 100 миллионов U, скидка составит 5000 U. Конечно, сборы с берущих по-прежнему основаны на VIP-тарифах, поэтому, если стратегия не требует берущих, уровень VIP мало влияет на высокочастотные стратегии. Различные уровни бирж, как правило, имеют разные ставки скидок и требуют поддержания высокой суммы транзакции. В ранние времена, когда некоторые валютные рынки сильно колебались, прибыль была даже без скидок. По мере усиления конкуренции скидки составляли большую долю прибыли или даже полагались исключительно на нее; высокочастотные трейдеры преследовали сборы верхнего уровня.
  • Скорость. Причина, по которой высокочастотные стратегии называются высокочастотными, заключается в том, что они очень быстрые. Присоединение к коло-серверу биржи, получение наименьшей задержки и наиболее стабильного соединения также стало одним из условий внутренней конкуренции. Время внутреннего потребления стратегии должно быть как можно меньше, и в этой статье будет представлен фреймворк websocket, который я использую, который принимает параллельное выполнение.
  • Подходящий рынок. Высокочастотная торговля известна как жемчужина количественной торговли, и многие программные трейдеры пробовали ее, но большинство людей остановились, потому что они не могут получить прибыль и не могут найти направление для улучшения. Основная причина должна заключаться в том, что они выбрали неправильный торговый рынок. На начальном этапе разработки стратегии следует выбирать относительно легкие рынки для получения прибыли в торговле, чтобы была прибыль и обратная связь для улучшения, что способствует продвижению стратегии. Если вы начнете конкурировать на самом конкурентном рынке со многими потенциальными противниками, как бы вы ни старались, вы потеряете деньги и вскоре сдадитесь. Я рекомендую недавно перечисленные торговые пары с бессрочными контрактами, когда конкурентов не так много, особенно с относительно большой суммой сделки; это когда получать прибыль проще всего. BTC и ETH имеют наибольшую сумму транзакций и наиболее активны в транзакциях, но также труднее всего выжить.
  • Столкновение с конкуренцией. Рынок для любой сделки постоянно меняется, и никакая торговая стратегия не может длиться вечно, особенно в высокочастотной торговле. Выход на этот рынок означает конкуренцию с самыми умными и добросовестными трейдерами напрямую. На рынке игр с нулевой суммой, чем больше вы зарабатываете, тем меньше зарабатывают другие. Чем позже вы войдете, тем выше сложность; те, которые уже находятся на рынке, также должны постоянно совершенствоваться. 3–4 года назад была, наверное, лучшая возможность; В последнее время общая активность на рынках цифровых валют снизилась, что очень затрудняет новичкам начать высокочастотную торговлю сейчас.

Принцип высокой частоты

Существуют различные высокочастотные стратегии:

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

Рамки стратегии

Следующий код основан на базовой структуре бессрочных контрактов Binance, в основном подписываясь на глубину веб-стокета, глубину потока ордеров, рыночные данные и информацию о позиции. Поскольку рыночные данные и информация о счете подписываются отдельно, необходимо постоянно использовать read(-1), чтобы определить, была ли получена последняя информация. Здесь EventLoop(1000) используется, чтобы избежать прямых бесконечных циклов и уменьшить нагрузку на систему. EventLoop(1000) будет блокироваться до тех пор, пока не будут получены wss или параллельные возвраты задач с тайм-аутом 1000 мс.

var datastream = null
var tickerstream = null
var update_listenKey_time = 0

функция ConncetWss(){
if (Date. now() - update_listenKey_time < 50*60*1000) {
return
}
if(datastream || tickerstream){
datastream. close()
тикерстрим. close()
}
//Need APIKEY
let req = HttpQuery(Base+'/fapi/v1/listenKey', {method: 'POST',data: ''}, null, 'X-MBX-APIKEY:' + APIKEY)
let listenKey = JSON. parse(req). listenKey
datastream = Dial("wss://fstream.binance.com/ws/" + listenKey + '|reconnect=true', 60)
//Символы - это установленные торговые пары, позволяющие
trade_symbols_string = Символы. toLowerCase(). split(',')
пусть wss_url = "wss://fstream.binance.com/stream?streams="+trade_symbols_string. присоединиться(Цитата. toLowerCase()+"@aggTrade/")+Quote. toLowerCase()+"@aggTrade/"+trade_symbols_string. присоединиться(Цитата. toLowerCase()+"@depth20@100ms/")+Quote. toLowerCase()+"@depth20@100ms"
tickerstream = Dial(wss_url+"|reconnect=true", 60)
update_listenKey_time = Date. now()
}

функция ReadWss(){
пусть данные = поток данных. read(-1)
пусть тикер = тикерстрим. read(-1)
while(data){
data = JSON. parse(data)
if (data. e == 'ACCOUNT_UPDATE') {
updateWsPosition(data)
}
if (data. e == 'ORDER_TRADE_UPDATE'){
updateWsOrder(data)
}
data = datastream. read(-1)
}
while(ticker){
ticker = JSON. разбор(тикер). данные
if(тикер. e == 'aggTrade'){
updateWsTrades(ticker)
}
if(ticker. e == 'depthUpdate'){
updateWsDepth(ticker)
}
ticker = tickerstream. read(-1)
}
makerOrder()
}

function main() {
while(true){
ConncetWss()
ReadWss()
worker()
updateStatus()
EventLoop( 1000 г.)
}
}

Стратегические индикаторы

Как упоминалось ранее, моя высокочастотная стратегия требует определения тренда перед покупкой и продажей. Краткосрочный тренд в основном оценивается на основе данных тик-по-тиковых транзакций, то есть aggTrade в подписке, которая включает в себя направление транзакции, цену, количество, время транзакции и т. Д. Покупка и продажа в основном относятся к глубине и торговой сумме. Ниже приводится подробное введение в показатели, о которых следует беспокоиться; большинство из них делятся на группы покупки и продажи и подсчитываются динамически в течение определенного временного окна. Временное окно моей стратегии находится в пределах 10 секунд.

  • Средняя сумма сделки на сделку, на одну торговую сделку – это совокупность различных ордеров с одинаковым направлением и ценой в пределах 100мс, отражающих размер ордеров на покупку и продажу. Эти данные имеют большой вес, можно предположить, что если объем ордеров на покупку больше, чем ордеров на продажу, то это рынок, на котором доминирует покупатель.
  • Частота ордеров или интервал ордеров, он также основан на данных транзакции за транзакцией, средняя сумма транзакции, упомянутая ранее, не учитывает концепцию времени и не совсем точна. Если ордер в одном направлении имеет небольшую среднюю сумму транзакции, но высокую частоту, это все равно способствует силе этого направления. Средняя сумма транзакции * частота ордера представляет собой общую сумму транзакции через фиксированные промежутки времени и может быть использована для прямого сравнения. Прибытие ордеров следует распределению Пуассона, которое можно использовать для простой оценки того, сколько составляет общее количество заказов, поступающих в течение определенного временного интервала, и предоставления ссылки для размещения позиций по ордерам.
  • Средний спред, это относительно легко понять, то есть продать один минус купить один. Текущий рынок в основном имеет 1-тиковый спред. Если спред становится больше, это часто означает, что есть рыночный тренд.
  • Усредните цену покупки и продажи, рассчитайте среднюю цену каждой сделки отдельно и сравните ее с последней ценой. Если цена последнего заказа на покупку выше средней цены заказа на покупку, можно предварительно судить о том, что произошел прорыв.

Логика стратегии

Определение краткосрочного тренда

//бык представляет собой краткосрочный бычий бычий, медвежий представляет собой краткосрочный медвежий
бык = last_sell_price > avg_sell_price &&
last_buy_price > avg_buy_price && avg_buy_amount / avg_buy_time > avg_sell_amount / avg_sell_time;
пусть медведь = last_sell_price < avg_sell_price && last_buy_price < avg_buy_price &&
avg_buy_amount / avg_buy_time < avg_sell_amount / avg_sell_time;

Если последняя цена продажи выше средней цены продажи, последняя цена покупки выше средней цены покупки, а стоимость ордера на покупку с фиксированным интервалом больше, чем стоимость ордера на продажу, то она оценивается как краткосрочная бычья. И наоборот, он медвежий.

Цена за размещение заказов

функция updatePrice(depth, bid_amount, ask_amount) {

let buy_price = 0
let sell_price = 0
let acc_bid_amount = 0
let acc_ask_amount = 0

for (let i = 0; i < Math. мин(глубина. спрашивает. длина, глубина. ставки. длина); i++) {
acc_bid_amount += parseFloat(depth. bids[i][1])
acc_ask_amount += parseFloat(depth. asks[i][1])
if (acc_bid_amount > bid_amount && buy_price == 0) {
buy_price = parseFloat(depth. bids[i][0]) + tick_size
}
if (acc_ask_amount > ask_amount && sell_price == 0) {
sell_price = parseFloat(depth. asks[i][0]) - tick_size
}
if (buy_price > 0 && sell_price > 0) {
break
}
}
return [buy_price, sell_price]
}

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

Сумма заказа

пусть buy_amount = Отношение * avg_sell_amount / avg_sell_time
пусть sell_amount = Отношение * avg_buy_amount / avg_buy_time

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

Условия размещения заказа

if(bull && (sell_price-buy_price) > N * avg_diff) {
trade('buy', buy_price, buy_amount)
}else if(position.amount < 0){
trade('buy', buy_price, -position.amount)
}
if(bear && (sell_price-buy_price) > N * avg_diff) {
trade('sell', sell_price, sell_amount)
}else if(position.amount > 0){
trade('sell', sell_price, position.amount)
}

Где avg_diff — это средняя рыночная разница цен, и ордер на покупку будет размещен только тогда, когда спред бид-аск больше определенного кратного этому значению и является бычьим. Если вы держите короткую позицию, он также закроет позицию, чтобы избежать удержания в течение длительного периода. Заказы могут быть размещены как заказы только производителя, чтобы обеспечить их выполнение. Кроме того, можно использовать пользовательский идентификатор заказа Binance, чтобы не нужно было ждать ответа на заказ.

Параллельная структура

var tasks = []
var jobs = []

function worker(){
let new_jobs = []
for(let i=0; i<tasks.length; i++){
let task = tasks[i]
jobs.push(exchange. Go.apply(this, task.param))
}
_.each(jobs, function(t){
let ret = t.wait(-1)
if(ret === undefined){
new_jobs.push(t)//Unreturned tasks будет продолжать ждать в следующий раз
}
})
jobs = new_jobs
tasks = []
}

/*
Напишите требуемое параметры задачи в параметре
tasks.push({'type':'order','param': ["IO", "api", "POST","/fapi/v1/order",
"symbol="+symbol+Quote+"&side="+side+"&type=LIMIT&timeInForce=GTX&quantity="+
amount+"&price="+price+"&newClientOrderId=" + UUID( ) +"&timestamp="+Date.now()]})
*/

Отслеживаемые данные

  • Задержка, важность высокочастотной стратегии скорости была подчеркнута. В стратегии необходимо отслеживать и записывать различные задержки, такие как размещение ордеров, отмена ордеров, возврат позиций, глубина, поток ордеров, позиции, общие циклы и так далее. Любые ненормальные задержки должны быть своевременно расследованы и попытаться сократить общую задержку стратегии.
  • Коэффициент суммы транзакции, рассчитайте сумму транзакции в процентах от общей суммы транзакции. Если соотношение низкое, все еще есть возможности для роста. В часы пик на стратегию можно приходиться более 10% от общей суммы торгов.
  • Норма прибыли при закрытии позиций, расчет средней нормы прибыли на закрытие позиции является наиболее важным ориентиром для оценки эффективности стратегии.
  • Коэффициент скидок, доля скидок в общем доходе, отражает степень зависимости стратегии от скидок. Биржевые платформы имеют разные уровни скидок, а убыточные стратегии могут быть прибыльными при более высоком уровне рибейта.
  • Частота неудачных выставок ордеров, ордера торгуются только путем выставления ордера. Из-за задержки в размещении заказа, он может не быть размещен. Если это соотношение высокое, это означает, что скорость стратегии не выгодна.
  • По доле выполненных ордеров платформы часто предъявляют требования к скорости транзакций. Если он слишком низкий, это означает, что стратегия слишком часто отменяет ордера и должна быть решена.
  • Среднее расстояние между ордерами на покупку и продажу, которое отражает стратегию размещения ордеров и разрыв между рынком, мы видим, что большинство из них по-прежнему занимают позицию покупки одного и продажи одного.

Другие предложения

  • Торгуйте несколькими валютами, высокочастотная стратегия в этой статье относится только к одной бирже, единой валюте и единому рынку. Он имеет большие ограничения, и большинство ситуаций и валют не могут приносить прибыль. Однако невозможно предсказать, какая валюта будет прибыльной в будущем, поэтому вы можете торговать несколькими или даже всеми валютами, не упуская возможностей. Даже при ограничении частоты бирж робот может торговать несколькими торговыми парами. Конечно, для оптимальной скорости один субсчет может торговать одной торговой парой с одним сервером, соответствующим одному роботу; однако это приведет к гораздо более высоким затратам.
  • Определите количество ордеров и условия заказа в зависимости от доходности. Торговля несколькими валютами приведет к высокой стоимости попыток, если мониторинг не является прибыльным, используйте минимальную сумму транзакции и уменьшайте частоту торговли до тех пор, пока стратегия динамически не будет отслеживать положительную доходность, затем увеличивайте сумму сделки для постепенного повышения доходности.
  • Получайте больше информации, еще одной особенностью высокочастотной торговли является то, что она обрабатывает больший объем данных и использует больше информации. На всю рыночную информацию для одной торговой пары в рамках одной биржи следует ссылаться, и бессрочные контракты также могут относиться к данным спотового рынка, а также к данным с других бирж для той же торговой пары или даже к данным из других валют. Чем больше данных, тем больше соответствующее преимущество. Например, Binance может подписаться на лучшую информацию об отложенных ордерах по symbol, потому что самое короткое время нажатия для глубины и потока ордеров составляет 100 мс; только это в режиме реального времени и очень ценно для высокочастотных стратегий.
  • Сервер Binance находится в aws Tokyo, серверы других бирж различаются, подробности можно проконсультироваться с техническим персоналом биржи.
  • Код стратегии в этой статье представляет собой просто упрощенный пример кода, с удалением многих громоздких, но необходимых деталей. Используемые показатели носят справочный характер и не должны использоваться непосредственно. Есть много деталей, на которые следует обратить внимание при запуске высокочастотной стратегии, и это требует терпения для изменения и улучшения.

Источник