리소스 로딩... 로딩...

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

저자:FMZ~리디아, 창작: 2023-08-10 13:44:30, 업데이트: 2023-09-12 15:51:24

img

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

이전 기사에서는 매개 변수를 동적으로 조정하고 주문 도착 간격을 연구함으로써 추정값의 품질을 평가하는 방법에 대한 필요성을 보여주었습니다. 이 기사에서는 깊이 데이터에 초점을 맞추고 중간 가격 (정당한 가격 또는 마이크로 가격으로도 알려져 있습니다.) 를 연구합니다.

깊이 데이터

바이낸스는 최고의 입찰 가격 (최고의 구매 가격), 최고의 입찰량 (최고의 입찰 가격의 양), 가장 낮은 판매 가격 (최고의 수요 가격), 가장 좋은 수요량 (최고의 수요 가격의 양), 거래 시간) 에 대한 역사 데이터 다운로드를 제공합니다. 이 데이터에는 두 번째 또는 더 깊은 주문 부지 수준이 포함되지 않습니다. 이 문서의 분석은 8 월 7 일 YGG 시장에 기반하며 900 만 개 이상의 데이터 포인트로 상당한 변동성을 경험했습니다.

먼저, 그 날의 시장 조건을 살펴보자. 큰 변동이 있었고, 시장 변동성과 함께 주문부도량이 크게 변화했다. 특히 스프레드는 시장 변동의 정도를 나타냈으며, 이는 최고의 요청과 입찰 가격의 차이입니다. 그 날의 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

[2]에서:

books = pd.read_csv('YGGUSDT-bookTicker-2023-08-07.csv')

[3]에서:

tick_size = 0.0001

[4]:

books['date'] = pd.to_datetime(books['transaction_time'], unit='ms')
books.index = books['date']

[5]에서:

books['spread'] = round(books['best_ask_price'] - books['best_bid_price'],4)

[6]에서:

books['best_bid_price'][::10].plot(figsize=(10,5),grid=True);

외출[6]:

img

[7]에서:

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);

아웃[7]:

img

[8]에서:

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

아웃[8]:

img

[9]에서:

books['spread'].value_counts()[books['spread'].value_counts()>500]/books['spread'].value_counts().sum()

아웃[9]:

img

불균형 한 인용

불균형 코팅은 대부분의 경우 구매 및 판매 주문 사이의 주문 책자 부피의 중요한 차이에서 관찰됩니다. 이 차이점은 구매 주문 부피의 감소가 종종 감소로 이어지는 이전에 언급한 이유와 유사한 단기 시장 추세에 강력한 예측 효과를 가지고 있습니다. 주문 책자의 한 쪽이 다른 쪽보다 현저하게 작다면, 활성 구매 및 판매 주문이 비슷한 부피라고 가정하면, 더 작은 쪽이 소비 될 가능성이 더 높으며, 이로 인해 가격 변화를 주도합니다. 불균형 코팅은 문자 I로 나타납니다.

img

여기서 Q_b는 미결된 구매 주문 (best_bid_qty) 의 금액이고 Q_a는 미결된 판매 주문 (best_ask_qty) 의 금액입니다.

중간값을 정의합니다.

img

아래 그래프는 다음 1 간격에서 중간 가격의 변화율과 불균형 I 사이의 관계를 보여줍니다. 예상대로 I가 증가하고 1에 가까워질수록 가격이 증가할 확률이 높을수록 가격 변화가 가속화됩니다. 고주파 거래에서 중간 가격을 도입하는 것은 미래의 가격 변화를 더 잘 예측하기 위해, 즉 미래의 가격 차이가 작을수록 중간 가격이 더 잘 정의됩니다. 분명히 미결 주문의 불균형은 전략의 예측을 위해 추가 정보를 제공합니다. 이것을 염두에두고 중량 된 중간 가격을 정의합니다.

img

[10]에서:

books['I'] = books['best_bid_qty'] / (books['best_bid_qty'] + books['best_ask_qty'])

[11]에서:

books['mid_price'] = (books['best_ask_price'] + books['best_bid_price'])/2

[12]에서:

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)

아웃[12]:

img

[13]에서:

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)

아웃[13]:

img

중위값을 조정합니다:

그래프에서 볼 수 있듯이 가중 중값은 I의 다른 값에 비해 더 작은 변동을 나타내고, 더 잘 맞는 것을 나타냅니다. 그러나, 여전히 일부 오차가 있습니다. 특히 0.2와 0.8 주위입니다. 이것은 내가 여전히 추가 정보를 제공한다는 것을 시사합니다. 가중 중값에 의해 암시되는 가격 수정 용어와 I 사이의 완전히 선형적인 관계의 가정은 현실과 일치하지 않습니다. 그래프에서 볼 수 있듯이 0과 1에 접근 할 때 오차 속도가 증가하여 비선형 관계를 나타냅니다.

더 직관적인 표현을 위해, 여기 I의 재정립이 있습니다:

I의 개정된 정의:

img

이 시점에서:

img

관측에 따라 가중된 중간 가격은 평균 중간 가격에 대한 수정이며, 수정 기간은 스프레드로 곱되는 것을 알 수 있다. 수정 기간은 I의 함수이며, 가중된 중간 가격은 I/2의 간단한 관계를 가정한다. 이 경우, 조정된 I 분포 (-1, 1) 의 장점은 I가 원자 주위에서 대칭이므로, 함수에 적합한 관계를 찾는 것이 편리해지기 때문에 명백해진다. 그래프를 조사함으로써, 이 함수가 I의 힘들을 만족해야 하는 것으로 나타난다. 이는 양쪽의 급속한 성장과 원자 주위 대칭에 맞춰져 있기 때문이다. 또한 원자 주위에서 값들이 선형에 가깝다는 것을 관찰할 수 있다. 또한, I가 0일 때 함수가 0이고, I가 1일 때 함수가 0.5이므로, 함수의 공식이 추측된다.

img

여기 N 는 양수 짝수이고 실제 테스트 후에 N가 8일 때 더 낫습니다. 지금까지 이 논문에서는 수정된 중량값을 제시합니다.

img

이 시점에서 중간 가격 변화의 예측은 더 이상 I와 크게 관련이 없습니다. 이 결과가 단순한 중량 중간 가격보다 약간 낫지만 여전히 실제 거래 시나리오에는 적용되지 않습니다. 이것은 단지 제안 된 접근법입니다. 2017 년 S Stoikov의 기사에서,마이크로 가격마르코프 체인 접근법을 사용하여 도입되고 관련 코드가 제공됩니다. 연구자들은이 접근법을 더 자세히 탐구 할 수 있습니다.

[14]에서:

books['I'] = (books['best_bid_qty'] - books['best_ask_qty']) / (books['best_bid_qty'] + books['best_ask_qty'])

[15]에서:

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)

외출[15]:

img

[16]에서:

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'].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)

외출[16]:

img

요약

중간에 있는 가격 (mid-price) 은 단기적 미래 가격의 예측으로 작용하기 때문에 고주파 전략에 매우 중요합니다. 따라서 중간에 있는 가격 (mid-price) 이 가능한 한 정확해야 합니다. 앞서 논의된 중간에 있는 가격 접근법은 오더북 데이터에 기반하고 있으며, 분석에 오더북의 상위 레벨만 활용됩니다. 라이브 트레이딩에서 전략은 실제 거래 가격에 대한 중간에 있는 가격 예측을 검증하기 위해 거래 데이터를 포함한 모든 사용 가능한 데이터를 활용하는 것을 목표로 해야 합니다. 스토이코프는 트위터에서 실제 중간에 있는 가격 (real mid-price) 이 실행되는 입찰과 요청 가격의 확률의 중량 평균이어야 한다고 언급한 것을 기억합니다. 이 문제는 이전 기사에서 탐구되었습니다. 길이 제약으로 인해 다음 기사에서 이러한 주제에 대한 자세한 사항이 논의될 것입니다.


더 많은