В процессе загрузки ресурсов... загрузка...

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

Автор:Трава, Создано: 2023-08-08 22:31:47, Обновлено: 2023-09-18 19:51:25

img

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

Глубокие данные

Binance предоставляет исторические данные о лучших предложениях для загрузки, включая best_bid_price: лучшая цена покупки, то есть наибольшая цена покупки, best_bid_qty: количество лучших покупок, best_ask_price: количество лучших продаж, best_ask_qty: количество лучших продаж, transaction_time: время действия. Данные не включают второго и более глубокого списка.

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

from datetime import date,datetime
import time
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
books = pd.read_csv('YGGUSDT-bookTicker-2023-08-07.csv')
tick_size = 0.0001
books['date'] = pd.to_datetime(books['transaction_time'], unit='ms')
books.index = books['date']
books['spread'] = round(books['best_ask_price'] - books['best_bid_price'],4)
books['best_bid_price'][::10].plot(figsize=(10,5),grid=True);

img

books['best_bid_qty'][::10].rolling(10000).mean().plot(figsize=(10,5),grid=True);
books['best_ask_qty'][::10].rolling(10000).mean().plot(figsize=(10,5),grid=True);

img

(books['spread'][::10]/tick_size).rolling(10000).mean().plot(figsize=(10,5),grid=True);

img

books['spread'].value_counts()[books['spread'].value_counts()>500]/books['spread'].value_counts().sum()
0.0001    0.799169
0.0002    0.102750
0.0003    0.042472
0.0004    0.022821
0.0005    0.012792
0.0006    0.007350
0.0007    0.004376
0.0008    0.002712
0.0009    0.001657
0.0010    0.001089
0.0011    0.000740
0.0012    0.000496
0.0013    0.000380
0.0014    0.000258
0.0015    0.000197
0.0016    0.000140
0.0017    0.000112
0.0018    0.000088
0.0019    0.000063
Name: spread, dtype: float64

Неравномерные предложения

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

Определение средней цены:img

Ниже приведенная диаграмма показывает соотношение изменения средней цены и дисбаланса I в течение следующих 1 интервала, и в соответствии с ожиданиями, чем больше I, тем больше вероятность того, что цены будут расти, и чем ближе к 1, тем больше будет ускоряться масштаб изменения цены. В высокочастотных операциях целью введения средней цены является лучшее прогнозирование изменения будущих цен, то есть чем меньше будет разница в будущих ценах, тем лучше будет определена средняя цена.img

books['I'] = books['best_bid_qty'] / (books['best_bid_qty'] + books['best_ask_qty'])
books['mid_price'] = (books['best_ask_price'] + books['best_bid_price'])/2
bins = np.linspace(0, 1, 51)
books['I_bins'] = pd.cut(books['I'], bins, labels=bins[1:])
books['price_change'] = (books['mid_price'].pct_change()/tick_size).shift(-1)
avg_change = books.groupby('I_bins')['price_change'].mean()
plt.figure(figsize=(8,5))
plt.plot(avg_change)
plt.xlabel('I Value Range')
plt.ylabel('Average Mid Price Change Rate');
plt.grid(True)

img

books['weighted_mid_price'] = books['mid_price'] + books['spread']*books['I']/2
bins = np.linspace(-1, 1, 51)
books['I_bins'] = pd.cut(books['I'], bins, labels=bins[1:])
books['weighted_price_change'] = (books['weighted_mid_price'].pct_change()/tick_size).shift(-1)
avg_change = books.groupby('I_bins')['weighted_price_change'].mean()
plt.figure(figsize=(8,5))
plt.plot(avg_change)
plt.xlabel('I Value Range')
plt.ylabel('Weighted Average Mid Price Change Rate');
plt.grid(True)

img

Корректировка средней цены

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

Для большей интуиции, здесь мы переопределяем "I":

img

В это время:

img

В этом случае выясняются преимущества распределения I после корректировки (−1,1) относительно симметрии исходного пункта I, что позволяет нам найти подходящие отношения к функции. Взгляните на график, где функция должна удовлетворять отношению странных чисел I, что соответствует скорости роста с обеих сторон, и относительно симметрии исходного пункта, также можно наблюдать, что значение вблизи исходного пункта линейное, а затем, когда добавление приближается к I0, результат функции 0, когда I - 1, результат функции 0.5; поэтому можно предположить:

img

Здесь N - положительное дажее число, после практических испытаний N - 8 лучше. На данный момент в статье представлена скорректированная средняя цена:

img

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

books['I'] = (books['best_bid_qty'] - books['best_ask_qty']) / (books['best_bid_qty'] + books['best_ask_qty'])
books['weighted_mid_price'] = books['mid_price'] + books['spread']*books['I']/2
bins = np.linspace(-1, 1, 51)
books['I_bins'] = pd.cut(books['I'], bins, labels=bins[1:])
books['weighted_price_change'] = (books['weighted_mid_price'].pct_change()/tick_size).shift(-1)
avg_change = books.groupby('I_bins')['weighted_price_change'].sum()
plt.figure(figsize=(8,5))
plt.plot(avg_change)
plt.xlabel('I Value Range')
plt.ylabel('Weighted Average Mid Price Change Rate');
plt.grid(True)

img

books['adjust_mid_price'] = books['mid_price'] + books['spread']*(books['I'])*(books['I']**8+1)/4
bins = np.linspace(-1, 1, 51)
books['I_bins'] = pd.cut(books['I'], bins, labels=bins[1:])
books['adjust_mid_price'] = (books['adjust_mid_price'].pct_change()/tick_size).shift(-1)
avg_change = books.groupby('I_bins')['adjust_mid_price'].sum()
plt.figure(figsize=(8,5))
plt.plot(avg_change)
plt.xlabel('I Value Range')
plt.ylabel('Weighted Average Mid Price Change Rate');
plt.grid(True)

img

books['adjust_mid_price'] = books['mid_price'] + books['spread']*(books['I']**3)/2
bins = np.linspace(-1, 1, 51)
books['I_bins'] = pd.cut(books['I'], bins, labels=bins[1:])
books['adjust_mid_price'] = (books['adjust_mid_price'].pct_change()/tick_size).shift(-1)
avg_change = books.groupby('I_bins')['adjust_mid_price'].sum()
plt.figure(figsize=(8,5))
plt.plot(avg_change)
plt.xlabel('I Value Range')
plt.ylabel('Weighted Average Mid Price Change Rate');
plt.grid(True)

img

Подведение итогов

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


Больше

ЛуисЯ не могу понять, что это такое.

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