Pemikiran mengenai Strategi Dagangan Frekuensi Tinggi (1)

Penulis:Lydia, Dicipta: 2023-08-04 13:47:39, Dikemas kini: 2023-09-12 15:50:10

img

Pemikiran mengenai Strategi Dagangan Frekuensi Tinggi (1)

Saya telah menulis dua artikel mengenai perdagangan frekuensi tinggi mata wang digital, iaituStrategi Frekuensi Tinggi Mata Wang Digital Pendahuluan terperinci dan Dapatkan 80 kali dalam 5 hari, Kuasa Strategi Frekuensi Tinggi. Walau bagaimanapun, artikel ini hanya boleh dianggap sebagai perkongsian pengalaman dan memberikan gambaran umum. Kali ini, saya merancang untuk menulis satu siri artikel untuk memperkenalkan proses pemikiran di sebalik perdagangan frekuensi tinggi dari awal. Saya berharap untuk menyimpannya ringkas dan jelas, tetapi kerana kepakaran saya yang terhad, pemahaman saya mengenai perdagangan frekuensi tinggi mungkin tidak sangat mendalam. Artikel ini harus dilihat sebagai titik permulaan untuk perbincangan, dan saya mengalu-alukan pembetulan dan bimbingan dari pakar.

Sumber Keuntungan Frekuensi Tinggi

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 yang Perlu Ditangani

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

  2. 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 Perdagangan Frekuensi Tinggi dan Buku Perintah. Banyak cadangan juga boleh didapati dalam talian, walaupun penyempurnaan lanjut berada di luar skop artikel ini. Di samping itu, adalah dinasihatkan untuk menubuhkan sistem backtesting yang boleh dipercayai dan cepat. Walaupun strategi frekuensi tinggi dapat dengan mudah disahkan melalui perdagangan langsung, backtesting membantu memberikan wawasan tambahan dan mengurangkan kos percubaan dan kesilapan.

Data yang diperlukan

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:

  1. agg_trade_id: ID perdagangan agregat.
  2. harga: Harga di mana perdagangan telah dilaksanakan.
  3. kuantiti: kuantiti perdagangan.
  4. first_trade_id: Dalam kes-kes di mana pelbagai dagangan digabungkan, ini mewakili ID dagangan pertama.
  5. last_trade_id: ID perdagangan terakhir dalam agregasi.
  6. transact_time: Stempel masa pelaksanaan perdagangan.
  7. is_buyer_maker: Menunjukkan arah perdagangan. True mewakili pesanan beli yang dilaksanakan sebagai pembuat, sementara pesanan jual dilaksanakan sebagai penerima.

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

img

664475 baris × 7 lajur

Modelkan Jumlah Perdagangan Individu

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

img

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

img

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.

img

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

img

Dalam [56]:

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

Keluar[56]:

img

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:

img

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

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


Lebih lanjut