
Na negociação programática, muitas vezes é necessário calcular a média e a variância, como ao calcular indicadores como médias móveis e volatilidade. Quando precisamos de cálculos de alta frequência e longo período, precisamos reter dados históricos de longo prazo, o que é desnecessário, demorado e consome recursos. Este artigo apresenta um algoritmo de atualização on-line para calcular médias ponderadas e variâncias, o que é particularmente importante para processar fluxos de dados em tempo real e ajustar dinamicamente estratégias de negociação, especialmente estratégias de alta frequência. O artigo também fornece a implementação do código Python correspondente para ajudar os traders a implementar e aplicar rapidamente esse algoritmo em transações reais.
Se usarmos \(\mu_n\) para representar a média do \(n\)ésimo ponto de dados, assumindo que já calculamos a média de \(\mu_{n-1}\) do \({n-1}\)ésimo ponto de dados , agora recebemos um novo ponto de dados \(x_{n}\). Queremos calcular a nova média \(\mu_{n}\) que inclui esse novo ponto de dados. A seguir está uma derivação detalhada.
\(\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 de variância pode ser decomposto nas seguintes 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})(x_n - \mu_n)\) \(S_n = S_{n-1} + (x_n - \mu_{n-1})(x_n - \mu_n)\) \(\sigma_n^2 = \frac{S_n}{n}\)
Como pode ser visto nas duas fórmulas acima, esse processo nos permite atualizar a nova média e variância, retendo apenas a média e a variância dos dados anteriores ao receber cada novo ponto de dados \(x_n\), sem salvar dados históricos. , e o o cálculo é mais rápido. Mas o problema é que o que é calculado dessa maneira é a média e a variância de toda a amostra, enquanto na estratégia real, precisamos considerar um certo período fixo. Ao observar a atualização média acima, podemos ver que o novo valor de atualização média é o desvio dos novos dados da média passada multiplicado por uma razão. Se essa razão for fixa, obteremos a média ponderada exponencialmente que discutiremos a seguir.
A média ponderada exponencialmente pode ser definida pela seguinte relação recursiva:
\(\mu_t = \alpha x_t + (1 - \alpha) \mu_{t-1}\)
onde \(\mu_t\) é a média ponderada exponencialmente no ponto de tempo \(t\), \(x_t\) é o valor observado no ponto de tempo \(t\), \(\alpha\) é o fator de ponderação e \(\mu_{t-1}\) é a média ponderada exponencialmente do ponto de tempo anterior.
Para a variância, precisamos calcular a média ponderada exponencialmente dos desvios quadrados em cada ponto de tempo. Isto pode ser alcançado através da seguinte relação de recorrência:
\(S_n = \alpha S_{n-1} + (1 - \alpha)(x_n - \mu_n)(x_n - \mu_{n-1})\)
onde \(\sigma_t^2\) é a variância ponderada exponencialmente no ponto de tempo \(t\), e \(\sigma_{t-1}^2\) é a variância ponderada exponencialmente no ponto de tempo anterior.
Observe a média e a variância ponderadas exponencialmente. Suas formas de atualização incremental estão alinhadas com a intuição. Ambas retêm parte do valor passado e adicionam a nova mudança. O processo de derivação específico pode ser consultado neste artigo: https://fanf2.user . srcf.net/hermes/doc/antiforgery/stats.pdf
A média simples (também conhecida como média aritmética) e a média ponderada exponencialmente são duas medidas estatísticas comuns, cada uma com características e usos diferentes. A média simples dá peso igual a cada observação e reflete a localização central do conjunto de dados. A média ponderada exponencialmente é um cálculo recursivo que dá mais peso às observações mais recentes. O peso diminui exponencialmente à medida que a observação se afasta do tempo atual.
Embora a média simples e a média ponderada exponencialmente sejam conceitualmente diferentes, podemos fazer com que a média ponderada exponencialmente se aproxime de uma média simples para um número específico de observações escolhendo um valor apropriado de \(\alpha\). Essa relação aproximada pode ser descrita pelo tamanho efetivo da amostra, que é uma função do fator de ponderação \(\alpha\) na média ponderada exponencialmente.
A Média Móvel Simples (MMS) é a média aritmética de todos os preços dentro de uma determinada janela de tempo. Para uma janela de tempo \(N\), o centroide da SMA (onde está a média) pode ser considerado como:
\(\text{centroide SMA} = \frac{1 + N}{2}\)
A média móvel exponencial (MME) é uma média ponderada em que pontos de dados mais recentes têm maior peso. O peso da EMA diminui exponencialmente ao longo do tempo. O centroide da EMA pode ser obtido pela soma das seguintes séries:
\(\text{Centroide EMA} = \alfa \vezes \esquerda[1 + 2(1 - \alpha) + 3(1 - \alpha)^2 + \cdots \right] = \frac{1}{\alpha}\)
Quando assumimos que SMA e EMA têm o mesmo centro de massa, obtemos:
\(\frac{1 + N}{2} = \frac{1}{\alpha}\)
Resolvendo esta equação, podemos obter a relação entre \(\alpha\) e \(N\):
\(\alpha = \frac{2}{N + 1}\)
Isso significa que, para uma dada SMA de \(N\) dias, o valor \(\alpha\) correspondente pode ser usado para calcular uma EMA “equivalente” de modo que as duas tenham o mesmo centro de massa e os resultados sejam muito semelhantes.
Suponha que temos uma EMA que é atualizada a cada segundo com um fator de peso de \(\alpha_1\). Isso significa que a cada segundo, um novo ponto de dados é adicionado à 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ção, digamos para atualizar a cada \(f\) segundos, queremos encontrar um novo fator de peso \(\alpha_2\) tal que o impacto total de um ponto de dados dentro de \(f\) segundos seja o mesmo que ao atualizar a cada segundo .
Ao longo de \(f\) segundos, se nenhuma atualização for feita, a influência de pontos de dados antigos decairá continuamente \(f\) vezes, cada vez multiplicada por \(1 - \alpha_1\). Portanto, o fator de decaimento total após \(f\) segundos é \((1 - \alpha_1)^f\).
Para fazer com que a EMA atualizada a cada \(f\) segundos tenha o mesmo efeito de decaimento em um ciclo de atualização que a EMA atualizada uma vez por segundo, definimos o fator de decaimento total após \(f\) segundos para ser igual ao fator de decaimento em uma atualização ciclo:
\((1 - \alpha_1)^f = 1 - \alpha_2\)
Resolvendo esta equação, obtemos o novo fator de peso \(\alpha_2\):
\(\alpha_2 = 1 - (1 - \alpha_1)^f\)
Esta fórmula fornece uma aproximação para o novo fator de peso \(\alpha_2\) que mantém o efeito de suavização da EMA constante quando a frequência de atualização muda. Por exemplo, calculamos a média do preço \(\alpha_1\) como 0,001 e atualizamos o preço mais recente a cada 10 segundos. Se o alterarmos para 1 segundo, o equivalente \(\alpha_2\) é cerca de 0,01
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)
Na negociação programática de alta frequência, o processamento rápido de dados em tempo real é crucial. Para melhorar a eficiência computacional e reduzir o consumo de recursos, este artigo apresenta um algoritmo de atualização on-line para calcular continuamente a média ponderada e a variância de um fluxo de dados. O cálculo de atualizações incrementais em tempo real também pode ser usado para calcular vários dados estatísticos e indicadores, como a correlação entre dois preços de ativos, ajuste linear, etc., o que tem grande potencial. Atualizações incrementais tratam os dados como um sistema de sinais, o que é uma evolução do pensamento em comparação aos cálculos de período fixo. Se sua estratégia também tiver uma parte que salva cálculos de dados históricos, você também pode modificá-la de acordo com essa ideia, registrar apenas a estimativa do status do sistema e, quando novos dados chegarem, atualizar o status do sistema e assim por diante.