Outil de trading programmé: algorithme de mise à jour progressive pour calculer les moyennes et les différences

Auteur:Le foin, Créé à: 2023-11-08 16:28:36, mis à jour à: 2023-11-09 20:46:17

img

Nom de famille

Dans les transactions programmées, il est souvent nécessaire de calculer les moyennes et les différences, comme pour calculer des indicateurs tels que les moyennes et les fluctuations. Lorsque nous avons besoin de calculs à haute fréquence et à long cycle, il est nécessaire de conserver des données historiques pendant de longues périodes, ce qui est inutile et demande des ressources. Cet article présente un algorithme de mise à jour en ligne pour calculer les moyennes et les différences pondérées, ce qui est particulièrement important pour traiter les flux de données en temps réel et les stratégies de négociation d'ajustement dynamique, en particulier les stratégies de haute fréquence.

Les moyennes et les différences simples

Si nous utilisons $\mu_n$ pour représenter la moyenne des $n$ points de données, supposons que nous ayons calculé la moyenne des ${n-1}$ points de données $\mu_{n-1}$, nous recevons maintenant un nouveau point de données $x_{n}$. Nous voulons calculer la nouvelle moyenne des $\mu_{n}$ qui contient ce nouveau point de données.

$\mu_n = \frac{1}{n} \sum_{i=1}^{n} x_i$ $\mu_n = \frac{1}{n} \left( x_n + \sum_{i=1}^{n-1} x_i \right) $ $\mu_{n-1} = \frac{1}{n-1} \sum_{i=1}^{n-1} x_i$ Je vais essayer d'avoir une idée de ce que c'est. $\mu_n = \frac{1}{n} \left( x_n + (n-1) \mu_{n-1} \right) $ $\mu_n = \mu_{n-1} + \frac{1}{n} (x_n - \mu_{n-1}) $

Le processus de mise à jour différentielle peut être décomposé en les étapes suivantes:

$S_n = \sum_{i=1}^{n} (x_i - \mu_n) ^2$ $S_n = \sum_{i=1}^{n} x_i^2 - n\mu_n^2$ $S_n - S_{n-1} = x_n^2 - n\mu_n^2 + (n - 1)\mu_{n-1}^2$ $S_n - S_{n-1} = (x_n - \mu_{n-1}) $S_n = S_{n-1} + (x_n - \mu_{n-1}) $\sigma_n^2 = \frac{S_n}{n}$

Comme le montrent les deux formules ci-dessus, ce processus nous permet de conserver les moyennes et les différences d'une seule donnée pour chaque nouveau point de données $x_n$ reçu, de mettre à jour les moyennes et les différences sans avoir à stocker les données historiques et de calculer plus rapidement. Mais le problème est que cela est calculé comme les moyennes et les différences de l'ensemble de l'échantillon, et nous devons considérer une certaine période fixe dans la stratégie pratique.

Moyenne pondérée exponentiellement

Les moyennes pondérées d'indices peuvent être définies par la relation de récurrence suivante:

$\mu_t = \alpha x_t + (1 - \alpha) \mu_{t-1}$

Par exemple, $\mu_t$ est la moyenne pondérée de l'indice au point de temps $t$, $x_t$ est la valeur observée au point de temps $t$, $\alpha$ est le facteur de pondération, et $\mu_{t-1}$ est la moyenne pondérée de l'indice au point de temps précédent.

La variance pondérée exponentiellement

Pour la différence, nous devons calculer la moyenne pondérée de l'indice de la différence carrée de chaque point de temps.

$S_n = \alpha S_{n-1} + (1 - \alpha) ((x_n - \mu_n) ((x_n - \mu_{n-1}) $

Là, $\sigma_t^2$ est l'écart exponentiel plus les puissances de $t$ au point de temps $t$, et $\sigma_{t-1}^2$ est l'écart exponentiel plus les puissances du point de temps précédent.

Les indicateurs d'observation avec les moyennes pondérées et les différences, dont la forme de mise à jour des augmentations est intuitive, conservent une partie des valeurs passées, avec de nouvelles modifications, un processus de déduction spécifique peut être consulté dans ce document:https://fanf2.user.srcf.net/hermes/doc/antiforgery/stats.pdf

Les moyennes mobiles simples (SMA) et les moyennes mobiles indicielles (EMA)

Les moyennes simples (également appelées moyennes arithmétiques) et les moyennes pondérées indicielles sont deux mesures statistiques courantes, qui ont chacune des caractéristiques et des utilisations différentes. Les moyennes simples accordent la même pondération à chaque valeur d'observation, ce qui reflète la position centrale de l'ensemble de données. Les moyennes pondérées indicielles sont une méthode de calcul récurrente qui accorde une plus grande pondération à la valeur d'observation la plus proche.

  • Répartition des poids: les moyennes simples donnent la même pondération à chaque point de données, tandis que les moyennes pondérées indicielles donnent une plus grande pondération au point de données le plus proche.
  • La sensibilité à la nouvelle informationLes moyennes simples ne sont pas suffisamment sensibles aux données nouvellement ajoutées, car elles impliquent un recalcul de tous les points de données. Les moyennes pondérées indicielles reflètent plus rapidement les changements dans les données les plus récentes.
  • Complicité de calcul: le calcul des moyennes simples est relativement simple, mais les coûts de calcul augmentent avec l'augmentation des points de données. Le calcul des moyennes pondérées par indices est plus complexe, mais il peut traiter plus efficacement les flux de données continus en raison de sa nature récurrente.

Les EMA et les SMA sont approximativement convertis

Bien que les moyennes simples et les moyennes pondérées indicielles soient conceptuellement différentes, nous pouvons rapprocher les moyennes pondérées indicielles d'une moyenne simple contenant des valeurs d'observation pour une quantité donnée en choisissant la valeur appropriée $\alpha$. Cette approximation peut être décrite par la taille effective de l'échantillon, qui est la fonction du facteur de pondération $\alpha$ dans les moyennes pondérées indicielles.

La moyenne mobile simple (SMA) est la moyenne arithmétique de tous les prix au cours d'une fenêtre de temps donnée. Pour une fenêtre de temps $N$, le centre de masse (SMA) peut être considéré comme:

$\text{SMA} est égal à $ \frac{1 + N}{2}

Une moyenne mobile indicielle (EMA) est une moyenne pondérée dans laquelle les points de données les plus proches ont une plus grande pondération.

$\text{EMA} = \alpha \times \left[1 + 2 ((1 - \alpha) + 3 ((1 - \alpha) ^2 + \cdots \right] = \frac{1}{\alpha}$

Lorsque nous supposons que les SMA et les EMA ont la même masse, nous obtenons:

$\frac{1 + N}{2} = \frac{1}{\alpha}$

Si nous trouvons la relation entre $\alpha$ et $N$, nous obtenons la relation $\alpha$ et $N$.

$\alpha = \frac{2}{N + 1}$

Cela signifie qu'une valeur $\alpha$ correspondante peut être utilisée pour calculer une EMA équivalente à une masse de cuivre pour une SMA de $N$ de jour donnée, de sorte que les deux ont la même masse et que les résultats sont très proches.

Échange de fréquence de mise à jour EMA différente

Supposons que nous ayons une EMA qui est mise à jour une fois par seconde et dont le facteur de pondération est $\alpha_1$. Cela signifie que chaque seconde, de nouveaux points de données sont ajoutés à l'EMA avec un poids de $\alpha_1$, tandis que l'impact des anciens points de données est multiplié par $1 - \alpha_1$.

Si nous changeons la fréquence des mises à jour, par exemple une fois toutes les $f$ secondes, nous voulons trouver un nouveau facteur de pondération $\alpha_2$, de sorte que l'impact global des points de données en $f$ secondes soit le même que lors des mises à jour par seconde.

Dans le temps de $f$ secondes, si aucune mise à jour n'est effectuée, l'impact de l'ancien point de données diminue de façon continue $f$ fois, chaque fois multiplié par $1 - \alpha_1$. Ainsi, le facteur de diminution total après $f$ secondes est $(1 - \alpha_1) ^f$.

Afin que l'EMA qui est mis à jour une fois par seconde $f$ ait le même effet de décroissance que l'EMA qui est mis à jour une fois par seconde dans un cycle de mise à jour, nous définissons le coefficient de décroissance total après $f$ secondes comme étant égal au coefficient de décroissance dans un cycle de mise à jour:

$(1 - \alpha_1) ^f = 1 - \alpha_2$

Si nous trouvons une solution à cette équation, nous obtenons le nouveau facteur de pondération $\alpha_2$:

$\alpha_2 = 1 - (1 - \alpha_1) ^f$

Cette formule donne une valeur approximative du nouveau facteur de pondération $\alpha_2$ qui maintient l'effet de l'EMA stable lors de la modification de la fréquence de mise à jour. Par exemple, nous calculons que la valeur moyenne du prix $\alpha_1$ est de 0.001, et que le prix le plus récent est mis à jour tous les 10 s, ce qui équivaut à $\alpha_2$ environ 0.01 si nous changeons la fréquence de mise à jour en 1s.

L'implémentation de code Python

class ExponentialWeightedStats:
    def __init__(self, alpha):
        self.alpha = alpha
        self.mu = 0
        self.S = 0
        self.initialized = False

    def update(self, x):
        if not self.initialized:
            self.mu = x
            self.S = 0
            self.initialized = True
        else:
            temp = x - self.mu
            new_mu = self.mu + self.alpha * temp
            self.S = self.alpha * self.S + (1 - self.alpha) * temp * (x - self.mu)
            self.mu = new_mu

    @property
    def mean(self):
        return self.mu

    @property
    def variance(self):
        return self.S

# 使用示例
alpha = 0.05  # 权重因子
stats = ExponentialWeightedStats(alpha)
data_stream = [] # 数据流
for data_point in data_stream:
    stats.update(data_point)

Résumé

Le traitement rapide des données en temps réel est essentiel dans les transactions programmées à haute fréquence. Pour améliorer l'efficacité des calculs et réduire la consommation de ressources, cet article présente un algorithme de mise à jour en ligne pour calculer en continu les moyennes et les différences pondérées des flux de données. Les calculs d'incrémentation en temps réel peuvent également être utilisés pour calculer une variété de statistiques et d'indicateurs, tels que la corrélation des prix des deux actifs, la correspondance linéaire, etc. Le potentiel est grand.


Plus de