Artikel sebelumnya menunjukkan keperluan untuk menyesuaikan parameter secara dinamik dan bagaimana untuk menilai kualiti anggaran dengan mengkaji selang masa ketibaan pesanan.
Binance menyediakan muat turun data sejarah untuk best_bid_price (harga pembelian tertinggi), best_bid_quantity (kuantiti pada harga tawaran terbaik), best_ask_price (harga jualan terendah), best_ask_quantity (kuantiti pada harga permintaan terbaik), dan waktu transaksi. Data ini tidak termasuk tahap buku pesanan kedua atau lebih dalam. Analisis dalam artikel ini berdasarkan pasaran YGG pada 7 Ogos, yang mengalami turun naik yang ketara dengan lebih dari 9 juta mata data.
Pertama, mari kita lihat keadaan pasaran pada hari itu. Terdapat turun naik yang besar, dan jumlah buku pesanan berubah dengan ketara bersama-sama dengan turun naik pasaran. Penyebaran, khususnya, menunjukkan sejauh mana turun naik pasaran, yang merupakan perbezaan antara harga permintaan dan tawaran terbaik. Dalam statistik pasaran YGG pada hari itu, penyebaran lebih besar daripada satu tik untuk 20% masa. Dalam era pelbagai bot perdagangan yang bersaing dalam buku pesanan, situasi seperti itu semakin jarang berlaku.
Dalam [1]:
from datetime import date,datetime
import time
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
Dalam [2]:
books = pd.read_csv('YGGUSDT-bookTicker-2023-08-07.csv')
Dalam [3]:
tick_size = 0.0001
Dalam [4]:
books['date'] = pd.to_datetime(books['transaction_time'], unit='ms')
books.index = books['date']
Dalam [5]:
books['spread'] = round(books['best_ask_price'] - books['best_bid_price'],4)
Dalam [6]:
books['best_bid_price'][::10].plot(figsize=(10,5),grid=True);
Keluar[6]:
Dalam [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);
Keluar[7]:
Dalam [8]:
(books['spread'][::10]/tick_size).rolling(10000).mean().plot(figsize=(10,5),grid=True);
Keluar[8]:
Dalam [9]:
books['spread'].value_counts()[books['spread'].value_counts()>500]/books['spread'].value_counts().sum()
Keluar[9]:
Perkataan tidak seimbang diperhatikan dari perbezaan yang ketara dalam jumlah buku pesanan antara pesanan beli dan jual kebanyakan masa. Perbezaan ini mempunyai kesan ramalan yang kuat terhadap trend pasaran jangka pendek, serupa dengan sebab yang disebutkan sebelumnya bahawa penurunan dalam jumlah pesanan beli sering menyebabkan penurunan. Jika satu sisi buku pesanan jauh lebih kecil daripada yang lain, dengan mengandaikan pesanan beli dan jual aktif serupa dalam jumlah, terdapat kemungkinan yang lebih besar bahawa sisi yang lebih kecil dikonsumsi, dengan itu mendorong perubahan harga.
Di mana Q_b mewakili jumlah pesanan beli yang menunggu (best_bid_qty) dan Q_a mewakili jumlah pesanan jual yang menunggu (best_ask_qty).
Tentukan harga pertengahan:
Grafik di bawah menunjukkan hubungan antara kadar perubahan harga pertengahan dalam selang 1 seterusnya dan ketidakseimbangan I. Seperti yang dijangkakan, semakin besar kemungkinan harga akan meningkat apabila I meningkat dan semakin dekat dengan 1, semakin pesat perubahan harga. Dalam perdagangan frekuensi tinggi, pengenalan harga perantara adalah untuk meramalkan perubahan harga masa depan dengan lebih baik, iaitu, dan perbezaan harga masa depan lebih kecil, semakin baik harga perantara ditakrifkan.
Dalam [10]:
books['I'] = books['best_bid_qty'] / (books['best_bid_qty'] + books['best_ask_qty'])
Dalam [11]:
books['mid_price'] = (books['best_ask_price'] + books['best_bid_price'])/2
Dalam [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)
Keluar[12]:
Dalam [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)
Keluar[13]:
Dari grafik, dapat diperhatikan bahawa harga pertengahan yang ditimbang menunjukkan variasi yang lebih kecil berbanding dengan nilai I yang berbeza, menunjukkan bahawa ia lebih sesuai. Walau bagaimanapun, masih ada beberapa penyimpangan, terutamanya sekitar 0.2 dan 0.8. Ini menunjukkan bahawa saya masih memberikan maklumat tambahan. Asumsi hubungan yang sepenuhnya linear antara istilah pembetulan harga dan I, seperti yang tersirat oleh harga pertengahan yang ditimbang, tidak sejajar dengan realiti.
Untuk memberikan perwakilan yang lebih intuitif, berikut adalah definisi semula I:
Definisi I yang disemak semula:
Pada ketika ini:
Apabila diperhatikan, ia dapat diperhatikan bahawa harga pertengahan yang ditimbang adalah pembetulan kepada harga pertengahan purata, di mana istilah pembetulan dikalikan dengan penyebaran. Istilah pembetulan adalah fungsi I, dan harga pertengahan yang ditimbang mengandaikan hubungan mudah I/2. Dalam kes ini, kelebihan pengagihan I yang disesuaikan (-1, 1) menjadi jelas, kerana I simetri di sekitar asal, menjadikannya mudah untuk mencari hubungan yang sesuai untuk fungsi. Dengan memeriksa grafik, nampaknya fungsi ini harus memuaskan kuasa I, kerana ia sejajar dengan pertumbuhan pesat di kedua-dua belah pihak dan simetri asal. Di samping itu, dapat diperhatikan bahawa nilai di sekitar asal hampir linear. Selanjutnya, apabila I adalah 0, fungsi hasilnya adalah 0, dan apabila I adalah 1, hasilnya adalah 0.5.
Di sini N adalah nombor genap positif, selepas ujian sebenar, ia adalah lebih baik apabila N adalah 8. setakat ini kertas ini membentangkan harga pertengahan tertimbang yang diubah suai:
Pada ketika ini, ramalan perubahan harga pertengahan tidak lagi berkaitan dengan I. Walaupun hasil ini sedikit lebih baik daripada harga pertengahan tertimbang sederhana, ia masih tidak dapat digunakan dalam senario perdagangan sebenar. Ini hanya pendekatan yang dicadangkan.Harga Mikrodiperkenalkan menggunakan pendekatan rantaian Markov, dan kod yang berkaitan disediakan.
Dalam [14]:
books['I'] = (books['best_bid_qty'] - books['best_ask_qty']) / (books['best_bid_qty'] + books['best_ask_qty'])
Dalam [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)
Keluar[15]:
Dalam [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)
Keluar[16]:
Harga pertengahan adalah penting untuk strategi frekuensi tinggi kerana ia berfungsi sebagai ramalan harga masa depan jangka pendek. Oleh itu, adalah penting bagi harga pertengahan untuk menjadi tepat sebanyak mungkin. Pendekatan harga pertengahan yang dibincangkan sebelumnya berdasarkan data buku pesanan, kerana hanya tahap atas buku pesanan yang digunakan dalam analisis. Dalam perdagangan langsung, strategi harus bertujuan untuk menggunakan semua data yang ada, termasuk data perdagangan, untuk mengesahkan ramalan harga pertengahan terhadap harga transaksi sebenar. Saya ingat Stoikov menyebut dalam Twitter bahawa harga pertengahan sebenar harus menjadi purata tertimbang kebarangkalian tawaran dan meminta harga yang dilaksanakan. Isu ini telah diterokai dalam artikel sebelumnya. Oleh kerana batasan panjang, butiran lanjut mengenai topik ini akan dibincangkan dalam artikel seterusnya.