Программированный трейдер: алгоритм инкрементального обновления для вычисления среднего и дифференциального значений

Автор:Трава, Создано: 2023-11-08 16:28:36, Обновлено: 2023-11-09 20:46:17

img

Описание

В программируемой торговле часто требуется вычислять средние и дифференциальные значения, например, показатели, такие как уравнение и волатильность. Когда нам нужны высокочастотные и длинночастотные вычисления, необходимо сохранять длительные периоды исторических данных, что не является необходимым и ресурсоемким. В статье представлен алгоритм онлайн-обновления для вычисления взвешенных средних и дифференциальных значений, который особенно важен для обработки потоков данных в реальном времени и динамических корректировок торговых стратегий, особенно высокочастотных стратегий.

Простые средние и квадратные

Если мы используем $\mu_n$ для обозначения среднего числа $\n$ точек данных, предположим, что мы рассчитали среднее число $\mu_{n-1}$ точек данных $\mu_{n-1}$, и теперь мы получаем новую точку данных $x_{n}$. Мы хотим вычислить новое среднее число $\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}) $

Процесс обновления дифференцированности может быть разделен на следующие этапы:

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

Как видно из двух вышеперечисленных формул, этот процесс позволяет нам сохранять только средние значения и дифференциальные значения одного из данных при каждом новом полученном пункте $x_n$, чтобы обновлять новые средние значения и дифференциальные значения без сохранения исторических данных, и вычислять их быстрее. Но проблема в том, что мы вычисляем средние значения и дифференциальные значения для всей выборки, а в практической стратегии мы должны учитывать определенные фиксированные циклы.

Уровень экспоненциально-взвешенного среднего

Индексные средние могут быть определены следующими рекурсивными отношениями:

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

В этом случае $\mu_t$ - это индексный средневековый показатель в точке $t$, $x_t$ - это наблюдаемое значение в точке $t$, $\alpha$ - это весовой фактор, $\mu_{t-1} $ - это индексный средневековый показатель в точку $t$.

Экспоненциально-взвешенная вариантность

Для дифференциации нам нужно вычислить индексный средневзвешенный квадратный дифференциации в каждой точке времени. Это можно сделать с помощью следующей рекурсивной связи:

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

В этом случае $\sigma_t^2$ является дифференциацией с индексом плюс квадраты в точке времени $t$, $\sigma_{t-1}^2$ - дифференциацией с индексом плюс квадраты в точку времени $t$.

Наблюдательные индексы с учетом средних и дифференциальных значений, их инвентарная форма обновления соответствует интуиции, и все они сохраняют часть прошлого значения, с добавлением новых изменений. Конкретный процесс вывода можно рассмотреть в этой статье:https://fanf2.user.srcf.net/hermes/doc/antiforgery/stats.pdf

Простые движущиеся средние (SMA) и индексные движущиеся средние (EMA)

Простые средние (также известные как арифметические средние) и весовые средние - это два распространенных статистических показателя, которые имеют различные характеристики и применение. Простые средние придают каждому значению наблюдения одинаковый вес, который отражает центральное местоположение набора данных.

  • Распределение весаПростые средние дают одинаковый вес каждой точке данных, а индексные средние дают более высокий вес ближайшей точке данных.
  • Чувствительность к новой информацииПростые средние не являются чувствительными к новым данным, поскольку они включают перерасчет всех точек данных. Индексные средние с учетом их веса могут быстрее отражать изменения в последних данных.
  • Комплексность вычислений: вычисление простых средних относительно просто, но расходы на вычисление увеличиваются с увеличением количества точек данных; вычисление индексовых средних более сложно, но благодаря своей рекурсивной природе оно может более эффективно обрабатывать непрерывный поток данных.

Приблизительный обмен EMA и SMA

Хотя простые средние и весовые средние понятия концептуально отличаются, мы можем приблизить весовые средние к простым средним, содержащим определенные количественные наблюдения, выбирая подходящее значение $\alpha$. Это приближение может быть описано эффективным размером выборки, который является функцией весового фактора $\alpha$ в весовых средних.

Простая движущаяся средняя (SMA) - это среднее значение всех цен в данном окне времени. Для окна времени $N$ массовый центр SMA (то есть место, где находится среднее число) может считаться:

$\text{SMA} = \frac{1 + N}{2}$

Индексовая движущаяся средняя (EMA) - это средняя величина, в которой ближайшие данные имеют более высокий вес. Вес EMA уменьшается с индексовым уровнем времени. Массовый центр EMA может быть получен с помощью следующих уровней:

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

Когда мы предположим, что SMA и EMA имеют одинаковую массу, мы получаем:

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

Если мы решим это уравнение, мы получим взаимосвязь между $\alpha$ и $N$:

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

Это означает, что для данной SMA $N$ дня соответствующее значение $\alpha$ может быть использовано для вычисления EMA аналогичного EMA, что делает их одинаковыми, и результаты очень близки.

Обмен на различные частоты обновления EMA

Предположим, что у нас есть ЭМА, которая обновляется раз в секунду, и ее весовой коэффициент $\alpha_1$. Это означает, что каждую секунду новые точки данных добавляются в ЭМА с весом $\alpha_1$, а влияние старых пунктов данных умножается на $1 - \alpha_1$.

Если мы изменяем частоту обновления, например, каждые $f$ секунды, мы хотим найти новый весовой фактор $\alpha_2$, чтобы общее влияние на точки данных в $f$ секунды было таким же, как и при обновлении в секунду.

В течение $f$ секунд, если не проводить обновления, влияние старых точек данных будет последовательно уменьшаться $f$ раз, каждый раз умножаясь на $1 - \alpha_1$. Таким образом, общий коэффициент уменьшения после $f$ секунд будет $(1 - \alpha_1) ^f$.

Чтобы EMA, обновляемая один раз в $f$ секунды, имела тот же эффект упадка, что и EMA, обновляемая один раз в секунду, мы установили общий упадковый коэффициент после $f$ секунды, равный упадковому коэффициенту в течение одного цикла обновления:

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

Если мы решим это уравнение, мы получим новый весовой коэффициент $\alpha_2$:

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

Эта формула дает приблизительное значение нового весового фактора $\alpha_2$, который сохраняет устойчивый эффект EMA при изменении частоты обновления. Например: мы вычислили среднее значение цены $\alpha_1$ как 0.001, обновляя последнюю цену каждые 10 с. Если изменить ее на 1 с, то эквивалент $\alpha_2$ будет примерно 0.01

Использование кода 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)

Подведение итогов

В высокочастотных программируемых сделках быстрая обработка данных в режиме реального времени имеет решающее значение. Для повышения вычислительной эффективности и снижения расхода ресурсов в статье представлен алгоритм онлайн-обновления, который используется для непрерывного расчета средних и дифференциальных значений потоков данных.


Больше