이 글은 디지털 화폐의 고주파 거래 전략에 대해 논의하고 있으며, 이윤의 근원 (주로 시장의 급격한 변동과 거래소 수수료로부터의 환불), 단위 위치 및 위치 통제 문제, 그리고 파레토 분포를 사용하여 거래 완료를 모델링하는 방법에 대한 문제들을 다루고 있다. 또한, 비안안이 제공하는 단위 거래 및 최상위 단위 순위 데이터를 참조하여 재검토하고 있으며, 후속 글에서는 고주파 거래 전략의 다른 문제들에 대해 심도 있게 논의할 계획이다.
저는 디지털 화폐에 대한 두 개의 기사를 썼습니다.디지털 화폐의 하이프레크 전략에 대한 자세한 소개, 5번 밸런 80배, 높은 주파수 전략의 힘▲ 그러나 경험 공유, 범용적으로 이야기 할 수 있습니다. 이번에는 일련의 기사를 작성 할 계획입니다. 처음부터 고 주파수 거래에 대한 아이디어를 소개합니다. 최대한 간결하게 설명하기를 바랍니다. 그러나 제 자신의 수준이 제한되어 있기 때문에 고 주파수 거래에 대한 이해가 깊지 않기 때문에 이 기사는 단지 유인자를 던지고 대 신께서 옳을 것을 바랍니다.
이전 기사에서 언급한 바와 같이, 고주파 전략은 특히 시장이 매우 급격하게 변동하는 시장에 적합하다. 전체 추세와 격동으로 구성된 짧은 시간 동안의 가격 변화의 거래 품종을 살펴본다. 우리가 추세의 변화를 정확하게 예측할 수 있다면 당연히 돈을 벌 수 있지만, 이것은 또한 가장 어렵습니다. 이 글은 주로 고주파 메이커 전략에 대해 설명하고 있습니다. 이 문제는 다루지 않을 것입니다. 격동 상황에서 전략적으로 주문을 거래하면 거래가 충분히 빈번하고 수익 공간이 충분히 크다면 트렌드에 의한 잠재적 손실을 커버 할 수 있습니다.
1.策略同时挂买单和卖单,第一个问题就是在哪里挂单。挂的离盘口越近,成交的概率越高,但在剧烈波动的行情中,瞬间成交的价格可能离盘口较远,挂的那太近没有能吃到足够的利润。挂的太远的单子成交概率又低。这是一个需要优化的问题。
2.控制仓位。为了控制风险,策略就不能长时间累计过多的仓位。可以通过控制挂单距离、挂单量、总仓位限制等办法解决。
위의 목적을 달성하기 위해서는 거래의 확률 확률, 거래의 이익, 시장 추정 등 다양한 측면에 대한 모델링 추정이 필요합니다. 이 분야에 대한 기사와 논문은 많으며, 하이-프레크류니티 트레이딩, 오더북과 같은 키워드에서 찾을 수 있습니다. 온라인에도 많은 권장 사항이 있습니다. 또한 신뢰할 수있는 빠른 리테스트 시스템을 구축하는 것이 좋습니다.
from datetime import date,datetime
import time
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
각 거래는 다음과 같습니다:
그 날 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));
为了观察方便,截掉尾部观察.可以看到成交量越大,出现频率越低,且减少的趋势更快。
buy_trades['quantity'][buy_trades['quantity']<200].plot.hist(bins=200,figsize=(10, 5));
거래량 만족 분포에 관한 연구는 많이 있다. 파레토 분포 (Power-law distribution) 는 통계 물리학과 사회 과학에서 흔히 볼 수 있는 확률 분포의 한 형태이다. 파레토 분포의 경우 사건의 크기가 그 사건의 크기에 대한 부정적인 지수와 같다. 이 분포의 주요 특징은 큰 사건의 발생 빈도가 다른 많은 분포에서 예상되는 것보다 더 높다는 것이다. 이것이 바로 거래량 분포의 특징이다. 파레토 분포의 형태는: P (x) = C (x) ^ (α)).
아래 그림은 거래량이 어떤 값보다 큰 확률을 나타냅니다. 파란색 선은 실제 확률이고,
여기서 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)
plt.figure(figsize=(10, 5))
plt.grid(True)
plt.title('Diff')
plt.plot(depths, probabilities_s-probabilities);
그러나 이 추정치는 단지, 위의 그림에서 우리가 모의값과 실제값의 차이를 그려낸 것처럼 보인다. 트랜잭션이 작을 때 오차는 매우 크거나 심지어 10%에 가깝다. 파라미터 추정에서 다른 점을 선택하여 이 점의 확률을 더 정확하게 만들 수는 있지만, 또한 오차 문제를 해결하지 못한다. 이것은
여기서 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);
거래량 분포에 대한 추정 방정식과 함께, 방정식의 확률은 실제 확률이 아니라 조건적 확률이다. 이 때 다음 주문이 발생하면, 이 주문이 어떤 값보다 큰 확률은 무엇입니까? 또는 다른 깊이의 주문이 완료되는 확률은 무엇입니까? (이미, 덜 엄격한 경우, 이론적으로 주문책에는 새로운 주문과 철회가 있으며, 같은 깊이의 대기열이 있습니다.) 라는 질문에 답할 수 있습니다.
이 글은 거의 끝났습니다. 많은 질문이 남아 있습니다. 다음 기사에서는 그 답을 찾으려고 노력하겠습니다.
오크 정량화 🐂🍺
fmzero
초목CSV는 너무 커서 직접 다운로드할 수 있습니다.