3
fokus pada
1444
Pengikut

Sistem pengujian ulang frekuensi tinggi berdasarkan transaksi per transaksi dan cacat pengujian ulang K-line

Dibuat di: 2020-06-04 16:48:02, diperbarui pada: 2024-12-10 20:32:01
comments   7
hits   5112

Sistem pengujian ulang frekuensi tinggi berdasarkan transaksi per transaksi dan cacat pengujian ulang K-line

aku di siniStrategi lindung nilai multi mata uang Binance short over-rising long over-slumpingMesin pengujian ulang juga dirilis pada waktu yang sama. Laporan pertama memverifikasi efektivitas strategi berdasarkan uji ulang K-line selama satu jam. Akan tetapi, waktu dormansi aktual dari strategi publik adalah 1 detik, yang merupakan strategi frekuensi sangat tinggi. Jelas tidak mungkin untuk mendapatkan hasil akurat dengan melakukan backtesting dengan K-line per jam. Kemudian ditambahkanUji kembali garis menitHasilnya, keuntungan pengujian ulang meningkat banyak, tetapi masih mustahil untuk menentukan parameter apa yang harus digunakan dalam situasi tingkat kedua, dan pemahaman tentang keseluruhan strategi tidak begitu jelas. Alasan utamanya adalah kelemahan penting dari pengujian ulang berbasis K-line.

Masalah dengan pengujian ulang K-line

Pertama-tama, apa itu K-line historis? Data garis K mencakup empat harga: pembukaan tinggi dan penutupan rendah, dua waktu mulai, dan volume perdagangan rentang. Kebanyakan platform dan kerangka kerja kuantitatif didasarkan pada pengujian ulang K-line, dan platform kuantitatif FMZ juga menyediakan pengujian ulang tingkat centang. Pengujian ulang K-line sangat cepat dan tidak ada masalah dalam banyak kasus, tetapi juga memiliki kelemahan yang sangat serius, terutama saat menguji ulang strategi multi-variasi dan strategi frekuensi tinggi, hampir mustahil untuk menarik kesimpulan yang benar.

Yang pertama adalah masalah waktu. Waktu harga tertinggi dan terendah dari data K-line tidak diberikan, jadi tidak perlu dipertimbangkan. Namun harga pembukaan dan penutupan yang paling penting tidak dimulai dari pembukaan dan penutupan. waktu penutupan. Bahkan untuk produk perdagangan yang kurang populer, sering kali tidak ada perdagangan selama lebih dari sepuluh detik. Ketika kita menguji ulang strategi multiproduk, kita sering berasumsi bahwa harga pembukaan dan penutupannya bersamaan. Ini juga merupakan dasar untuk menguji ulang harga penutupan.

Bayangkan menggunakan garis menit untuk menguji ulang arbitrase dua jenis. Perbedaan harga mereka biasanya 10 yuan. Sekarang ditemukan bahwa pada pukul 10:01, harga penutupan kontrak A adalah 100 dan kontrak B adalah 112. Perbedaan harga adalah 12 yuan. Jadi strateginya mulai melakukan lindung nilai. Pada saat ini, selisih harga kembali, dan strategi tersebut memperoleh laba kembali sebesar 2 yuan.

Situasi sebenarnya mungkin adalah bahwa pada pukul 10:00:45, kontrak A menghasilkan transaksi sebesar 100 yuan, dan tidak ada transaksi setelahnya. Pada pukul 10:00:58, kontrak B menghasilkan transaksi sebesar 112 yuan. Pada pukul 10:01, kedua harga tersebut tidak ada, berapakah harga pasar saat ini, dan berapa besar perbedaan harga yang dapat diperoleh dengan melakukan lindung nilai? Tidak ada cara untuk mengetahuinya. Salah satu skenario yang mungkin adalah: pada pukul 10:00:58, harga bid-ask kontrak A adalah 101,9-102,1, dan tidak ada perbedaan harga 2 yuan sama sekali. Ini akan sangat menyesatkan optimalisasi strategi kita.

Masalah kedua adalah pencocokan. Pencocokan yang sebenarnya mengutamakan harga dan waktu. Jika pembeli melampaui harga permintaan, transaksi umumnya akan diselesaikan langsung pada harga permintaan. Jika tidak, transaksi akan masuk ke buku pesanan dan menunggu. Data K-line jelas tidak memiliki harga beli dan jual, dan mustahil untuk mensimulasikan pencocokan pada tingkat terperinci.

Terakhir, ada dampak strategi itu sendiri terhadap pasar. Jika itu adalah backtest modal kecil, dampaknya tidak akan signifikan. Namun jika volume perdagangan menyumbang proporsi besar, maka akan berdampak pada pasar. Bukan hanya akan terjadi slip harga yang besar ketika transaksi langsung dieksekusi, namun jika order beli anda dieksekusi dengan cara backtesting, hal tersebut justru akan mendahului transaksi trader lain yang awalnya ingin membeli, dan efek kupu-kupu akan berdampak pada pasar. Dampak ini tidak dapat diukur, dan kami hanya dapat mengatakan berdasarkan pengalaman bahwa perdagangan frekuensi tinggi hanya dapat mengakomodasi dana kecil.

Pengujian ulang berdasarkan kedalaman dan tanda centang waktu nyata

FMZ menyediakan pengujian ulang waktu nyata, yang dapat memperoleh kedalaman 20 level historis nyata, tick level kedua waktu nyata, data transaksi per transaksi, dan berdasarkan ini,Fungsi pemutaran waktu nyata. Jumlah data pengujian ulang sangat besar dan kecepatannya sangat lambat, biasanya hanya dua hari. Untuk strategi frekuensi relatif tinggi atau strategi yang memerlukan penilaian waktu yang ketat, pengujian ulang waktu nyata diperlukan. Pasangan transaksi dan periode waktu yang dikumpulkan oleh FMZ tidak panjang, tetapi ada lebih dari 70 miliar data historis. Mekanisme pencocokan saat ini adalah jika pesanan beli lebih besar dari pesanan jual, maka pesanan tersebut akan segera dicocokkan sepenuhnya tanpa mempedulikan volumenya; jika lebih kecil dari pesanan jual, maka pesanan tersebut akan masuk antrean pencocokan. Mekanisme pengujian ulang seperti itu memecahkan dua masalah pertama pengujian ulang K-line, tetapi masih tidak dapat memecahkan masalah terakhir. Dan karena jumlah datanya sangat besar, kecepatan dan rentang waktu pengujian ulang menjadi terbatas.

Sistem pengujian ulang frekuensi tinggi berdasarkan transaksi per transaksi dan cacat pengujian ulang K-line

Mekanisme pengujian ulang berdasarkan aliran pesanan transaksi

Informasi garis K terlalu sedikit dan kedalamannya mungkin salah, tetapi ada satu jenis data yang mencerminkan maksud transaksi pasar yang sebenarnya dan mencerminkan riwayat transaksi yang paling autentik - yaitu, transaksi demi transaksi. Artikel ini akan mengusulkan sistem pengujian ulang frekuensi tinggi berdasarkan arus pesanan, yang akan sangat mengurangi jumlah data untuk pengujian ulang waktu nyata dan mensimulasikan dampak volume perdagangan pada pasar sampai batas tertentu.

Saya mengunduh catatan transaksi kontrak abadi Binance XTZ dalam 5 hari terakhir (alamat unduhan: https://www.fmz.com/upload/asset/1ff487b007e1a848ead.csv). Sebagai produk yang tidak terlalu populer, ada 213.000 transaksi di total. Data, mari kita lihat dulu komposisi datanya:

[['XTZ', 1590981301905, 2.905, 0.4, 'False\n'],
 ['XTZ', 1590981303044, 2.903, 3.6, 'True\n'],
 ['XTZ', 1590981303309, 2.903, 3.7, 'True\n'],
 ['XTZ', 1590981303738, 2.903, 238.1, 'True\n'],
 ['XTZ', 1590981303892, 2.904, 0.1, 'False\n'],
 ['XTZ', 1590981305250, 2.904, 0.1, 'False\n'],
 ['XTZ', 1590981305643, 2.903, 197.3, 'True\n'],

Data berupa daftar dua dimensi, diurutkan berdasarkan waktu transaksi. Arti spesifiknya adalah: nama produk, harga transaksi, stempel waktu transaksi, kuantitas transaksi, dan apakah itu transaksi order jual yang aktif. Ada pembeli dan penjual, dan setiap transaksi melibatkan pembeli dan penjual. Jika pembeli adalah pembuat pasar dan penjual adalah penerima, data terakhir adalah Benar.

Pertama, berdasarkan arah transaksi, harga beli dan jual di pasar dapat disimpulkan dengan cukup akurat. Jika itu adalah perintah jual aktif, harga beli saat ini adalah harga transaksi. Jika itu adalah perintah beli aktif, harga jual adalah harga transaksi. Jika ada transaksi baru, harga penawaran baru akan diperbarui. Jika tidak diperbarui, harga penawaran sebelumnya akan dipertahankan. Mudah untuk menyimpulkan bahwa pada saat terakhir data di atas, harga beli adalah 2,903 dan harga jual adalah 2,904.

Berdasarkan aliran pesanan, pencocokan dapat dilakukan seperti ini: mengambil pesanan beli sebagai contoh, harga adalah harga, jumlah pesanan adalah jumlah, dan pesanan beli dan jual masing-masing adalah tawaran dan permintaan. Jika harga lebih rendah dari harga ask dan lebih tinggi dari harga bid, maka akan dinilai terlebih dahulu sebagai maker dan dapat dicocokkan dengan transaksi terlebih dahulu. Kemudian, dalam kurun waktu keberadaan order, semua transaksi dengan harga transaksi yang lebih rendah atau sama dengan ke harga akan dicocokkan dengan order ini (jika harga lebih rendah dari ask, harga transaksi lebih tinggi dari bid). Jika harga bid sama dengan atau sama dengan bid, maka tidak dapat diperdagangkan terlebih dahulu. Semua order dengan harga transaksi yang lebih rendah dari harga tersebut akan dicocokkan dengan pesanan ini. Harga yang dicocokkan adalah harga, dan volume transaksi adalah volume transaksi setiap transaksi hingga pesanan tersebut sepenuhnya dieksekusi atau dibatalkan. Jika harga lebih tinggi dari harga ask, maka dianggap sebagai taker. Setelah itu, semua transaksi dengan harga transaksi lebih rendah atau sama dengan harga tersebut dalam jangka waktu keberadaan order akan dicocokkan dengan order tersebut, dan harga yang cocok akan menjadi harga transaksi dari transaksi tersebut. Perbedaan antara pembuat dan penerima adalah karena bursa pada dasarnya mendorong penempatan pesanan dan menawarkan biaya transaksi preferensial. Untuk strategi frekuensi tinggi, perbedaan ini harus diperhitungkan.

Mudah untuk melihat masalah dengan jenis pencocokan ini. Jika order tersebut adalah taker, situasi sebenarnya adalah order tersebut dapat segera dieksekusi, daripada menunggu order baru untuk menyamainya. Pertama-tama, kami tidak memperhitungkan volume pending order. Bahkan jika ada data, penilaian langsung terhadap transaksi akan mengubah kedalaman dan memengaruhi pasar. Pencocokan berdasarkan pesanan baru sama dengan mengganti pesanan riil dalam sejarah dengan pesanan Anda. Bagaimanapun, hal itu tidak akan melebihi batas volume perdagangan pasar itu sendiri, dan laba akhir tidak akan melebihi laba maksimum yang dihasilkan oleh pasar. Beberapa mekanisme pencocokan juga memengaruhi volume transaksi pesanan, yang pada gilirannya memengaruhi pengembalian strategi, dan secara kuantitatif mencerminkan kapasitas strategi. Tidak akan ada uji ulang tradisional di mana keuntungan akan berlipat ganda jika jumlah dana berlipat ganda.

Ada beberapa detail kecil. Jika harga beli order sama dengan harga beli satu, sebenarnya masih ada kemungkinan tertentu bahwa itu akan cocok dengan harga beli satu. Penting untuk mempertimbangkan prioritas pending order dan kemungkinan transaksi, dll. Ini relatif rumit dan tidak akan dipertimbangkan di sini.

Mencocokkan kode

Objek pertukaran dapat merujuk ke pengantar di awal, yang pada dasarnya tidak berubah. Hanya selisih antara biaya pembuat dan penerima yang ditambahkan, dan kecepatan pengujian ulang dioptimalkan. Berikut ini terutama akan memperkenalkan kode yang cocok.

    symbol = 'XTZ'
    loop_time = 0
    intervel = 1000 #策略的休眠时间为1000ms
    init_price = data[0][2] #初始价格
    e = Exchange([symbol],initial_balance=1000000,maker_fee=maker_fee,taker_fee=taker_fee,log='') #初始化交易所
    depth = {'ask':data[0][2], 'bid':data[0][2]} #深度
    order = {'buy':{'price':0,'amount':0,'maker':False,'priority':False,'id':0},
             'sell':{'price':0,'amount':0,'maker':False,'priority':False,'id':0}} #订单
    for tick in data:
        price = int(tick[2]/tick_sizes[symbol])*tick_sizes[symbol] #成交价格
        trade_amount = tick[3] #成交数量
        time_stamp = tick[1] #成交时间戳
        if tick[4] == 'False\n':
            depth['ask'] = price
        else:
            depth['bid'] = price
        
        if depth['bid'] < order['buy']['price']:
            order['buy']['priority'] = True
        if depth['ask'] > order['sell']['price']:
            order['sell']['priority'] = True
        if price > order['buy']['price']:
            order['buy']['maker'] = True
        if price < order['sell']['price']:
            order['sell']['maker'] = True
        
        #订单网络延时也可以作为撮合条件之一,这里没考虑
        cond1 = order['buy']['priority'] and order['buy']['price'] >= price and order['buy']['amount'] > 0
        cond2 = not order['buy']['priority'] and order['buy']['price'] > price and order['buy']['amount'] > 0
        cond3 = order['sell']['priority'] and order['sell']['price'] <= price and order['sell']['amount'] > 0
        cond4 = not order['sell']['priority'] and order['sell']['price'] < price and order['sell']['amount'] > 0

        if cond1 or cond2:
            buy_price = order['buy']['price'] if order['buy']['maker'] else price
            e.Buy(symbol, buy_price, min(order['buy']['amount'],trade_amount), order['buy']['id'], order['buy']['maker'])
            order['buy']['amount'] -= min(order['buy']['amount'],trade_amount)
            e.Update(time_stamp,[symbol],{symbol:price})
        if cond3 or cond4:
            sell_price = order['sell']['price'] if order['sell']['maker'] else price
            e.Sell(symbol, sell_price, min(order['sell']['amount'],trade_amount), order['sell']['id'], order['sell']['maker'])
            order['sell']['amount'] -= min(order['sell']['amount'],trade_amount)
            e.Update(time_stamp,[symbol],{symbol:price})

        if time_stamp - loop_time > intervel:
            order = get_order(e,depth,order) #交易逻辑,这里未给出
            loop_time += int((time_stamp - loop_time)/intervel)*intervel

Beberapa detail yang perlu diperhatikan:

  • 1. Bila ada transaksi baru, Anda harus mencocokkan pesanan terlebih dahulu, lalu melakukan pemesanan berdasarkan harga terbaru.
  • 2. Setiap order memiliki dua atribut: maker - apakah itu maker, priority - prioritas yang sesuai. Mengambil order beli sebagai contoh, ketika harga beli lebih rendah dari harga ask, maka ditandai sebagai maker, dan ketika harga beli lebih rendah dari harga ask, maka ditandai sebagai maker. harga beli lebih besar dari harga beli, maka ditandai sebagai order beli. Pencocokan prioritas, prioritas menentukan apakah harga sama dengan harga bid atau tidak, dan pembuat menentukan biaya penanganan.
  • 3. Pembuat dan prioritas order diperbarui. Misalnya, jika order beli besar ditempatkan yang melebihi harga pasar, ketika harga yang lebih besar dari harga bid muncul, volume perdagangan yang tersisa akan menjadi pembuatnya.
  • 4. Interval strategi itu diperlukan, yang dapat mewakili penundaan pasar.

Strategi Grid Pengujian Ulang

Akhirnya, kita telah mencapai tahap pengujian ulang yang sebenarnya. Kita akan menguji ulang salah satu strategi grid paling klasik untuk melihat apakah strategi ini mencapai hasil yang diharapkan. Prinsip strateginya adalah setiap kali harga naik 1%, kita menahan order short pada nilai tertentu (atau sebaliknya, menahan order long), menghitung order beli dan jual, dan menempatkannya terlebih dahulu. Kode tersebut tidak dirilis. Enkapsulasi semua kode ke dalamGrid('XTZ',100,0.3,1000,maker_fee=-0.00002,taker_fee=0.0003)Dalam fungsi tersebut, parameternya adalah: pasangan perdagangan, deviasi harga 1% dari nilai kepemilikan, kepadatan pesanan 0,3%, interval tidur dalam ms, biaya pembuat pesanan, dan biaya penerima pesanan.

Dalam lima hari terakhir, pasar XTZ berada dalam fase yang fluktuatif, yang sangat cocok untuk jaringan listrik. /unggah/aset/1e235fa08ed9dce82a3.png

Pertama-tama, kami menguji ulang dampak ukuran posisi yang berbeda terhadap laba. Laba yang diukur dengan mekanisme pengujian ulang tradisional pasti akan meningkat secara proporsional dengan peningkatan posisi.

e1 = Grid('XTZ',100,0.3,1000,maker_fee=-0.00002,taker_fee=0.0003)
print(e1.account['USDT'])
e2 = Grid('XTZ',1000,0.3,1000,maker_fee=-0.00002,taker_fee=0.0003)
print(e2.account['USDT'])
e3 = Grid('XTZ',10000,0.3,1000,maker_fee=-0.00002,taker_fee=0.0003)
print(e3.account['USDT'])
e4 = Grid('XTZ',100000,0.3,1000,maker_fee=-0.00002,taker_fee=0.0003)
print(e4.account['USDT'])

Total ada empat kelompok yang diuji ulang, dengan nilai penahanan masing-masing 100, 1000, 10000, dan 100000, dan total waktu pengujian ulang adalah 1,3 detik. Hasilnya adalah sebagai berikut:

{'realised_profit': 28.470993031132966, 'margin': 0.7982662957624465, 'unrealised_profit': 0.0104554474048441, 'total': 10000028.481448, 'leverage': 0.0, 'fee': -0.3430967859046398, 'maker_fee': -0.36980249726699727, 'taker_fee': 0.026705711362357405}
{'realised_profit': 275.63148945320177, 'margin': 14.346335829979132, 'unrealised_profit': 4.4382117331794045e-14, 'total': 10000275.631489, 'leverage': 0.0, 'fee': -3.3102045933457784, 'maker_fee': -3.5800688964477048, 'taker_fee': 0.2698643031019274}
{'realised_profit': 2693.8701498889504, 'margin': 67.70120400534114, 'unrealised_profit': 0.5735269329348516, 'total': 10002694.443677, 'leverage': 0.0001, 'fee': -33.984021415250744, 'maker_fee': -34.879233866850974, 'taker_fee': 0.8952124516001403}
{'realised_profit': 22610.231198585603, 'margin': 983.3853688758861, 'unrealised_profit': -20.529965947304365, 'total': 10022589.701233, 'leverage': 0.002, 'fee': -200.87094000385412, 'maker_fee': -261.5849078470078, 'taker_fee': 60.71396784315319}

Terlihat bahwa laba akhir yang terealisasi masing-masing sebesar 28,4%, 27,5%, 26,9% dan 22,6% dari nilai posisi. Hal ini juga sesuai dengan situasi yang sebenarnya. Semakin besar nilai posisi, semakin besar nilai pending order, semakin besar kemungkinan transaksi parsial akan terjadi, dan keuntungan akhir yang direalisasikan akan lebih kecil dibandingkan volume pesanan tertunda. Gambar berikut membandingkan pengembalian relatif dari kepemilikan dengan nilai masing-masing 100 dan 10.000: Sistem pengujian ulang frekuensi tinggi berdasarkan transaksi per transaksi dan cacat pengujian ulang K-line

Kita juga dapat menguji ulang dampak berbagai parameter pada pengembalian pengujian ulang, seperti kepadatan pesanan, waktu dormansi, biaya penanganan, dll. Ambil waktu tidur sebagai contoh, ubahlah menjadi 100 ms dan bandingkan dengan waktu tidur 1000 ms untuk melihat manfaatnya. Hasil backtestnya adalah sebagai berikut:

{'realised_profit': 29.079440803790423, 'margin': 0.7982662957624695, 'unrealised_profit': 0.0104554474048441, 'total': 10000029.089896, 'leverage': 0.0, 'fee': -0.3703702128662524, 'maker_fee': -0.37938946377435134, 'taker_fee': 0.009019250908098965}

Keuntungan meningkat sedikit. Hal ini karena strategi ini hanya menempatkan satu set pesanan. Beberapa pesanan tidak dapat memperoleh keuntungan dari harga yang berfluktuasi karena tidak dapat diubah tepat waktu. Pengurangan waktu dormansi telah memperbaiki masalah ini. Hal ini juga menggambarkan pentingnya menempatkan beberapa kelompok pesanan dalam strategi jaringan.

Meringkaskan

Makalah ini secara inovatif mengusulkan sistem pengujian ulang baru berdasarkan aliran pesanan, yang sebagian dapat mensimulasikan kondisi pencocokan pesanan tertunda, penerimaan pesanan, transaksi parsial, penundaan, dll., dan sebagian mencerminkan dampak dana strategi terhadap pengembalian. Ini memiliki referensi penting nilai untuk strategi lindung nilai, dan pengujian ulang presisi tinggi menunjukkan arah untuk mengoptimalkan parameter strategi. Hal ini juga telah diverifikasi melalui perdagangan aktual jangka panjang. Ia juga mengontrol jumlah data yang diperlukan untuk pengujian ulang dengan lebih baik, dan kecepatan pengujian ulang juga sangat cepat.