Les ressources ont été chargées... Je charge...

Réflexion sur les stratégies de trading à haute fréquence (4)

Auteur:Le foin, Créé à: 2023-08-08 22:31:47, Mis à jour à: 2023-09-18 19:51:25

img

L'article précédent a montré pourquoi les paramètres doivent être ajustés dynamiquement et comment évaluer les estimations pour le bien ou le mal en étudiant les intervalles d'arrivée des commandes. Cet article se concentrera sur les données en profondeur, l'étude du prix intermédiaire (ou appelé juste prix, micro-prix, etc.).

Données en profondeur

Binance fournit des téléchargements de données historiques des meilleures offres, comprenant best_bid_price: prix d'achat le plus avantageux, best_bid_qty: nombre de prix d'achat les plus avantageux, best_ask_price: nombre de prix d'achat les plus avantageux, best_ask_qty: nombre de prix d'achat les plus avantageux, transaction_time: temps d'exécution.

Tout d'abord, regardez le marché du jour, les hausses et les baisses, en outre, le volume des transactions du jour a également connu de plus grandes variations avec les fluctuations du marché, en particulier le spread (différence entre le prix de vente et le prix d'achat) montre très nettement la volatilité du marché. Dans les statistiques du marché du jour de YGG, il y a un écart de temps de 20% supérieur à 1 tick, ce qui est rare à l'ère de la compétition des robots sur le marché.

from datetime import date,datetime
import time
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
books = pd.read_csv('YGGUSDT-bookTicker-2023-08-07.csv')
tick_size = 0.0001
books['date'] = pd.to_datetime(books['transaction_time'], unit='ms')
books.index = books['date']
books['spread'] = round(books['best_ask_price'] - books['best_bid_price'],4)
books['best_bid_price'][::10].plot(figsize=(10,5),grid=True);

img

books['best_bid_qty'][::10].rolling(10000).mean().plot(figsize=(10,5),grid=True);
books['best_ask_qty'][::10].rolling(10000).mean().plot(figsize=(10,5),grid=True);

img

(books['spread'][::10]/tick_size).rolling(10000).mean().plot(figsize=(10,5),grid=True);

img

books['spread'].value_counts()[books['spread'].value_counts()>500]/books['spread'].value_counts().sum()
0.0001    0.799169
0.0002    0.102750
0.0003    0.042472
0.0004    0.022821
0.0005    0.012792
0.0006    0.007350
0.0007    0.004376
0.0008    0.002712
0.0009    0.001657
0.0010    0.001089
0.0011    0.000740
0.0012    0.000496
0.0013    0.000380
0.0014    0.000258
0.0015    0.000197
0.0016    0.000140
0.0017    0.000112
0.0018    0.000088
0.0019    0.000063
Name: spread, dtype: float64

Des offres déséquilibrées

On peut voir d'en haut qu'il y a une grande différence entre le volume des ordres d'achat et de vente pendant la majeure partie du temps, ce qui est très prédictif pour le marché à court terme. Les raisons sont les mêmes que celles mentionnées dans l'article précédent. Si un ordre d'achat est significativement plus petit que l'autre, supposons que le volume des ordres d'achat et de vente actifs suivants soit proche, le côté du ordre d'achat est plus susceptible d'être mangé, ce qui entraîne une variation du prix.imgDans ce cas, Q_b représente le montant de l'offre (best_bid_qty) et Q_a représente le montant de l'offre (best_ask_qty).

Définition du prix moyen:img

Le graphique ci-dessous montre la relation entre le taux de variation du prix intermédiaire et le déséquilibre I à 1 intervalle, et selon les prévisions, les prix sont plus susceptibles d'augmenter avec l'augmentation du prix I et l'ampleur des variations de prix s'accélère avec l'approche de 1. Dans les transactions à haute fréquence, le but de l'introduction du prix intermédiaire est de mieux prédire les variations de prix futurs, c'est-à-dire que le prix intermédiaire est mieux défini lorsque les différences de prix futures sont plus petites.img

books['I'] = books['best_bid_qty'] / (books['best_bid_qty'] + books['best_ask_qty'])
books['mid_price'] = (books['best_ask_price'] + books['best_bid_price'])/2
bins = np.linspace(0, 1, 51)
books['I_bins'] = pd.cut(books['I'], bins, labels=bins[1:])
books['price_change'] = (books['mid_price'].pct_change()/tick_size).shift(-1)
avg_change = books.groupby('I_bins')['price_change'].mean()
plt.figure(figsize=(8,5))
plt.plot(avg_change)
plt.xlabel('I Value Range')
plt.ylabel('Average Mid Price Change Rate');
plt.grid(True)

img

books['weighted_mid_price'] = books['mid_price'] + books['spread']*books['I']/2
bins = np.linspace(-1, 1, 51)
books['I_bins'] = pd.cut(books['I'], bins, labels=bins[1:])
books['weighted_price_change'] = (books['weighted_mid_price'].pct_change()/tick_size).shift(-1)
avg_change = books.groupby('I_bins')['weighted_price_change'].mean()
plt.figure(figsize=(8,5))
plt.plot(avg_change)
plt.xlabel('I Value Range')
plt.ylabel('Weighted Average Mid Price Change Rate');
plt.grid(True)

img

Ajustement des prix intermédiaires

On peut voir sur le graphique que le changement du prix moyen pondéré par rapport aux différents I est beaucoup plus faible, ce qui indique que le prix moyen pondéré est un meilleur ajustement. Mais il y a encore des règles, comme près de 0,2 et 0,8 où la déviation est plus grande. Cela indique que I peut toujours apporter des informations supplémentaires.

Pour plus d'intuition, je vais redéfinir ici I:

img

À ce moment-là:

img

On observe que le prix moyen pondéré est une modification du prix moyen, le coefficient de la modification est Spread, et le coefficient de la modification est une fonction relative à I. Le prix moyen pondéré est simplement supposé être I/2 ⋅ On constate alors les avantages de la distribution de I ajustée (−1,1) sur la symétrie du point d'origine, ce qui nous permet de trouver une relation de correspondance de la fonction.

img

Ici, N est un nombre positif et même, après un test pratique, N est meilleur à 8 heures. Jusqu'à présent, cet article a proposé un prix moyen pondéré modifié:

img

À ce stade, la prédiction des variations de l'intermédiaire n'a pratiquement rien à voir avec I. Ce résultat, bien qu'il soit un peu meilleur qu'un simple prix intermédiaire pondéré, n'est pas réellement applicable.Le micro-prixIl y a aussi un article sur le code, que tout le monde peut étudier.

books['I'] = (books['best_bid_qty'] - books['best_ask_qty']) / (books['best_bid_qty'] + books['best_ask_qty'])
books['weighted_mid_price'] = books['mid_price'] + books['spread']*books['I']/2
bins = np.linspace(-1, 1, 51)
books['I_bins'] = pd.cut(books['I'], bins, labels=bins[1:])
books['weighted_price_change'] = (books['weighted_mid_price'].pct_change()/tick_size).shift(-1)
avg_change = books.groupby('I_bins')['weighted_price_change'].sum()
plt.figure(figsize=(8,5))
plt.plot(avg_change)
plt.xlabel('I Value Range')
plt.ylabel('Weighted Average Mid Price Change Rate');
plt.grid(True)

img

books['adjust_mid_price'] = books['mid_price'] + books['spread']*(books['I'])*(books['I']**8+1)/4
bins = np.linspace(-1, 1, 51)
books['I_bins'] = pd.cut(books['I'], bins, labels=bins[1:])
books['adjust_mid_price'] = (books['adjust_mid_price'].pct_change()/tick_size).shift(-1)
avg_change = books.groupby('I_bins')['adjust_mid_price'].sum()
plt.figure(figsize=(8,5))
plt.plot(avg_change)
plt.xlabel('I Value Range')
plt.ylabel('Weighted Average Mid Price Change Rate');
plt.grid(True)

img

books['adjust_mid_price'] = books['mid_price'] + books['spread']*(books['I']**3)/2
bins = np.linspace(-1, 1, 51)
books['I_bins'] = pd.cut(books['I'], bins, labels=bins[1:])
books['adjust_mid_price'] = (books['adjust_mid_price'].pct_change()/tick_size).shift(-1)
avg_change = books.groupby('I_bins')['adjust_mid_price'].sum()
plt.figure(figsize=(8,5))
plt.plot(avg_change)
plt.xlabel('I Value Range')
plt.ylabel('Weighted Average Mid Price Change Rate');
plt.grid(True)

img

Résumé

Les prix intermédiaires sont très importants pour les stratégies à haute fréquence, car ils sont des prévisions de prix à court terme, donc les prix intermédiaires doivent être aussi précis que possible. Les prix intermédiaires présentés ci-dessus sont basés sur des données de transaction, car une seule file de marchés est utilisée lors de l'analyse. Dans le cas réel, la stratégie doit utiliser toutes les données possibles, en particulier les transactions en échange, et les prévisions de prix intermédiaires doivent être vérifiées par les prix réels des transactions.


Plus de

Je suis Louis.Je n'arrive pas à comprendre.

Je suis zéro.Il est trop fort!