Parámetros de optimización de la estrategia de la red de contratos permanentes

El autor:Las hierbas, Creado: 2023-12-08 17:00:38, Actualizado: 2023-12-14 17:07:42

img

La estrategia de la rejilla permanente es una estrategia clásica muy popular para las plataformas. No se usan monedas en comparación con las redes in situ, se pueden apalancar y son mucho más fáciles que las redes in situ. Sin embargo, debido a que no se puede calificar directamente la redetección en la plataforma de los inventores, lo que es perjudicial para la selección de monedas y la optimización de parámetros, este artículo presentará el proceso de redetección completo de Python, que incluye todos los aspectos de la recopilación de datos, la redetección del marco de redetección, las funciones de medición y la optimización de parámetros, que se pueden probar en el juypter notebook.

Recopilación de datos

En general, los datos de la línea K son suficientes, para mayor precisión, los ciclos de la línea K son más pequeños y mejores, pero para equilibrar el tiempo de repetición y la cantidad de datos, este artículo usa 5 min para repetición de datos de los últimos dos años, el volumen de datos final excede las líneas de 20 W, la moneda elige DYDX. Por supuesto, las monedas específicas y los ciclos de la línea K se pueden elegir según sus intereses.

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()

El marco de evaluación

La revisión continúa eligiendo el marco de trabajo utilizado anteriormente para apoyar el USDT para el contrato permanente de monedas multicurrency, simple y útil.

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)

Función de repetición de la red

El principio de la estrategia de la red es simple, el aumento de las ventas, la caída de las compras, y se refiere específicamente a tres parámetros: precio inicial, intervalo de la red, valor de la transacción. La volatilidad del mercado de DYDX es muy grande, desde el mínimo inicial de 8.6U cayó 1U, el mercado alcista reciente volvió a 3U, la estrategia de precio inicial por defecto es de 8.6U, lo que es muy desfavorable para la estrategia de la red, pero el parámetro por defecto se remonta a dos años de ganancias totales de 9200U, una pérdida de 7500U durante el período.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

Impacto del precio inicial

La configuración del precio inicial afecta la posición inicial de la estrategia, el precio inicial predeterminado que acabamos de revisar es el precio inicial al inicio, es decir, no mantener la posición al inicio. Y sabemos que la estrategia de red recaudará todos los beneficios al regresar al precio inicial, por lo que si la estrategia se inicia con el pronóstico correcto de lo que sucederá en el futuro, se incrementará significativamente la ganancia.

Sin embargo, el precio inicial se establece en 3U, la estrategia es mantener un gran número de reservas vacías al principio, en este caso, directamente con un boleto vacío de 17,000U, por lo que también se enfrenta a un mayor riesgo.

img

Configuración del espacio de la red

El intervalo de la red determina la distancia de los pedidos de suspensión, obviamente, cuanto menor sea el intervalo, más frecuentes serán las transacciones, menor será la ganancia de una sola moneda y más altos serán los cargos de tramitación. Pero es de notar que el intervalo de la red se vuelve más pequeño y el valor de la red no cambia, cuando el precio cambia, el total de las tenencias aumenta y el riesgo es completamente diferente.

Debido a que la retrospección utiliza datos de línea de 5mK y solo se realiza una transacción en una línea K. Esto es obviamente poco realista, especialmente porque la volatilidad de la moneda digital es muy alta, los intervalos más pequeños se pierden muchos transacciones en la retrospección en comparación con la pantalla real, y solo un mayor intervalo tiene un valor de referencia.

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

El valor de las transacciones en la red

Como se ha dicho anteriormente, cuando las fluctuaciones son simultáneas, el mayor valor que se tiene, el riesgo y otros métodos proporcionales, pero siempre y cuando no sea una caída rápida, el 1% del total de capital y el 1% del intervalo de la red deben ser capaces de hacer frente a la mayoría de los mercados. En este ejemplo de DYDX, la caída de casi el 90% también desencadenó una explosión.

Precio de retorno variable

El precio de retorno es el precio inicial, la diferencia entre el precio actual y el precio inicial y el tamaño de la red determinan cuántas posiciones se deben mantener. Si el precio de retorno se establece por encima del precio actual, la estrategia de red hará más y, a su vez, se vaciará. El precio de retorno predeterminado es el precio al inicio de la estrategia. Para reducir el riesgo, se recomienda hacer solo muchas redes.img

Cuando se inicia la estrategia, el precio de retorno se establece en 1.6 veces el precio de inicio, de modo que la estrategia de red comienza a mantener la posición generada por esta diferencia parcial cuando el precio cae de 1.6 veces al precio actual. Si el precio posterior excede el precio de retorno / 1.6, se restablece el precio inicial, manteniendo siempre al menos el 60% de la diferencia para hacer más.img

Por supuesto, si eres más optimista con el mercado, puedes establecer este porcentaje más alto, y los beneficios finales también aumentarán en consecuencia, por supuesto, si el mercado cae, esta configuración también aumenta el riesgo de tenencia.


Más.

El EEEE¿Por qué fmz no puede rastrear directamente la política de la red?