В статье рассматриваются высокочастотные стратегии торговли цифровой валютой, включая источники прибыли (в основном от бурных рыночных колебаний и комиссий на биржевых операциях), вопросы позиционного контроля и контроля позиций, а также методы моделирования транзакций с использованием распределения Парето. Кроме того, цитируются данные по каждой сделке и наилучшим оптовым транзакциям, предоставляемые 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
В частности, в частности:
Как вы можете видеть, в тот день было зарегистрировано 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));
为了观察方便,截掉尾部观察.可以看到成交量越大,出现频率越低,且减少的趋势更快。
buy_trades['quantity'][buy_trades['quantity']<200].plot.hist(bins=200,figsize=(10, 5));
Много исследований относятся к распределению, удовлетворяющему требованиям к массе транзакций. Распределение, удовлетворяющее требованиям к силу закону, также называемое распределением Парето, является распространенной формой распределения вероятности в статистической физике и социальных науках. В распределении, удовлетворяющем требованиям к силу закону, вероятность величины (или частоты) события равна некоторому отрицательному показателю величины этого события.
На следующей схеме представлена вероятность того, что объем сделок больше определенного значения, синяя линия - фактическая вероятность, и прямая - аналогичная вероятность. Не путать с конкретными параметрами, можно увидеть, что это действительно удовлетворяет распределению Парето. Поскольку вероятность объема заказов больше 0, чем 0, равна 1, и для удовлетворения стандартизации его распределение должно иметь форму:
где 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)
plt.figure(figsize=(10, 5))
plt.grid(True)
plt.title('Diff')
plt.plot(depths, probabilities_s-probabilities);
Но это приближение просто выглядит так, как если бы мы нарисовали на рисунке разницу между аналогичным и фактическим значениями. Если бы транзакция была меньше, отклонение было бы большим, даже близким к 10%. Можно было бы выбрать разные точки, чтобы сделать вероятность этой точки более точной при оценке параметров, но это не решило бы проблему отклонения.
Для краткого описания, здесь стандартное количество транзакций представлено с помощью 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);
При оценке распределения объемов сделок, внимание уделяется вероятности уравнения не истинной вероятности, а условной вероятности. При этом можно ответить на вопрос, какова вероятность того, что следующий заказ произойдет, если этот заказ будет больше определенного значения. Также можно сказать, какова вероятность того, что будут сделаны заказы разной глубины (идеально, менее строго, теоретически, в книге заказов есть новые заказы и снятия, а также очереди с той же глубиной).
На этом этапе мы уже почти закончили, но есть еще много вопросов, на которые нужно ответить, и следующая серия статей попытается дать ответы.
Ок количественный 🐂🍺
Фмнуро- Это неправда.
Траваcsv слишком большой, чтобы скачать его самостоятельно