Berpikir tentang strategi perdagangan frekuensi tinggi (3)

Penulis:Rumput, Dibuat: 2023-08-07 18:17:28, Diperbarui: 2023-09-18 19:50:53

img

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.

Jangka waktu pesanan

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:

img

Di antaranya:

  • K adalah jumlah peristiwa yang kita minati.
  • λ adalah rata-rata kejadian kejadian dalam satuan waktu (atau ruang satuan).
  • P ((k; λ) menunjukkan probabilitas k kejadian yang terjadi secara kebetulan dalam kondisi dengan kejadian rata-rata λ.

Dalam proses Parason, interval waktu antara peristiwa tunduk pada distribusi indeks. Fungsi kepadatan probabilitas distribusi indeks (PDF) diberikan oleh rumus berikut:

img

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));

img

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)

img

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.

  • Kejadian tidak konstan: Proses Parsons mengasumsikan bahwa rata-rata kejadian kejadian dalam jangka waktu tertentu adalah konstan. Jika hipotesis ini tidak benar, maka distribusi data akan menyimpang dari distribusi Parsons.
  • Interaksi proses: Hipotesis dasar lain dari proses Parsons adalah bahwa peristiwa-peristiwa adalah independen. Jika peristiwa-peristiwa di dunia nyata saling mempengaruhi, maka distribusi mereka mungkin menyimpang dari distribusi Parsons.

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() ;

img

Perbarui parameter secara real time

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);

img

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);

img

(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

Pengamatan

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.


Lebih banyak