Pikiran tentang Strategi Perdagangan Frekuensi Tinggi (1)

Penulis:Lydia, Dibuat: 2023-08-04 13:47:39, Diperbarui: 2023-09-12 15:50:10

img

Pikiran tentang Strategi Perdagangan Frekuensi Tinggi (1)

Saya telah menulis dua artikel tentang perdagangan frekuensi tinggi mata uang digital, yaitu Strategi Frekuensi Tinggi Mata Uang Digital Pengantar Rincian dan Dapatkan 80 kali dalam 5 hari, kekuatan strategi frekuensi tinggi. Namun, artikel ini hanya dapat dianggap sebagai berbagi pengalaman dan memberikan gambaran umum. Kali ini, saya berencana untuk menulis serangkaian artikel untuk memperkenalkan proses pemikiran di balik perdagangan frekuensi tinggi dari awal. Saya berharap untuk tetap ringkas dan jelas, tetapi karena keahlian terbatas saya, pemahaman saya tentang perdagangan frekuensi tinggi mungkin tidak sangat mendalam. Artikel ini harus dilihat sebagai titik awal untuk diskusi, dan saya menyambut koreksi dan bimbingan dari para ahli.

Sumber Keuntungan Frekuensi Tinggi

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 yang Harus Diatasi

  1. 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.

  2. 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 High-Frequency Trading dan Orderbook. Banyak rekomendasi juga dapat ditemukan secara online, meskipun penyusunan lebih lanjut berada di luar ruang lingkup artikel ini. Selain itu, disarankan untuk membangun sistem backtesting yang andal dan cepat. Meskipun strategi frekuensi tinggi dapat dengan mudah divalidasi melalui perdagangan langsung, backtesting membantu memberikan wawasan tambahan dan mengurangi biaya trial and error.

Data yang Dibutuhkan

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:

  1. Agg_trade_id: ID dari perdagangan agregat.
  2. harga: Harga di mana perdagangan dilaksanakan.
  3. kuantitas: kuantitas perdagangan.
  4. first_trade_id: Dalam kasus di mana beberapa perdagangan digabungkan, ini mewakili ID perdagangan pertama.
  5. last_trade_id: ID perdagangan terakhir dalam agregasi.
  6. Transaction_time: Tanda waktu pelaksanaan transaksi.
  7. is_buyer_maker: Menunjukkan arah perdagangan. True mewakili pesanan beli yang dieksekusi sebagai pembuat, sedangkan pesanan jual dieksekusi sebagai penerima.

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

img

664475 baris × 7 kolom

Modelkan Jumlah Perdagangan Individu

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

img

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

img

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:

img

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

img

Di [56]:

plt.figure(figsize=(10, 5))
plt.grid(True)
plt.title('Diff')
plt.plot(depths, probabilities_s-probabilities);

Keluar[56]:

img

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:

img

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

img

Dalam [53]:

plt.figure(figsize=(10, 5))
plt.grid(True)
plt.title('Diff')
plt.plot(depths, probabilities_s-probabilities);

Keluar[53]:

img

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.


Lebih banyak