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.
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 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.
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 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.
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.
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.
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)
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.