Размышления о стратегии высокочастотного трейдинга (1)

Автор:Трава, Создано: 2023-08-03 16:14:16, Обновлено: 2023-12-08 16:37:21

img

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

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

Источники высокочастотного рентабельного питания

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

Проблемы, которые нужно решить

1.策略同时挂买单和卖单,第一个问题就是在哪里挂单。挂的离盘口越近,成交的概率越高,但在剧烈波动的行情中,瞬间成交的价格可能离盘口较远,挂的那太近没有能吃到足够的利润。挂的太远的单子成交概率又低。这是一个需要优化的问题。

2.控制仓位。为了控制风险,策略就不能长时间累计过多的仓位。可以通过控制挂单距离、挂单量、总仓位限制等办法解决。

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

Необходимые данные

Binance предоставляет данные по каждой сделке и наилучшим подвешенным заказам.Загрузка, глубинные данные требуют загрузки с помощью API в белом списке, а также могут быть собраны самостоятельно. Для ретроспективных целей можно использовать атрибутивные данные транзакций.

from datetime import date,datetime
import time
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

В частности, в частности:

  1. agg_trade_id: идентификатор сделки.
  2. цена: цена сделки
  3. quantity: количество сделок
  4. first_trade_id: объемная сделка может иметь несколько одновременных сделок, только один данный, это ID первой сделки
  5. last_trade_id: ID последней сделки
  6. transact_time: время совершения транзакции
  7. is_buyer_maker: направление сделки, True представляет покупщик сделки, продавец - покупатель

Как вы можете видеть, в тот день было зарегистрировано 660 000 сделок, сделок было очень много.

trades = pd.read_csv('COMPUSDT-aggTrades-2023-07-02.csv')
trades

664475 строк × 7 столбцов

agg_trade_id цены количество first_trade_id last_trade_id время транзакции это_покупатель_производитель
120719552 52.42 22.087 207862988 207862990 1688256004603 Неправда
120719553 52.41 29.314 207862991 207863002 1688256004623 Это правда.
120719554 52.42 0.945 207863003 207863003 1688256004678 Неправда
120719555 52.41 13.534 207863004 207863006 1688256004680 Это правда.
121384024 68.29 10.065 210364899 210364905 1688342399863 Неправда
121384025 68.30 7.078 210364906 210364908 1688342399948 Неправда
121384026 68.29 7.622 210364909 210364911 1688342399979 Это правда.

Моделирование сделок с одной купюрой

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

trades['date'] = pd.to_datetime(trades['transact_time'], unit='ms')
trades.index = trades['date']
buy_trades = trades[trades['is_buyer_maker']==False].copy()
sell_trades = trades[trades['is_buyer_maker']==True].copy()
buy_trades = buy_trades.groupby('transact_time').agg({
    'agg_trade_id': 'last',
    'price': 'last',
    'quantity': 'sum',
    'first_trade_id': 'first',
    'last_trade_id': 'last',
    'is_buyer_maker': 'last',
    'date': 'last',
    'transact_time':'last'
})
sell_trades = sell_trades.groupby('transact_time').agg({
    'agg_trade_id': 'last',
    'price': 'last',
    'quantity': 'sum',
    'first_trade_id': 'first',
    'last_trade_id': 'last',
    'is_buyer_maker': 'last',
    'date': 'last',
    'transact_time':'last'
})
buy_trades['interval']=buy_trades['transact_time'] - buy_trades['transact_time'].shift()
sell_trades['interval']=sell_trades['transact_time'] - sell_trades['transact_time'].shift()
print(trades.shape[0] - (buy_trades.shape[0]+sell_trades.shape[0]))
146181

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

buy_trades['quantity'].plot.hist(bins=200,figsize=(10, 5));

png

为了观察方便,截掉尾部观察.可以看到成交量越大,出现频率越低,且减少的趋势更快。

buy_trades['quantity'][buy_trades['quantity']<200].plot.hist(bins=200,figsize=(10, 5));

png

Много исследований относятся к распределению, удовлетворяющему требованиям к массе транзакций. Распределение, удовлетворяющее требованиям к силу закону, также называемое распределением Парето, является распространенной формой распределения вероятности в статистической физике и социальных науках. В распределении, удовлетворяющем требованиям к силу закону, вероятность величины (или частоты) события равна некоторому отрицательному показателю величины этого события.

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

png

где N - стандартизированный параметр. Здесь выбирается средний объем M, а альфа - 2.06. Оценка конкретного альфа может быть отсчитана с помощью значения P, когда D = N. В частности: альфа = log ((P ((d>M)) /log ((2)).

depths = range(0, 250, 2)
probabilities = np.array([np.mean(buy_trades['quantity'] > depth) for depth in depths])
alpha = np.log(np.mean(buy_trades['quantity'] > mean_quantity))/np.log(2)
mean_quantity = buy_trades['quantity'].mean()
probabilities_s = np.array([(1+depth/mean_quantity)**alpha for depth in depths])

plt.figure(figsize=(10, 5))
plt.plot(depths, probabilities)
plt.plot(depths, probabilities_s)
plt.xlabel('Depth')
plt.ylabel('Probability of execution')
plt.title('Execution probability at different depths')
plt.grid(True)

img

plt.figure(figsize=(10, 5))
plt.grid(True)
plt.title('Diff')
plt.plot(depths, probabilities_s-probabilities);

png

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

png

Для краткого описания, здесь стандартное количество транзакций представлено с помощью r = q/M. Параметры могут быть оценены таким же образом, как и выше. На рисунке ниже можно увидеть, что максимальное отклонение после корректировки не превышает 2%. Теоретически можно продолжать корректировку, но эта точность также достаточно.

depths = range(0, 250, 2)
probabilities = np.array([np.mean(buy_trades['quantity'] > depth) for depth in depths])
mean = buy_trades['quantity'].mean()
alpha = np.log(np.mean(buy_trades['quantity'] > mean))/np.log(2.05)
probabilities_s = np.array([(((1+20**(-depth/mean))*depth+mean)/mean)**alpha for depth in depths])

plt.figure(figsize=(10, 5))
plt.plot(depths, probabilities)
plt.plot(depths, probabilities_s)
plt.xlabel('Depth')
plt.ylabel('Probability of execution')
plt.title('Execution probability at different depths')
plt.grid(True)
plt.figure(figsize=(10, 5))
plt.grid(True)
plt.title('Diff')
plt.plot(depths, probabilities_s-probabilities);

png

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

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


Больше

Ок количественный 🐂🍺

Фмнуро- Это неправда.

Траваcsv слишком большой, чтобы скачать его самостоятельно