En la carga de los recursos... Cargando...

Utilidad para los comerciantes programados: algoritmo de actualización incremental para calcular medias y diferencias

El autor:Las hierbas, Creado: 2023-11-08 16:28:36, Actualizado: 2024-11-08 09:13:54

img

Descripción

En el comercio programado, a menudo se requiere calcular promedios y diferencias, como en el cálculo de indicadores como la línea media y la volatilidad. Cuando necesitamos cálculos de alta frecuencia y de largo ciclo, se requiere mantener datos históricos durante mucho tiempo, lo que es innecesario y consume recursos. Este artículo presenta un algoritmo de actualización en línea para calcular promedios y diferencias ponderados, que es especialmente importante para manejar estrategias comerciales de flujo de datos en tiempo real y de ajuste dinámico, especialmente estrategias de alta frecuencia.

Las medias y diferencias simples

Si representamos el promedio de los $n$ puntos de datos con $\mu_n$, supongamos que hemos calculado el promedio de ${n-1}$ puntos de datos $\mu_{n-1}$, y ahora recibimos un nuevo punto de datos $x_{n}$. Queremos calcular el nuevo promedio que contiene este nuevo punto de datos $\mu_{n}$.

$\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$ $(n-1) \mu_{n-1} = \sum_{i=1}^{n-1} x_i$ $\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}) $

El proceso de actualización de diferencias se puede dividir en los siguientes pasos:

$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})(x_n - \mu_n) $ $\sigma_n^2 = \frac{S_n}{n}$

Como se puede ver en las dos fórmulas anteriores, este proceso nos permite mantener los promedios y diferencias de un solo dato por cada nuevo punto de datos $x_n$ que recibimos, para poder actualizar los nuevos promedios y diferencias sin necesidad de guardar datos históricos y para calcular más rápidamente. Pero el problema es que se calcula así los promedios y diferencias de toda la muestra, y en la estrategia práctica, lo que necesitamos considerar es un cierto período fijo. Observando la actualización de los promedios anterior, se puede ver que la actualización de los nuevos promedios es el desvío de los nuevos datos con los promedios pasados multiplicado por una proporción, y si se fija esta proporción, se obtiene la siguiente puntuación del índice que se trata.

El promedio ponderado exponencialmente

Los promedios ponderados por índices pueden definirse mediante la siguiente relación recurrente:

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

Donde $\mu_t$ es el promedio ponderado por el índice en el momento $t$, $x_t$ es el valor observado en el momento $t$, $\alpha$ es el factor de peso, $\mu_{t-1}$ es el promedio ponderado por el índice en el momento anterior.

Variación ponderada exponencialmente

Para las diferencias, necesitamos calcular el promedio ponderado del índice de la desviación cuadrada de cada punto de tiempo. Esto se puede lograr mediante la siguiente relación de recurrencia:

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

Donde, $\sigma_t^2$ es la diferencia exponencial en el punto de tiempo $t$, y $\sigma_{t-1}^2$ es la diferencia exponencial en el punto de tiempo anterior.

Los índices de observación, los promedios ponderados y los diferenciales, en su forma de actualización de incremento, son intuitivos, conservan parte de los valores pasados, y se agregan nuevos cambios, un proceso de deducción específico puede referirse a este artículo:https://fanf2.user.srcf.net/hermes/doc/antiforgery/stats.pdf

Las medias móviles simples (SMA) y las medias móviles indiciales (EMA)

Las medias simples (también conocidas como medias aritméticas) y las medias ponderadas por índices son dos medidas estadísticas comunes, cada una con características y usos diferentes. Las medias simples dan el mismo peso a cada valor de observación, lo que refleja la posición central del conjunto de datos. Las medias ponderadas por índices son un método de cálculo recursivo que da un mayor peso al valor de observación más reciente.

  • Distribución de peso: las medias simples dan el mismo peso a cada punto de datos, mientras que las medias índices y ponderadas dan un mayor peso al punto de datos más cercano.
  • Sensibilidad a la nueva informaciónLos promedios simples no son suficientemente sensibles a los nuevos datos agregados, ya que implican un recalculado de todos los puntos de datos. Los promedios ponderados por índices reflejan los cambios en los últimos datos más rápidamente.
  • Complejidad de la computación: El cálculo de las medias simples es relativamente sencillo, pero el costo de cálculo también aumenta con el aumento de los puntos de datos. El cálculo de las medias ponderadas por índices es más complejo, pero debido a su naturaleza recurrente, puede procesar flujos de datos continuos de manera más eficiente.

El EMA y el SMA se intercambian aproximadamente

Aunque los promedios simples y los promedios ponderados por índices son conceptualmente diferentes, podemos hacer que los promedios ponderados por índices se acerquen a un promedio simple que contiene un valor de observación de un determinado número al elegir el valor $\alpha$ adecuado. Esta aproximación puede describirse por el tamaño de la muestra efectiva, que es una función del factor de peso $\alpha$ en los promedios ponderados por índices.

La media móvil simple (SMA) es el promedio aritmético de todos los precios en una ventana de tiempo dada. Para una ventana de tiempo $N$, el centro de masa (SMA) puede considerarse como:

Si el valor es igual al valor del valor del valor del valor del valor del valor del valor del valor del valor del valor del valor del valor del valor del valor del valor del valor del valor del valor del valor del valor del valor del valor del valor del valor del valor del valor del valor del valor del valor del valor del valor del valor del valor del valor del valor del valor del valor del valor del valor del valor del valor del valor del valor del valor del valor del valor del valor del valor del valor del valor del valor del valor del valor del valor del valor del valor del valor del valor del valor del valor del valor del valor del valor del valor del valor del valor del valor del valor del valor del valor del valor del valor del valor del valor del valor del valor del valor del valor del valor del valor del valor del valor del valor del valor del valor del valor del valor del valor del valor del valor del valor del valor del valor del valor del valor del valor del valor del valor del valor del valor del valor del valor del valor del valor del valor del valor del valor del valor del valor del valor del valor del valor del valor del valor del valor del valor del valor del valor del valor del valor del valor del valor del valor del valor del valor

La media móvil del índice (EMA) es una media ponderada en la que los puntos de datos más recientes tienen un mayor peso. La ponderación de la EMA disminuye con el tiempo. El centro de masa de la EMA se obtiene mediante la suma de los siguientes niveles:

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

Cuando asumimos que el SMA y el EMA tienen el mismo centro de gravedad, se obtiene:

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

Si solucionamos esta ecuación, obtendremos la relación entre $\alpha$ y $N$:

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

Esto significa que, para un SMA de $N$ días dado, el valor $\alpha$ correspondiente puede usarse para calcular un EMA equivalente a un par, lo que hace que ambos tengan la misma masa y los resultados sean muy cercanos.

El cambio de la frecuencia de actualización de la EMA

Supongamos que tenemos una EMA que se actualiza una vez por segundo y que tiene un factor de peso de $\alpha_1$. Esto significa que cada segundo, nuevos puntos de datos se agregan a la EMA con un peso de $\alpha_1$, mientras que el impacto de los puntos de datos viejos se multiplica por $1 - \alpha_1$.

Si cambiamos la frecuencia de las actualizaciones, por ejemplo, una vez cada $f$ segundos, queremos encontrar un nuevo factor de peso $\alpha_2$ para que el impacto total de los puntos de datos en $f$ segundos sea el mismo que cuando se actualizan cada segundo.

En $f$ segundos, si no se actualiza, el impacto de los puntos de datos viejos disminuirá $f$ veces consecutivamente, cada vez por $1 - \alpha_1$. Por lo tanto, el factor de disminución total después de $f$ segundos es $(1 - \alpha_1) ^ f$.

Para que una EMA que se actualiza una vez por $f$ segundos tenga el mismo efecto de disminución que una EMA que se actualiza una vez por segundo en un ciclo de actualización, se establece que el factor de disminución total después de $f$ segundos es igual al factor de disminución en un ciclo de actualización:

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

Si solucionamos esta ecuación, obtendremos el nuevo factor de peso $\alpha_2$:

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

Esta fórmula da el valor aproximado del nuevo factor de peso $\alpha_2$ que mantiene el EMA sin cambios en el efecto de suavización de la actualización de la frecuencia. Por ejemplo: en el cálculo del precio medio $\alpha_1$ es 0.001, el precio más reciente se actualiza una vez cada 10s, si se cambia a 1s se actualiza una vez, el equivalente $\alpha_2$ es aproximadamente 0.01

Implementación de código 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)

Resumen

En las transacciones programadas de alta frecuencia, el procesamiento rápido de los datos en tiempo real es fundamental. Para mejorar la eficiencia de cálculo y reducir el consumo de recursos, este artículo presenta un algoritmo de actualización en línea para calcular las medias y diferencias ponderadas de los flujos de datos de forma continua. Los cálculos de actualización incremental en tiempo real también pueden usarse para calcular una variedad de estadísticas e indicadores, como la correlación de los precios de los dos activos, la adecuación lineal, etc. El potencial es grande.


Más.