Вспомогательный урок к курсу "Собери своего арбитражного бота". В уроке 15 z-score помогает решить, когда две монеты разошлись. Здесь разберем его на десяти числах.
Три вопроса о списке чисел
Возьмем число минут, на которые ваш автобус опаздывал в течение десяти дней: 10, 12, 11, 13, 9, 12, 11, 10, 12, 30.
- Что типично? Среднее: сложите все и разделите на количество чисел.
- Насколько они различаются? Стандартное отклонение: типичное расстояние от среднего.
- Необычен ли сегодняшний день? 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, и бот считает это сигналом. У реальных рынков хвосты толще, чем предполагает это правило, поэтому оставляйте сигнал и добавляйте стоп.
Ваше упражнение
- Запустите код. Замените 30 на 14. Что произойдет со средним и стандартным отклонением?
- Напишите собственный список из десяти чисел, например время поездки или число шагов за день, и вручную вычислите z-score последнего значения.
- Почему мы возводим расстояния в квадрат, а не складываем их как есть?
Вернитесь к курсу: урок 15 (парный трейдинг).