Dalam artikel sebelumnya, saya memperkenalkan cara memodelkan jumlah dagangan kumulatif dan menganalisis fenomena kesan harga. Dalam artikel ini, saya akan terus menganalisis data pesanan dagangan. YGG baru-baru ini melancarkan kontrak berasaskan Binance U, dan turun naik harga telah ketara, dengan jumlah dagangan bahkan melebihi BTC pada satu ketika. Hari ini, saya akan menganalisisnya.
Secara amnya, ia dianggap bahawa masa ketibaan pesanan mengikuti proses Poisson.Proses PoissonDi sini, saya akan memberikan bukti empirikal.
Saya memuat turun data AggTrades untuk 5 Ogos, yang terdiri daripada 1,931,193 perdagangan, yang agak penting. Pertama, mari kita lihat pembahagian pesanan beli. Kita dapat melihat puncak tempatan yang tidak lancar sekitar 100ms dan 500ms, yang mungkin disebabkan oleh pesanan aisberg yang diletakkan oleh bot perdagangan pada selang waktu yang tetap. Ini juga mungkin salah satu sebab untuk keadaan pasaran yang tidak biasa pada hari itu.
Fungsi jisim kebarangkalian (PMF) pengedaran Poisson diberikan oleh formula berikut:
Di mana:
Dalam proses Poisson, selang masa antara peristiwa mengikuti pengedaran eksponensial.
Hasil yang sesuai menunjukkan bahawa terdapat perbezaan yang ketara antara data yang diperhatikan dan pengedaran Poisson yang dijangkakan. Proses Poisson meremehkan kekerapan selang masa yang panjang dan meremehkan kekerapan selang masa yang pendek. (Pengedaran selang yang sebenarnya lebih dekat dengan pengedaran Pareto yang diubah suai)
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]:
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']
Dalam [10]:
buy_trades['interval'][buy_trades['interval']<1000].plot.hist(bins=200,figsize=(10, 5));
Keluar[10]:
Dalam [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)
Keluar[20]:
Apabila membandingkan pengedaran jumlah kejadian dalam satu saat dengan pengedaran Poisson, perbezaannya juga penting. Pengedaran Poisson secara signifikan merendahkan kekerapan kejadian jarang berlaku.
Dalam erti kata lain, dalam persekitaran dunia nyata, kekerapan kejadian pesanan tidak tetap, dan perlu dikemas kini dalam masa nyata.
Pada [190]:
result_df = buy_trades.resample('1S').agg({
'price': 'count',
'quantity': 'sum'
}).rename(columns={'price': 'order_count', 'quantity': 'quantity_sum'})
Dalam [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() ;
Keluar[219]:
Dari analisis selang pesanan sebelum ini, dapat disimpulkan bahawa parameter tetap tidak sesuai untuk keadaan pasaran sebenar, dan parameter utama yang menggambarkan pasaran dalam strategi perlu dikemas kini dalam masa nyata. Penyelesaian yang paling mudah adalah menggunakan purata bergerak tingkap bergerak. Dua grafik di bawah menunjukkan kekerapan pesanan beli dalam masa 1 saat dan purata jumlah dagangan dengan saiz tingkap 1000. Dapat diperhatikan bahawa terdapat fenomena pengumpulan dalam perdagangan, di mana kekerapan pesanan jauh lebih tinggi daripada biasa untuk tempoh masa, dan jumlahnya juga meningkat secara sinkron. Di sini, purata nilai sebelumnya digunakan untuk meramalkan nilai absolut terkini, dan kesilapan purata baki digunakan untuk mengukur kualiti ramalan.
Dari grafik, kita juga dapat memahami mengapa kekerapan perintah menyimpang begitu banyak dari pengedaran Poisson. Walaupun purata bilangan perintah sesaat hanya 8.5, kes melampau menyimpang dengan ketara dari nilai ini.
Telah didapati bahawa menggunakan purata dua saat sebelumnya untuk meramalkan menghasilkan kesilapan sisa terkecil, dan jauh lebih baik daripada hanya menggunakan purata untuk hasil ramalan.
Dalam [221]:
result_df['order_count'].rolling(1000).mean().plot(figsize=(10,5),grid=True);
Keluar[221]:
Pada tahun [193]:
result_df['quantity_sum'].rolling(1000).mean().plot(figsize=(10,5),grid=True);
Keluar[193]:
Pada tahun [195]:
(result_df['order_count'] - result_df['mean_count'].mean()).abs().mean()
Keluar[195]:
6.985628185332997
Dalam [205]:
result_df['mean_count'] = result_df['order_count'].rolling(2).mean()
(result_df['order_count'] - result_df['mean_count'].shift()).abs().mean()
Keluar[205]:
3.091737586730269
Artikel ini secara ringkas menerangkan sebab-sebab penyimpangan selang masa pesanan dari proses Poisson, terutamanya disebabkan oleh perubahan parameter dari masa ke masa. Untuk meramalkan pasaran dengan tepat, strategi perlu membuat ramalan masa nyata parameter asas pasaran. Sisa boleh digunakan untuk mengukur kualiti ramalan. Contoh yang diberikan di atas adalah demonstrasi yang mudah, dan terdapat penyelidikan yang luas mengenai analisis siri masa tertentu, pengelompokan turun naik, dan topik lain yang berkaitan, demonstrasi di atas boleh ditingkatkan lagi.