En el artículo anterior, realizamos una evaluación preliminar de las monedas en la plataforma DATADATA en función de la amplitud y las subidas y bajadas. A continuación, exploraremos un factor clave en el comercio de cuadrícula: establecer el número de cuadrículas. La cantidad de cuadrículas determina la frecuencia de las transacciones y la cantidad de fondos para cada transacción, lo que a su vez afecta el rendimiento total y el nivel de riesgo del comercio en cuadrícula. Por lo tanto, cómo establecer razonablemente el número de cuadrículas para lograr el mejor punto de equilibrio es una cuestión importante que todo operador de cuadrículas debe considerar.
Muy pocas cuadrículas:Si el número de cuadrículas se establece demasiado pequeño, los intervalos entre cuadrículas serán mayores, lo que significa que el precio debe fluctuar más para llegar a la siguiente cuadrícula. Si bien el monto de transacciones de cada red es mayor y puede capturar mayores ganancias por fluctuaciones, debido a las menores oportunidades comerciales, es posible que se pierdan algunas ganancias generadas por fluctuaciones más pequeñas. Por lo tanto, la rentabilidad general puede ser inferior a la esperada.
Demasiadas cuadrículas:Cuando el número de cuadrículas es demasiado grande, el rango de precios de cada cuadrícula es más pequeño, las oportunidades comerciales aumentan y la compra y la venta se pueden realizar con mayor frecuencia. Sin embargo, debido a la pequeña cantidad de capital involucrada en cada transacción, tales estrategias a menudo requieren operaciones de alta frecuencia para obtener ganancias. Esto puede fácilmente llevar a tarifas de transacción más altas, y el comercio demasiado frecuente puede hacer que las pequeñas fluctuaciones del mercado sean la principal fuente de ganancias, con un límite superior limitado en las ganancias.
Número razonable de cuadrículas:La cantidad adecuada de cuadrículas debe tener en cuenta la volatilidad del mercado, el tamaño de la cuenta y la frecuencia de negociación esperada. Cuando la volatilidad del mercado es alta, aumentar adecuadamente el número de cuadrículas puede capturar mejor las fluctuaciones, mientras que cuando los fondos son grandes, establecer un número menor de cuadrículas puede resultar en montos de transacciones individuales más altos y reducir la presión sobre las tarifas de transacción. Al equilibrar el espaciado de la cuadrícula y el costo de las transacciones frecuentes, se pueden maximizar los retornos de la estrategia y el control de riesgos.
Una característica fundamental del comercio de cuadrícula es asignar fondos a cada intervalo estableciendo múltiples intervalos de cuadrícula. Para determinar el número de cuadrículas, primero debe calcular el intervalo entre cada cuadrícula y la cantidad de fondos en cada cuadrícula. La configuración del número de cuadrículas no solo afecta la cantidad de fondos en cada cuadrícula, sino que también determina el rango de precios de compra y venta de cada cuadrícula.
Los fondos de la cuenta son un factor importante para determinar el número de cuadrículas. Los fondos de cuenta más grandes permiten configurar más cuadrículas, mientras que los fondos de cuenta más pequeños requieren un límite en la cantidad de cuadrículas para evitar una asignación de fondos demasiado dispersa, lo que resulta en una cantidad demasiado pequeña de fondos en cada cuadrícula y la incapacidad de obtener ganancias efectivas.
Además, la estrategia de gestión de riesgos del comercio en red también debe tener en cuenta la configuración del número de redes. Especialmente cuando el mercado fluctúa violentamente, demasiadas cuadrículas pueden generar mayores pérdidas, por lo que el número de cuadrículas debe controlarse razonablemente para evitar transacciones excesivas.
En la aplicación real de estrategias de trading en red, especialmente al optimizar el equilibrio entre el número de redes y la tasa de retorno, el DQL (Datadata Query Language) de la plataforma Datadata proporciona una gran flexibilidad. DQL no solo admite la consulta, el procesamiento y el análisis de datos eficientes, sino que también ayuda a los operadores a simular y realizar pruebas retrospectivas del rendimiento de las estrategias de negociación en cuadrícula para encontrar el número de cuadrícula más adecuado y otras configuraciones de parámetros.
A través de DQL, podemos obtener fácilmente datos históricos de K-line de múltiples intercambios (como Binance) y ajustar las estrategias de trading en cuadrícula en función de estos datos. De esta manera, se puede determinar con precisión la estrategia óptima de trading en red según los diferentes entornos de mercado y la volatilidad de monedas específicas.
Antes de comenzar a probar retrospectivamente nuestra estrategia de trading en cuadrícula, primero debemos obtener datos de mercado para la moneda objetivo. El siguiente es el código para consultar los datos de la línea K de una moneda específica de la base de datos:
# 获取目标币种的K线数据
data = query("select * from klines.spot_1d where Exchange = 'Binance' and Symbol = '???_usdt' order by Time")
La explicación:
???_usdt
) en la plataforma de trading de Binance (incluido tiempo, precio de apertura, precio más alto, precio más bajo y precio de cierre, etc.). Esto proporciona datos básicos para la ejecución de la estrategia.El núcleo de la estrategia de comercio en cuadrícula es comerciar utilizando una cantidad de cuadrícula y un rango de precios preestablecidos. Los pasos específicos son los siguientes:
Calcular el intervalo de la cuadrícula (gap) y el monto de transacción por cuadrícula (nocional):
Espaciado de la cuadrícula (espacio libre):Calculado en base a la relación entre los precios más altos y más bajos del mercado. La fórmula es la siguiente:
[
\text{gap} = \frac{\log(\text{max_p} / \text{min_p})}{\text{grid_num}}
]
en,max_p
Por el precio más alto,min_p
Por el precio más bajo,grid_num
es el número de cuadrículas.
Monto de transacción por red (nocional):El monto de la transacción de cada cuadrícula se calcula según los fondos totales y la cantidad de cuadrículas. La fórmula es: [ \text{notional} = \frac{\text{balance}}{\text{grid_num}} ]
Precios de inicio y fin de red:
exp(gap)
, etcétera.Operaciones comerciales:
Tarifas de transacción:Suponiendo que la tarifa de manejo para cada transacción es 0,0001, necesitamos calcular y acumular la tarifa de manejo para cada transacción.
def grid_trading_strategy(
raw,
grid_num, # 网格数量
min_p, # 最低价格
max_p, # 最高价格
):
"""
执行网格交易策略的函数
"""
# 初始化变量
balance = 1000 # 初始资金
raw = raw[['Time', 'Open', 'High', 'Low', 'Close']] # 只选择相关列
# 网格交易策略的设置
gap = math.log(max_p / min_p) / grid_num # 计算网格间隔
notional = balance / grid_num # 每个网格的交易额
# 初始化网格
net = []
for i in range(grid_num):
net.append({
'start_p': min_p * math.exp(i * gap), # 每个网格的起始价格
'end_p': min_p * math.exp((i + 1) * gap), # 每个网格的结束价格
'amt': notional / (min_p * math.exp(i * gap)), # 每个网格的购买量
'status': 'idle' # 初始状态为闲置
})
# 记录状态
state = {
'stock': 0, # 当前持仓
'fee': 0, # 交易费用
'longTradeVol': 0, # 长期交易量
'shortTradeVol': 0, # 短期交易量
'profitTbl': [], # 存储每个时刻的利润
'feeTbl': [], # 存储每个时刻的费用
'netCnt': 0, # 记录净交易次数
'idx': 0 # 当前数据的索引
}
# 检查开盘交易
def check_open_orders(state, net):
for i in range(len(net)):
if net[i]['status'] == 'idle' and raw['Low'][state['idx']] <= net[i]['start_p'] and raw['Open'][state['idx']] > net[i]['start_p']:
net[i]['status'] = 'taken' # 网格被占用
tradeVol = net[i]['amt'] * net[i]['start_p']
state['stock'] += net[i]['amt']
state['longTradeVol'] += tradeVol
state['fee'] += tradeVol * 0.0001 # 假设手续费为0.0001
# 检查平仓交易
def check_close_orders(state, net):
for i in range(len(net)):
if net[i]['status'] == 'taken' and raw['High'][state['idx']] >= net[i]['end_p'] and raw['Open'][state['idx']] < net[i]['end_p']:
net[i]['status'] = 'idle' # 网格状态恢复为空闲
tradeVol = net[i]['amt'] * net[i]['end_p']
state['stock'] -= net[i]['amt']
state['shortTradeVol'] += tradeVol
state['fee'] += tradeVol * 0.0001 # 假设手续费为0.0001
state['netCnt'] += 1
# 日志记录利润和费用
def log(state):
addVol = state['stock'] * raw['Close'][state['idx']] # 当前仓位的总价值
pl = state['shortTradeVol'] - state['longTradeVol'] + addVol # 计算利润
state['profitTbl'].append(pl)
state['feeTbl'].append(state['fee'])
# 主交易循环
for i in range(len(raw)):
state['idx'] = i
if raw['Close'][state['idx']] >= raw['Open'][state['idx']]:
check_open_orders(state, net)
check_close_orders(state, net)
else:
check_close_orders(state, net)
check_open_orders(state, net)
log(state)
# 将利润和费用数据整理为DataFrame
pl = DataFrame({'pl' : state['profitTbl'], 'fee' : state['feeTbl']})
pl['time'] = raw['Time']
pl['pl-net'] = pl['pl'] - pl['fee']
return pl
Para la moneda de destino, elegimos la moneda ‘oax_usdt’. Después de verificar el código en el artículo anterior, esta moneda mantiene una gran amplitud durante un largo período de tiempo sin mostrar una tendencia unilateral significativa. Podemos intentar usar diferentes números de cuadrícula (por ejemplo: 5, 10, 15, etc.) para realizar pruebas retrospectivas simuladas para ver los efectos de diferentes números de cuadrícula y luego encontrar un número de cuadrícula adecuado. Por ejemplo, al calcular el beneficio neto (pl-net) para cada número de cuadrícula, podemos evaluar qué números de cuadrícula pueden generar los mejores rendimientos en el entorno de mercado actual. Aquí está el código para ejecutar el backtest:
grid_nums = [5*i+5 for i in range(5)]
out = []
for g in grid_nums:
pl = grid_trading_strategy(
data,
grid_num=g,
min_p=min(data['Close']),
max_p=max(data['Close'])
)
out.append({
'num': g,
'pl-net': pl['pl-net'][-1],
'min_pl': min(pl['pl-net']),
'max_pl': max(pl['pl-net'])
})
return out
Luego de realizar pruebas retrospectivas con diferentes configuraciones de números de cuadrícula, obtuvimos los siguientes resultados:
El análisis:
Establecer correctamente el número de cuadrículas es una tarea importante en la estrategia de comercio de cuadrículas. Al optimizar el número de cuadrículas, se puede mejorar de manera efectiva el rendimiento de las ganancias de las estrategias de comercio de cuadrículas y se pueden controlar mejor los riesgos. Este artículo analiza la configuración del número de cuadrícula y proporciona métodos de cálculo específicos y códigos de muestra, con la esperanza de ayudar a todos a optimizar las estrategias de negociación de cuadrícula y mejorar la estabilidad y la rentabilidad de las estrategias.
Nota: El código de backtesting de la red en este artículo está adaptado de Zhihu Da Shen Halcyon, consulta el artículo para obtener una explicación del código fuente.Diario de práctica de trading algorítmico (XVIII): detalles sobre el trading en cuadrícula: la relación entre el número de cuadrícula y el rendimiento a largo plazo。