Векторный бэктест
Finartel Quantitative Research
Сегодня разбираем простой векторный бэктест. Основные преимущества векторных тестов перед событийными: простота реализации и высокая скорость расчетов. Последний пункт особенно важен при тестировании скользящим окном с использованием оптимизационных алгоритмов ("Walk-forward").
Несмотря на простоту векторных бэктестеров, они крайне полезны, по нашему опыту с их помощью решается большинство квантовских задач. Векторное тестирование чем-то похоже на эскизирование, можно по-быстрому оценить лежат ли деньги в определенной торговой идее или нужно копать дальше.
Итак, приступим.
Мы уже использовали векторные тесты в предыдущих постах, давайте просто разберем их подробнее.
В одном из первых постов мы использовали функцию stupid_backtest, которая выглядела следующим образом:

Ссылка на пост с применением этой функции:
https://telegra.ph/Realizaciya-geneticheskogo-algoritma-06-18
Здесь мы видим всего одну строчку кода, давайте разберем её.
df['signal'] - это временной ряд с нашей позицией (! не сделками, а именно позицией !)
df['Close'] - это временной ряд с ценами закрытия
diff() - метод для расчета разностей ряда
shift() - метод для сдвига ряда (с помощью этого метода делаем задержку ряда на 1 таймфрейм)
cumsum() - метод для расчета накопительной суммы ряда
Вроде все понятно, берем разности цен, умножаем на сигнал со сдвигом и получаем прибыль на каждый момент времени, после считаем накопленную прибыль.
А зачем нужна задержка shift()? И что будет, если мы уберем эту задержку?
Сначала ответим на второй вопрос, просто отрисуем два графика: с задержкой и без.
Возьмем цены дневные фьючерсов на сп500. В качестве сигнала будем использовать знак разности цены и скользящей средней от цены с периодом 22 дня.
На python формула для расчета сигнала будет выглядеть так:
df['signal'] = np.sign(df['Close'] - df['Close'].ewm(span=252).mean())
С задержкой получим следующий результат:

Вполне ожидаемо получаем болтанку около нуля.
Теперь без задержки:

Похоже, что где-то мы заглядываем в будущее. Потому и важна эта задержка, она ставит сигнал на правильное место во времени.
Т.к. мы умножаем сигнал на разность цен, а разность цен - это разность текущего значения и предыдущего, то нам необходимо сдвигать сигнал на шаг вперед, иначе мы будем торговать по прошлым ценам.
В ближайшее время будем разбирать нюансы векторного тестирования, разберем различные метрики устойчивости полученной стратегии, разберем реализацию тестирования скользящим окном с помощью pandas и многое-многое другое.
Следите за новостями на нашем телеграм-канале.
https://t.me/finartel