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

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

저자:초목, 창작: 2023-08-03 16:14:16, 업데이트: 2024-11-10 18:56:50

img

이 글은 디지털 화폐의 고주파 거래 전략에 대해 논의하고 있으며, 이윤의 근원 (주로 시장의 급격한 변동과 거래소 수수료로부터의 환불), 단위 위치 및 위치 통제 문제, 그리고 파레토 분포를 사용하여 거래 완료를 모델링하는 방법에 대한 문제들을 다루고 있다. 또한, 비안안이 제공하는 단위 거래 및 최상위 단위 순위 데이터를 참조하여 재검토하고 있으며, 후속 글에서는 고주파 거래 전략의 다른 문제들에 대해 심도 있게 논의할 계획이다.

저는 디지털 화폐에 대한 두 개의 기사를 썼습니다.디지털 화폐의 하이프레크 전략에 대한 자세한 소개, 5번 밸런 80배, 높은 주파수 전략의 힘▲ 그러나 경험 공유, 범용적으로 이야기 할 수 있습니다. 이번에는 일련의 기사를 작성 할 계획입니다. 처음부터 고 주파수 거래에 대한 아이디어를 소개합니다. 최대한 간결하게 설명하기를 바랍니다. 그러나 제 자신의 수준이 제한되어 있기 때문에 고 주파수 거래에 대한 이해가 깊지 않기 때문에 이 기사는 단지 유인자를 던지고 대 신께서 옳을 것을 바랍니다.

높은 주파수 수익성 소스

이전 기사에서 언급한 바와 같이, 고주파 전략은 특히 시장이 매우 급격하게 변동하는 시장에 적합하다. 전체 추세와 격동으로 구성된 짧은 시간 동안의 가격 변화의 거래 품종을 살펴본다. 우리가 추세의 변화를 정확하게 예측할 수 있다면 당연히 돈을 벌 수 있지만, 이것은 또한 가장 어렵습니다. 이 글은 주로 고주파 메이커 전략에 대해 설명하고 있습니다. 이 문제는 다루지 않을 것입니다. 격동 상황에서 전략적으로 주문을 거래하면 거래가 충분히 빈번하고 수익 공간이 충분히 크다면 트렌드에 의한 잠재적 손실을 커버 할 수 있습니다.

해결해야 할 문제

1.策略同时挂买单和卖单,第一个问题就是在哪里挂单。挂的离盘口越近,成交的概率越高,但在剧烈波动的行情中,瞬间成交的价格可能离盘口较远,挂的那太近没有能吃到足够的利润。挂的太远的单子成交概率又低。这是一个需要优化的问题。

2.控制仓位。为了控制风险,策略就不能长时间累计过多的仓位。可以通过控制挂单距离、挂单量、总仓位限制等办法解决。

위의 목적을 달성하기 위해서는 거래의 확률 확률, 거래의 이익, 시장 추정 등 다양한 측면에 대한 모델링 추정이 필요합니다. 이 분야에 대한 기사와 논문은 많으며, 하이-프레크류니티 트레이딩, 오더북과 같은 키워드에서 찾을 수 있습니다. 온라인에도 많은 권장 사항이 있습니다. 또한 신뢰할 수있는 빠른 리테스트 시스템을 구축하는 것이 좋습니다.

필요한 데이터

안은 각 거래와 가장 우수한 송금 데이터를 제공합니다.다운로드이 문서에서는 HOOKUSDT-aggTrades-2023-01-27의 데이터를 예로 들 수 있다.

from datetime import date,datetime
import time
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

각 거래는 다음과 같습니다:

  1. agg_trade_id: 거래로 분류된 id,
  2. 가격: 거래 가격
  3. quantity: 거래의 양
  4. first_trade_id: 집계 거래에는 여러 개의 거래가 동시에 이루어질 수 있으며, 하나의 데이터만 통계에 포함되며, 이는 첫 번째 거래의 ID입니다.
  5. last_trade_id: 마지막 거래의 id
  6. 트랜잭션_타임: 트랜잭션 완료 시간
  7. is_buyer_maker: 거래 방향, True는 구매자, 구매자는 구매자

그 날 66만 건의 거래 데이터가 있었고 거래가 활발하다는 것을 볼 수 있습니다.

trades = pd.read_csv('COMPUSDT-aggTrades-2023-07-02.csv')
trades

664475 행 × 7 열

agg_trade_id 가격 1st_trade_id last_trade_id 트랜잭션 시간 is_buyer_maker
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 맞아요

단일 거래 모델링

먼저 데이터를 처리하여 원본 트레이드를 분할하여 구매자 주도적 거래 그룹과 판매자 주도적 거래 그룹으로 분류합니다. 또한 원본 종합 거래의 데이터는 동시에 같은 가격과 같은 방향으로 하나의 데이터로 이루어져 있으며, 100 개의 주도적 거래량이 발생할 수 있습니다. 여러 거래로 분할되어 가격이 다르면 두 개의 데이터가 생성됩니다. 예를 들어 60와 40을 두 번 분할하면 거래량 추정에 영향을 미칩니다. 따라서 트랜잭트_타임에 따라 다시 한 번 집계해야합니다. 집계 후 데이터 양은 140,000 개 감소합니다.

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

png

为了观察方便,截掉尾部观察.可以看到成交量越大,出现频率越低,且减少的趋势更快。

buy_trades['quantity'][buy_trades['quantity']<200].plot.hist(bins=200,figsize=(10, 5));

png

거래량 만족 분포에 관한 연구는 많이 있다. 파레토 분포 (Power-law distribution) 는 통계 물리학과 사회 과학에서 흔히 볼 수 있는 확률 분포의 한 형태이다. 파레토 분포의 경우 사건의 크기가 그 사건의 크기에 대한 부정적인 지수와 같다. 이 분포의 주요 특징은 큰 사건의 발생 빈도가 다른 많은 분포에서 예상되는 것보다 더 높다는 것이다. 이것이 바로 거래량 분포의 특징이다. 파레토 분포의 형태는: P (x) = C (x) ^ (α)).

아래 그림은 거래량이 어떤 값보다 큰 확률을 나타냅니다. 파란색 선은 실제 확률이고, 선은 모의 확률입니다. 구체적인 매개 변수를 복잡하게 만들지 않고, 실제로 파레토 분포를 만족시키는 것을 볼 수 있습니다. 0보다 큰 주문의 확률은 1이기 때문에 표준화를 충족시키기 위해 분포 방정식의 형태는 다음과 같습니다.

png

여기서 N는 표준화된 매개 변수이다. 여기서 평균 트랜잭션 M를 선택하고, 알파는 2.06을 선택한다. 특정 알파의 추정값은 D=N의 P값을 역산하여 계산할 수 있다. 구체적으로: 알파 = 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)

img

plt.figure(figsize=(10, 5))
plt.grid(True)
plt.title('Diff')
plt.plot(depths, probabilities_s-probabilities);

png

그러나 이 추정치는 단지, 위의 그림에서 우리가 모의값과 실제값의 차이를 그려낸 것처럼 보인다. 트랜잭션이 작을 때 오차는 매우 크거나 심지어 10%에 가깝다. 파라미터 추정에서 다른 점을 선택하여 이 점의 확률을 더 정확하게 만들 수는 있지만, 또한 오차 문제를 해결하지 못한다. 이것은 값 분포와 실제 분포의 차이에 의해 결정되며, 더 정확한 결과를 얻기 위해, 값 분포의 방정식을 수정해야 한다. 구체적인 과정은 설명되지 않고, 전체적으로 빛의 깜박임이 발견되고, 실제로는 다음과 같다.

png

여기서 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);

png

거래량 분포에 대한 추정 방정식과 함께, 방정식의 확률은 실제 확률이 아니라 조건적 확률이다. 이 때 다음 주문이 발생하면, 이 주문이 어떤 값보다 큰 확률은 무엇입니까? 또는 다른 깊이의 주문이 완료되는 확률은 무엇입니까? (이미, 덜 엄격한 경우, 이론적으로 주문책에는 새로운 주문과 철회가 있으며, 같은 깊이의 대기열이 있습니다.) 라는 질문에 답할 수 있습니다.

이 글은 거의 끝났습니다. 많은 질문이 남아 있습니다. 다음 기사에서는 그 답을 찾으려고 노력하겠습니다.


더 많은

오크 정량화 🐂🍺

fmzero!

초목CSV는 너무 커서 직접 다운로드할 수 있습니다.