Memikirkan strategi perdagangan frekuensi tinggi (1)

Penulis:Rumput, Dicipta pada: 2023-08-03 16:14:16, Dikemas kini pada: 2023-12-08 16:37:21

img

Artikel ini membincangkan strategi perdagangan frekuensi tinggi mata wang digital, termasuk sumber keuntungan (terutamanya dari turun naik pasaran yang kuat dan bayaran bayaran pertukaran), isu-isu kedudukan dan kawalan kedudukan, dan kaedah pemodelan transaksi dengan pembahagian Pareto. Selain itu, ia juga merujuk kepada data transaksi per-pembayaran dan pesanan teratas yang disediakan oleh Binance untuk ujian semula, dan merancang untuk membincangkan isu-isu lain mengenai strategi perdagangan frekuensi tinggi secara mendalam dalam artikel berikutnya.

Saya pernah menulis dua artikel mengenai perdagangan frekuensi tinggi mata wang digital.Pendahuluan terperinci mengenai strategi frekuensi tinggi mata wang digital, 5 watt 80 kali ganda, kekuatan strategi frekuensi tinggi. Tetapi hanya boleh dianggap sebagai perkongsian pengalaman, untuk bercakap secara umum. Kali ini saya merancang untuk menulis satu siri artikel, memperkenalkan idea perdagangan frekuensi tinggi dari awal, saya berharap untuk menjadi sesingkat mungkin, tetapi kerana tahap saya yang terhad, pemahaman mengenai perdagangan frekuensi tinggi tidak mendalam, artikel ini hanya membuang keris penghantaran, semoga Tuhan benar.

Sumber keuntungan frekuensi tinggi

Artikel sebelumnya telah menyatakan bahawa strategi frekuensi tinggi sangat sesuai untuk pasaran dengan turun naik dan turun naik yang sangat kuat. Mengkaji perubahan harga dalam jangka masa yang singkat, terdiri daripada trend keseluruhan dan pergolakan. Jika kita dapat meramalkan perubahan trend dengan tepat, tentu dapat membuat wang, tetapi ini juga yang paling sukar. Artikel ini terutama membincangkan strategi pembuat frekuensi tinggi, dan tidak akan melibatkan masalah ini.

Masalah yang perlu diselesaikan

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

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

Untuk mencapai tujuan di atas, perlu membuat anggaran pemodelan mengenai pelbagai aspek seperti kebarangkalian kemungkinan urus niaga, keuntungan urus niaga, anggaran pasaran, dan banyak artikel dan makalah dalam hal ini boleh didapati dalam kata kunci seperti Trading Frekuensi Tinggi, Buku Perintah. Terdapat banyak cadangan dalam talian, tetapi tidak di sini.

Data yang diperlukan

Binance menyediakan data urus niaga dan pesanan teratas.Muat turunData mendalam perlu dimuat turun dengan API dalam senarai putih, tetapi juga boleh dikumpulkan sendiri. Data transaksi yang digunakan untuk penggunaan agregat untuk tujuan pengembalian boleh digunakan. 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 perbayaran adalah seperti berikut:

  1. agg_trade_id: id yang dikategorikan kepada urus niaga
  2. harga: harga transaksi
  3. quantity: jumlah transaksi
  4. first_trade_id: transaksi agregat mungkin mempunyai beberapa transaksi pada masa yang sama, hanya satu data yang dikira, ini adalah id transaksi pertama
  5. last_trade_id: id transaksi terakhir
  6. transact_time: masa transaksi
  7. is_buyer_maker: arah urus niaga, True mewakili urus niaga pembayar, urus niaga penjual adalah pemegang

Di sini, anda boleh melihat 660,000 data urus niaga pada hari itu dan urus niaga sangat aktif.

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

664475 baris × 7 lajur

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

Model Perdagangan Satu Bayaran

Data akan diproses terlebih dahulu, dengan memisahkan perdagangan asal menjadi kumpulan transaksi aktif bagi membayar dan kumpulan transaksi aktif untuk menjual. Data perdagangan agregat semula adalah satu data pada masa yang sama dengan harga yang sama dan arah yang sama, mungkin akan berlaku satu jumlah pembelian aktif sebanyak 100, jika dibahagikan kepada beberapa transaksi dan harga yang tidak sama, seperti untuk membahagikan 60 dan 40 keping, akan menghasilkan dua data, yang mempengaruhi anggaran jumlah pembelian. Oleh itu, perlu mengumpul sekali 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

Sebagai contoh pembayaran, gambar garis lurus pertama, anda dapat melihat kesan ekor panjang yang sangat jelas, kebanyakan data tertumpu 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

Terdapat banyak kajian mengenai pengagihan yang memenuhi undang-undang transaksi. Pengagihan yang memenuhi undang-undang kuasa, yang juga dikenali sebagai pengagihan Pareto, adalah bentuk pengagihan kebarangkalian yang biasa dijumpai dalam fizik statistik dan sains sosial. Dalam pengagihan undang-undang, kebarangkalian saiz (atau kekerapan) peristiwa adalah bersamaan dengan indeks negatif dari saiz kejadian itu. Ciri utama pengagihan ini adalah kekerapan kejadian peristiwa besar (iaitu peristiwa yang jauh dari purata) lebih tinggi daripada yang dijangkakan dalam banyak pengagihan lain. Ini adalah ciri pengagihan transaksi.

Gambar di bawah menunjukkan kebarangkalian transaksi yang lebih besar daripada nilai tertentu, dengan garis biru untuk kebarangkalian sebenar, dan garis garisan untuk kebarangkalian simulasi. Di sini, tanpa mengelirukan parameter tertentu, anda dapat melihat bahawa ia memang memenuhi pembahagian Pareto. Oleh kerana kebarangkalian jumlah pesanan yang lebih besar daripada 0 adalah 1, dan untuk memenuhi standardisasi, persamaan pembahagian harus berbentuk sebagai berikut:

png

Di mana N adalah parameter standard. Di sini, pilih purata transaksi M, pilih alpha-2.06. Perkiraan alpha tertentu boleh dikira semula dengan nilai P apabila D = N. Secara khusus: alpha = log ((P ((d>M)) / log ((2)). Memilih titik yang berbeza akan sedikit berbeza dengan nilai pengambilan 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

Tetapi anggaran ini hanya kelihatan seperti, di atas gambar, kita melukis perbezaan antara nilai analog dan nilai sebenar. Jika pertukaran kecil, penyimpangan sangat besar, bahkan hampir 10%. Titik yang berbeza boleh dipilih untuk menjadikan kebarangkalian titik ini lebih tepat, tetapi juga tidak menyelesaikan masalah penyimpangan. Ini ditentukan oleh perbezaan sebaran silindris dan sebaran sebenar, dan untuk mendapatkan hasil yang lebih tepat, persamaan sebaran silindris perlu diubah.

png

Untuk gambaran, r = q/M di sini mewakili jumlah urus niaga standard. Parameter boleh dianggarkan dengan cara yang sama seperti di atas. Gambar di bawah dapat melihat bahawa penyimpangan maksimum tidak melebihi 2% selepas pembetulan.

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 mengenai pembahagian jumlah dagangan, perhatikan bahawa kebarangkalian persamaan bukan kebarangkalian sebenar, tetapi kebarangkalian bersyarat. Pada masa ini, anda boleh menjawab soalan ini, apakah kebarangkalian pesanan ini lebih besar daripada nilai tertentu jika pesanan berikutnya berlaku?

Saya hampir selesai menulis di sini dan masih ada banyak soalan yang perlu dijawab, dan siri artikel berikut akan cuba menjawabnya.


Lebih lanjut

Ukuran ok 🐂🍺

FmzeroBerani!

RumputCSV terlalu besar untuk dimuat turun sendiri.