Tư duy về chiến lược giao dịch tần số cao (3)

Tác giả:Cỏ nhỏ, Tạo: 2023-08-07 18:17:28, Cập nhật: 2023-09-18 19:50:53

img

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 một cách đơn giản các hiện tượng cú sốc giá. Bài viết này cũng sẽ tiếp tục phân tích xung quanh dữ liệu lệnh giao dịch.

Khoảng thời gian đặt hàng

Thông thường, giả sử thời gian đặt hàng đến phù hợp với quá trình đặt hàng, đây là một bài viết giới thiệu.Quá trình ParshanCác bạn có thể tham khảo bài viết trên trên.

Tải xuống AggTrades ngày 5 tháng 8, tổng cộng 193193 giao dịch, rất phóng đại. Trước tiên, hãy nhìn vào sự phân bố thanh toán, bạn có thể thấy một đỉnh địa phương không trơn tru ở khoảng 100ms và 500ms, được cho là do lệnh hẹn giờ robot được ủy thác bởi tảng băng trôi, đây cũng có thể là một trong những lý do gây ra sự bất thường trong ngày.

Phương thức của hàm khối lượng xác suất (PMF) của phân bố Parsons được đưa ra bởi:

img

Trong đó có:

  • k là số lượng sự kiện mà chúng ta quan tâm.
  • λ là tỷ lệ trung bình của các sự kiện trong thời gian đơn vị (hoặc không gian đơn vị).
  • P ((k; λ) cho thấy khả năng xảy ra của k sự kiện tình cờ trong một điều kiện có tỷ lệ xảy ra trung bình λ.

Trong quá trình Parsons, khoảng thời gian giữa các sự kiện phụ thuộc vào phân bố chỉ số; hàm mật độ xác suất của phân bố chỉ số (PDF) được đưa ra bởi công thức sau:

img

Bằng cách kết hợp, kết quả được tìm thấy khác biệt lớn hơn so với phân bố Pareto dự kiến, quá trình Pareto đã đánh giá thấp tần số thời gian khoảng cách dài và đánh giá cao tần số thời gian khoảng cách thấp.

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

Phân phối số lần xảy ra lệnh trong 1s, so sánh với phân bố Parsons, cũng có sự khác biệt rất rõ ràng. Phân phối Parsons đánh giá thấp đáng kể tần suất xảy ra các sự kiện có khả năng thấp.

  • Tỷ lệ xảy ra không cố định: Quá trình Parsons giả định tỷ lệ xảy ra trung bình của sự kiện trong bất kỳ khoảng thời gian nào là không đổi. Nếu giả định này không đúng, thì sự phân bố của dữ liệu sẽ sai so với sự phân bố Parsons.
  • Sự tương tác của quá trình: Một giả định cơ bản khác của quá trình Parsons là sự kiện là độc lập giữa các sự kiện. Nếu các sự kiện trong thế giới thực ảnh hưởng đến nhau, thì sự phân bố của chúng có thể sai lệch so với sự phân bố Parsons.

Điều này có nghĩa là trong môi trường thực, tần suất xảy ra của các đơn đặt hàng là không nhất quán, cần được cập nhật trong thời gian thực và sẽ có tác dụng khuyến khích, tức là nhiều đơn đặt hàng hơn trong một thời gian cố định sẽ kích thích nhiều đơn đặt hàng hơn. Điều này làm cho chiến lược không thể cố định một tham số duy nhất.

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

Cập nhật các thông số trong thời gian thực

Từ việc phân tích khoảng thời gian đặt hàng trước đây, có thể kết luận rằng các thông số cố định không phù hợp với thị trường thực tế, các thông số quan trọng về mô tả thị trường của chiến lược cần được cập nhật trong thời gian thực. Phương pháp dễ nhất để nghĩ đến là trung bình di chuyển của cửa sổ trượt. Hai biểu đồ dưới đây là trung bình của 1000 cửa sổ về tần suất thanh toán trong 1s và số lượng giao dịch, chúng ta có thể thấy hiện tượng tập hợp giao dịch, tức là có một thời gian tần suất đặt hàng cao hơn đáng kể so với bình thường, và số lượng tại thời điểm này cũng đồng bộ lớn.

Từ biểu đồ cũng có thể hiểu được tại sao tần suất đặt hàng lại lệch quá nhiều so với phân bố Parsons, trong khi số lượng đơn đặt hàng mỗi giây trung bình chỉ có 8,5 lần, nhưng trong trường hợp cực đoan, số lượng đơn đặt hàng mỗi giây trung bình lệch rất nhiều.

Ở đây, người ta tìm thấy rằng việc dự đoán sai sót parallax với giá trị trung bình của hai giây trước là nhỏ nhất và tốt hơn nhiều so với kết quả dự đoán trung bình đơn giản.

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

img

result_df
order_count số lượng_số
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

Tóm lại

Bài viết này đơn giản giới thiệu lý do cho quá trình sai lệch trong khoảng thời gian đặt hàng, chủ yếu là do các tham số thay đổi theo thời gian. Để dự đoán thị trường chính xác hơn, chiến lược cần phải dự đoán các tham số cơ bản của thị trường trong thời gian thực. Các dự báo có thể được đo lường tốt hay xấu bằng dư thừa, ví dụ đơn giản nhất được đưa ra ở trên, phân tích chuỗi thời gian cụ thể, tập hợp tỷ lệ biến động và nhiều nghiên cứu liên quan có thể được cải thiện hơn nữa.


Thêm nữa