Type/to search
3
Follow
1503
Followers
Penjelasan terperinci tentang optimasi parameter strategi grid kontrak abadi
Discussions
Created 2023-12-08 17:00:38  Updated 2023-12-14 17:07:42
 1
 3569

img

Strategi grid abadi adalah strategi klasik yang populer di platform. Dibandingkan dengan grid spot, tidak perlu menahan koin dan leverage dapat ditambahkan, yang jauh lebih nyaman daripada grid spot. Namun, karena tidak mungkin untuk melakukan backtesting secara langsung pada Inventor Quantitative Platform, maka tidak kondusif untuk menyaring mata uang dan menentukan optimasi parameter. Artikel ini akan memperkenalkan proses backtesting Python secara lengkap, termasuk pengumpulan data, kerangka kerja backtesting, fungsi backtesting, optimasi parameter, dll. Anda dapat mencobanya sendiri di juypter notebook.

Pengumpulan Data

Umumnya, data K-line sudah cukup. Demi akurasi, semakin kecil periode K-line, semakin baik. Namun, waktu backtest dan volume data harus seimbang. Artikel ini menggunakan data 5 menit dari dua tahun terakhir untuk backtesting Volume data akhir melebihi 200.000 baris. Pilih DYDX. Tentu saja, Anda dapat memilih mata uang tertentu dan periode K-line sesuai minat Anda sendiri.

import requests from datetime import date,datetime import time import pandas as pd import numpy as np import matplotlib.pyplot as plt import requests, zipfile, io %matplotlib inline def GetKlines(symbol='BTC',start='2020-8-10',end='2021-8-10',period='1h'): Klines = [] start_time = int(time.mktime(datetime.strptime(start, "%Y-%m-%d").timetuple()))*1000 end_time = int(time.mktime(datetime.strptime(end, "%Y-%m-%d").timetuple()))*1000 while start_time < end_time: res = requests.get('https://fapi.binance.com/fapi/v1/klines?symbol=%sUSDT&interval=%s&startTime=%s&limit=1000'%(symbol,period,start_time)) res_list = res.json() Klines += res_list start_time = res_list[-1][0] return pd.DataFrame(Klines,columns=['time','open','high','low','close','amount','end_time','volume','count','buy_amount','buy_volume','null']).astype('float') df = GetKlines(symbol='DYDX',start='2022-1-1',end='2023-12-7',period='5m') df = df.drop_duplicates()

Kerangka Pengujian Kembali

Pengujian ulang terus menggunakan kerangka kerja yang umum digunakan sebelumnya yang mendukung berbagai mata uang kontrak berjangka USDT, yang sederhana dan mudah digunakan.

class Exchange: def __init__(self, trade_symbols, fee=0.0004, initial_balance=10000): self.initial_balance = initial_balance #初始的资产 self.fee = fee self.trade_symbols = trade_symbols self.account = {'USDT':{'realised_profit':0, 'unrealised_profit':0, 'total':initial_balance, 'fee':0}} for symbol in trade_symbols: self.account[symbol] = {'amount':0, 'hold_price':0, 'value':0, 'price':0, 'realised_profit':0,'unrealised_profit':0,'fee':0} def Trade(self, symbol, direction, price, amount): cover_amount = 0 if direction*self.account[symbol]['amount'] >=0 else min(abs(self.account[symbol]['amount']), amount) open_amount = amount - cover_amount self.account['USDT']['realised_profit'] -= price*amount*self.fee #扣除手续费 self.account['USDT']['fee'] += price*amount*self.fee self.account[symbol]['fee'] += price*amount*self.fee if cover_amount > 0: #先平仓 self.account['USDT']['realised_profit'] += -direction*(price - self.account[symbol]['hold_price'])*cover_amount #利润 self.account[symbol]['realised_profit'] += -direction*(price - self.account[symbol]['hold_price'])*cover_amount self.account[symbol]['amount'] -= -direction*cover_amount self.account[symbol]['hold_price'] = 0 if self.account[symbol]['amount'] == 0 else self.account[symbol]['hold_price'] if open_amount > 0: total_cost = self.account[symbol]['hold_price']*direction*self.account[symbol]['amount'] + price*open_amount total_amount = direction*self.account[symbol]['amount']+open_amount self.account[symbol]['hold_price'] = total_cost/total_amount self.account[symbol]['amount'] += direction*open_amount def Buy(self, symbol, price, amount): self.Trade(symbol, 1, price, amount) def Sell(self, symbol, price, amount): self.Trade(symbol, -1, price, amount) def Update(self, close_price): #对资产进行更新 self.account['USDT']['unrealised_profit'] = 0 for symbol in self.trade_symbols: self.account[symbol]['unrealised_profit'] = (close_price[symbol] - self.account[symbol]['hold_price'])*self.account[symbol]['amount'] self.account[symbol]['price'] = close_price[symbol] self.account[symbol]['value'] = abs(self.account[symbol]['amount'])*close_price[symbol] self.account['USDT']['unrealised_profit'] += self.account[symbol]['unrealised_profit'] self.account['USDT']['total'] = round(self.account['USDT']['realised_profit'] + self.initial_balance + self.account['USDT']['unrealised_profit'],6)

Fungsi pengujian ulang grid

Prinsip strategi grid sangat sederhana: jual saat harga naik dan beli saat harga turun. Strategi ini melibatkan tiga parameter khusus: harga awal, jarak grid, dan nilai transaksi. Fluktuasi pasar DYDX sangat besar. Harganya telah turun dari 8,6U awal menjadi 1U, dan telah naik kembali ke 3U dalam pasar bullish baru-baru ini. Harga awal default dari strategi ini adalah 8,6U, yang sangat tidak menguntungkan bagi jaringan. strategi, tetapi parameter default backtest Total keuntungan dalam dua tahun adalah 9200U, dan ada kerugian 7500U pada satu titik.
img

symbol = 'DYDX' value = 100 pct = 0.01 def Grid(fee=0.0002, value=100, pct=0.01, init = df.close[0]): e = Exchange([symbol], fee=0.0002, initial_balance=10000) init_price = init res_list = [] #用于储存中间结果 for row in df.iterrows(): kline = row[1] #这样会测一根K线只会产生一个买单或一个卖单,不是特别精确 buy_price = (value / pct - value) / ((value / pct) / init_price + e.account[symbol]['amount']) #买单价格,由于是挂单成交,也是最终的撮合价格 sell_price = (value / pct + value) / ((value / pct) / init_price + e.account[symbol]['amount']) if kline.low < buy_price: #K线最低价低于当前挂单价,买单成交 e.Buy(symbol,buy_price,value/buy_price) if kline.high > sell_price: e.Sell(symbol,sell_price,value/sell_price) e.Update({symbol:kline.close}) res_list.append([kline.time, kline.close, e.account[symbol]['amount'], e.account['USDT']['total']-e.initial_balance,e.account['USDT']['fee'] ]) res = pd.DataFrame(data=res_list, columns=['time','price','amount','profit', 'fee']) res.index = pd.to_datetime(res.time,unit='ms') return res

img

Dampak harga awal

Pengaturan harga awal memengaruhi posisi awal strategi. Harga awal default dari backtest tadi adalah harga awal saat startup, artinya, tidak ada posisi yang dipegang saat startup. Kita tahu bahwa strategi grid akan merealisasikan semua keuntungan ketika harga kembali ke level awal, jadi jika strategi tersebut dapat memprediksi pasar masa depan dengan tepat saat diluncurkan, keuntungan akan meningkat secara signifikan. Di sini kami menetapkan harga awal ke 3U dan kemudian melakukan uji ulang. Penarikan maksimum akhir adalah 9200U, dan keuntungan akhir adalah 13372U. Strategi terakhir tidak menahan posisi. Keuntungan ini adalah semua keuntungan volatilitas, dan selisih antara keuntungan parameter default dan keuntungan ini adalah kerugian posisi yang disebabkan oleh penilaian harga akhir yang tidak akurat.

Namun, jika harga awal ditetapkan pada 3U, strategi akan melakukan short di awal dan menahan sejumlah besar posisi short. Dalam contoh ini, posisi short sebesar 17.000 U dipegang secara langsung, sehingga menghadapi risiko yang lebih besar.

img

Pengaturan jarak grid

Jarak grid menentukan jarak antara order yang tertunda. Jelas, semakin kecil jaraknya, semakin sering transaksi dilakukan, semakin rendah keuntungan dari satu transaksi, dan semakin tinggi biaya penanganannya. Namun perlu diperhatikan bahwa ketika jarak grid menjadi lebih kecil dan nilai grid tetap tidak berubah, maka posisi total akan meningkat ketika harga berubah, dan risiko yang dihadapi pun menjadi sangat berbeda. Oleh karena itu, untuk menguji ulang efek jarak grid, perlu mengonversi nilai grid.

Karena pengujian ulang menggunakan data garis 5mK, dan hanya satu transaksi yang dilakukan pada garis K. Hal ini jelas tidak sesuai dengan kenyataan, terutama karena volatilitas mata uang digital sangat besar. Spasi yang lebih kecil akan kehilangan banyak transaksi dalam pengujian ulang dibandingkan dengan perdagangan aktual. Hanya spasi yang lebih besar yang akan memiliki nilai referensi. Dengan mekanisme pengujian ulang ini, kesimpulan yang ditarik tidak akurat. Melalui pengujian ulang data aliran pesanan level centang, jarak grid optimal haruslah 0,005-0,01.

for p in [0.0005, 0.001 ,0.002 ,0.005, 0.01, 0.02, 0.05]: res = Grid( fee=0.0002, value=value*p/0.01, pct=p, init =3) print(p, round(min(res['profit']),0), round(res['profit'][-1],0), round(res['fee'][-1],0)) 0.0005 -8378.0 144.0 237.0 0.001 -9323.0 1031.0 465.0 0.002 -9306.0 3606.0 738.0 0.005 -9267.0 9457.0 781.0 0.01 -9228.0 13375.0 550.0 0.02 -9183.0 15212.0 309.0 0.05 -9037.0 16263.0 131.0

Nilai transaksi jaringan

Seperti yang disebutkan sebelumnya, ketika volatilitasnya sama, semakin besar nilai yang dimiliki, semakin tinggi pula risiko metode proporsional. Namun, selama itu bukan penurunan yang cepat, 1% dari total dana dikombinasikan dengan 1% dari jarak grid harus mampu mengatasi sebagian besar kondisi pasar. Dalam contoh DYDX ini, penurunan hampir 90% juga memicu panggilan margin. Namun perlu dicatat bahwa DYDX sebagian besar jatuh. Ketika jatuh, strategi grid akan mengambil posisi long dan penurunan maksimum adalah 100%. Namun, tidak ada batasan kenaikan dan risikonya jauh lebih tinggi. Oleh karena itu, strategi grid menyarankan agar pengguna memilih mata uang yang menurut mereka berpotensi dan hanya mengambil posisi long.

Harga Regresi Variabel

Harga regresi adalah harga awal. Perbedaan antara harga saat ini dan harga awal serta ukuran grid menentukan berapa banyak posisi yang harus dipertahankan. Jika harga regresi ditetapkan lebih tinggi dari harga saat ini, strategi grid akan menjadi long, dan sebaliknya. Harga regresi default adalah harga di mana strategi dimulai. Untuk mengurangi risiko, disarankan untuk menggunakan grid long-only. Ide yang wajar adalah apakah mungkin untuk mengubah harga regresi sehingga meskipun harga naik, Anda masih dapat memegang posisi long tanpa harus menyesuaikannya. dirimu sendiri. Mengambil pasar BTC tahun ini sebagai contoh, jumlahnya naik dari 15.000 di awal tahun menjadi 43.000 di akhir tahun. Jika Anda mulai menjalankan strategi grid sejak awal tahun, harga pengembalian default adalah 15.000, dan Anda melakukan perdagangan long dan short. Pengembalian spesifiknya seperti yang ditunjukkan pada gambar di bawah ini. Anda akan kehilangan uang sepenuhnya karena BTC terbit. Bahkan jika mode long-only tidak diatur dengan benar, harga akan terlampaui dengan cepat tanpa menahan posisi.
img

Pertama, ketika strategi dimulai, harga regresi ditetapkan menjadi 1,6 kali harga pada saat permulaan. Dengan cara ini, strategi grid akan memperlakukan harga sebagai penurunan dari 1,6 kali ke harga saat ini dan mulai menahan harga jangka panjang. posisi yang disebabkan oleh bagian dari perbedaan harga ini. Jika harga berikutnya melebihi Ketika harga pengembalian adalah /1,6, harga awal diatur ulang, sehingga setidaknya 60% dari perbedaan selalu tersedia untuk posisi beli. Hasil backtestnya adalah sebagai berikut:
img

Tentu saja, jika Anda lebih optimis terhadap pasar, Anda dapat menetapkan rasio ini ke nilai yang lebih besar, dan laba akhir akan meningkat sesuai dengan itu. Tentu saja, jika pasar jatuh, pengaturan ini juga akan meningkatkan risiko menahan posisi.

Comment
All comments (1)

    fmz为什么不能直接回测网格策略呢?

    3 years ago
  • 1
iPhone Download
Forums
PINE Language
© 2015 - ∞ INVENTOR PTE LTD (SG)