Bài viết trước đã chứng minh sự cần thiết phải điều chỉnh các thông số một cách năng động và cách đánh giá chất lượng ước tính bằng cách nghiên cứu khoảng thời gian đặt hàng đến.
Binance cung cấp tải xuống dữ liệu lịch sử cho best_bid_price (giá mua cao nhất), best_bid_quantity (lượng ở giá thầu tốt nhất), best_ask_price (giá bán thấp nhất), best_ask_quantity (lượng ở giá thầu tốt nhất) và transaction_time. Dữ liệu này không bao gồm các mức sổ lệnh thứ hai hoặc sâu hơn. Phân tích trong bài viết này dựa trên thị trường YGG vào ngày 7 tháng 8, trải qua sự biến động đáng kể với hơn 9 triệu điểm dữ liệu.
Đầu tiên, hãy xem xét điều kiện thị trường vào ngày đó. Có những biến động lớn, và khối lượng sổ lệnh thay đổi đáng kể cùng với sự biến động của thị trường. Sự lây lan, đặc biệt, chỉ ra mức độ biến động của thị trường, đó là sự khác biệt giữa giá mua và mua tốt nhất. Trong số liệu thống kê của thị trường YGG vào ngày đó, sự lây lan lớn hơn một dấu chấm trong 20% thời gian. Trong thời đại của các robot giao dịch khác nhau cạnh tranh trong sổ lệnh, những tình huống như vậy ngày càng trở nên hiếm.
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]:
books = pd.read_csv('YGGUSDT-bookTicker-2023-08-07.csv')
Trong [3]:
tick_size = 0.0001
Trong [4]:
books['date'] = pd.to_datetime(books['transaction_time'], unit='ms')
books.index = books['date']
Trong [5]:
books['spread'] = round(books['best_ask_price'] - books['best_bid_price'],4)
Trong [6]:
books['best_bid_price'][::10].plot(figsize=(10,5),grid=True);
Ra ngoài[6]:
Trong [7]:
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);
Ra ngoài[7]:
Trong [8]:
(books['spread'][::10]/tick_size).rolling(10000).mean().plot(figsize=(10,5),grid=True);
Ra khỏi[8]:
Trong [9]:
books['spread'].value_counts()[books['spread'].value_counts()>500]/books['spread'].value_counts().sum()
Ra khỏi[9]:
Nếu một bên của sổ đơn đặt hàng nhỏ hơn một bên khác, giả sử các đơn đặt hàng mua và bán hoạt động tương tự nhau về khối lượng, có nhiều khả năng bên nhỏ hơn sẽ được tiêu thụ, do đó thúc đẩy thay đổi giá. Các báo giá không cân bằng được thể hiện bằng chữ
Trong đó Q_b đại diện cho số tiền đặt hàng mua đang chờ (best_bid_qty) và Q_a đại diện cho số tiền đặt hàng bán đang chờ (best_ask_qty).
Định nghĩa giá trung bình:
Biểu đồ dưới đây cho thấy mối quan hệ giữa tỷ lệ thay đổi giá trung bình trong khoảng thời gian 1 tiếp theo và sự mất cân bằng I. Như dự kiến, giá càng tăng khi I tăng và càng gần 1, thì sự thay đổi giá càng tăng tốc. Trong giao dịch tần số cao, việc giới thiệu giá trung gian là để dự đoán tốt hơn những thay đổi giá trong tương lai, tức là, và sự khác biệt giá trong tương lai càng nhỏ, giá trung gian càng được xác định tốt hơn.
Trong [10]:
books['I'] = books['best_bid_qty'] / (books['best_bid_qty'] + books['best_ask_qty'])
Trong [11]:
books['mid_price'] = (books['best_ask_price'] + books['best_bid_price'])/2
Trong [12]:
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)
Ra khỏi [1]:
Trong [13]:
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)
Ra khỏi [1]:
Từ biểu đồ, có thể quan sát thấy rằng giá trung bình trọng số cho thấy sự thay đổi nhỏ hơn so với các giá trị khác nhau của I, cho thấy rằng nó phù hợp hơn. Tuy nhiên, vẫn có một số độ lệch, đặc biệt là khoảng 0,2 và 0,8. Điều này cho thấy rằng tôi vẫn cung cấp thông tin bổ sung. Giả định về mối quan hệ hoàn toàn tuyến tính giữa thuật ngữ điều chỉnh giá và I, như được ngụ ý bởi giá trung bình trọng số, không phù hợp với thực tế. Có thể thấy từ biểu đồ rằng tốc độ lệch tăng khi tôi tiếp cận 0 và 1, cho thấy một mối quan hệ phi tuyến tính.
Để cung cấp một đại diện trực quan hơn, đây là một định nghĩa lại của I:
Định nghĩa sửa đổi của I:
Tại thời điểm này:
Trong trường hợp này, lợi thế của phân bố I điều chỉnh (-1, 1) trở nên rõ ràng, vì I đối xứng xung quanh nguồn gốc, làm cho nó thuận tiện để tìm một mối quan hệ phù hợp cho hàm. Bằng cách kiểm tra biểu đồ, có vẻ như hàm này nên thỏa mãn các hàm I, vì nó phù hợp với sự tăng trưởng nhanh ở cả hai bên và đối xứng nguồn gốc. Ngoài ra, có thể quan sát thấy rằng các giá trị gần nguồn gốc gần tuyến tính. Hơn nữa, khi I là 0, kết quả hàm là 0, và khi I là 1, kết quả hàm là 0.5. Do đó, người ta suy đoán rằng công thức của hàm là:
Ở đây N là một số ngang dương, sau khi thử nghiệm thực tế, nó tốt hơn khi N là 8. Cho đến nay bài báo này trình bày giá trung bình được cân nhắc sửa đổi:
Tại thời điểm này, dự đoán thay đổi giá trung bình không còn liên quan đáng kể đến I. Mặc dù kết quả này tốt hơn một chút so với giá trung bình đơn giản, nhưng nó vẫn không áp dụng trong các kịch bản giao dịch thực tế. Đây chỉ là một cách tiếp cận được đề xuất.Micro-Priceđược giới thiệu bằng cách sử dụng một phương pháp chuỗi Markov, và mã liên quan được cung cấp.
Trong [14]:
books['I'] = (books['best_bid_qty'] - books['best_ask_qty']) / (books['best_bid_qty'] + books['best_ask_qty'])
Trong [15]:
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)
Ra khỏi [1]:
Trong [16]:
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'].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)
Ra khỏi [1]:
Trong giao dịch trực tiếp, các chiến lược nên nhằm mục đích sử dụng tất cả các dữ liệu có sẵn, bao gồm dữ liệu giao dịch, để xác nhận dự đoán giá trung bình so với giá giao dịch thực tế. Tôi nhớ Stoikov đã đề cập trong một Twitter rằng giá trung bình thực sự nên là một trung bình trọng số của xác suất của giá thầu và hỏi được thực hiện. Vấn đề này đã được khám phá trong các bài viết trước đây. Do hạn chế chiều dài, chi tiết hơn về các chủ đề này sẽ được thảo luận trong bài viết tiếp theo.