Pemikiran mengenai Strategi Dagangan Frekuensi Tinggi (3)

Penulis:Lydia, Dicipta: 2023-08-08 10:05:19, Dikemas kini: 2023-09-12 15:50:55

img

Pemikiran mengenai Strategi Dagangan Frekuensi Tinggi (3)

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.

Jangka Masa Perintah

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:

img

Di mana:

  • κ ialah bilangan acara yang kita minat.
  • λ ialah purata kadar peristiwa yang berlaku setiap unit masa (atau ruang unit).
  • imgmewakili kebarangkalian kejadian κ yang berlaku, dengan kadar purata λ.

Dalam proses Poisson, selang masa antara peristiwa mengikuti pengedaran eksponensial.

img

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]:

img

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]:

img

Apabila membandingkan pengedaran jumlah kejadian dalam satu saat dengan pengedaran Poisson, perbezaannya juga penting. Pengedaran Poisson secara signifikan merendahkan kekerapan kejadian jarang berlaku.

  • Kadar kejadian yang tidak tetap: Proses Poisson menganggap bahawa kadar purata peristiwa yang berlaku dalam selang masa tertentu adalah tetap. Jika andaian ini tidak berlaku, maka pengedaran data akan menyimpang dari pengedaran Poisson.
  • Interaksi antara proses: Satu lagi andaian asas proses Poisson adalah bahawa peristiwa adalah bebas antara satu sama lain.

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]:

img

Kemas kini Parameter Masa Nyata

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]:

img

Pada tahun [193]:

result_df['quantity_sum'].rolling(1000).mean().plot(figsize=(10,5),grid=True);

Keluar[193]:

img

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

Ringkasan

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.


Lebih lanjut