Saya telah menulis dua artikel mengenai perdagangan frekuensi tinggi mata wang digital, iaituStrategi Frekuensi Tinggi Mata Wang Digital Pendahuluan terperinci
Dalam artikel saya sebelumnya, saya menyebut bahawa strategi frekuensi tinggi sangat sesuai untuk pasaran dengan turun naik yang sangat tidak menentu. Perubahan harga instrumen dagangan dalam jangka masa yang singkat terdiri daripada trend dan goyangan keseluruhan. Walaupun ia memang menguntungkan jika kita dapat meramalkan perubahan trend dengan tepat, ini juga merupakan aspek yang paling mencabar. Dalam artikel ini, saya akan terutamanya memberi tumpuan kepada strategi pembuat frekuensi tinggi dan tidak akan menyelidiki ramalan trend. Dalam pasaran yang bergoyang, dengan meletakkan tawaran dan meminta pesanan secara strategik, jika kekerapan tawaran cukup tinggi dan margin keuntungan adalah ketara, ia dapat menampung potensi kerugian yang disebabkan oleh trend. Dengan cara ini, keuntungan dapat dicapai tanpa meramalkan pergerakan pasaran.
Masalah pertama dalam melaksanakan strategi yang meletakkan kedua-dua pesanan beli dan jual adalah menentukan di mana untuk meletakkan pesanan ini. Semakin dekat pesanan diletakkan ke kedalaman pasaran, semakin tinggi kebarangkalian pelaksanaan. Walau bagaimanapun, dalam keadaan pasaran yang sangat tidak menentu, harga di mana pesanan dieksekusi dengan serta-merta mungkin jauh dari kedalaman pasaran, mengakibatkan keuntungan yang tidak mencukupi. Di sisi lain, meletakkan pesanan terlalu jauh mengurangkan kebarangkalian pelaksanaan. Ini adalah masalah pengoptimuman yang perlu ditangani.
Pengendalian kedudukan adalah penting untuk menguruskan risiko. Strategi tidak boleh mengumpul kedudukan yang berlebihan untuk tempoh yang panjang. Ini boleh ditangani dengan mengawal jarak dan kuantiti pesanan yang diletakkan, serta menetapkan had untuk kedudukan keseluruhan.
Untuk mencapai objektif di atas, pemodelan dan anggaran diperlukan untuk pelbagai aspek seperti kebarangkalian pelaksanaan, keuntungan dari pelaksanaan, dan anggaran pasaran. Terdapat banyak artikel dan kertas yang tersedia mengenai topik ini, menggunakan kata kunci seperti
Binance menyediakandata yang boleh dimuat turununtuk perdagangan individu dan pesanan tawaran / permintaan terbaik. Data kedalaman boleh dimuat turun melalui API mereka dengan disenaraikan putih, atau ia boleh dikumpulkan secara manual. Untuk tujuan backtesting, data perdagangan agregat mencukupi. Dalam artikel ini, kita 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 termasuk yang berikut:
Ia boleh dilihat bahawa terdapat 660,000 perdagangan yang dilaksanakan pada hari itu, menunjukkan pasaran yang sangat aktif.
Dalam [4]:
trades = pd.read_csv('COMPUSDT-aggTrades-2023-07-02.csv')
trades
Keluar[4]: ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
664475 baris × 7 lajur
Pertama, data diproses dengan membahagikan perdagangan asal kepada dua kumpulan: pesanan beli yang dilaksanakan sebagai pembuat dan pesanan jual yang dilaksanakan sebagai penerima. Di samping itu, data perdagangan agregat asal menggabungkan perdagangan yang dilaksanakan pada masa yang sama, pada harga yang sama, dan dalam arah yang sama ke dalam satu titik data tunggal. Sebagai contoh, jika terdapat satu pesanan beli dengan jumlah 100, ia boleh dibahagikan kepada dua perdagangan dengan jumlah 60 dan 40, jika harga berbeza. Ini boleh mempengaruhi anggaran jumlah pesanan beli. Oleh itu, perlu mengumpulkan data lagi berdasarkan transact_time. Selepas pengumpulan kedua ini, jumlah data dikurangkan sebanyak 140,000 rekod.
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 pesanan beli sebagai contoh, mari kita plot histogram terlebih dahulu. Ia dapat diperhatikan bahawa terdapat kesan ekor panjang yang signifikan, dengan majoriti data tertumpu ke arah bahagian paling kiri histogram. Walau bagaimanapun, terdapat juga beberapa perdagangan besar yang diedarkan ke arah hujung ekor.
Dalam [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.
Dalam [37]:
buy_trades['quantity'][buy_trades['quantity']<200].plot.hist(bins=200,figsize=(10, 5));
Di luar [37]:
Terdapat banyak kajian mengenai pengedaran jumlah dagangan. Telah didapati bahawa jumlah dagangan mengikuti pengedaran undang-undang kuasa, juga dikenali sebagai pengedaran Pareto, yang merupakan pengedaran kebarangkalian biasa dalam fizik statistik dan sains sosial. Dalam pengedaran undang-undang kuasa, kebarangkalian saiz (atau kekerapan) suatu peristiwa adalah sebanding dengan eksponen negatif saiz peristiwa itu. Ciri utama pengedaran ini adalah kekerapan peristiwa besar (iaitu, yang jauh dari purata) lebih tinggi daripada yang dijangkakan dalam banyak pengedaran lain. Ini adalah ciri pengedaran jumlah dagangan. Bentuk pengedaran Pareto diberikan oleh P ((x) = C ((x^-α). Mari kita mengesahkan ini secara empiris.
Grafik berikut mewakili kebarangkalian jumlah perdagangan melebihi nilai tertentu. Garis biru mewakili kebarangkalian sebenar, sementara garis oren mewakili kebarangkalian yang disimulasikan. Sila ambil perhatian bahawa kita tidak akan masuk ke dalam parameter khusus pada ketika ini.
Di sini, N adalah parameter untuk normalisasi. Kita akan memilih jumlah perdagangan purata, M, dan menetapkan alpha kepada -2.06. Anggaran spesifik alpha boleh diperolehi dengan mengira nilai P apabila D = N. Khususnya, alpha = log (((P(d>M)) / log ((2). Pilihan titik yang berbeza mungkin mengakibatkan perbezaan kecil dalam nilai alpha.
Dalam [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]:
Dalam [56]:
plt.figure(figsize=(10, 5))
plt.grid(True)
plt.title('Diff')
plt.plot(depths, probabilities_s-probabilities);
Keluar[56]:
Walau bagaimanapun, anggaran ini hanya kira-kira, seperti yang ditunjukkan dalam grafik di mana kita memetakan perbezaan antara nilai simulasi dan sebenar. Apabila jumlah perdagangan kecil, penyimpangan adalah penting, bahkan mendekati 10%. Walaupun memilih titik yang berbeza semasa anggaran parameter dapat meningkatkan ketepatan kebarangkalian titik tertentu itu, ia tidak menyelesaikan isu penyimpangan secara keseluruhan. Perbezaan ini timbul daripada perbezaan antara pengagihan undang-undang kuasa dan pengagihan sebenar. Untuk mendapatkan hasil yang lebih tepat, persamaan pengagihan undang-undang kuasa perlu diubah suai. Proses tertentu tidak diterangkan di sini, tetapi secara ringkas, selepas seketika wawasan, didapati bahawa persamaan sebenar harus seperti berikut:
Untuk mempermudah, mari kita gunakan r = q / M untuk mewakili jumlah perdagangan yang normal. Kita boleh menganggarkan parameter menggunakan kaedah yang sama seperti sebelumnya. Grafik berikut menunjukkan bahawa selepas pengubahsuaian, penyimpangan maksimum tidak lebih daripada 2%. Secara teori, penyesuaian lanjut boleh dibuat, tetapi tahap ketepatan ini sudah mencukupi.
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 anggaran untuk pengedaran jumlah perdagangan, adalah penting untuk diperhatikan bahawa kebarangkalian dalam persamaan bukan kebarangkalian sebenar, tetapi kebarangkalian bersyarat. Pada ketika ini, kita boleh menjawab soalan: Apakah kebarangkalian bahawa pesanan seterusnya akan lebih besar daripada nilai tertentu?
Pada ketika ini, panjang teks sudah cukup panjang, dan masih banyak soalan yang perlu dijawab.