English Deutsch 日本語
preview
Статистический арбитраж с использованием коинтегрированных акций (Часть 8): Сравнение собственных векторов на скользящих окнах для ребалансировки портфеля

Статистический арбитраж с использованием коинтегрированных акций (Часть 8): Сравнение собственных векторов на скользящих окнах для ребалансировки портфеля

MetaTrader 5Торговые системы |
39 2
Jocimar Lopes
Jocimar Lopes

Введение

В последней статье этой серии мы сообщили о значительном улучшении нашей стратегии статистического арбитража. Включение времени полувосстановления до среднего (half-time to mean reversion) в нашу систему скоринга сыграло ключевую роль в решении проблемы чрезвычайно большой средней продолжительности удержания позиций. Это был самый критический недостаток нашей модели до того, как мы добавили расчет времени полувосстановления в систему скоринга. Его включение в отбор корзин, вероятно, является одним из факторов, способствовавших многообещающим результатам бэк-тестирования, которых мы достигли.

Другим фактором стало включение стабильности весов портфеля в качестве критерия в систему скоринга. Это помогло нам отфильтровать корзины с потенциально высокой волатильностью коинтеграционного собственного вектора. Поскольку этот собственный вектор является

основой для расчета спреда, по которому ведутся торги, его стабильность с течением времени имеет непосредственные последствия для прибыльности стратегии. Мы рассчитывали веса портфеля, используя ADF-валидацию спреда на внутривыборочных и вневыборочных данных (IS/OOS ADF).

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

  1. Для точности он требует относительно длительных вневыборочных периодов. Он обладает низкой мощностью при коротких вневыборочных периодах, что как раз будет иметь место, когда нам потребуется мониторить торговлю в реальном времени.
  2. Он очень чувствителен к точке разделения на внутривыборочный и вневыборочный периоды; то есть если мы сдвинем точку разделения, мы можем получить другие результаты.
  3. Он не дает никакого понимания того, когда или почему коинтеграция нарушается.
Вследствие этих ограничений IS/OOS ADF-валидация спреда может показывать исключительно хорошие результаты на бэк-тестах, но может вводить в заблуждение или даже полностью давать сбой в реальной торговле.

В этой статье мы посмотрим, как можно преодолеть ограничения IS/OOS ADF-валидации, извлекая максимальную выгоду из ее сильных сторон. Мы представляем метод сравнения собственных векторов со скользящим окном (Rolling Windows Eigenvector Comparison, RWEC) для измерения стабильности весов портфеля. RWEC может хорошо работать с короткими вневыборочными периодами, менее зависим от точки разделения выборки и может предоставить нам информацию о том, когда происходит нарушение коинтеграции. Понимание того, когда коинтеграция нарушается, имеет первостепенное значение для мониторинга реальной торговли. RWEC в сочетании с методом IS/OOS ADF должен дать нам более надежную оценку стабильности весов портфеля не только для красивых бэк-тестов, но и для мониторинга системы и ребалансировки портфеля в реальной торговле.

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



Стабильность весов против стабильности сигнала

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

"рынок находится в состоянии непрерывного изменения. То есть не существует такого понятия, как бычий или медвежий рынок, паттерны свечей/баров или ‘коррелирующие акции, которые хорошо сочетаются’. Всё меняется сейчас и навсегда."

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

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

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

Именно в этом и заключается суть статистического арбитража: использование набора статистических инструментов, которые помогают нам повысить вероятности в нашу пользу. В данном конкретном случае это может помочь нам повысить вероятность составления такой корзины акций, чей коинтеграционный вектор с большей вероятностью останется стабильным с течением времени. При правильном сочетании методы, которые мы использовали с начала этой серии статей для тестирования на коинтеграцию и стационарность, могут помочь нам повысить вероятность выбора акций, чьи портфельные веса сохранятся дольше. Если нам это удастся, мы можем сказать, что с определенным уровнем уверенности (90%, 95%...) наш сигнал всё еще будет эффективен завтра или на следующей неделе.

Знания об уровне стабильности коинтеграционного вектора, весов портфеля и спреда недостаточно для перехода от системы скоринга к реальной торговле. Нам также необходимо оценить стабильность сигнала. Давайте посмотрим, как мы можем это сделать, лучше поняв IS/OOS ADF-валидацию, которую мы использовали для оценки стабильности коинтеграционного вектора. Затем мы посмотрим, как мы можем использовать ее в тандеме с RWEC для оценки стабильности сигнала.



IS/OOS ADF-валидация

Измерив стабильность портфельных весов и включив ее в качестве критерия отбора акций в нашу систему скоринга, мы улучшили качество корзины с наивысшим рейтингом, которую использовали в наших последних бэк-тестах. Вы можете ознакомиться с полным отчетом в Части 6 этой серии, где мы отобрали корзину с наивысшим рейтингом без теста на стабильность портфельных весов, и сравнить его с Частью 7 после включения этого теста в систему скоринга. Для быстрого сравнения ниже показана эволюция кривой капитала (график Balance/Equity) до и после использования этого критерия.

Рис. 1. График изменения капитала при бэк-тестировании без теста на стабильность собственного вектора при отборе корзины

Рис. 1. График изменения капитала при бэк-тестировании без теста на стабильность собственного вектора при отборе корзины

Рис. 2. График изменения капитала при бэк-тестировании с включением теста на стабильность собственного вектора в отбор корзины (предыдущая статья)

Рис. 2. График изменения капитала при бэк-тестировании с включением теста на стабильность собственного вектора в отбор корзины (предыдущая статья)

IS/OOS ADF-валидация — это четырехэтапный метод. Он начинается с разделения наших ценовых данных на две части для внутривыборочного (IS) и вневыборочного (OOS) тестирования и вычисления коинтеграционного вектора на внутривыборочных данных. Затем, используя полученный коинтеграционный вектор, метод рассчитывает спред на вневыборочных данных и вычисляет для него ADF-статистику. Чтобы веса портфеля рассматриваемой корзины считались стабильными, обе ADF-статистики — IS и OOS — должны указывать на стационарность.

Разделение -> Оценка на IS -> Формирование спреда на OOS -> ADF на OOS спреде

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

       n = len(prices)
        if n < 50:
            return np.nan
        split = int(n * split_ratio)
        if n - split < 30:
            return np.nan
        train = prices.iloc[:split]
        test = prices.iloc[split:]
        try:
            vec_is = self.get_coint_vector(train, method, det_order, k_ar_diff)
            spread_oos = pd.Series(np.dot(test.values, vec_is), index=test.index)
            if spread_oos.std() < 1e-10 or spread_oos.isnull().any():
                self.logger.debug("Out-of-sample spread is effectively constant or contains NaNs")
                raise ValueError("Out-of-sample spread is effectively constant or contains NaNs")
            adf_stat = adfuller(spread_oos)[0]
            return float(adf_stat)
        except Exception as e:
            self.logger.warning(f"Stability computation error: {e}")
            return np.nan

Вы можете найти полный код в скрипте coint_ranker_auto.py, приложенном к предыдущей статье.

Выполняя вневыборочную валидацию, IS/OOS ADF-тест позволяет избежать переобучения и внутривыборочного смещения. Поскольку у всех нас есть доступ только к прошлым данным — тому самому "взгляду в зеркало заднего вида", о котором мы говорили выше, — это известный метод имитации реальной торговли в процессе тестирования. Это аналог форвардного тестирования при бэк-тестировании в Metatrader 5 Tester.

“Forward

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

Рис. 3. Настройки тестера Metatrader 5 с выделенной опцией Forward

Рис. 3. Настройки тестера Metatrader 5 с выделенной опцией Forward

Эта вневыборочная валидация дает нам хорошую предсказательную способность в отношении коинтеграции, поскольку она проверяет стационарность торгового сигнала (спреда) "в будущем", на "неизвестных" данных. Эта предсказательная способность отразилась в тех хороших результатах бэк-тестов, которые мы видели. Она говорит о том, что мы можем торговать рассчитанный спред в реальной торговле, потому что вневыборочная валидация уже проверила его на "неизвестных" данных. Однако, как знают все, кто проводит бэк-тесты, настоящий вопрос здесь кроется в кавычках вокруг слова "неизвестных". Насколько гарантированно стабильность наших портфельных весов сохранится после того, как мы выйдем из зоны комфорта "неизвестных" данных бэк-тестирования и отправимся в дикие джунгли по-настоящему неизвестных данных реальной торговли? Именно здесь IS/OOS ADF проявляет некоторые свои слабости.

В реальной торговле мы не можем ждать относительно длительных периодов, когда портфельные веса теряют свои стабильные взаимосвязи; мы не можем выносить длительные периоды с утраченной коинтеграцией. Нам нужно получать информацию как можно раньше, чтобы принять решение и действовать в соответствии с ним. Но IS/OOS ADF требует длительных вневыборочных периодов для точности. Это не является реальной проблемой при бэк-тестировании, но может серьезно навредить в реальной торговле. Так получается, что теперь эти "вневыборочные периоды" с потенциально нарушенной коинтеграцией — это время, когда наши деньги находятся на рынке, подвергаясь риску и потенциально вызывая неприемлемые просадки.

Кроме того, IS/OOS ADF чувствителен к точке разделения — моменту времени, когда мы делим выборочные данные на известные и "неизвестные", чтобы избежать переобучения. В реальной торговле эта точка разделения будет непрерывно двигаться вперед, поэтому мы можем ожидать, что в этих условиях метод будет менее надежным.

Одним из возможных решений для минимизации этих ограничений IS/OOS ADF в реальной торговле является использование его вместе со сравнением собственных векторов со скользящим окном (Rolling Window Eigenvector Comparison).



Сравнение собственных векторов со скользящим окном (Rolling Window Eigenvector Comparison, RWEC)

Метод сравнения собственных векторов со скользящим окном (RWEC) рассчитывает стабильность портфельных весов путем сравнения косинусного расстояния углов между последовательными собственными векторами с заданным пороговым значением. Он вычисляет коинтеграционный вектор на скользящих окнах и сравнивает собственные векторы в этих окнах. Хотя мы не фокусируемся на математике, стоящей за вычислением собственных векторов, возможно, будет полезно вспомнить, что такое собственный вектор, чтобы лучше понять, как работает этот метод.

"Геометрически векторы — это многомерные величины, имеющие величину и направление, часто изображаемые в виде стрелок. Линейное преобразование вращает, растягивает или сдвигает векторы, на которые оно воздействует. Собственные векторы линейного преобразования — это те векторы, которые только растягиваются или сжимаются, без вращения или сдвига. Соответствующее собственное значение — это коэффициент, на который растягивается или сжимается собственный вектор. Если собственное значение отрицательное, направление собственного вектора меняется на противоположное. (Страница Wikipedia о собственных значениях и собственных векторах.)"

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

На той же странице Wikipedia есть эта анимация. Это самая наглядная иллюстрация данного свойства собственных векторов, которую мне удалось найти.

Рис. 4. Анимированная иллюстрация, показывающая, что собственные векторы не сдвигаются и не вращаются после линейного преобразования

Рис. 4. Анимированная иллюстрация, показывающая, что собственные векторы не сдвигаются и не вращаются после линейного преобразования

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

Существуют и другие метрики RWEC, которые можно использовать для оценки стабильности коинтеграционных векторов, помимо сравнения косинусов углов между последовательными собственными векторами, например, корреляция коэффициентов хеджирования (hedge ratios), но все они основаны на том же фундаментальном свойстве собственных векторов — неизменности их относительного наклона после линейного преобразования. (Кстати, это увлекательная область для изучения тем, кто заинтересован в углублении своего понимания данного предмета.)

На рисунках 5 и 6 показаны два примера графиков, полученных при применении метода RWEC к двум различным парам ETF за один и тот же период. В следующих примерах для обоих методов мы используем пары ETF вместо корзин акций, которые мы использовали в наших экспериментах. Причина в том, что мы завершаем это введение в статистический арбитраж. Мы начали серию с корреляции Пирсона для торговли валютными парами, а затем перешли к акциям, поскольку они лучше подходят для понимания процесса сужения рынка для построения примерной системы скоринга. Теперь, когда мы переходим от бэк-тестов к реальной торговле, у нас есть возможность вернуться к парному трейдингу и использовать то, что мы узнали на рынке акций: методы тестирования, построение системы скоринга и эволюцию базы данных. Сейчас также подходящий момент, чтобы начать изучать другие рынки и их особенности. Чтобы вам было проще воспроизводить эти эксперименты, мы используем только символы, включенные в демо-счет Meta Quotes для Metatrader 5.

Цель этих графиков — показать, насколько четко этот метод указывает нам на точный момент времени, когда стабильность портфельных весов (или сама коинтеграция) была нарушена. Это свойство, называемое высоким временным разрешением (high temporal resolution), является одной из главных причин, делающих его столь полезным для мониторинга реальной торговли.

Рис. 5. Пример графика сравнения собственных векторов со скользящим окном (RWEC)

Рис. 5. Пример графика сравнения собственных векторов со скользящим окном (RWEC)

На первом графике синяя линия представляет вес первого актива в паре, в данном случае GLD. Оранжевая линия представляет вес его контр-актива, GDX, с течением времени. GLD — это актив, который мы собираемся покупать (лонг); его значение в портфельном векторе положительно, выше нулевой линии. GDX — это актив, который будет продаваться (шорт). Значения по оси Y — это не "реальные" значения актива. Они были нормализованы к 1, чтобы показать нам относительный вес между двумя активами. Вы можете отчетливо видеть, что в начале 2021, 2022 и 2023 годов актив, предназначенный для шорта, уходит ниже нуля, обращая вспять первоначальное соотношение в паре. Более того, с конца 2023 года по первые месяцы 2024 года они поменялись местами, и то, что раньше нужно было покупать, теперь нужно продавать, и наоборот. Эти структурные изменения рынка отразились в углах их коинтеграционного вектора, показанных на втором графике.

Красные точки представляют собой сходство между последовательными коинтеграционными векторами как меру косинусного расстояния между их соответствующими углами — разницу между наклонами векторов. Если эта разница равна нулю, это означает, что разницы нет, что коинтеграционные векторы имеют одинаковый наклон. Когда последовательные векторы имеют одинаковый наклон, их сходство равно единице (identity), и мы имеем идеальную стабильность. В этом примере идеальная стабильность наблюдается лишь в течение коротких периодов. С другой стороны, у нас есть экстремальные пики дисбаланса, обычно в первой половине года, как раз в те периоды в начале 2021, 2022 и 2023 годов, с экстремальным пиком в начале 2024 года, когда соотношение между активами обратилось вспять.

Весь смысл метода RWEC в том, что он измеряет структурную стабильность линейной взаимосвязи. В то время как IS/OOS ADF не дает нам никакой подсказки о моменте времени, когда коинтеграция была утрачена, RWEC показывает это точно. Эта особенность может быть использована для предположений о причинах разрыва коинтеграции: был ли это результат слияния компаний? Возможно, одна из компаний, входящих в пару, опубликовала баланс с исключительно низкими или исключительно высокими результатами? Может быть, в тот период на рынках произошло системное землетрясение? Эта особенность RWEC может помочь нам в поиске причин нарушения структурной стабильности. Зная причины, мы можем предвидеть будущие изменения аналогичного характера.

Рис. 6. Графики сравнения собственных векторов со скользящим окном для пары ETF EEM/VWO

Рис. 6. Графики сравнения собственных векторов со скользящим окном для пары ETF EEM/VWO

Желтая пунктирная линия представляет выбранный порог стабильности. В обоих приведенных выше тестах он был установлен на уровне 30 градусов. На Рисунке 5 пик нарушения коинтеграции был далек от этого порога, но на Рисунке 6 мы видим, что в начале 2020 года наблюдается пик почти в 80 градусов. Также есть два предшествующих отклонения, которые были близки к 30-градусному порогу. 

Порог стабильности RWEC может и должен использоваться как инструмент управления рисками. Обратите внимание, что если бы мы выбрали 50 градусов, два предшествующих измерения были бы помечены нашей автоматизированной системой как находящиеся в пределах стабильного предела, и пара ETF продолжала бы оставаться частью нашей гипотетической операции. С другой стороны, если бы мы выбрали 15 градусов, система порекомендовала бы остановиться на втором пике. Поскольку мы будем использовать этот метод для мониторинга реальной торговли, выбор этого параметра сделает нашу стратегию более консервативной при его понижении или более агрессивной при повышении порога стабильности.

Обратите внимание, что в этих примерах мы снова используем наш "взгляд в прошлое". Мы знаем, что это были пики, потому что знаем, что обе пары вернулись к своей стабильной коинтеграции. В реальной торговле все, что мы будем знать, это то, что коинтеграционный вектор изменился. У нас не будет возможности узнать, вернется ли он к своим прежним уровням. Именно здесь нам придется принять решение: должны ли мы остановиться, закрыть возможные открытые позиции и отложить пару в сторону, пока она снова не будет одобрена в нашей системе скоринга, или мы должны изменить портфельные веса на новые значения?

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



Почему IS/OOS ADF и RWEC следует использовать вместе при мониторинге реальной торговли?

Короткий ответ: потому что RWEC предупредит нас на ранней стадии о рыночных землетрясениях, которые IS/OOS ADF увидит только позже. Даже когда коинтеграционные векторы (а следовательно, и портфельные веса) остаются идеально стабильными, под поверхностью может происходить радикальное изменение рынка. IS/OOS ADF все еще будет какое-то время видеть портфельные веса как неизменные, но RWEC может предупредить нас о том, что что-то изменилось. Приведенные ниже комментируемые тесты призваны сделать это свойство RWEC максимально понятным.

Чтобы сделать IS/OOS ADF полезным для мониторинга реальной торговли, нам нужно использовать Walk-Forward анализ. Таким образом, у нас будет гибридная система, объединяющая скоринг и мониторинг. Вместо одного разделения на IS и OOS мы будем использовать вневыборочную валидацию со скользящим окном, смещая точку разделения вперед на выбранный шаг для каждого прогона теста. Обратите внимание, что это та же техника, которая используется в RWEC. Разница в том, что мы можем использовать IS/OOS ADF так, как мы делаем это здесь, или без скользящего форвардного анализа, как мы делали в нашей системе скоринга.



Результаты IS/OOS ADF

Ниже приведены результаты IS/OOS ADF для пары ETF XLK/AAA. Горизонт составляет 2000 баров, что соответствует почти восьми годам, поэтому мы можем получить точную оценку стационарности спреда и стабильности коинтеграционного вектора.

def fetch_data(self, symbols, timeframe=mt5.TIMEFRAME_D1, n_bars=2000):

Для Walk-Forward анализ мы установили 70% данных в качестве обучающей доли, а длину каждого вневыборочного окна (OOS) — 100 дней. Мы также задали окно скольжения в 22 торговых дня между тестами (шаг в нашей функции range()).

   def walk_forward_test(self, data, train_frac=0.7, oos_length=100):
        """Walk-forward OOS validation"""
        results = []
        
        n_train = int(len(data) * train_frac)
        for start in range(n_train, len(data) - oos_length, 22):  # Step = 22 trading days
            end = start + oos_length
            
            # IS: estimate cointegration
            train_data = data.iloc[:start]

Полный скрипт прилагается к этому материалу под названием isoos_adf_wf.py.

При запуске этого теста вы должны увидеть вывод, похожий на этот. 

Результаты IS/OOS ADF

Успешность OOS: 55.6%

Среднее p-значение ADF: 0.203

Медианное p-значение ADF: 0.002

Помните, что p-значение ниже 0.05 — это наш минимально приемлемый уровень для того, чтобы считать спред стационарным. Среднее p-значение в этом результате находится далеко выше этого минимума, что указывает на нестационарный спред, в то время как медианное p-значение находится далеко ниже, около нуля, что указывает на сильную стационарность спреда. Это не противоречие. Скорее, это информация. Разница говорит нам о том, что на среднее значение сильно повлияли выбросы. В нашем случае выбросы — это пики, на которых стационарность была утрачена, но медиана гарантирует, что большую часть времени спред был стационарным.

Последние 5 окон:

adf_pvalue  stationary

4  3.111851e-01       False

5  1.517744e-01       False

6  1.718277e-03        True

7  4.409114e-07        True

8  3.135563e-05        True

Результаты для последних пяти окон показывают, что стационарность была утрачена примерно в районе четвертого вневыборочного окна или непосредственно перед ним.

Рис. 7. Графики внутривыборочной/вневыборочной ADF-валидации (IS/OOS ADF) для пары ETF XLK/AAA

Рис. 7. Графики внутривыборочной/вневыборочной ADF-валидации (IS/OOS ADF) для пары ETF XLK/AAA

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

В правом верхнем углу на оси x мы имеем 9 точек данных с p-значениями OOS. Это те же самые точки данных, что и на оси x графика эволюции коинтеграционного вектора OOS (OOS Coint Vector Evolution) в правом нижнем углу.

Помните, наш горизонт составляет 2000 баров? Доля обучающих данных (train fraction) в нашем тесте составляет 1400 баров (70% от 2000). Таким образом, первый внутривыборочный прогон идет с 1-го дня по 1400-й день. Поскольку длина вневыборочного окна у нас составляет 100, первый вневыборочный прогон идет с 1401-го дня по 1500-й день. Полученное вневыборочное p-значение — это наша точка данных 0 на этом графике.

У нас есть окно скольжения (Walk-Forward window) в 22 дня, поэтому второй внутривыборочный тест идет с 1-го дня по 1422-й день, а второй вневыборочный прогон идет с 1423-го дня по 1522-й день. Полученное вневыборочное p-значение — это наша точка данных 1 на этом графике. И так далее. Самый последний вневыборочный прогон показан в левом верхнем углу.

Как вы можете видеть, тестовые окна перекрываются. Таким образом, это скользящий форвардный анализ с перекрывающимися окнами. Первые несколько p-значений (0–3) получены из вневыборочных периодов, которые имели место несколько лет назад (с 2023 по начало 2025 года), а последнее вневыборочное окно закрылось 31 октября 2025 года. Мы могли бы выбрать скользящий форвардный анализ без перекрывающихся окон. Какой бы вариант вы ни выбрали, крайне важно, чтобы вы понимали, как работает этот тест Walk-Forward, потому что это понимание необходимо для настройки его параметров, чтобы улучшить стратегию или остановить торговлю для избежания убытков.

Таблица может помочь упростить понимание.

Walk-forward test # (x-axis in ADF plot)
In-sample period used for Beta
OOS period tested
p-value plotted
Beta plotted in bottom-right
0Day 1 -> Day ~1400
Day 1401 -> Day 1500
Point 0
Point 0
1Day 1 -> Day ~1422
Day 1423 -> Day 1522
Point 1
Point 1
...............
8Day 1 -> Day ~1576
Day 1577 -> Day 1677 (last 100 days)
Point 8Point 8

Таблица 1. Перекрывающиеся окна при внутривыборочной/вневыборочной ADF-валидации со скользящим форвардным анализом

На графике OOS Spread в левом верхнем углу показан только самый последний вневыборочный прогон — последнее 100-дневное окно. Вот почему на нем 100 точек, в то время как на графике ADF их всего 9. P-значение ADF при x = 8 и последнее значение Beta на графике эволюции вектора получены из того же окна оценки + тестирования, которое показано на этом графике. Таким образом, мы можем сделать вывод, что на этом графике p-значение составляет ~0,02 (намного ниже 0,05). В этот последний период спред является стационарным. Это часть зеленого сектора на круговой диаграмме.

А эта самопоясняющая круговая диаграмма с показателем успешности (success rate) представляет собой краткую сводку вневыборочной стационарности. Она утверждает, что из 9 наших тестов Walk-Forward стационарность была подтверждена в 55,6% случаев.



Результаты RWEC

Ниже приведены результаты RWEC для той же пары ETF — XLK/AAA. Горизонт составляет те же 2000 баров, что и для IS/OOS ADF, поэтому мы можем сопоставить их результаты по датам. Перекрывающиеся окна скользящего форвардного анализа (Walk-Forward) также имеют одинаковое количество торговых дней (шаг = 22), но длина окна отличается. В то время как для IS/OOS ADF мы использовали oos_length = 100, для RWEC окно (window) составляет 252.

   def rolling_cointegration(self, data, window=252, step=22):
        """Compute rolling cointegration vectors"""

Есть две веские причины не использовать те же самые 100-дневные окна в RWEC. Первая причина техническая и, в некотором смысле, обязательная: сам автор теста Йохансена рекомендует большее окно.

"Однако в конечных выборках точность оценок сильно зависит от размера выборки. Моделирование показывает, что для достижения разумной точности оценки коинтеграционного пространства часто требуются выборки из 100-200 наблюдений (примерно 1-2 года дневных данных для финансовых рядов) (...) На практике, когда параметры не постоянны во времени, процедуру часто применяют к скользящим выборкам, скажем, из 200-400 наблюдений, чтобы проверить стабильность коинтеграционных соотношений». (Johansen, 1995).

Другая причина заключается в том, что если в какой-то момент мы захотим сравнить наши тесты с академическими работами или бенчмарками, лучше, чтобы мы использовали рекомендованные академические стандарты. Используя 252 для RWEC и 100 для IS/OOS ADF, наши тесты становятся напрямую сопоставимы с опубликованными исследованиями.

На практике эта разница в длине окна является прямым следствием целей каждого метода. RWEC измеряет структурную стабильность коинтеграционных векторов. Чтобы быть надежным, ему нужно много наблюдений в выборочных данных. С другой стороны, IS/OOS ADF измеряет стационарность спреда на вневыборочных данных, поэтому он должен быть достаточно коротким, чтобы имитировать реальную торговлю. После выполнения технических требований именно из этих практических соображений возникают передовые академические практики (best practices).

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

   def vector_similarity(self, vectors_df):
        """Compute cosine similarity between consecutive vectors"""
        similarities = []
        for i in range(1, len(vectors_df)):
            vec1 = vectors_df.iloc[i-1].values
            vec2 = vectors_df.iloc[i].values
            cos_sim = np.dot(vec1, vec2) / (np.linalg.norm(vec1) * np.linalg.norm(vec2))
            angle_deg = np.degrees(np.arccos(np.clip(cos_sim, -1, 1)))
            similarities.append({
                'date': vectors_df.index[i],
                'cosine_similarity': cos_sim,
                'angle_degrees': angle_deg,
                'stable': angle_deg < 30  # Threshold
            })
        return pd.DataFrame(similarities).set_index('date')

Полный скрипт прилагается к этому материалу под названием rwec.py.

При запуске этого теста вы должны увидеть вывод, похожий на этот. 

Результаты RWEC

stable

True     29

False     4

Name: count, dtype: int64

Mean angle: 22.3°

Median angle: 0.1°

Те же наблюдения о разнице между средним и медианным углом, которые мы сделали выше в отношении результатов IS/OOS ADF, применимы и здесь. В то время как средний угол относительно близок к нашему выбранному порогу, медианный угол близок к нулю, что означало бы идеальную стабильность. Причину этой разницы легко понять на графиках ниже — там видны экстремальные выбросы на короткой стороне портфеля (оранжевая линия — AAA).

Рис. 8. Графики сравнения собственных векторов со скользящим окном для пары ETF XLK/AAA
Рис. 8. Графики сравнения собственных векторов со скользящим окном для пары ETF XLK/AAA

О чем кричат эти графики: будьте осторожны! Эта пара стабильна большую часть времени, но иногда она подвержена полному дисбалансу. Обратите внимание, что каждый график содержит 33 точки данных: 29 истинных/стабильных и 4 ложных/нестабильных (четыре пика, которые мы видим на втором графике). Каждому пику нестабильности потребовалось более двух месяцев, чтобы подняться выше нашего порога и вернуться обратно ниже него. Этого времени, кажется, достаточно, чтобы свести на нет предыдущую прибыль или даже получить требование о внесении дополнительного обеспечения (margin call), в зависимости от размера нашего счета. Одним словом, RWEC выявляет структурную нестабильность, которую IS/OOS ADF игнорировал в своем последнем вневыборочном окне (хотя успешность OOS 55,6% сама по себе может служить предупреждением).

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



Интервал ребалансировки

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

Позвольте мне ответить на этот вопрос, воспроизведя распорядок дня Эда Торпа по торговле статистическим арбитражем, описанный им самим примерно в 2000 году. Эд Торп — математик, игрок и менеджер хедж-фонда, который был одним из пионеров количественной революции в конце 1980-х годов. Он описал свой торговый распорядок в автобиографической книге "Человек на все рынки" (Random House, NY, 2017).


"Статистическая арбитражная операция, которую мы со Стивом перезапустили в 1992 году, успешно работает вот уже восемь лет. Наши компьютеры торгуют более миллиона акций в первый час, и мы в плюсе на 400 000 долларов. В настоящее время управляя 340 миллионами долларов, мы купили акций на 540 миллионов долларов и продали такое же количество акций. Наши компьютерные симуляции и опыт показывают, что этот портфель близок к рыночно-нейтральному, что означает, что колебания стоимости портфеля имеют мало корреляции с общими средними изменениями цен на рынке. Уровень нашей рыночной нейтральности, измеряемый тем, что финансовые теоретики называют бета, в среднем составил 0,06. 

(...)

Используя нашу модель, наши компьютеры ежедневно рассчитывают "справедливую" цену для каждой из примерно тысячи крупнейших, наиболее торгуемых компаний на Нью-Йоркской и Американской фондовых биржах. Профессионалы рынка называют акции с большим объемом торгов "ликвидными"; их преимущество в том, что ими легче торговать, не вызывая при этом слишком сильного движения цены вверх или вниз. Последние цены с бирж поступают в наши компьютеры и немедленно сравниваются с текущей справедливой стоимостью в соответствии с нашей моделью. Когда фактическая цена достаточно сильно отличается от справедливой цены, мы покупаем недооцененные акции и продаем переоцененные. 

(...)

Просматривая экран компьютера, я вижу интересующие меня позиции за день, включая самые большие прибыли и самые большие убытки. Я могу быстро определить, не кажутся ли какие-либо прибыли или убытки необычно большими. Всё выглядит нормально. Всё выглядит нормально. Я иду по коридору в офис Стива Мидзусавы, где он смотрит на свой терминал Bloomberg, проверяя новости, которые могут оказать большое влияние на одну из акций, которыми мы торгуем. Когда он обнаруживает такие события, как неожиданное объявление о слиянии, поглощении, выделении или реорганизации, он говорит компьютеру внести акцию в ограничительный список: не открывать новую позицию и закрыть то, что у нас есть.

(...)

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

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

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

Резюмируя, нам нужно включить эти тесты в нашу систему скоринга и, чтобы минимизировать риск в полностью автоматизированной операции, нам нужно проверять их для активного портфеля по крайней мере раз в день. В идеале, нам нужно проверять их с частотой выбранного таймфрейма, с максимально коротким вневыборочным окном для IS/OOS ADF и с разумными предупреждениями на периоды, когда косинусное расстояние RWEC начинает отклоняться от своей медианы.



Заключение

Основываясь на хороших результатах бэк-тестирования, о которых мы сообщили в предыдущей статье, здесь мы начинаем переход от скрининга/скоринга к реальной торговле в рамках разработки нашего фреймворка для статистического арбитража. Чтобы соответствовать основным требованиям мониторинга реальной торговли, мы предлагаем включить скользящий форвардный анализ (Walk-Forward) в метод внутривыборочной/вневыборочной ADF-валидации (IS/OOS ADF) и внедрить метод сравнения собственных векторов со скользящим окном (Rolling Windows Eigenvector Comparison, RWEC) как для системы скоринга, так и для мониторинга стабильности портфельных весов во время реальной торговли.

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

Мы объясняем механику перекрывающихся окон в технике Walk-Forward и подробно описываем чтение и возможную интерпретацию примерного графика этой техники на IS/OOS ADF при использовании в тандеме с RWEC. Мы показываем, что, комбинируя RWEC и IS/OOS ADF с анализом Walk-Forward, мы можем получить надежный бэк-тест и достичь динамического управления рисками для реальной торговли.

Наконец, мы предоставляем примеры кода Python, использованные в статье, для читателей, заинтересованных в экспериментировании с параметрами тестов на той же паре ETF или даже на других классах активов.

Название файлаОписание
rwec.pyPython-скрипт для запуска теста сравнения собственных векторов со скользящим окном (RWEC) на парах активов с построением графиков.
isoos_adf_wf.pyPython-скрипт для запуска внутривыборочной/вневыборочной ADF-валидации (IS/OOS ADF) со скользящим форвардным анализом на парах активов с построением графиков.
bench_runner.pyPython-скрипт для одновременного запуска обоих тестов на нескольких парах активов и сравнения их результатов.

Перевод с английского произведен MetaQuotes Ltd.
Оригинальная статья: https://www.mql5.com/en/articles/20485

Прикрепленные файлы |
Последние комментарии | Перейти к обсуждению на форуме трейдеров (2)
Cyberdude
Cyberdude | 15 дек. 2025 в 16:37

Вы когда-нибудь пробовали это в реальных торговых условиях?

Без обид, но это просто слишком хорошо, чтобы быть правдой!

Jocimar Lopes
Jocimar Lopes | 16 дек. 2025 в 17:30
Cyberdude #:

Вы когда-нибудь пробовали это в реальных торговых условиях?

Без обид, но это просто слишком хорошо, чтобы быть правдой

Да, без обид. Если это опубликовано, значит, это можно оспаривать и обсуждать. И опять же, вы правы: "это слишком хорошо, чтобы быть правдой".

Однако, пожалуйста, обратите внимание, что я упомянул в тексте, что я тщательно выбрал пару XLK/AAA, чтобы подчеркнуть основную особенность IS/OOS ADF, которая заключается в том, чтобы показать прошлые дисбалансы.

"Как уже было сказано, я выбрал эту пару ETF, чтобы лучше проиллюстрировать суть вопроса".

Обычно это не так очевидно, как в данном примере, но в этот период у данной конкретной пары был явный дисбаланс, который и был зафиксирован тестом.

Да, мы используем эти тесты для отбора/выбора корзин и для мониторинга живой торговли. Но мы проводим эти эксперименты на небольшом счете. Мы НЕ зарабатываем миллионы. Мы учимся тому, что возможно с нашими ограниченными ресурсами.

Да, возможности есть, и мы знаем, что есть менеджеры, использующие квантовые стратегии для stat arb с разным уровнем успеха. Это не легкие деньги. И никогда не было легкими деньгами. Но в почти бесконечном сочетании классов активов, таймфреймов, периодов оглядки для расчета средней реверсии и спреда, да, есть возможности, за которыми нужно охотиться.

Здесь я публикую методы, которые мы используем для поиска этих возможностей, а не сами возможности как таковые. Эта статья является хорошим примером: когда мы начали использовать полупериод средней реверсии при выборе корзины, мы убедились в улучшении ситуации, которое вы можете видеть на двух графиках, открывающих статью. Это реально, как метод, но эти конкретные графики - конечный результат нескольких вариантов и оптимизаций MT5 Tester (это тоже упоминается в статье).

Я ожидаю, что люди будут экспериментировать со скриптами, которые я прикрепляю здесь. Единственным вложением будет ваше время. Я использовал только символы, включенные в демо-счет Meta Quotes, без подписки на биржу. Таким образом, это бесплатно.

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

Есть только одна вещь, которую мы избегаем как дьявол: это краткосрочная торговля. Не говоря уже о высокочастотном трейдинге (HFT). Это безумие для "сардин". :))

Надеюсь, это поможет.

Особенности написания Пользовательских Индикаторов Особенности написания Пользовательских Индикаторов
Написание пользовательских индикаторов в торговой системе MetaTrader 4
Разработка инструментария для анализа Price Action (Часть 36): Прямой доступ Python к потокам рыночных данных MetaTrader 5 Разработка инструментария для анализа Price Action (Часть 36): Прямой доступ Python к потокам рыночных данных MetaTrader 5
Раскройте потенциал терминала MetaTrader 5 по максимуму с помощью Python-экосистемы анализа данных и официальной клиентской библиотеки MetaTrader 5. В этой статье показано, как пройти аутентификацию и напрямую передавать тики и минутные бары в хранилище Parquet, применять продвинутые методы создания признаков с помощью ta и Prophet, а также обучать модель градиентного бустинга с учетом временной структуры данных. Затем мы разворачиваем легковесный сервис Flask, который выдает торговые сигналы в реальном времени. Независимо от того, строите ли вы гибридную количественную торговую систему или усиливаете советник машинным обучением, в результате у вас будет надежный сквозной пайплайн для алгоритмической торговли на основе данных.
Особенности написания экспертов Особенности написания экспертов
Написание и тестирование экспертов в торговой системе MetaTrader 4.
Статистический арбитраж на основе коинтегрированных акций (Часть 9): Бэктестирование обновлений весов портфеля Статистический арбитраж на основе коинтегрированных акций (Часть 9): Бэктестирование обновлений весов портфеля
В данной статье описывается использование файлов CSV для тестирования на исторических данных обновлений весов портфеля в стратегии, основанной на возврате к среднему значению и использующей статистический арбитраж на основе коинтегрированных акций. Это включает в себя как заполнение базы данных результатами сравнения собственных векторов в скользящих окнах (RWEC), так и сравнение отчетов по бэктесту. В то же время в статье подробно описывается роль каждого параметра RWEC и его влияние на общий результат бэктеста, а также показывается, как сравнение относительного просадки может помочь нам в дальнейшей оптимизации этих параметров.