Bài trước đã chỉ ra lý do tại sao phải điều chỉnh động các thông số và cách đánh giá ước tính tốt hay xấu bằng cách nghiên cứu khoảng thời gian đến của đơn đặt hàng. Bài viết này sẽ tập trung vào dữ liệu sâu, nghiên cứu giá trung bình (hay được gọi là giá công bằng, giá vi mô, v.v.).
Binance cung cấp tải về dữ liệu lịch sử về giá tốt nhất, bao gồm best_bid_price: giá mua tốt nhất, giá mua lớn nhất, best_bid_qty: số lượng giá mua tốt nhất, best_ask_price: giá bán tốt nhất, best_ask_qty: số lượng giá bán tốt nhất, transaction_time: thời gian. Dữ liệu này không bao gồm các tập thứ hai và các danh sách sâu hơn.
Đầu tiên nhìn vào thị trường trong ngày, tăng và giảm, số lượng đơn đăng ký giao dịch trong ngày cũng thay đổi lớn theo biến động của thị trường, đặc biệt là chênh lệch giữa giá bán và giá mua rất rõ ràng cho thấy tình trạng biến động của thị trường. Trong thống kê thị trường trong ngày của YGG, có 20% thời gian trải rộng lớn hơn 1 dấu chấm, điều này rất hiếm trong thời đại của các robot cạnh tranh trên giao dịch.
from datetime import date,datetime
import time
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
books = pd.read_csv('YGGUSDT-bookTicker-2023-08-07.csv')
tick_size = 0.0001
books['date'] = pd.to_datetime(books['transaction_time'], unit='ms')
books.index = books['date']
books['spread'] = round(books['best_ask_price'] - books['best_bid_price'],4)
books['best_bid_price'][::10].plot(figsize=(10,5),grid=True);
books['best_bid_qty'][::10].rolling(10000).mean().plot(figsize=(10,5),grid=True);
books['best_ask_qty'][::10].rolling(10000).mean().plot(figsize=(10,5),grid=True);
(books['spread'][::10]/tick_size).rolling(10000).mean().plot(figsize=(10,5),grid=True);
books['spread'].value_counts()[books['spread'].value_counts()>500]/books['spread'].value_counts().sum()
0.0001 0.799169
0.0002 0.102750
0.0003 0.042472
0.0004 0.022821
0.0005 0.012792
0.0006 0.007350
0.0007 0.004376
0.0008 0.002712
0.0009 0.001657
0.0010 0.001089
0.0011 0.000740
0.0012 0.000496
0.0013 0.000380
0.0014 0.000258
0.0015 0.000197
0.0016 0.000140
0.0017 0.000112
0.0018 0.000088
0.0019 0.000063
Name: spread, dtype: float64
Từ trên, bạn có thể thấy rằng số lượng đặt hàng mua và bán khác nhau rất nhiều trong hầu hết thời gian, và sự khác biệt này có tác dụng dự báo mạnh mẽ về thị trường ngắn hạn. Lý do tương tự như bài viết trước đã đề cập đến số lượng đặt hàng nhỏ thường giảm. Nếu một bên đặt hàng nhỏ hơn một bên, giả sử rằng số lượng đặt hàng mua và bán chủ động tiếp theo gần nhau, bên đặt hàng nhỏ có nhiều khả năng bị ăn thịt, do đó thúc đẩy sự thay đổi giá.Trong đó Q_b đại diện cho số đơn đặt hàng (best_bid_qty) và Q_a đại diện cho số đơn đặt hàng (best_ask_qty).
Định nghĩa giá giữa:
Hình dưới đây cho thấy mối quan hệ giữa tỷ lệ thay đổi giữa giá giữa và sự cân bằng I sau 1 khoảng thời gian, và theo dự đoán, giá càng tăng khi I tăng, giá càng có khả năng tăng, và mức độ thay đổi giá càng gần 1. Trong giao dịch tần suất cao, mục đích của việc đưa ra giá trung gian là để dự đoán tốt hơn sự thay đổi giá trong tương lai, tức là, giá trung gian được xác định tốt hơn khi chênh lệch giá nhỏ hơn với giá trong tương lai. Sự cân bằng hiển nhiên được liệt kê cung cấp thông tin bổ sung cho dự đoán của chiến lược, theo đó, xác định giá trung bình cân nặng:
books['I'] = books['best_bid_qty'] / (books['best_bid_qty'] + books['best_ask_qty'])
books['mid_price'] = (books['best_ask_price'] + books['best_bid_price'])/2
bins = np.linspace(0, 1, 51)
books['I_bins'] = pd.cut(books['I'], bins, labels=bins[1:])
books['price_change'] = (books['mid_price'].pct_change()/tick_size).shift(-1)
avg_change = books.groupby('I_bins')['price_change'].mean()
plt.figure(figsize=(8,5))
plt.plot(avg_change)
plt.xlabel('I Value Range')
plt.ylabel('Average Mid Price Change Rate');
plt.grid(True)
books['weighted_mid_price'] = books['mid_price'] + books['spread']*books['I']/2
bins = np.linspace(-1, 1, 51)
books['I_bins'] = pd.cut(books['I'], bins, labels=bins[1:])
books['weighted_price_change'] = (books['weighted_mid_price'].pct_change()/tick_size).shift(-1)
avg_change = books.groupby('I_bins')['weighted_price_change'].mean()
plt.figure(figsize=(8,5))
plt.plot(avg_change)
plt.xlabel('I Value Range')
plt.ylabel('Weighted Average Mid Price Change Rate');
plt.grid(True)
Từ biểu đồ, sự thay đổi của giá giữa trọng lượng so với các I khác nhau là rất nhỏ, cho thấy giá giữa trọng lượng là một sự phù hợp tốt hơn. Nhưng vẫn có một số quy luật, chẳng hạn như khoảng 0.2 và 0.8, sai lệch lớn hơn. Điều này cho thấy I vẫn có thể đóng góp thông tin bổ sung. Vì giá giữa trọng lượng giả định điều chỉnh giá hoàn toàn tuyến tính với I, điều này rõ ràng không phù hợp với thực tế, như có thể thấy từ biểu đồ trên, sự sai lệch nhanh hơn khi I gần 0 và 1, chứ không phải là mối quan hệ tuyến tính.
Để hiểu rõ hơn, hãy định nghĩa lại I:
Tại thời điểm này:
Nhìn vào hình thức này, chúng ta có thể thấy rằng giá trung bình được cân nhắc là một sửa đổi cho giá trung bình, hệ số của điều chỉnh là Spread, và điều chỉnh là về hàm I, giá trung bình được cân nhắc đơn giản là giả định mối quan hệ này là I / 2. Khi điều chỉnh, lợi ích của sự phân bố của I (−1,1) được thể hiện, I về đối xứng điểm gốc, điều này giúp chúng ta tìm ra mối quan hệ phù hợp của hàm. Nhìn vào biểu đồ, hàm này nên đáp ứng các mối quan hệ bậc kỳ lạ của I, vì vậy phù hợp với tốc độ tăng trưởng của hai bên, và về đối xứng điểm gốc, chúng ta cũng có thể thấy rằng giá trị gần điểm gốc là tuyến tính, cộng lại gần I0, kết quả của hàm là 0, khi I là 1, kết quả của hàm là 0.5. Vì vậy, giả định:
N ở đây là số ngang dương, sau khi thử nghiệm thực tế, N là tốt hơn khi 8. Cho đến nay, bài viết đưa ra giá trung bình cân nhắc được sửa đổi:
Tại thời điểm này, dự đoán sự thay đổi của giá trung gian không liên quan đến I. Kết quả này, mặc dù tốt hơn giá trung gian cân nặng đơn giản, nhưng cũng không áp dụng thực tế, chỉ đưa ra một ý tưởng. Một bài báo năm 2017 của S. Stoikov sử dụng phương pháp chuỗi Markov.Micro-PriceCác bạn có thể tìm hiểu thêm về các chương trình này.
books['I'] = (books['best_bid_qty'] - books['best_ask_qty']) / (books['best_bid_qty'] + books['best_ask_qty'])
books['weighted_mid_price'] = books['mid_price'] + books['spread']*books['I']/2
bins = np.linspace(-1, 1, 51)
books['I_bins'] = pd.cut(books['I'], bins, labels=bins[1:])
books['weighted_price_change'] = (books['weighted_mid_price'].pct_change()/tick_size).shift(-1)
avg_change = books.groupby('I_bins')['weighted_price_change'].sum()
plt.figure(figsize=(8,5))
plt.plot(avg_change)
plt.xlabel('I Value Range')
plt.ylabel('Weighted Average Mid Price Change Rate');
plt.grid(True)
books['adjust_mid_price'] = books['mid_price'] + books['spread']*(books['I'])*(books['I']**8+1)/4
bins = np.linspace(-1, 1, 51)
books['I_bins'] = pd.cut(books['I'], bins, labels=bins[1:])
books['adjust_mid_price'] = (books['adjust_mid_price'].pct_change()/tick_size).shift(-1)
avg_change = books.groupby('I_bins')['adjust_mid_price'].sum()
plt.figure(figsize=(8,5))
plt.plot(avg_change)
plt.xlabel('I Value Range')
plt.ylabel('Weighted Average Mid Price Change Rate');
plt.grid(True)
books['adjust_mid_price'] = books['mid_price'] + books['spread']*(books['I']**3)/2
bins = np.linspace(-1, 1, 51)
books['I_bins'] = pd.cut(books['I'], bins, labels=bins[1:])
books['adjust_mid_price'] = (books['adjust_mid_price'].pct_change()/tick_size).shift(-1)
avg_change = books.groupby('I_bins')['adjust_mid_price'].sum()
plt.figure(figsize=(8,5))
plt.plot(avg_change)
plt.xlabel('I Value Range')
plt.ylabel('Weighted Average Mid Price Change Rate');
plt.grid(True)
Giá trung gian rất quan trọng đối với chiến lược tần số cao, là dự đoán về giá ngắn hạn trong tương lai, vì vậy giá trung gian nên chính xác nhất có thể. Giá trung gian được giới thiệu trước đây đều dựa trên dữ liệu giao dịch, vì chỉ có một tập hợp thị trường được sử dụng khi phân tích. Trong thực tế, chiến lược nên sử dụng tất cả dữ liệu càng tốt, đặc biệt là các giao dịch trong thực tế, và dự đoán về giá trung gian nên được kiểm tra bởi giá giao dịch thực tế.
LouisTôi không thể hiểu được.
fmzeroBọn chúng ta sẽ bị giết.