Pada artikel sebelumnya, saya menjelaskan bagaimana memodelkan jumlah transaksi yang terkumpul, serta menganalisis kejutan harga secara sederhana. Artikel ini juga akan terus menganalisis data pesanan perdagangan.
Pada umumnya, asumsi waktu kedatangan pesanan sesuai dengan proses Parson, di sini ada sebuah artikel yang menjelaskan.Proses ParasamDi bawah ini saya akan membuktikan.
Download aggTrades tanggal 5 Agustus, total 193193 perdagangan, sangat berlebihan. Pertama-tama, lihatlah distribusi pembayaran, Anda dapat melihat puncak lokal yang tidak mulus di sekitar 100ms dan 500ms, yang seharusnya disebabkan oleh robot penjadwalan waktu yang ditugaskan oleh gunung es, yang mungkin juga merupakan salah satu alasan untuk ketidakbiasaannya pada hari itu.
Fungsi massa probabilitas (PMF) dari distribusi Parsons diberikan oleh rumus berikut:
Di antaranya:
Dalam proses Parason, interval waktu antara peristiwa tunduk pada distribusi indeks. Fungsi kepadatan probabilitas distribusi indeks (PDF) diberikan oleh rumus berikut:
Dengan menemukan bahwa hasil dan distribusi Pareto yang diharapkan jauh berbeda, proses Pareto meremehkan frekuensi waktu interval panjang dan meremehkan frekuensi waktu interval rendah.
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));
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)
Distribusi jumlah kejadian order dalam 1s dibandingkan dengan distribusi Parsons, yang juga sangat berbeda. Distribusi Parsons secara signifikan meremehkan frekuensi kejadian kejadian peristiwa probabilitas rendah.
Artinya, dalam lingkungan nyata, frekuensi kejadian order tidak konstan, perlu diperbarui secara real-time, dan akan terjadi efek insentif, yaitu lebih banyak order dalam waktu yang tetap akan memicu lebih banyak order; yang membuat strategi tidak dapat menetapkan parameter tunggal.
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() ;
Dari analisis interval pesanan di atas dapat disimpulkan bahwa parameter tetap tidak sesuai dengan pasar nyata, parameter kunci dari strategi untuk menggambarkan pasar perlu diperbarui secara real-time. Solusi yang paling mudah dipertimbangkan adalah rata-rata bergerak jendela geser. Dua grafik di bawah ini adalah rata-rata frekuensi pembayaran dalam 1s dan rata-rata rata-rata rata-rata rata-rata rata-rata rata-rata rata-rata rata-rata rata-rata rata-rata rata-rata rata-rata rata-rata rata-rata rata-rata rata-rata rata-rata rata-rata rata-rata rata-rata rata-rata rata-rata rata-rata rata-rata rata-rata rata-rata rata-rata rata-rata rata-rata rata-rata rata-rata rata-rata rata-rata rata-rata rata-rata rata-rata rata-rata rata-rata rata-rata rata-rata rata-rata rata-rata rata-rata rata-rata rata-rata rata-rata rata-rata rata-rata rata-rata rata-rata rata-rata rata-rata rata-rata rata-rata rata-rata rata-rata rata-rata rata-rata rata-rata rata-rata rata-rata rata-rata
Dari grafik ini juga dapat dimengerti mengapa frekuensi pesanan akan sangat menyimpang dari distribusi Parsons, meskipun rata-rata jumlah pesanan per detik hanya 8.5 kali, tetapi dalam kasus ekstrim rata-rata pesanan per detik jauh menyimpang.
Di sini ditemukan bahwa rata-rata dua detik pertama adalah yang paling kecil untuk memprediksi kesalahan parsial, dan jauh lebih baik daripada rata-rata sederhana.
result_df['order_count'][::10].rolling(1000).mean().plot(figsize=(10,5),grid=True);
result_df
order_count | jumlah_jumlah | |
---|---|---|
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);
(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
Artikel ini menjelaskan secara singkat mengapa proses pergeseran interval waktu pesanan terjadi, terutama karena parameter berubah seiring waktu. Untuk memprediksi pasar dengan lebih akurat, strategi memerlukan prediksi waktu nyata terhadap parameter dasar pasar. Sisa dapat digunakan untuk mengukur baik atau buruk dari prediksi, yang diberikan di atas adalah contoh yang paling sederhana.