Saya telah menulis dua artikel tentang perdagangan frekuensi tinggi mata uang digital, yaitu
Dalam artikel saya sebelumnya, saya menyebutkan bahwa strategi frekuensi tinggi sangat cocok untuk pasar dengan fluktuasi yang sangat fluktuatif. Perubahan harga instrumen perdagangan dalam jangka waktu singkat terdiri dari tren dan osilasi keseluruhan. Meskipun memang menguntungkan jika kita dapat memprediksi perubahan tren dengan akurat, ini juga merupakan aspek yang paling menantang. Dalam artikel ini, saya terutama akan fokus pada strategi pembuat frekuensi tinggi dan tidak akan menyelidiki prediksi tren. Dalam pasar osilasi, dengan menempatkan penawaran dan meminta pesanan secara strategis, jika frekuensi penawaran cukup tinggi dan margin keuntungan signifikan, itu dapat menutupi potensi kerugian yang disebabkan oleh tren. Dengan cara ini, profitabilitas dapat dicapai tanpa memprediksi pergerakan pasar. Saat ini, bursa memberikan rebate untuk perdagangan pembuat, yang juga merupakan komponen keuntungan. Semakin tinggi komponen pasar, proporsi rebate harus lebih tinggi.
Masalah pertama dalam menerapkan strategi yang menempatkan baik pesanan beli dan jual adalah menentukan di mana untuk menempatkan pesanan ini. Semakin dekat pesanan ditempatkan ke kedalaman pasar, semakin tinggi probabilitas eksekusi. Namun, dalam kondisi pasar yang sangat fluktuatif, harga di mana pesanan segera dilaksanakan mungkin jauh dari kedalaman pasar, menghasilkan keuntungan yang tidak cukup. Di sisi lain, menempatkan pesanan terlalu jauh mengurangi probabilitas eksekusi. Ini adalah masalah optimalisasi yang perlu ditangani.
Pengendalian posisi sangat penting untuk mengelola risiko. Strategi tidak dapat mengumpulkan posisi yang berlebihan untuk jangka waktu yang lama. Hal ini dapat ditangani dengan mengontrol jarak dan jumlah pesanan yang ditempatkan, serta menetapkan batas pada posisi keseluruhan.
Untuk mencapai tujuan di atas, pemodelan dan estimasi diperlukan untuk berbagai aspek seperti probabilitas eksekusi, keuntungan dari eksekusi, dan estimasi pasar. Ada banyak artikel dan makalah yang tersedia tentang topik ini, menggunakan kata kunci seperti
Binance menyediakandata yang dapat diunduhuntuk perdagangan individu dan pesanan bid / ask terbaik. Data kedalaman dapat diunduh melalui API mereka dengan didaftarkan, atau dapat dikumpulkan secara manual. Untuk tujuan backtesting, data perdagangan agregat sudah cukup. Dalam artikel ini, kami akan menggunakan contoh data HOOKUSDT-aggTrades-2023-01-27.
Dalam [1]:
from datetime import date,datetime
import time
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
Data perdagangan individu mencakup hal berikut:
Hal ini dapat dilihat bahwa ada 660.000 perdagangan yang dilaksanakan pada hari itu, menunjukkan pasar yang sangat aktif.
Dalam [4]:
trades = pd.read_csv('COMPUSDT-aggTrades-2023-07-02.csv')
trades
Keluar[4]: ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
664475 baris × 7 kolom
Pertama, data diproses dengan membagi perdagangan asli menjadi dua kelompok: buy order yang dieksekusi sebagai maker dan sell order yang dieksekusi sebagai taker. Selain itu, data perdagangan agregat asli menggabungkan perdagangan yang dieksekusi pada saat yang sama, dengan harga yang sama, dan dalam arah yang sama ke dalam satu titik data tunggal. Misalnya, jika ada satu pesanan pembelian dengan volume 100, itu dapat dibagi menjadi dua perdagangan dengan volume masing-masing 60 dan 40, jika harga berbeda. Ini dapat mempengaruhi estimasi volume pesanan pembelian. Oleh karena itu, perlu untuk mengakumulasi data lagi berdasarkan transact_time. Setelah agregasi kedua ini, volume data dikurangi 140.000 catatan.
Dalam [6]:
trades['date'] = pd.to_datetime(trades['transact_time'], unit='ms')
trades.index = trades['date']
buy_trades = trades[trades['is_buyer_maker']==False].copy()
sell_trades = trades[trades['is_buyer_maker']==True].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'
})
sell_trades = sell_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()
sell_trades['interval']=sell_trades['transact_time'] - sell_trades['transact_time'].shift()
Dalam [10]:
print(trades.shape[0] - (buy_trades.shape[0]+sell_trades.shape[0]))
Di luar [10]: 146181
Ambil order beli sebagai contoh, mari kita pertama-tama memetakan histogram. Hal ini dapat diamati bahwa ada efek ekor panjang yang signifikan, dengan sebagian besar data terkonsentrasi ke arah bagian paling kiri dari histogram. Namun, ada juga beberapa perdagangan besar yang didistribusikan ke ujung ekor.
Di [36]:
buy_trades['quantity'].plot.hist(bins=200,figsize=(10, 5));
Di luar [36]:
Untuk pengamatan yang lebih mudah, mari kita potong ekor dan menganalisis data. Hal ini dapat diamati bahwa sebagai jumlah perdagangan meningkat, frekuensi kejadian menurun, dan tingkat penurunan menjadi lebih cepat.
Di [37]:
buy_trades['quantity'][buy_trades['quantity']<200].plot.hist(bins=200,figsize=(10, 5));
Di luar [37]:
Ada banyak penelitian tentang distribusi jumlah perdagangan. Telah ditemukan bahwa jumlah perdagangan mengikuti distribusi hukum kekuatan, juga dikenal sebagai distribusi Pareto, yang merupakan distribusi probabilitas yang umum dalam fisika statistik dan ilmu sosial. Dalam distribusi hukum kekuatan, probabilitas ukuran (atau frekuensi) suatu peristiwa sebanding dengan eksponen negatif dari ukuran peristiwa itu. Karakteristik utama distribusi ini adalah bahwa frekuensi peristiwa besar (yaitu, yang jauh dari rata-rata) lebih tinggi dari yang diharapkan dalam banyak distribusi lain. Ini justru merupakan karakteristik distribusi jumlah perdagangan. Bentuk distribusi Pareto diberikan oleh P (x) = C (x) ^-α). Mari kita verifikasi secara empiris.
Grafik berikut mewakili probabilitas jumlah perdagangan melebihi nilai tertentu. Garis biru mewakili probabilitas aktual, sementara garis oranye mewakili probabilitas simulasi. Harap dicatat bahwa kita tidak akan membahas parameter spesifik pada titik ini. Dapat diamati bahwa distribusi memang mengikuti distribusi Pareto. Karena probabilitas jumlah perdagangan lebih besar dari nol adalah 1, dan untuk memenuhi normalisasi, persamaan distribusi harus sebagai berikut:
Di sini, N adalah parameter untuk normalisasi. Kita akan memilih jumlah perdagangan rata-rata, M, dan menetapkan alpha menjadi -2.06. Perkiraan spesifik alpha dapat diperoleh dengan menghitung nilai P ketika D = N. Secara khusus, alpha = log (((P(d>M)) / log ((2).
Di [55]:
depths = range(0, 250, 2)
probabilities = np.array([np.mean(buy_trades['quantity'] > depth) for depth in depths])
alpha = np.log(np.mean(buy_trades['quantity'] > mean_quantity))/np.log(2)
mean_quantity = buy_trades['quantity'].mean()
probabilities_s = np.array([(1+depth/mean_quantity)**alpha for depth in depths])
plt.figure(figsize=(10, 5))
plt.plot(depths, probabilities)
plt.plot(depths, probabilities_s)
plt.xlabel('Depth')
plt.ylabel('Probability of execution')
plt.title('Execution probability at different depths')
plt.grid(True)
Keluar[55]:
Di [56]:
plt.figure(figsize=(10, 5))
plt.grid(True)
plt.title('Diff')
plt.plot(depths, probabilities_s-probabilities);
Keluar[56]:
Namun, perkiraan ini hanya perkiraan, seperti yang ditunjukkan dalam grafik di mana kita memetakan perbedaan antara nilai simulasi dan nilai aktual. Ketika jumlah perdagangan kecil, penyimpangan itu signifikan, bahkan mendekati 10%. Meskipun memilih titik yang berbeda selama perkiraan parameter dapat meningkatkan keakuratan probabilitas titik tertentu itu, itu tidak menyelesaikan masalah penyimpangan secara keseluruhan. Diskrepansi ini timbul dari perbedaan antara distribusi hukum daya dan distribusi aktual. Untuk mendapatkan hasil yang lebih akurat, persamaan distribusi hukum daya perlu dimodifikasi. Proses spesifik tidak dijelaskan di sini, tetapi secara singkat, setelah seketika wawasan, ditemukan bahwa persamaan sebenarnya harus sebagai berikut:
Untuk menyederhanakan, mari kita gunakan r = q / M untuk mewakili jumlah perdagangan normal. Kita dapat memperkirakan parameter menggunakan metode yang sama seperti sebelumnya. Grafik berikut menunjukkan bahwa setelah modifikasi, penyimpangan maksimum tidak lebih dari 2%. Secara teori, penyesuaian lebih lanjut dapat dilakukan, tetapi tingkat akurasi ini sudah cukup.
Dalam [52]:
depths = range(0, 250, 2)
probabilities = np.array([np.mean(buy_trades['quantity'] > depth) for depth in depths])
mean = buy_trades['quantity'].mean()
alpha = np.log(np.mean(buy_trades['quantity'] > mean))/np.log(2.05)
probabilities_s = np.array([(((1+20**(-depth/mean))*depth+mean)/mean)**alpha for depth in depths])
plt.figure(figsize=(10, 5))
plt.plot(depths, probabilities)
plt.plot(depths, probabilities_s)
plt.xlabel('Depth')
plt.ylabel('Probability of execution')
plt.title('Execution probability at different depths')
plt.grid(True)
Keluar[52]:
Dalam [53]:
plt.figure(figsize=(10, 5))
plt.grid(True)
plt.title('Diff')
plt.plot(depths, probabilities_s-probabilities);
Keluar[53]:
Dengan persamaan perkiraan untuk distribusi jumlah perdagangan, penting untuk dicatat bahwa probabilitas dalam persamaan bukanlah probabilitas aktual, tetapi probabilitas bersyarat. Pada titik ini, kita dapat menjawab pertanyaan: Apa probabilitas bahwa pesanan berikutnya akan lebih besar dari nilai tertentu?
Pada titik ini, panjang teks sudah cukup panjang, dan masih banyak pertanyaan yang perlu dijawab.