Готовим ценовые данные правильно » Элитный трейдер
Элитный трейдер


Готовим ценовые данные правильно

Часть 1: ужасы гетероскедастичности

Когда вы пытаетесь построить некую модель, которая предсказывала бы будущее изменение цены, она обычно выглядит так: на вход подаются какие-то факторы, полученные из ценовых данных, например индикаторы какие-нибудь, а на выходе имеем оценку сдвига цены, ну, например, за день.
28 октября 2013 long-short.ru mehanizator
Обычно вашей первой мыслью на этом пути будет использовать изменения цен как есть, то есть (Close/Open - 1), например. Особо хитрые могут взять ln(Close/Open), и так правильнее, кстати. Скорее всего большинство входов модели будут представлять собой линейные комбинации вот этих самых изменений цен за прошлые бары.

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

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

Вроде все правильно и логично, да?

Нет!

Засада в том, что изменение цены на протяжении всей истории имеет сильно неоднородную дисперсию. Специально обученные люди называют это гетероскедастичностью. В переводе на русский - волатильность разная на разных участках. В 2008 она была высокой, в 2012 она была низкой.

Абсолютные значения дневных сдвигов SPY:

Готовим ценовые данные правильно


Если вы будете пытаться построить линейную модель на неоднородных по дисперсии данных, вы получите мусор!

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

В общем, вы просто подгоните модель под кризисные годы с сильной волатильностью. А все остальные года, все данные между кризисами, работать вообще не будут.

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

Модель должна опираться на все данные в равной мере!

Как этого добиться? Мой вариант - нужно нормировать ценовые сдвиги на текущую волатильность. Ее можно оценивать по-разному:
1. средний диапазон бара ln(High/Low) за N баров
2. диапазон цены за N баров - фактически то же самое что 1, только с коэффициентом sqrt(N).
3. среднее абсолютное значение сдвига цены за N баров
4. СКО сдвига цены за N баров.

Я обычно использую первый способ.

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

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

Нормированные сдвиги цен SPY:

Готовим ценовые данные правильно


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

Нужно разобрать график цены на ценовые сдвиги, нормировать их на волатильность, и собрать обратно. На этом синтетическом инструменте уже можно что-то тестировать. Пример таких инструментов для S&P и MICEX.

Часть 2: в поисках лучшей нормировки

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

Очевидное лекарство - сделать нормировку. Например, на волатильность. Ряд становится более-менее однородным, можно строить модели и они уже не будут неадекватными. Плюс - у нас появляется параметр волатильности, который мы сразу же засовываем в модель, где он обычно неплохо работает, спасибо “эффекту плеча” (leverage effect).

Хорошо, теперь возникает следующий вопрос - а как, собственно, считать “волатильность”? СКО ряда в окне N прошлых дней, конечно, подразумевается по умолчанию, однако это не единственный вариант. Вот некоторые другие:

1. Среднее абсолютное значение.
2. Средний дневной диапазон ln(High/Low).
3. Средний дневной диапазон с учетом утреннего гэпа.
4. Вариация (почти то же СКО, только средние значения не вычитаются).
5. Внутридневные изменения (realized volatility).

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

Хорошо, теперь встает новый вопрос. Даже с нормировкой ряда у него остается довольно заметные ассиметрия (skewness) и эксцесс (kurtosis). Остаточный эксцесс может сигнализировать об остаточной неоднородности ряда даже после нормировки на волатильность. Некоторые мои расчеты условных распределений показали, что высшие моменты полученных распределений зависят от волатильности. Чем выше волатильность - тем сильнее проявляется ассиметрия и эксцесс. Что наводит на мысль, что простая нормировка все-таки не оптимальна, и можно попробовать ее как-то улучшить.

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

Проверим расчетом. Берем дневные данные SPY (очень активно торгуемый ETF на индекс S&P 500) с 2003 года, для расчета текущей волатильности используем окно в 21 день (месяц). В качестве оценки волатильности используем среднее абсолютное значение элементов ряда. Элемент ряда ln(close[i] / close[i-1]).

Заодно посчитаем корреляции между логарифмом нормы и последующим изменением цены с горизонтом в 21 день. Поскольку распределения все равно достаточно кривые, будем на всякий случай считать как корреляцию Пирсона (обычную), так и ранговую корреляцию Спирмена, которая предположительно должна давать более адекватные оценки зависимостей для не-гауссовских распределений.

Смотрим что получилось:

s=0.50 ske=-1.2589 kur= +3.527 crp=-0.0713 crs=+0.0052
s=0.75 ske=-1.0766 kur= +2.273 crp=-0.0840 crs=-0.0490
s=1.00 ske=-0.9061 kur= +1.591 crp=-0.0996 crs=-0.0969
s=1.25 ske=-0.7320 kur= +1.388 crp=-0.1168 crs=-0.1354
s=1.50 ske=-0.5367 kur= +1.592 crp=-0.1345 crs=-0.1664
s=1.75 ske=-0.3047 kur= +2.173 crp=-0.1518 crs=-0.1910
s=2.00 ske=-0.0256 kur= +3.153 crp=-0.1681 crs=-0.2108
s=2.25 ske=+0.3062 kur= +4.600 crp=-0.1830 crs=-0.2269
s=2.50 ske=+0.6923 kur= +6.611 crp=-0.1962 crs=-0.2404


Здесь s - степень, ske - ассиметрия, kur - эксцесс, crp - коэффициент корреляции Пирсона, crs - коэффициент корреляции Спирмена.

Видно, что минимальный эксцесс достигается примерно при s=1.25.

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

http://www.long-short.ru/ (C) Источник
Не является индивидуальной инвестиционной рекомендацией
При копировании ссылка обязательна Нашли ошибку: выделить и нажать Ctrl+Enter