Векторный бэктест

Векторный бэктест

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



Report Page