3
fokus pada
1444
Pengikut

Penjelasan terperinci tentang pengoptimuman parameter strategi grid kontrak kekal

Dicipta dalam: 2023-12-08 17:00:38, dikemas kini pada: 2023-12-14 17:07:42
comments   1
hits   2862

Penjelasan terperinci tentang pengoptimuman parameter strategi grid kontrak kekal

Strategi grid kekal ialah strategi klasik yang popular di platform. Berbanding dengan grid spot, tidak perlu memegang syiling dan leverage boleh ditambah, yang jauh lebih mudah daripada grid spot. Walau bagaimanapun, kerana adalah mustahil untuk melakukan ujian belakang secara langsung pada Platform Kuantitatif Inventor, ia tidak sesuai untuk menyaring mata wang dan menentukan pengoptimuman parameter Artikel ini akan memperkenalkan proses ujian balik Python yang lengkap, termasuk pengumpulan data, rangka kerja ujian belakang, fungsi ujian belakang, pengoptimuman parameter. dan lain-lain. Anda boleh mencubanya sendiri dalam buku nota juypter.

Pengumpulan Data

Secara amnya, data K-line sudah mencukupi Untuk ketepatan, lebih kecil tempoh K-line, lebih baik, masa ujian belakang dan volum data harus seimbang . Jumlah data akhir melebihi 200,000 baris. Sudah tentu, mata wang tertentu dan tempoh K-line boleh dipilih mengikut 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()

Rangka Kerja Ujian Belakang

Ujian belakang terus menggunakan rangka kerja yang biasa digunakan sebelum ini yang menyokong berbilang mata wang kontrak kekal USDT, yang mudah 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 ujian belakang grid

Prinsip strategi grid adalah sangat mudah: jual apabila harga naik dan beli apabila harga turun Ia melibatkan tiga parameter khusus: harga awal, jarak grid dan nilai transaksi. Turun naik pasaran DYDX adalah sangat besar Ia telah jatuh daripada 8.6U awal kepada 1U, dan telah meningkat semula kepada 3U dalam pasaran kenaikan harga baru-baru ini strategi, tetapi parameter lalai backtest Jumlah keuntungan dalam dua tahun ialah 9200U, dan terdapat kerugian 7500U pada satu ketika. Penjelasan terperinci tentang pengoptimuman parameter strategi grid kontrak kekal

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 pengoptimuman parameter strategi grid kontrak kekal

Kesan harga awal

Penetapan harga awal mempengaruhi kedudukan awal strategi Harga awal lalai ujian belakang tadi ialah harga awal pada permulaan, iaitu, tiada kedudukan dipegang pada permulaan. Kami tahu bahawa strategi grid akan merealisasikan semua keuntungan apabila harga kembali ke tahap awal, jadi jika strategi itu boleh meramalkan pasaran masa depan dengan betul apabila ia dilancarkan, ia akan meningkatkan keuntungan dengan ketara. Di sini kami menetapkan harga awal kepada 3U dan kemudian backtest. Pengeluaran maksimum terakhir ialah 9200U, dan keuntungan akhir ialah 13372U. Strategi akhir tidak memegang kedudukan Keuntungan ini adalah semua keuntungan turun naik, dan perbezaan antara keuntungan parameter lalai dan keuntungan ini adalah kerugian kedudukan yang disebabkan oleh pertimbangan harga akhir yang tidak tepat.

Walau bagaimanapun, jika harga awal ditetapkan pada 3U, strategi akan menjadi pendek pada permulaan dan memegang sejumlah besar kedudukan jual Dalam contoh ini, kedudukan pendek sebanyak 17,000 U dipegang secara langsung, jadi ia menghadapi risiko yang lebih besar.

Penjelasan terperinci tentang pengoptimuman parameter strategi grid kontrak kekal

Tetapan jarak grid

Jarak grid menentukan jarak antara pesanan yang belum selesai Jelas sekali, semakin kecil jarak, semakin kerap transaksi, semakin rendah keuntungan satu transaksi, dan semakin tinggi yuran pengendalian. Tetapi perlu diingat bahawa apabila jarak grid menjadi lebih kecil dan nilai grid kekal tidak berubah, jumlah kedudukan akan meningkat apabila harga berubah, dan risiko yang dihadapi adalah berbeza sama sekali. Oleh itu, untuk menguji semula kesan jarak grid, adalah perlu untuk menukar nilai grid.

Memandangkan ujian belakang menggunakan data talian 5mK, dan hanya satu transaksi dibuat pada talian K. Ini jelas tidak selaras dengan realiti, terutamanya kerana turun naik mata wang digital adalah sangat besar Jarak yang lebih kecil akan terlepas banyak urus niaga dalam ujian belakang berbanding dengan perdagangan sebenar. Di bawah mekanisme ujian belakang ini, kesimpulan yang dibuat adalah tidak tepat. Melalui ujian balik data aliran pesanan peringkat tanda, jarak grid yang optimum hendaklah 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 grid

Seperti yang dinyatakan sebelum ini, apabila turun naik adalah sama, lebih besar nilai yang dipegang, lebih tinggi kaedah berkadar risiko Walau bagaimanapun, selagi ia bukan penurunan pesat, 1% daripada jumlah dana digabungkan dengan 1% daripada jarak grid. sepatutnya dapat menghadapi kebanyakan keadaan pasaran. Dalam contoh DYDX ini, penurunan hampir 90% turut mencetuskan panggilan margin. Tetapi sila ambil perhatian bahawa DYDX terutamanya jatuh Apabila ia jatuh, strategi grid menjadi panjang dan penurunan maksimum ialah 100%. Oleh itu, strategi grid mengesyorkan pengguna memilih mata wang yang mereka fikir berpotensi dan hanya bertahan lama.

Harga Regresi Berubah

Harga regresi ialah harga awal Perbezaan antara harga semasa dan harga awal dan saiz grid menentukan berapa banyak kedudukan yang perlu dipegang Jika harga regresi ditetapkan lebih tinggi daripada harga semasa, strategi grid akan menjadi panjang, dan sebaliknya. Harga regresi lalai ialah harga di mana strategi dimulakan. Untuk mengurangkan risiko, adalah disyorkan untuk menggunakan grid panjang sahaja. Idea semula jadi adalah sama ada mungkin untuk menukar harga regresi supaya walaupun harga meningkat, anda masih boleh memegang kedudukan panjang tanpa perlu menyesuaikannya. diri sendiri. Mengambil pasaran BTC tahun ini sebagai contoh, ia meningkat daripada 15,000 pada awal tahun kepada 43,000 pada akhir tahun. Jika anda mula menjalankan strategi grid dari awal tahun, harga pulangan lalai ialah 15,000, dan anda melakukan kedua-dua perdagangan panjang dan pendek Pulangan khusus adalah seperti yang ditunjukkan dalam rajah di bawah Anda akan kehilangan wang sepanjang jalan naik. Walaupun mod lama sahaja tidak disediakan dengan betul, harga akan dilampaui dengan cepat tanpa memegang kedudukan. Penjelasan terperinci tentang pengoptimuman parameter strategi grid kontrak kekal

Pertama, apabila strategi dimulakan, harga regresi ditetapkan kepada 1.6 kali ganda harga pada masa permulaan Dengan cara ini, strategi grid akan menganggap harga jatuh dari 1.6 kali kepada harga semasa dan mula bertahan lama. kedudukan yang disebabkan oleh bahagian perbezaan harga ini Jika harga berikutnya melebihi Apabila harga pulangan adalah /1.6, harga awal ditetapkan semula, supaya sekurang-kurangnya 60% daripada perbezaan sentiasa tersedia untuk posisi beli. Keputusan backtest adalah seperti berikut: Penjelasan terperinci tentang pengoptimuman parameter strategi grid kontrak kekal

Sudah tentu, jika anda lebih optimistik tentang pasaran, anda boleh menetapkan nisbah ini kepada nilai yang lebih besar, dan keuntungan akhir akan meningkat dengan sewajarnya, jika pasaran jatuh, tetapan ini juga akan meningkatkan risiko memegang kedudukan.