Введение в подробные высокочастотные стратегии торговли криптовалютами

Автор:Изобретатель количественный, Создано: 2023-03-19 19:56:11, Обновлено: 2023-09-18 19:55:58

img

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

Условия для торговли высокой частотой

Счета скидок Комиссии

используя Binance в качестве примера, в настоящее время предлагают скидку производителя в размере 0,05% за каждые 100 000 торговых единиц. Если ежедневный объем торговли составляет 100 миллионов единиц, скидка составляет 5000 единиц. Конечно, комиссионный сбор по-прежнему зависит от ставки VIP, поэтому, если стратегия не нуждается в приеме заказов, уровень VIP мало влияет на стратегию высокой частоты. Различные уровни скидок комиссионных доступны на разных биржах, что требует высокого объема торговли. В первые дни, еще можно было получать прибыль без скидок, но по мере усиления конкуренции, скидки составляли большую часть прибыли, и высокочастотные трейдеры преследовали самые высокие ставки.

Скорость

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

Подходящий рынок

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

Встретимся лицом к лицу с конкурентами

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

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

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

Архитектура стратегии

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

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

function ConncetWss(){
    if (Date.now() - update_listenKey_time < 50*60*1000) {
        return
    }
    if(datastream || tickerstream){
        datastream.close()
        tickerstream.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)
    // Symbols is the pair of symbol
    let trade_symbols_string = Symbols.toLowerCase().split(',')
    let wss_url = "wss://fstream.binance.com/stream?streams="+trade_symbols_string.join(Quote.toLowerCase()+"@aggTrade/")+Quote.toLowerCase()+"@aggTrade/"+trade_symbols_string.join(Quote.toLowerCase()+"@depth20@100ms/")+Quote.toLowerCase()+"@depth20@100ms"
    tickerstream = Dial(wss_url+"|reconnect=true", 60)
    update_listenKey_time = Date.now()
}

function ReadWss(){
    let data = datastream.read(-1)
    let ticker = tickerstream.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.parse(ticker).data
        if(ticker.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 мс. Это отражает размер ордеров купли-продажи и имеет высокий вес. Если объем торговли ордеров купли-продажи больше объема ордеров продажи, можно предположить, что рынок доминирует покупатели.
  • Средний объем транзакций * частота заказов представляет собой общий объем транзакций в фиксированном интервале и может использоваться для прямого сравнения. Событие прибытия заказов следует за распределением Поасона, которое может быть использовано для оценки того, сколько общего значения заказов будет достигнуто в течение определенного временного интервала, обеспечивая ссылку для размещения заказов.
  • Средний спред, который представляет собой разницу между ценой продажи и ценой покупки. Средние цены покупки и продажи, которые рассчитывают среднюю цену покупки и продажи, соответственно, и сравнивают их с последней ценой.

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

Оценка краткосрочных тенденций

let bull =  last_sell_price > avg_sell_price && last_buy_price > avg_buy_price &&
            avg_buy_amount / avg_buy_time > avg_sell_amount / avg_sell_time;
let bear =  last_sell_price < avg_sell_price && last_buy_price < avg_buy_price && 
            avg_buy_amount / avg_buy_time < avg_sell_amount / avg_sell_time;

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

Размещение заказов

function 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.min(depth.asks.length, depth.bids.length); 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 секунды и без учета ситуации с новыми ордерами, цена продажи устанавливается на позицию, где ордер на покупку

Размер конкретного времени окна должен быть установлен самим.

Количество заказов

let buy_amount = Ratio * avg_sell_amount / avg_sell_time
let sell_amount = Ratio * 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 - это средняя разница в спреде, и только тогда, когда разница между покупкой и продажей при размещении ордеров больше определенного кратного этого значения, и рынок быстрый, будет размещен ордер на покупку. Если удерживать короткую позицию, позиция также будет закрыта, чтобы избежать длительного удержания позиции.

Одновременная архитектура

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)//未返回的任务下次继续等待
        }
    })
    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% или более от общего объема торговли.
  • Уровень прибыли по итогам заключения сделки: статистика показывает средний уровень прибыли по итогам заключения сделки, который является наиболее важным показателем эффективности стратегии.
  • Соотношение скидок: Статистика показывает долю скидок в общем доходе, отражая степень, в которой стратегия зависит от скидок. Уровень неудачи заказов: заказы размещаются и выполняются только, но из-за задержек в размещении заказов они могут не быть выполнены.
  • Соотношение исполнения заказов: Платформа часто имеет требования к соотношению исполнения заказов. Если оно слишком низкое, это указывает на то, что стратегия слишком часто отменяет заказы и должна быть решена. Среднее расстояние между ордерами покупки и продажи: данные отражают расстояние между размещением ордеров по стратегии и глубиной рынка, и большинство ордеров все еще занимают позиции ордеров покупки и продажи.

Другие советы

  • Торговать несколькими валютами: Стратегия высокой частоты в этой статье ограничена единственными биржами, едиными валютными парами и условиями единого рынка и имеет ограниченную применимость. Большинство валют не могут быть прибыльными, но невозможно предсказать, какие валюты будут прибыльными в будущем, поэтому рекомендуется торговать несколькими или даже всеми валютами, чтобы не упустить возможности. Даже при ограничениях частоты биржи один робот может торговать несколькими торговыми парами. Конечно, для наилучшей скорости один подсчет может торговать одной торговой парой, один сервер соответствует одному роботу, но этот подход будет иметь гораздо более высокие затраты.
  • Определите размер заказа и условия на основе прибыльности. Торговля несколькими валютами может привести к слишком высокой стоимости попытки, поэтому, если мониторинг показывает, что это не выгодно, уменьшите частоту торговли и используйте минимальный объем торговли, пока стратегия динамически не обнаружит положительный уровень прибыли, а затем постепенно увеличивайте объем торговли для повышения прибыльности.
  • Получить больше информации: Еще одна характеристика высокочастотного трейдинга заключается в том, что он обрабатывает больше данных и использует больше информации. Все рыночные данные для одной биржи и валютной пары должны быть рассмотрены, а вечные данные также могут относиться к спотовым данным или данным для той же валютной пары на других биржах или даже других валютах. Чем больше данных, тем больше соответствующее преимущество.

Связанные

Больше