고주파 거래 전략에 대한 생각 (4)

저자:초목, 창작: 2023-08-08 22:31:47, 업데이트: 2023-09-18 19:51:25

img

이전 기사에서는 주문의 도착 간격을 연구함으로써 매개 변수들에 대한 동적 조정이 왜 필요한지, 그리고 어떻게 추정값을 평가할 수 있는지 보여준다. 이 기사에서는 심층 데이터에 초점을 맞추고 중간 가격 (또는 공정 가격, 마이크로 가격 등) 을 연구한다.

깊이 있는 데이터

바이안은 가장 우수한 가격의 역사적 데이터 다운로드를 제공하며, 베스트_비드_프라이스 (best_bid_price): 가장 우수한 가격, 즉 최대 구매 가격, 베스트_비드_큐티 (best_bid_qty): 가장 우수한 가격, 베스트_어스크_프라이스 (best_ask_price): 가장 우수한 가격, 베스트_어스크_큐티 (best_ask_price): 가장 우수한 판매 가격, 트랜잭션_타임 (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에 대한 함수이며, 가중중 중간값은 단순히 이 관계가 I/2라고 가정한다. 이 때 조정된 I의 분포 ((-1,1)) 의 장점이 나타난다. I는 원점 대칭에 대해, 이것은 우리가 함수의 적합 관계를 찾는 데 편리하게 제공한다. 그래프를 관찰하면, 이 함수가 I의 특이 분기 관계를 만족해야 한다는 것을 알 수 있다.

img

여기서 N은 정偶수이고 실제 테스트를 통해 N은 8에 비해 낫다. 지금까지 이 글은 수정된 중중중중값을 제시했다:

img

이 때 예측 중간에 있는 가격의 변화는 I와 거의 관련이 없다. 이 결과는 단순 중간에 있는 값보다 조금 더 좋지만 실제에도 적용될 수 없다. 여기서는 단지 아이디어를 제시한다. S. 스토이코프의 2017년 기사는 마르코프 사슬의 방법을 사용해서 소개했다.마이크로 가격이 글은 이 글과 관련된 코드를 제공해 주었고, 여러분도 알아볼 수 있습니다.

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

요약

중간에 있는 가격은 미래 단기 가격에 대한 예측이 매우 중요하기 때문에 중간에 있는 가격은 가능한 한 정확해야 한다. 앞서 소개한 중간에 있는 가격들은 매각 데이터에 기반하고 있는데, 이는 분석할 때 하나의 시장만을 사용했기 때문이다. 실제 시장에서는 전략은 가능한 한 모든 데이터를 사용해야 하며, 특히 실제 시장의 트레이드가 거래로 전환되는 경우 중간에 있는 가격에 대한 예측은 실제 거래 가격에 의해 검증되어야 한다.


더 많은

루이스이 글은 이미 접혀있어서 이해가 되지 않습니다.

fmzero!