Ferramentas de negociação programada: algoritmos de atualização incremental para calcular médias e divisões

Autora:Ervas daninhas, Criado: 2023-11-08 16:28:36, Atualizado: 2023-11-09 20:46:17

img

Resumo

Em negociações programadas, é frequente a necessidade de calcular médias e diferenciais, como em indicadores como o cálculo da equação e da volatilidade. Quando precisamos de cálculos de alta frequência e longo ciclo, é necessário manter dados históricos por longos períodos de tempo, o que é desnecessário e demorado. Este artigo apresenta um algoritmo de atualização on-line para calcular médias e diferenciais ponderados, que é particularmente importante para lidar com fluxos de dados em tempo real e estratégias de negociação de ajuste dinâmico, especialmente estratégias de alta frequência.

Média e diferença simples

Se nós representamos a média dos n$ pontos de dados com $\mu_n$, assumindo que já temos calculado a média de $\mu_{n-1}$ pontos de dados $\mu_{n-1}$, agora recebemos um novo ponto de dados $x_{n}$. Queremos calcular a nova média de $\mu_{n}$ que contém este novo ponto de dados.

$\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}) $

O processo de atualização diferencial pode ser dividido em três etapas:

$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}$

Como podemos ver nas duas fórmulas acima, este processo permite que, quando recebemos cada novo ponto de dados $x_n$, mantenhamos apenas a média e o diferencial de um dado, para que possamos atualizar novas médias e diferenças, sem a necessidade de guardar dados históricos, e para que o cálculo seja mais rápido. Mas o problema é que isso é calculado como médias e diferenças de toda a amostra, e na estratégia real, o que precisamos considerar é um certo período fixo.

A média ponderada exponencialmente

A média ponderada do índice pode ser definida pela seguinte relação de recorrência:

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

Dentre elas, $\mu_t$ é a média ponderada do índice do ponto de tempo $t$, $x_t$ é o valor observado do ponto de tempo $t$, $\alpha$ é o fator de peso, $\mu_{t-1}$ é a média ponderada do índice do ponto de tempo anterior.

Variação ponderada exponencialmente

Para a diferença, precisamos calcular a média ponderada do índice do desvio quadrado de cada ponto de tempo. Isso pode ser feito com a seguinte relação de recorrência:

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

Dentre eles, $\sigma_t^2$ é o diferencial de índice mais o poder do ponto de tempo $t$, e $\sigma_{t-1}^2$ é o diferencial de índice mais o poder do ponto de tempo anterior.

Os índices de observação com as médias e os diferenciais ponderados, cuja forma de atualização de incremento é intuitiva, mantêm parte do valor passado, além de novas mudanças.https://fanf2.user.srcf.net/hermes/doc/antiforgery/stats.pdf

A média móvel simples (SMA) e a média móvel do índice (EMA)

A média simples (também chamada média aritmética) e a média ponderada por índices são duas medidas estatísticas comuns, que têm características e usos diferentes. A média simples atribui o mesmo peso a cada valor de observação, que reflete a posição central do conjunto de dados. A média ponderada por índices é um método de cálculo recursivo que atribui um maior peso à observação mais recente. A ponderação diminui exponencialmente com o aumento da distância da observação do tempo atual.

  • Distribuição de pesoA média simples dá o mesmo peso a cada ponto de dados, enquanto a média ponderada por índices dá um maior peso ao ponto de dados mais próximo.
  • Sensibilidade a novas informaçõesA média simples não é sensível a novos dados adicionados, pois envolve um recalculo de todos os pontos de dados. A média ponderada por índices reflete mais rapidamente as mudanças nos dados mais recentes.
  • Complexidade computacionalO cálculo de médias simples é relativamente simples, mas o custo de computação aumenta com o aumento dos pontos de dados. O cálculo de médias ponderadas por índices é mais complexo, mas, devido à sua natureza recorrente, pode lidar com fluxos de dados contínuos de forma mais eficiente.

A EMA e a SMA são inversões aproximadas

Embora a média simples e a média ponderada por índices sejam conceptualmente diferentes, podemos aproximar a média ponderada por índices de uma média simples que contenha observações de uma determinada quantidade, escolhendo o valor $\alpha$ apropriado. Esta aproximação pode ser descrita pelo tamanho efetivo da amostra, que é uma função do fator de peso $\alpha$ na média ponderada por índices.

A média móvel simples (SMA) é a média aritmética de todos os preços em uma dada janela de tempo. Para uma janela de tempo $N$, o centro de massa (SMA) pode ser considerado como:

$\text{SMA} é igual a \frac{1 + N}{2}$

A média móvel do índice (EMA) é uma média ponderada em que os pontos de dados mais recentes têm maior peso. O peso da EMA diminui com a escala do índice de tempo. O centro de massa da EMA pode ser obtido através da seguinte escala:

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

Quando assumimos que a SMA e a EMA têm a mesma massa, obtemos:

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

Se resolvermos esta equação, podemos obter a relação entre $\alpha$ e $N$:

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

Isso significa que, para um SMA de $N$ dias, o valor correspondente de $\alpha$ pode ser usado para calcular um EMA equivalente a um pico, tornando os dois com a mesma massa e o resultado muito próximo.

Mudança de freqüência de atualização da EMA

Suponhamos que temos uma EMA que é atualizada por segundo e que tem um fator de peso de $\alpha_1$. Isso significa que, a cada segundo, novos pontos de dados são adicionados à EMA com um peso de $\alpha_1$, enquanto o impacto dos pontos de dados antigos é multiplicado por $1 - \alpha_1$.

Se alterarmos a frequência de atualizações, por exemplo, uma atualização a cada $f$s, queremos encontrar um novo fator de peso $\alpha_2$, de modo que o impacto total dos pontos de dados em $f$s seja o mesmo que no momento da atualização por segundo.

No período de $f$ segundos, se a atualização não for feita, o impacto do antigo ponto de dados irá diminuir $f$ vezes, multiplicando cada vez por $1 - \alpha_1$. Assim, o fator de redução total após $f$ segundos é $(1 - \alpha_1) ^f$.

Para que uma EMA que é atualizada $f$ por segundo tenha o mesmo efeito de declínio que uma EMA que é atualizada por segundo em um ciclo de atualização, definimos o fator de declínio total após $f$ por segundo igual ao fator de declínio em um ciclo de atualização:

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

Se você resolver esta equação, você terá um novo fator de peso $\alpha_2$:

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

Esta fórmula dá a aproximação do novo fator de peso $\alpha_2$ que mantém o EMA flutuante na mudança de freqüência de atualização. Por exemplo: nós calculamos o preço médio $\alpha_1$ como 0.001, atualizando o preço mais recente a cada 10s, o equivalente $\alpha_2$ é aproximadamente 0.01 se mudamos para 1s atualizando uma vez.

Implementação 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)

Resumo

O processamento rápido de dados em tempo real é fundamental para a negociação programada de alta frequência. Para aumentar a eficiência computacional e reduzir o consumo de recursos, este artigo apresenta um algoritmo de atualização on-line para calcular as médias e diferenciais ponderadas de fluxos de dados em contínuo. A atualização incremental em tempo real também pode ser usada para calcular uma variedade de dados estatísticos e indicadores, como correlação de preços de dois ativos, ajustamento linear, etc. O potencial é grande.


Mais.