Pemikiran mengenai strategi perdagangan frekuensi tinggi (3)

Penulis:Rumput, Dicipta: 2023-08-07 18:17:28, Dikemas kini: 2023-09-18 19:50:53

img

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.

Jangkaan masa pesanan

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:

img

Di antaranya:

  • k ialah bilangan peristiwa yang kita minat.
  • λ ialah purata kejadian kejadian dalam satu unit masa (atau ruang satu unit).
  • P ((k; λ) menunjukkan kebarangkalian k peristiwa yang berlaku secara kebetulan, dengan keadaan kejadian purata λ.

Dalam proses Parthenon, selang masa antara peristiwa tertakluk kepada pembahagian indeks. Fungsi ketumpatan kebarangkalian pembahagian indeks (PDF) diberikan oleh formula berikut:

img

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

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

Perbandingan perpaduan jumlah kejadian pesanan dalam 1s dengan pembahagian Parsons juga sangat jelas. Perpaduan Parsons sangat merendahkan kekerapan kejadian kejadian kemungkinan kecil.

  • Kejadian tidak senantiasa: Proses Parsons mengandaikan bahawa purata kejadian peristiwa dalam tempoh masa yang diberikan adalah senantiasa. Jika hipotesis ini tidak benar, maka pembahagian data akan menyimpang dari pembahagian Parsons.
  • Interaksi proses: Satu lagi hipotesis asas proses Parsons ialah peristiwa adalah bebas antara satu sama lain. Jika peristiwa di dunia nyata saling mempengaruhi, maka pembahagian mereka mungkin menyimpang dari pembahagian Parsons.

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

img

Mengemas kini parameter secara langsung

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

img

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

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

Ringkasan

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.


Lebih lanjut