Система высокочастотного обратного тестирования, основанная на транзакции за транзакцией и дефекты обратного тестирования K-линии

Автор:Лидия., Создано: 2022-11-30 12:38:50, Обновлено: 2023-09-11 20:01:01

img

Система высокочастотного обратного тестирования, основанная на транзакции за транзакцией и дефекты обратного тестирования K-линии

Я опубликовал механизм обратного тестирования в статье Исследование стратегии хеджирования в нескольких валютах фьючерсов Binance (https://www.fmz.com/digest-topic/5584И первый отчет основан на одночасовом обратном тестировании K-линии, которое проверяет эффективность стратегии. Однако, по сути, время сна общественной стратегии составляет 1 с, что является довольно высокой частотой стратегии. Очевидно, невозможно получить точные результаты с помощью одночасового обратного тестирования K-линии.https://www.fmz.com/digest-topic/5621В результате результаты обратного тестирования значительно улучшились, но до сих пор невозможно определить, какие параметры следует использовать в случае второго уровня, и понимание всей стратегии не очень ясно.

Проблемы, основанные на обратном тестировании K-линии

Во-первых, что такое историческая K-линия? Один K-линейный данный включает в себя четыре цены: самую высокую цену, цену открытия, самую низкую цену и цену закрытия, время начала, время окончания и количество интервала торговли. Большинство количественных платформ и рамок тестируются на основе K-линии, а FMZ Quant Platform также обеспечивает обратную проверку уровня Tick. Скорость обратной проверки K-линии очень быстра, и в большинстве случаев это не проблема, но также есть очень серьезные недостатки, особенно многообразная стратегия и высокочастотная стратегия обратной проверки, которые вряд ли могут сделать правильные выводы.

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

Представьте, что используется минутовая линия для обратного тестирования арбитража двух сортов. Разница между ними обычно составляет 10 юаней. Теперь выясняется, что в 10:01, цена закрытия контракта А составляет 100 юаней, цена закрытия контракта В - 112 юаней, и разница составляет 12 юаней. Таким образом, стратегия начинает хеджироваться. В определенное время разница возвращается, и стратегия зарабатывает 2 юаней прибыли.

Однако фактическая ситуация может произойти в 10:00:45, контракт А генерировал транзакцию в 100 юаней, а затем не было никакой транзакции. Контракт В генерировал транзакцию в 112 юаней в 10:00:58. В 10:01, обе цены не существовали. Какова была цена открытия в это время? И какую разницу может получить хеджирование? Мы не знаем. Одна из возможных ситуаций заключается в том, что в 10:00:58, тенденция покупки одного и продажи одного контракта А составляет 101.9-102.1, и вообще нет спреда в 2 юаней, что сильно вводит в заблуждение нашу оптимизацию стратегии.

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

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

Обратное тестирование на основе глубины в реальном времени и тика

FMZ предоставляет реальный бот уровень обратного тестирования, который может получить реальную историческую глубину 20 уровней, в режиме реального времени секунды кнопки, транзакции по транзакции и другие данные, и на основе этого он сделал реальный бот воспроизведения функции (https://www.fmz.com/m/databaseДля стратегий, которые имеют относительно высокую частоту или требуют строгого временного суждения, необходимо реальное ботовое бэкстестинг. Торговые пары и время, собранные FMZ, не слишком длинны, но есть более 70 миллиардов исторических данных. Современный механизм соответствия заключается в том, что если ордер на покупку больше, чем один ордер на продажу, он будет полностью соответствовать сразу, не смотря на количество, и если ордер на покупку меньше, чем один ордер на продажу, он войдет в очередь соответствия. Этот механизм бэкстестирования решает первые две проблемы бэкстестирования K-линии, но он все еще не может решить последнюю проблему. И поскольку количество данных слишком велико, скорость и время бэкстестирования ограничены.

img img

Механизм обратного тестирования на основе потока заказов по каждой сделке

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

Я загрузил транзакцию за транзакцией за последние 5 дней Binance XTZ вечный контракт (адрес загрузки:https://www.fmz.com/upload/asset/1ff487b007e1a848ead.csvВ качестве менее популярной разновидности существует 213 000 данных.

[['XTZ', 1590981301905, 2.905, 0.4, 'False\n'],
 ['XTZ', 1590981303044, 2.903, 3.6, 'True\n'],
 ['XTZ', 1590981303309, 2.903, 3.7, 'True\n'],
 ['XTZ', 1590981303738, 2.903, 238.1, 'True\n'],
 ['XTZ', 1590981303892, 2.904, 0.1, 'False\n'],
 ['XTZ', 1590981305250, 2.904, 0.1, 'False\n'],
 ['XTZ', 1590981305643, 2.903, 197.3, 'True\n'],

Данные представляют собой двумерный список, сортированный по времени транзакции. Конкретные значения: название вида, цена транзакции, временная марка транзакции, количество транзакции и активно ли выполняется ордер на продажу. Существуют как покупка, так и продажа. Каждая транзакция включает в себя покупателя и продавца. Если покупатель является производителем рынка, а продавец - активным покупателем, последние данные будут истинными.

Во-первых, в соответствии с направлением транзакции, мы можем точно спекулировать покупкой и продажей на рынке. Если это активный ордер продажи, цена покупки в это время является ценой транзакции. Если это активный ордер покупки, цена продажи является ценой транзакции. Если есть новая транзакция, мы обновляем новую открывающую позицию. Если она не обновляется, последний результат будет сохранен. Легко запустить последний момент вышеперечисленных данных. Цена покупки составляет 2.903 и цена продажи составляет 2.904.

Согласно потоку заказов, он может быть сопоставлен следующим образом: возьмите заказ покупки в качестве примера, цена - цена, а количество заказов - сумма. В это время, купить один и продать один из открывающихся позиций предлагают и просят соответственно. Если цена ниже, чем спросить, и выше, чем предложить, он будет судим как производитель в первую очередь, и приоритетность может быть дана сопоставлению. Затем все транзакции с ценой транзакции ниже или равна цене в течение срока действия ордера будут сопоставлены с этим заказом (если цена ниже или равна цене предложения, приоритет не может быть дан транзакции, и заказы с ценой транзакции ниже, чем цена будет сопоставлена с этим заказом).

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

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

Код поисковика

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

    symbol = 'XTZ'
    loop_time = 0
    intervel = 1000 #The sleep time of the strategy is 1000ms
    init_price = data[0][2] #Initial price
    e = Exchange([symbol],initial_balance=1000000,maker_fee=maker_fee,taker_fee=taker_fee,log='') #Initialize the exchange
    depth = {'ask':data[0][2], 'bid':data[0][2]} #depth
    order = {'buy':{'price':0,'amount':0,'maker':False,'priority':False,'id':0},
             'sell':{'price':0,'amount':0,'maker':False,'priority':False,'id':0}} #Order
    for tick in data:
        price = int(tick[2]/tick_sizes[symbol])*tick_sizes[symbol] #Transaction price
        trade_amount = tick[3] #Number of transactions
        time_stamp = tick[1] #Transaction timestamp
        if tick[4] == 'False\n':
            depth['ask'] = price
        else:
            depth['bid'] = price
        
        if depth['bid'] < order['buy']['price']:
            order['buy']['priority'] = True
        if depth['ask'] > order['sell']['price']:
            order['sell']['priority'] = True
        if price > order['buy']['price']:
            order['buy']['maker'] = True
        if price < order['sell']['price']:
            order['sell']['maker'] = True
        
        #Order network delay can also be used as one of the matching conditions, which is not considered here
        cond1 = order['buy']['priority'] and order['buy']['price'] >= price and order['buy']['amount'] > 0
        cond2 = not order['buy']['priority'] and order['buy']['price'] > price and order['buy']['amount'] > 0
        cond3 = order['sell']['priority'] and order['sell']['price'] <= price and order['sell']['amount'] > 0
        cond4 = not order['sell']['priority'] and order['sell']['price'] < price and order['sell']['amount'] > 0

        if cond1 or cond2:
            buy_price = order['buy']['price'] if order['buy']['maker'] else price
            e.Buy(symbol, buy_price, min(order['buy']['amount'],trade_amount), order['buy']['id'], order['buy']['maker'])
            order['buy']['amount'] -= min(order['buy']['amount'],trade_amount)
            e.Update(time_stamp,[symbol],{symbol:price})
        if cond3 or cond4:
            sell_price = order['sell']['price'] if order['sell']['maker'] else price
            e.Sell(symbol, sell_price, min(order['sell']['amount'],trade_amount), order['sell']['id'], order['sell']['maker'])
            order['sell']['amount'] -= min(order['sell']['amount'],trade_amount)
            e.Update(time_stamp,[symbol],{symbol:price})

        if time_stamp - loop_time > intervel:
            order = get_order(e,depth,order) #Trading logic, not given here
            loop_time += int((time_stamp - loop_time)/intervel)*intervel

Некоторые детали следует отметить:

Когда происходит новая сделка, мы должны сначала сопоставить заказ, а затем разместить заказ по последней цене. -2. Каждый заказ имеет два атрибута: maker whether it's maker, and priority matchmaking priority. Принимая заказ покупки в качестве примера, когда цена покупки меньше, чем цена продажи, он помечен как maker, а когда цена покупки больше, чем цена покупки, он помечен как priority matchmaking. Priority определяет, совпадает ли цена, если цена равна цене покупки, а maker определяет комиссию. -3. обновляются производитель и приоритет ордера. Например, существует большой ордер на покупку, который превышает открытые позиции, когда цена больше цены покупки, в это время остальное количество транзакции будет производителем. Необходим интервал стратегии, который может представлять собой задержку рынка.

Бактестирование стратегий сети

Наконец, мы достигаем фактического этапа обратного тестирования. Здесь мы собираемся проверить наиболее классическую сетевую стратегию, чтобы увидеть, достигла ли она ожидаемого эффекта. Принцип стратегии заключается в том, что каждый раз, когда цена увеличивается на 1%, мы будем держать определенное значение ордеров на короткие позиции (в противном случае мы будем держать ордера на длинные позиции), и мы будем рассчитывать ордер на покупку и ордер на продажу и ожидать их заранее. Код не будет выпущен.Grid ('XTZ ', 100,0.31000, maker_fee=-0.00002, taker_fee=0.0003)Параметры: торговая пара, стоимость хранения с отклонением цены 1%, плотность ордеров 0,3%, интервал сна мс, ожидание комиссии заказчика и комиссионная.

Рынок XTZ был в шоке в последние 5 дней, что очень подходит для стратегии сети.

img

В первую очередь мы проверим влияние различных позиций на доходность. Доходность, измеряемая традиционным механизмом обратного тестирования, непременно увеличится пропорционально увеличению позиций.

e1 = Grid('XTZ',100,0.3,1000,maker_fee=-0.00002,taker_fee=0.0003)
print(e1.account['USDT'])
e2 = Grid('XTZ',1000,0.3,1000,maker_fee=-0.00002,taker_fee=0.0003)
print(e2.account['USDT'])
e3 = Grid('XTZ',10000,0.3,1000,maker_fee=-0.00002,taker_fee=0.0003)
print(e3.account['USDT'])
e4 = Grid('XTZ',100000,0.3,1000,maker_fee=-0.00002,taker_fee=0.0003)
print(e4.account['USDT'])

В общей сложности четыре группы подверглись обратному тестированию с значениями позиций 100, 1000, 10000 и 100000, а общее время обратного тестирования составило 1,3 с. Результаты таковы:

{'realised_profit': 28.470993031132966, 'margin': 0.7982662957624465, 'unrealised_profit': 0.0104554474048441, 'total': 10000028.481448, 'leverage': 0.0, 'fee': -0.3430967859046398, 'maker_fee': -0.36980249726699727, 'taker_fee': 0.026705711362357405}
{'realised_profit': 275.63148945320177, 'margin': 14.346335829979132, 'unrealised_profit': 4.4382117331794045e-14, 'total': 10000275.631489, 'leverage': 0.0, 'fee': -3.3102045933457784, 'maker_fee': -3.5800688964477048, 'taker_fee': 0.2698643031019274}
{'realised_profit': 2693.8701498889504, 'margin': 67.70120400534114, 'unrealised_profit': 0.5735269329348516, 'total': 10002694.443677, 'leverage': 0.0001, 'fee': -33.984021415250744, 'maker_fee': -34.879233866850974, 'taker_fee': 0.8952124516001403}
{'realised_profit': 22610.231198585603, 'margin': 983.3853688758861, 'unrealised_profit': -20.529965947304365, 'total': 10022589.701233, 'leverage': 0.002, 'fee': -200.87094000385412, 'maker_fee': -261.5849078470078, 'taker_fee': 60.71396784315319}

Можно увидеть, что окончательная реализованная прибыль составляет соответственно 28,4%, 27,5%, 26,9% и 22,6% от стоимости позиции. Это также соответствует фактической ситуации. Чем больше стоимость позиции, тем больше будет стоимость заказа, и с большей вероятностью произойдут частичные транзакции. Конечная реализованная прибыль будет меньше по отношению к сумме заказа. На рисунке ниже показано сравнение относительных доходов с значениями позиции 100 и 10000 соответственно:

img

Мы также можем проверить влияние различных параметров на возврат обратного теста, таких как плотность ожидаемых заказов, время сна и комиссии. Возьмите время сна в качестве примера, измените его на 100 мс, сравните с временем сна 1000 мс и наблюдайте за возвратами. Результаты обратного теста следующие:

{'realised_profit': 29.079440803790423, 'margin': 0.7982662957624695, 'unrealised_profit': 0.0104554474048441, 'total': 10000029.089896, 'leverage': 0.0, 'fee': -0.3703702128662524, 'maker_fee': -0.37938946377435134, 'taker_fee': 0.009019250908098965}

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

Резюме

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


Связанные

Больше