Berpikir tentang strategi perdagangan frekuensi tinggi (1)

Penulis:Rumput, Dibuat pada: 2023-08-03 16:14:16, Diperbarui pada: 2023-12-08 16:37:21

img

Artikel ini membahas strategi perdagangan frekuensi tinggi dalam mata uang digital, termasuk sumber keuntungan (terutama dari volatilitas pasar yang tinggi dan biaya transaksi bursa), masalah posisi dan kendali posisi, dan metode pemodelan transaksi dengan distribusi Pareto. Selain itu, data transaksi per-potongan dan pesanan teratas yang disediakan oleh Binance juga digunakan untuk uji ulang, dan rencana untuk membahas secara mendalam masalah lain tentang strategi perdagangan frekuensi tinggi dalam artikel berikutnya.

Saya pernah menulis dua artikel sebelumnya tentang perdagangan frekuensi tinggi dalam mata uang digital.Strategi frekuensi tinggi untuk mata uang digital, 5 watt 80 kali lebih kuat dari strategi frekuensi tinggi.Tapi hanya untuk berbagi pengalaman, berbicara secara umum. Kali ini saya berencana menulis serangkaian artikel, memperkenalkan ide perdagangan frekuensi tinggi dari awal, saya berharap untuk menjadi sesingkat mungkin, tetapi karena tingkat saya yang terbatas, pemahaman tentang perdagangan frekuensi tinggi tidak begitu mendalam, artikel ini hanya membuang guideline, saya harap Tuhan benar.

Sumber Frekuensi Tinggi

Artikel sebelumnya telah menyebutkan bahwa strategi frekuensi tinggi sangat cocok untuk pasar dengan turun naik yang sangat tajam. Mengkaji variasi harga dalam waktu singkat, yang terdiri dari tren keseluruhan dan goncangan. Tentu saja dapat menghasilkan uang jika kita dapat memprediksi perubahan tren secara akurat, tetapi ini juga yang paling sulit. Artikel ini terutama membahas strategi pembuat frekuensi tinggi, dan tidak akan membahas masalah ini.

Masalah yang harus diselesaikan

1.策略同时挂买单和卖单,第一个问题就是在哪里挂单。挂的离盘口越近,成交的概率越高,但在剧烈波动的行情中,瞬间成交的价格可能离盘口较远,挂的那太近没有能吃到足够的利润。挂的太远的单子成交概率又低。这是一个需要优化的问题。

2.控制仓位。为了控制风险,策略就不能长时间累计过多的仓位。可以通过控制挂单距离、挂单量、总仓位限制等办法解决。

Untuk mencapai tujuan di atas, perlu untuk memperkirakan model dari berbagai aspek, seperti kemungkinan kemungkinan transaksi, keuntungan transaksi, perkiraan pasar, banyak artikel dan makalah tentang hal ini dapat ditemukan dalam kata kunci seperti High-Frequency Trading, Orderbook, dll. Ada banyak rekomendasi di internet, tidak di sini. Selain itu, lebih baik membangun sistem uji balik yang cepat dan dapat diandalkan.

Data yang dibutuhkan

Binance menyediakan data transaksi per butir dan order teratas.UnduhData mendalam dapat diunduh melalui API dalam daftar putih, dan dapat dikumpulkan sendiri. Data transaksi yang digunakan untuk analisis kembali dapat digunakan untuk analisis. Contoh data HOOKUSDT-aggTrades-2023-01-27 digunakan dalam artikel ini.

from datetime import date,datetime
import time
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

Transaksi yang dilakukan secara individual adalah sebagai berikut:

  1. Agg_trade_id: ID yang dikelompokkan ke dalam transaksi,
  2. harga: harga transaksi
  3. quantity: jumlah transaksi
  4. first_trade_id: transaksi yang terakumulasi mungkin memiliki beberapa transaksi sekaligus, hanya satu data yang dihitung, yaitu id transaksi pertama
  5. last_trade_id: id transaksi terakhir
  6. Transact_time: waktu transaksi
  7. is_buyer_maker: arah transaksi, True mewakili pembeli-pembuat transaksi, pembeli adalah pemegang

Anda dapat melihat 660.000 data transaksi pada hari itu, transaksi sangat aktif.

trades = pd.read_csv('COMPUSDT-aggTrades-2023-07-02.csv')
trades

664475 baris × 7 kolom

agg_trade_id harga jumlah first_trade_id last_trade_id waktu transaksi adalah_pembeli_pembuat
120719552 52.42 22.087 207862988 207862990 1688256004603 Tidak benar
120719553 52.41 29.314 207862991 207863002 1688256004623 Benar
120719554 52.42 0.945 207863003 207863003 1688256004678 Tidak benar
120719555 52.41 13.534 207863004 207863006 1688256004680 Benar
121384024 68.29 10.065 210364899 210364905 1688342399863 Tidak benar
121384025 68.30 7.078 210364906 210364908 1688342399948 Tidak benar
121384026 68.29 7.622 210364909 210364911 1688342399979 Benar

Model transaksi uang tunai

Pertama-tama data diproses, perdagangan asli dibagi menjadi kelompok transaksi proaktif pembayaran dan kelompok transaksi proaktif pesanan. Data transaksi agregat asli lainnya adalah satu data pada saat yang sama dengan harga yang sama dan arah yang sama, mungkin akan terjadi jumlah transaksi proaktif 100, jika dibagi menjadi beberapa transaksi dan harga yang berbeda, misalnya untuk pembagian 60 dan 40, akan menghasilkan dua data, yang mempengaruhi perkiraan transaksi pembayaran. Oleh karena itu, perlu digabungkan lagi berdasarkan transact_time.

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()
print(trades.shape[0] - (buy_trades.shape[0]+sell_trades.shape[0]))
146181

Untuk contoh pembayaran, gambar garis lurus pertama, Anda dapat melihat efek ekor panjang sangat jelas, sebagian besar data terkonsentrasi di sebelah kiri sedikit, tetapi ada juga sedikit transaksi besar yang tersebar di ekor.

buy_trades['quantity'].plot.hist(bins=200,figsize=(10, 5));

png

为了观察方便,截掉尾部观察.可以看到成交量越大,出现频率越低,且减少的趋势更快。

buy_trades['quantity'][buy_trades['quantity']<200].plot.hist(bins=200,figsize=(10, 5));

png

Banyak penelitian yang berkaitan dengan distribusi yang memuaskan transaksi. Distribusi yang memuaskan hukum ketenagakerjaan (Power-law distribution) juga dikenal sebagai distribusi Pareto, adalah bentuk distribusi probabilitas yang umum digunakan dalam fisika statistik dan ilmu sosial. Dalam distribusi ketenagakerjaan, ukuran (atau frekuensi) probabilitas suatu peristiwa adalah proporsional dengan suatu indeks negatif dari ukuran peristiwa tersebut.

Gambar di bawah ini menunjukkan probabilitas transaksi yang lebih besar dari suatu nilai, garis biru adalah probabilitas nyata, garis kerucut adalah probabilitas simulasi, di sini jangan bingung parameter spesifik, Anda dapat melihat bahwa ini memang memenuhi distribusi Pareto. Karena probabilitas volume pesanan yang lebih besar dari 0 adalah 1, dan untuk memenuhi standardisasi, persamaan distribusi harus berbentuk sebagai berikut:

png

Di mana N adalah parameter standar. Di sini memilih rata-rata transaksi M, alpha memilih 2.06. Perkiraan alfa spesifik dapat dihitung kembali dengan nilai P ketika D = N. Secara khusus: alpha = log ((P ((d>M)) / log ((2)). Memilih titik yang berbeda akan sedikit berbeda dengan nilai alpha.

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)

img

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

png

Tapi perkiraan ini hanya terlihat seperti, di atas gambar, kita menggambar perbedaan antara nilai analog dan nilai nyata. Jika transaksi lebih kecil, kesesuaian sangat besar, bahkan mendekati 10%. Anda dapat memilih titik yang berbeda untuk membuat kemungkinan titik ini lebih akurat melalui perkiraan parameter, tetapi juga tidak memecahkan masalah penyimpangan. Ini ditentukan oleh perbedaan distribusi silindris dan distribusi aktual, dan untuk mendapatkan hasil yang lebih akurat, perlu melakukan modifikasi pada persamaan distribusi silindris.

png

Untuk pengamatan, r = q/M mewakili volume transaksi standar di sini. Parameter dapat diperkirakan dengan cara yang sama seperti di atas. Gambar di bawah ini menunjukkan bahwa penyimpangan maksimum setelah perbaikan tidak lebih dari 2%, secara teoritis dapat diperbaiki lebih lanjut, tetapi presisi ini juga cukup.

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)
plt.figure(figsize=(10, 5))
plt.grid(True)
plt.title('Diff')
plt.plot(depths, probabilities_s-probabilities);

png

Dengan persamaan perkiraan distribusi volume transaksi, perhatikan bahwa probabilitas persamaan bukanlah probabilitas yang sebenarnya, melainkan probabilitas kondisional. Saat ini dapat dijawab pertanyaan, apakah kemungkinan bahwa pesanan ini lebih besar dari nilai tertentu jika pesanan berikutnya terjadi?

Artikel ini sudah hampir selesai dan masih banyak pertanyaan yang perlu dijawab, yang akan kami coba jawab di artikel-artikel berikut.


Lebih banyak

Ukuran ok 🐂🍺

FmzeroAku tidak tahu apa yang terjadi.

RumputCSV terlalu besar untuk diunduh sendiri.