Dans l’article précédent, nous avons effectué un examen préliminaire des devises sur la plateforme DATADATA en fonction de l’amplitude et de la hausse et de la baisse. Ensuite, nous explorerons un facteur clé dans le trading de grille : la définition du nombre de grilles. Le nombre de grilles détermine la fréquence des transactions et le montant des fonds pour chaque transaction, ce qui affecte à son tour le rendement total et le niveau de risque du trading sur grille. Par conséquent, la manière de définir raisonnablement le nombre de grilles pour atteindre le meilleur point d’équilibre est une question importante que chaque trader de grille doit prendre en compte.
Trop peu de grilles:Si le nombre de grilles est trop petit, les intervalles entre les grilles seront plus grands, ce qui signifie que le prix doit fluctuer davantage pour atteindre la grille suivante. Bien que le montant des transactions de chaque grille soit plus important et puisse générer des profits de fluctuations plus importants, en raison du nombre réduit d’opportunités de trading, certains profits générés par des fluctuations plus faibles peuvent être manqués. Par conséquent, la rentabilité globale pourrait être inférieure aux prévisions.
Trop de grilles:Lorsque le nombre de grilles est trop élevé, la fourchette de prix de chaque grille est plus petite, les opportunités de trading augmentent et les achats et les ventes peuvent être effectués plus fréquemment. Cependant, en raison du faible montant de capital impliqué dans chaque transaction, ces stratégies nécessitent souvent un trading à haute fréquence pour générer un profit. Cela peut facilement conduire à des frais de transaction plus élevés, et des transactions trop fréquentes peuvent faire de petites fluctuations du marché la principale source de profit, avec une limite supérieure limitée aux bénéfices.
Nombre raisonnable de grilles:Le nombre approprié de grilles doit prendre en compte la volatilité du marché, la taille du compte et la fréquence de négociation prévue. Lorsque la volatilité du marché est élevée, l’augmentation appropriée du nombre de grilles peut mieux capturer les fluctuations, tandis que lorsque les fonds sont importants, la définition d’un nombre plus petit de grilles peut entraîner des montants de transaction uniques plus élevés et réduire la pression sur les frais de transaction. En équilibrant l’espacement de la grille et le coût des transactions fréquentes, les rendements de la stratégie et le contrôle des risques peuvent être maximisés.
L’une des principales caractéristiques du trading en grille est d’allouer des fonds à chaque intervalle en définissant plusieurs intervalles de grille. Lors de la détermination du nombre de grilles, vous devez d’abord calculer l’intervalle entre chaque grille et le montant des fonds dans chaque grille. Le réglage du nombre de grilles affecte non seulement le montant des fonds dans chaque grille, mais détermine également la fourchette de prix d’achat et de vente de chaque grille.
Les fonds du compte sont un facteur important pour déterminer le nombre de grilles. Des fonds de compte plus importants permettent de mettre en place davantage de grilles, tandis que des fonds de compte plus petits nécessitent une limite sur le nombre de grilles pour éviter une répartition trop dispersée des fonds, ce qui entraîne un montant de fonds trop faible dans chaque grille et l’incapacité de réaliser des bénéfices efficaces.
En outre, la stratégie de gestion des risques du trading en grille doit également prendre en compte la définition du nombre de grilles. Surtout lorsque le marché fluctue violemment, trop de grilles peuvent entraîner des pertes plus importantes, le nombre de grilles doit donc être correctement contrôlé pour éviter les échanges excessifs.
Dans l’application réelle des stratégies de trading en grille, notamment lors de l’optimisation de l’équilibre entre le nombre de grilles et le taux de rendement, le DQL (Datadata Query Language) de la plateforme Datadata offre une grande flexibilité. DQL prend non seulement en charge l’interrogation, le traitement et l’analyse efficaces des données, mais aide également les traders à simuler et à tester les performances des stratégies de trading en grille afin de trouver le numéro de grille le plus approprié et d’autres configurations de paramètres.
Grâce à DQL, nous pouvons facilement obtenir des données historiques sur la ligne K à partir de plusieurs bourses (telles que Binance) et ajuster les stratégies de trading en grille en fonction de ces données. De cette manière, la stratégie de trading de grille optimale peut être sélectionnée avec précision en fonction des différents environnements de marché et de la volatilité de devises spécifiques.
Avant de commencer à tester notre stratégie de trading en grille, nous devons d’abord obtenir des données de marché pour la devise cible. Voici le code permettant d’interroger les données K-line d’une devise spécifiée dans la base de données :
# 获取目标币种的K线数据
data = query("select * from klines.spot_1d where Exchange = 'Binance' and Symbol = '???_usdt' order by Time")
Il explique:
???_usdt
) sur la plateforme de trading Binance (y compris l’heure, le prix d’ouverture, le prix le plus élevé, le prix le plus bas et le prix de clôture, etc.). Cela fournit des données de base pour l’exécution de la stratégie.Le cœur de la stratégie de trading en grille consiste à trader en utilisant une quantité de grille et une fourchette de prix prédéfinies. Les étapes spécifiques sont les suivantes :
Calculer l’intervalle de grille (écart) et le montant de la transaction par grille (notionnel):
Espacement de la grille (espace):Calculé sur la base du rapport entre les prix les plus élevés et les plus bas du marché. La formule est la suivante :
[
\text{gap} = \frac{\log(\text{max_p} / \text{min_p})}{\text{grid_num}}
]
dans,max_p
Pour le prix le plus élevé,min_p
Pour le prix le plus bas,grid_num
est le nombre de grilles.
Montant de la transaction par grille (notionnel):Le montant de la transaction de chaque grille est calculé par le total des fonds et le nombre de grilles. La formule est : [ \text{notional} = \frac{\text{balance}}{\text{grid_num}} ]
Tarifs de début et de fin de réseau:
exp(gap)
, et ainsi de suite.Opérations de trading:
Frais de transaction:En supposant que les frais de traitement pour chaque transaction sont de 0,0001, nous devons calculer et accumuler les frais de traitement pour chaque transaction.
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
Pour la devise cible, nous choisissons la devise « oax_usdt ». Après avoir vérifié le code de l’article précédent, cette devise maintient une amplitude élevée pendant une longue période sans montrer de tendance unilatérale significative. Nous pouvons essayer d’utiliser différents numéros de grille (par exemple : 5, 10, 15, etc.) pour un backtesting simulé afin de voir les effets de différents numéros de grille, puis de trouver un numéro de grille approprié. Par exemple, en calculant le bénéfice net (pl-net) pour chaque numéro de grille, nous pouvons évaluer quels numéros de grille peuvent apporter les meilleurs rendements dans l’environnement de marché actuel. Voici le code pour exécuter le 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
Après avoir effectué des backtests avec différentes configurations de numéros de grille, nous avons obtenu les résultats suivants :
Une analyse:
Définir correctement le nombre de grilles est une tâche importante dans la stratégie de trading de grille. En optimisant le nombre de grilles, les performances bénéficiaires des stratégies de trading en grille peuvent être efficacement améliorées et les risques peuvent être mieux contrôlés. Cet article analyse les paramètres du numéro de grille et fournit des méthodes de calcul spécifiques et des exemples de codes, dans l’espoir d’aider tout le monde à optimiser les stratégies de trading de grille et à améliorer la stabilité et la rentabilité des stratégies.
Remarque: Le code de backtesting de la grille dans cet article est adapté de Zhihu Da Shen Halcyon, veuillez vous référer à l’article pour l’explication du code sourceJournal des pratiques de trading algorithmique (XVIII) - Détails sur le trading en grille : la relation entre le numéro de grille et le rendement à long terme。