3
fokus pada
1444
Pengikut

Penjelasan terperinci tentang optimasi parameter strategi grid kontrak abadi

Dibuat di: 2023-12-08 17:00:38, diperbarui pada: 2023-12-14 17:07:42
comments   1
hits   2862

Penjelasan terperinci tentang optimasi parameter strategi grid kontrak abadi

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. Penjelasan terperinci tentang optimasi parameter strategi grid kontrak abadi

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

Penjelasan terperinci tentang optimasi parameter strategi grid kontrak abadi

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.

Penjelasan terperinci tentang optimasi parameter strategi grid kontrak abadi

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. Penjelasan terperinci tentang optimasi parameter strategi grid kontrak abadi

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: Penjelasan terperinci tentang optimasi parameter strategi grid kontrak abadi

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.