높은 주파수 거래 전략에 대한 생각 (3)

저자:초목, 창작: 2023-08-07 18:17:28, 업데이트: 2023-09-18 19:50:53

img

지난 기사에서, 나는 거래량 축적 모델링과 가격 충격 현상을 간단하게 분석하는 방법을 소개했다. 이 기사에는 거래 주문 데이터를 중심으로 분석을 계속할 것이다.

주문 시간 간격

일반적으로, 주문의 도착시간이 파르산 프로세스에 맞게 가정됩니다.파르산 과정◎ 아래에서 증명하겠습니다.

8월 5일 다운로드된 aggTrades, 총 1,931193개의 트레이드, 매우 과장되었다. 먼저 지불의 분포를 살펴보면, 100ms와 500ms 정도에서 매끄럽지 않은 지역 정점을 볼 수 있다.

파산 분포의 확률 질량 함수 (PMF) 는 다음과 같은 공식으로 주어진다.

img

그 중 하나는:

  • k는 우리가 관심있는 사건의 수입니다.
  • λ는 단위 시간 (또는 단위 공간) 에 해당하는 사건의 평균 발생률이다.
  • P ((k; λ) 는 주어진 평균 발생률 λ의 조건에서 k개의 사건이 우연히 일어날 확률을 나타냅니다.

파산 과정에서 사건들 사이의 시간 간격은 지수 분포에 복종한다. 지수 분포의 확률 밀도 함수 (PDF) 는 다음과 같은 공식으로 주어진다.

img

합성 결과 결과와 파르산 분포의 예상 차이가 크다는 것을 발견함으로써, 파르산 프로세스는 긴 간격 시간의 빈도를 과소평가하고 낮은 간격 시간의 빈도를 과대평가했다. (실제 간격의 분포는 수정된 파레토 분포에 더 가깝다.)

from datetime import date,datetime
import time
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
trades = pd.read_csv('YGGUSDT-aggTrades-2023-08-05.csv')
trades['date'] = pd.to_datetime(trades['transact_time'], unit='ms')
trades.index = trades['date']
buy_trades = trades[trades['is_buyer_maker']==False].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'
})
buy_trades['interval']=buy_trades['transact_time'] - buy_trades['transact_time'].shift()
buy_trades.index = buy_trades['date']
buy_trades['interval'][buy_trades['interval']<1000].plot.hist(bins=200,figsize=(10, 5));

img

Intervals = np.array(range(0, 1000, 5))
mean_intervals = buy_trades['interval'].mean()
buy_rates = 1000/mean_intervals
probabilities = np.array([np.mean(buy_trades['interval'] > interval)  for interval in Intervals])
probabilities_s = np.array([np.e**(-buy_rates*interval/1000) for interval in Intervals])

plt.figure(figsize=(10, 5))
plt.plot(Intervals, probabilities)
plt.plot(Intervals, probabilities_s)
plt.xlabel('Intervals')
plt.ylabel('Probability')
plt.grid(True)

img

통계 1s 내의 주문의 발생 횟수 분포와 파산 분포를 비교하면, 또한 매우 명확한 차이가 있다. 파산 분포는 소 확률 사건의 발생 빈도를 크게 과소평가한다. 가능한 이유:

  • 불변의 발생률: 파르소스 과정은 주어진 시간에 어떤 사건의 평균 발생률이 일정하다고 가정한다. 만약 이 가정이 사실이 아니라면, 데이터의 분포는 파르소스 분포와 편차한다.
  • 과정의 상호작용: 파르소스 과정의 또 다른 기본 가정은 사건들 사이에 독립성이 있다는 것이다. 현실세계의 사건들이 서로 영향을 준다면, 그들의 분포는 파르소스 분포에서 벗어날 수 있다.

즉, 실제 환경에서는 주문이 발생하는 빈도가 불변하고 실시간으로 업데이트가 필요하며, 고정된 시간에 더 많은 주문이 더 많은 주문을 자극한다는 인센티브 작용이 발생합니다. 이것은 전략이 단 하나의 매개 변수를 고정할 수 없도록 만듭니다.

result_df = buy_trades.resample('0.1S').agg({ 
    'price': 'count',
    'quantity': 'sum'
}).rename(columns={'price': 'order_count', 'quantity': 'quantity_sum'})
count_df = result_df['order_count'].value_counts().sort_index()[result_df['order_count'].value_counts()>20]
(count_df/count_df.sum()).plot(figsize=(10,5),grid=True,label='sample pmf');

from scipy.stats import poisson
prob_values = poisson.pmf(count_df.index, 1000/mean_intervals) 

plt.plot(count_df.index, prob_values,label='poisson pmf');
plt.legend() ;

img

실시간 업데이트

앞서 주문 간격에 대한 분석을 통해 고정된 매개 변수가 실제 시장 시장에 적합하지 않으며 전략의 시장 설명에 대한 핵심 매개 변수가 실시간 업데이트가 필요하다는 결론을 내릴 수 있다. 가장 쉽게 생각할 수 있는 방법은 슬라이딩 윈도우의 이동 평균이다. 아래의 두 그래프는 각각 1s 내의 결제 빈도와 거래량 1000개의 창구의 평균값이다. 거래 집적 현상이 존재한다는 것을 볼 수 있다. 즉, 일정 기간 동안 주문의 빈도가 정상보다 현저히 높고, 이 시간 동안의 양도 동시적으로 크다. 여기서 상위 평균값을 사용하여 최신 1초의 예상값을 측정하고, 예상 잔여의 평균값의 절대 오류의 평균값을 사용하여 예측의 양을 측정한다.

이 그래프에서도 주문 빈도가 파산 분포에서 왜 그렇게 많이 벗어나는지 알 수 있다. 초당 주문 수의 평균 값은 8.5번밖에 되지 않지만, 극단적인 상황에서는 초당 주문의 평균 값은 크게 벗어난다.

여기서 첫 두 초의 평균값을 사용하여 파러디크 오류가 최소이며 단순한 평균값 예측 결과보다 훨씬 낫다는 것이 밝혀졌습니다.

result_df['order_count'][::10].rolling(1000).mean().plot(figsize=(10,5),grid=True);

img

result_df
order_count 양_총
2023-08-05 03:30:06.100 1 76.0
2023-08-05 03:30:06.200 0 0.0
2023-08-05 03:30:06.300 0 0.0
2023-08-05 03:30:06.400 1 416.0
2023-08-05 03:30:06.500 0 0.0
2023-08-05 23:59:59.500 3 9238.0
2023-08-05 23:59:59.600 0 0.0
2023-08-05 23:59:59.700 1 3981.0
2023-08-05 23:59:59.800 0 0.0
2023-08-05 23:59:59.900 2 534.0
result_df['quantity_sum'].rolling(1000).mean().plot(figsize=(10,5),grid=True);

img

(result_df['order_count'] - result_df['mean_count'].mean()).abs().mean()
6.985628185332997
result_df['mean_count'] = result_df['order_count'].ewm(alpha=0.11, adjust=False).mean()
(result_df['order_count'] - result_df['mean_count'].shift()).abs().mean()
0.6727616961866929
result_df['mean_quantity'] = result_df['quantity_sum'].ewm(alpha=0.1, adjust=False).mean()
(result_df['quantity_sum'] - result_df['mean_quantity'].shift()).abs().mean()
4180.171479076811

요약

이 문서는 주문 시간 간격 오차의 원인을 간단하게 소개합니다. 주로 매개 변수가 시간이 지남에 따라 변하기 때문입니다. 보다 정확한 시장을 예측하기 위해서는 전략이 시장의 기본 매개 변수에 대한 실시간 예측을 필요로합니다. 잔액을 사용하여 예측의 양과 악을 측정 할 수 있습니다. 위의 가장 간단한 예는 특정 시간 순위 분석, 변동률 집약 등과 관련된 연구가 많이 있으며 추가로 개선 할 수 있습니다.


더 많은