Trong bài viết trước, tôi đã giới thiệu cách mô hình hóa khối lượng giao dịch tích lũy và phân tích hiện tượng ảnh hưởng giá. Trong bài viết này, tôi sẽ tiếp tục phân tích dữ liệu đơn đặt hàng giao dịch. YGG gần đây đã tung ra các hợp đồng dựa trên Binance U, và biến động giá đã đáng kể, với khối lượng giao dịch thậm chí vượt qua BTC tại một thời điểm. Hôm nay, tôi sẽ phân tích nó.
Nói chung, nó được giả định rằng thời gian đến của đơn đặt hàng theo một quy trình Poisson.Quá trình PoissonỞ đây, tôi sẽ cung cấp bằng chứng thực nghiệm.
Tôi đã tải xuống dữ liệu AggTrades cho ngày 5 tháng 8, bao gồm 1.931.193 giao dịch, khá đáng kể. Đầu tiên, chúng ta hãy xem xét sự phân bố các lệnh mua. Chúng ta có thể thấy một đỉnh địa phương không mượt mà khoảng 100ms và 500ms, có khả năng là do các lệnh băng trôi được đặt bởi các robot giao dịch trong khoảng thời gian thường xuyên. Đây cũng có thể là một trong những lý do cho điều kiện thị trường bất thường trong ngày đó.
Chức năng khối lượng xác suất (PMF) của phân bố Poisson được cho bằng công thức sau:
Nơi:
Trong một quá trình Poisson, khoảng thời gian giữa các sự kiện theo một phân bố theo hàm số nhân.
Các kết quả phù hợp cho thấy có sự khác biệt đáng kể giữa dữ liệu quan sát và phân bố Poisson dự kiến. Quá trình Poisson đánh giá thấp tần suất của các khoảng thời gian dài và đánh giá quá cao tần suất của các khoảng thời gian ngắn.
Trong [1]:
from datetime import date,datetime
import time
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
Trong [2]:
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']
Trong [10]:
buy_trades['interval'][buy_trades['interval']<1000].plot.hist(bins=200,figsize=(10, 5));
Ra khỏi[10]:
Trong [20]:
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)
Ra khỏi [1]:
Khi so sánh sự phân bố số lần xảy ra thứ tự trong 1 giây với sự phân bố Poisson, sự khác biệt cũng rất đáng kể.
Nói cách khác, trong một môi trường thế giới thực, tần suất xảy ra lệnh là không liên tục, và nó cần phải được cập nhật trong thời gian thực.
Năm [190]:
result_df = buy_trades.resample('1S').agg({
'price': 'count',
'quantity': 'sum'
}).rename(columns={'price': 'order_count', 'quantity': 'quantity_sum'})
Trong [219]:
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() ;
Ra khỏi [219]:
Từ việc phân tích khoảng thời gian giao dịch trước đó, có thể kết luận rằng các thông số cố định không phù hợp với điều kiện thị trường thực tế và các thông số chính mô tả thị trường trong chiến lược cần phải được cập nhật trong thời gian thực. Giải pháp đơn giản nhất là sử dụng đường trung bình động cửa sổ trượt. Hai biểu đồ dưới đây cho thấy tần suất lệnh mua trong vòng 1 giây và số lượng giao dịch trung bình với kích thước cửa sổ 1000. Có thể quan sát thấy rằng có một hiện tượng cụm trong giao dịch, nơi tần suất giao dịch cao hơn đáng kể so với bình thường trong một khoảng thời gian, và khối lượng cũng tăng đồng bộ. Ở đây, trung bình của các giá trị trước đó được sử dụng để dự đoán giá trị tuyệt đối mới nhất và sai số trung bình của số dư được sử dụng để đo chất lượng của dự đoán.
Từ biểu đồ, chúng ta cũng có thể hiểu tại sao tần số thứ tự lệch rất nhiều so với phân bố Poisson. Mặc dù số lượng thứ tự trung bình mỗi giây chỉ là 8,5, các trường hợp cực đoan lệch đáng kể từ giá trị này.
Nó được tìm thấy rằng sử dụng trung bình của hai giây trước để dự đoán mang lại lỗi còn lại nhỏ nhất, và nó tốt hơn nhiều so với việc chỉ đơn giản sử dụng trung bình cho kết quả dự đoán.
Trong [221]:
result_df['order_count'].rolling(1000).mean().plot(figsize=(10,5),grid=True);
Ra khỏi [1]:
Năm [193]:
result_df['quantity_sum'].rolling(1000).mean().plot(figsize=(10,5),grid=True);
Ra khỏi [1]:
Năm [195]:
(result_df['order_count'] - result_df['mean_count'].mean()).abs().mean()
Ra khỏi[195]:
6.985628185332997
Trong [205]:
result_df['mean_count'] = result_df['order_count'].rolling(2).mean()
(result_df['order_count'] - result_df['mean_count'].shift()).abs().mean()
Ra khỏi[205]:
3.091737586730269
Bài viết này giải thích ngắn gọn lý do cho sự sai lệch của khoảng thời gian lệnh từ quy trình Poisson, chủ yếu là do sự thay đổi các tham số theo thời gian. Để dự đoán chính xác thị trường, các chiến lược cần phải dự đoán thời gian thực các tham số cơ bản của thị trường. Số dư có thể được sử dụng để đo chất lượng của dự đoán. Ví dụ được cung cấp ở trên là một minh chứng đơn giản, và có nghiên cứu rộng rãi về phân tích chuỗi thời gian cụ thể, nhóm biến động và các chủ đề liên quan khác, minh chứng ở trên có thể được cải thiện hơn nữa.