Dalam artikel sebelumnya, saya telah menerangkan bagaimana untuk memodelkan jumlah dagangan yang terkumpul, dan menganalisis kejutan harga yang mudah. Artikel ini juga akan terus menganalisis data pesanan perdagangan.
Dalam kes yang sama, anda boleh membuat pesanan di mana-mana sahaja yang anda mahu, tetapi anda tidak boleh membuat pesanan di mana-mana sahaja yang anda mahu.Proses PerpindahanSaya akan buktikan di bawah ini.
Mengunduh aggTrades pada 5 Ogos, dengan jumlah perdagangan 193193 perdagangan, sangat berlebihan. Pertama, lihatlah pembahagian pembayaran terlebih dahulu, anda dapat melihat puncak tempatan yang tidak licin di sekitar 100ms dan 500ms, yang sepatutnya disebabkan oleh pesanan masa robot yang ditugaskan oleh gunung es, yang mungkin juga salah satu sebab mengapa keadaan hari itu tidak biasa.
Fungsi kuantiti kebarangkalian (PMF) untuk sebaran Parsons diberikan oleh formula berikut:
Di antaranya:
Dalam proses Parthenon, selang masa antara peristiwa tertakluk kepada pembahagian indeks. Fungsi ketumpatan kebarangkalian pembahagian indeks (PDF) diberikan oleh formula berikut:
Dengan mencari hasil yang lebih besar daripada yang dijangkakan dengan pembahagian Pareto, proses Pareto meremehkan kekerapan masa selang panjang dan terlalu tinggi kekerapan masa selang 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)
Perbandingan perpaduan jumlah kejadian pesanan dalam 1s dengan pembahagian Parsons juga sangat jelas. Perpaduan Parsons sangat merendahkan kekerapan kejadian kejadian kemungkinan kecil.
Iaitu, dalam persekitaran sebenar, frekuensi kejadian pesanan tidak tetap, perlu dikemas kini dalam masa nyata, dan akan berlaku insentif, iaitu lebih banyak pesanan dalam masa yang tetap akan merangsang lebih banyak pesanan; ini membuat strategi tidak dapat menetapkan satu 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 selang pesanan di atas, dapat disimpulkan bahawa parameter tetap tidak sesuai dengan pasaran sebenar, parameter utama yang menggambarkan pasaran strategi perlu dikemas kini dalam masa nyata. Sempadan paling mudah untuk difikirkan adalah purata bergerak jendela geser. Dua grafik di bawah adalah purata purata kekerapan pembayaran dalam 1s dan purata purata 1000 tetingkap jumlah dagangan masing-masing.
Dari grafik ini juga dapat difahami mengapa frekuensi pesanan akan menyimpang begitu banyak dari pembahagian Parsons, walaupun purata jumlah pesanan hanya 8.5 kali sesaat, tetapi purata jumlah pesanan sesaat dalam keadaan ekstrem menyimpang jauh.
Di sini didapati bahawa ramalan dengan nilai purata dua saat pertama adalah yang paling kecil dan jauh lebih baik daripada ramalan dengan nilai purata yang mudah.
result_df['order_count'][::10].rolling(1000).mean().plot(figsize=(10,5),grid=True);
result_df
order_count | kuantiti_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 dengan ringkas menerangkan sebab-sebab proses pemisahan waktu pesanan, terutamanya kerana parameter berubah dari masa ke masa. Untuk meramalkan pasaran dengan lebih tepat, strategi memerlukan ramalan masa nyata terhadap parameter asas pasaran. Sisa boleh digunakan untuk mengukur ramalan baik atau buruk, contoh yang paling mudah diberikan di atas, analisis urutan masa tertentu, pengumpulan kadar turun naik dan banyak lagi kajian yang berkaitan boleh diperbaiki lebih lanjut.