Подготовка: среднее, разброс и z-score

Короткий урок с нуля для курса по арбитражу. Среднее, стандартное отклонение и z-score на десяти числах, почему одно необычное значение сдвигает все и как z-score показывает, когда что-то необычно.

Вспомогательный урок к курсу "Собери своего арбитражного бота". В уроке 15 z-score помогает решить, когда две монеты разошлись. Здесь разберем его на десяти числах.

Три вопроса о списке чисел

Возьмем число минут, на которые ваш автобус опаздывал в течение десяти дней: 10, 12, 11, 13, 9, 12, 11, 10, 12, 30.

  1. Что типично? Среднее: сложите все и разделите на количество чисел.
  2. Насколько они различаются? Стандартное отклонение: типичное расстояние от среднего.
  3. Необычен ли сегодняшний день? z-score: на сколько стандартных отклонений значение удалено от среднего.

Шаги вручную и в коде

import statistics
data = [10, 12, 11, 13, 9, 12, 11, 10, 12, 30]
mean = sum(data) / len(data)
print("mean", mean)
dev = [(x - mean) ** 2 for x in data]
var = sum(dev) / len(data)
print("variance", round(var, 2), "stdev", round(var ** 0.5, 2), "check", round(statistics.pstdev(data), 2))
for x in (11, 30):
    print(x, "z =", round((x - mean) / var ** 0.5, 2))
mean 13.0
variance 33.4 stdev 5.78
11 z = -0.35
30 z = 2.94

Разберем по шагам:

  • Среднее равно 130 / 10 = 13.
  • Для каждого значения возьмите расстояние от среднего и возведите его в квадрат. Так минус и плюс не сокращаются, а большие расстояния учитываются сильнее. Среднее этих квадратов является дисперсией, 33.4.
  • Квадратный корень из дисперсии является стандартным отклонением: 5.78. Вызов statistics.pstdev дает то же число, это проверка.
  • z-score равен (значение − среднее) / стандартное отклонение. Для дня с 11 минутами z = −0.35, это близко к норме. Для дня с 30 минутами z = 2.94, это далеко от нормы.

Одно необычное значение сдвигает все

Уберите 30 и пересчитайте остальные девять дней: среднее станет 11.11, а стандартное отклонение 1.2. Теперь z-score для 30 равен 15.8, это огромное число. Пока необычный день находится внутри списка, среднее и разброс растут, а 30 выглядит лишь слегка необычным (2.94). Усреднение по окну, содержащему необычное значение, немного его скрывает. В уроке 15 окно содержит последние 100 значений и намеренно не включает сегодняшний день.

Практическое правило

Для многих явлений в природе примерно 95 значений из 100 находятся в пределах 2 стандартных отклонений от среднего. Поэтому z-score выше 2 или ниже −2 бывает лишь в нескольких днях из 100, и бот считает это сигналом. У реальных рынков хвосты толще, чем предполагает это правило, поэтому оставляйте сигнал и добавляйте стоп.

Ваше упражнение

  1. Запустите код. Замените 30 на 14. Что произойдет со средним и стандартным отклонением?
  2. Напишите собственный список из десяти чисел, например время поездки или число шагов за день, и вручную вычислите z-score последнего значения.
  3. Почему мы возводим расстояния в квадрат, а не складываем их как есть?

Вернитесь к курсу: урок 15 (парный трейдинг).