Предсказание рынка на основе макроэкономических показателей

 

Итак, задача предсказать S&P 500 индекс на основе имеющихся экономических показателей.

Шаг 1: Находим показатели. Показатели имеются в общем доступе здесь: http://research.stlouisfed.org/fred2/ Их там 240 тысяч. Самым главным является рост GDP. Этот показатель расчитывается каждый квартал. Отсюда наш шаг - 3 месяца. Все индикаторы на более коротком периоде перерасчитываются на 3-х месячный период, остальные (годовые) отбрасываются. Отбрасываем также показатели для всех стран кроме США и показатели, у которых нет глубокой истории (по крайней мере 15 лет). Итак кропотливым трудом отсеиваем кучу показателей и получаем порядка 10 тыс показателей. Формулируем более конкретную задачу прдесказать S&P 500 индекс на один или два квартала вперёд имея в наличии 10 тыс экономических показателей с квартальным периодом. Я делаю всё в МатЛабе, хотя можно и в R.

Шаг 2: Преобразуем все данные к стационарному виду путём дифференцирования и нормирования. Методов тут много. Главное чтобы из преобразованных данных можно было восстановить первоначальные данные. Без стационарности не одна модель работать не будет. S&P 500 ряд до и после преобразования показан внизу.

 

Шаг 3: Выбираем модель. Можно нейронную сеть. Можно много-переменную линейную регрессию. Можно много-переменную полиномную регрессию. После опробования линейных и нелинейных моделей приходим к выводу что данные настолько зашумлены что вписывать нелинейную модель смысла нет т.к. y(x) граф, где y = S&P 500 и x = один из 10 тыс показателей, бредставляет собой почти круглое облако. Таким образом формулируем задачу ещё более конкретно: предсказать S&P 500 индекс на один или два квартала вперёд имея в наличии 10 тыс экономических показателей с квартальным периодом используя много-переменную линейную регрессию.

Шаг 4: Выбираем из 10 тыс экономических показателей наиболее главные (уменьшаем размерность задачи). Это самый главный и трудный шаг. Допустим берём историю S&P 500 длинной в 30 лет (120 кварталов). Чтобы представить S&P 500 в виде линейной комбинации экономических показателй разного рода, достаточно иметь 120 показателей чтобы точно описать S&P 500 за эти 30 лет. Причём показатели могут быть совершенно любыми чтобы создать такую точную модель из 120 показателей и 120 значений S&P 500. Значит нужно уменьшать количество входов ниже количества описываемых значений функции. Например ищем 10-20 наиболее важных показателей-входов. Такие задачи описания данных небольшим количеством входов, выбранных из огромного количества кандидатов-базисов (словаря), называются разряжённым кодированием (sparse coding).

Методов отбора входов-предсказателей много. Я перепробовал их все. Вот главные два:

  1. Классифицируем все 10 тыс данных по их предсказауемой способности S&P 500. Предсказуемая способность может измеряться коэффициентом кореляции или взаимной информацией.
  2. Перебираем все 10 тыс показателей по дному и выбираем тот, который дал линейную модель y_mod = a + b*x1 описывающую S&P 500 с наименьшей ошибкой. Потом выбираем второй вход опять же перебором оставшихся 10 тыс -1 индикаторов таким образом чтобы он описал остаток y - y_mod = c + d*x2 с наименьшей ошибкой. И так далее. Такой метод называется stepwise regression или matching pursuit. 

Вот первые 10 индикаторов с максимальным коэффициентом корреляции с S&P 500:

Series ID Lag Corr Mut Info
'PPICRM' 2 0.315 0.102
'CWUR0000SEHE' 2 0.283 0.122
'CES1021000001' 1 0.263 0.095
'B115RC1Q027SBEA' 2 0.262 0.102
'CES1000000034' 1 0.261 0.105
'A371RD3Q086SBEA' 2 0.260 0.085
'B115RC1Q027SBEA' 1 0.256 0.102
'CUUR0000SAF111' 1 0.252 0.117
'CUUR0000SEHE' 2 0.251 0.098
'USMINE' 1 0.250 0.102

Вот первые 10 индикаторов с максимальной взаимной информацией с S&P 500:

Series ID Lag Corr Mut Info
'CPILEGSL' 3 0.061 0.136
'B701RC1Q027SBEA' 3 0.038 0.136
'CUSR0000SAS' 3 0.043 0.134
'GDPPOT' 3 0.003 0.134
'NGDPPOT' 5 0.102 0.134
'OTHSEC' 4 0.168 0.133
'LNU01300060' 3 0.046 0.132
'LRAC25TTUSM156N' 3 0.046 0.132
'LRAC25TTUSQ156N' 3 0.046 0.131
'CUSR0000SAS' 1 0.130 0.131

 

Lag это задержка входного ряда по отношению к моделируемому ряду S&P 500. Как видно из этих таблиц, разные методы выбора наиважнейших входов приводят к разным наборам входов. Так как моей конечной целью является минимизация ошибки модели, то я выбрал второй метод выбора входов, т.е. перебор всех входов и выбор того входа который дал наименьшую ошибку.

Шаг 5: Выбираем метод расчёта ошибки и коэффициентов модели. Наипростейшим методом является метод СКО, поэтому линейная регрессия, использующая этот метод, так популярна. Проблема метода СКО в том что он чувствителен к выбросам (outliers), т.е. эти выбросы существенно влияют на коэфициенты модели. Чтобы уменьшить эту чувствительность, вместо суммы квадратов ошибок можно использовать сумму абсолютных значений ошибок, что ведёт к методу наименьших модулей (МНМ) или robust regression. Этот метод не имеет аналитического решения для коэффициентов модели в отличие от линейной регрессии. Обычно модули заменяются на плавные/дифференцируемые аппроксимирующие функции и решение ведётся численными методами и долго. Я пробовал оба метода (лин регрессии и МНМ) и особого преимущества МНМ не заметил. Вместо МНМ, я пошёл в обход. На втором шагу получения стационарных данных путём их дифференцирования, я добавил операцию нелинейной нормализации. То есть, исходный ряд x[1], x[2], ... x[i-1], x[i] ... сначала преобразуется в ряд разниц x[2]-x[1] ... x[i]-x[i-1] ... и потом каждая разница нормализуется путём её замены на sign(x[i]-x[i-1])*abs(x[i]-x[i-1])^u, где 0 < u < 1. При u=1, мы получаем классический метод СКО с его чувствительностью к выбросам. При u=0, все значения входного ряда заменяются на бинарные значения +/-1 практически без выбросов. При u=0.5, получаем что-то близкое к МНМ. Оптимальное значение u лежит где-то между 0.5 и 1.

Следует отметить что одним из популярных методов преобразования данных к стационарному виду является замена значений ряда на разницу логарифмов этих значений, т.е. log(x[i]) - log(x[i-1]) или log(x[i]/x[i-1]). Выбор такого преобразования опасен в моём случае так как в словаре 10 тыс входов много рядов с нулевыми и отрицательными значениями. Логарифм также имеет преимущетсво уменьшения чувствительности метода СКО к выбросамы По существу, моя функция преобразования sign(x)*|x|^u имеет ту же цель что и log(x), но без проблем связанных с нулевыми и отрицательными значениями.

Шаг 6: Расчитывем предсказание модели путём подстановки свежих входных данных и расчёта выхода модели используя те же коэффициенты модели, кторые были найдены линейной регрессией на предыдущем участки истории. Тут важно иметь в виду что квартальные значения экономических показателей и S&P 500 приходят почти одновременно (с точностью до 3 месяцев). Поэтому чтобы предсказать S&P 500 на следующий квартал, модель должна быть построена между текущим квартальным значением S&P 500 и входами задержанными по крайней мере на 1 квартал (Lag>=1). Чтобы предсказать S&P 500 через один квартал вперёд, модель должна быть построена между текущим квартальным значением S&P 500 и входами задержанными по крайней мере на 2 квартала (Lag>=2). И так далее. Точность предсказаний существенно снижается с увеличением задержки больше 2.

Шаг 7: Проверяем точность предсказаний на предыдущей истории. Первоначальная методика описанныя выше (вписываем каждый вход в предыдущую историю, выбираем вход дающий наименьшую СКО и рассчитывем предсказание по свежему значению этого входа) дала СКО предсказания, которая была ещё хуже чем случайные или нулевые предсказания. Задался таким вопросом: а почему вход, который хорошо вписался в прошлое, должен иметь хорошую предсказуемую способность будущего? Имеет смысл выбирать входы модели на основе их предыдущей ошибки предсказаний, а не на основе наименьшей ошибки регрессии на известных данных.

В конце концов, моя модель может быть пошагово описанa так:

  1. Закачиваем экономические данные из stlouisfed (около 10 тыс индикаторов). 
  2. Преобразеум данные к стационарному виду и нормализуем.
  3. Выбираем линейную модель индекса S&P 500, аналитечески решаемую методом СКО (линейная регрессия).
  4. Выбираем длинну истории (1960 - Q2 2015) и разбиваем её на обучающий отрезок (1960 - Q4 1999) и тестируемый отрезок (Q1 2000 - Q2 2015).
  5. Начинаем предсказания с 1960 + N + 1 года, где N*4 это начальное количество известных квартальных значений S&P 500.
  6. На первых N данных строится линейная модель y_mod = a + b*x для каждого экономического показателя, где y_mod - модель S&P 500, а x - один из экономических показателей. 
  7. Предсказываем N + 1 бар каждой моделью.
  8. Расчитываем ошибки предсказаний N + 1 бара каждой моделью. Запоминаем эти ошибки.
  9. Увеличиваем количество известных значений S&P 500 на 1, т.е. N + 1, и повторяем шаги 6-9 до тех пор пока не достигнем конца обучающего отрезка (Q4 1999). На этом шагу у нас запомнены ошибки предсказаний начиная с 1960 + N +1 года и кончая Q4 1999 каждым экономическим показателем.
  10. Начинаем тестирование модели на втором отрезкe истории (Q1 2000 - Q2 2015).
  11. Для каждого из 10 тыс входов расчитывем средне-квадратичную ошибку предсказаний за 1960 - Q4 1999.
  12. Из 10 тыс входов выбираем тот который имел наименьшую СКО предсказания за 1960 - Q4 1999.
  13. Строим линейную модель y_mod = a + b*x для каждого экономического показателя за 1960 - Q4 1999. 
  14. Предсказывем Q1 2000 каждой моделью.
  15. Предсказание выбранного входа с наименьшей СКО предсказаний за предыдущий отрезок времени (1960 - Q4 1999) выбираем как наше главное предсказание Q1 2000.
  16. Расчитываем ошибки предсказаний всех входов на Q1 2000 и добавляем их к СКО этих же входов за предыдущий отрезок времени (1960 - Q4 1999).
  17. Переходим к Q2 2000 и повторяем шаги 12-17 пока не достигнем конца тестируемого участка (Q2 2015) с неизвестным значением S&P 500, предсказание которого является нашей главной целью.
  18. Накопляем ошибки предсказаний за Q1 2000 - Q4 2014 сделанными входами с наименьшей СКО предсказаний на предыдущих отрезках. Эта ошибка (err2) и является нашей out-of-sample ошибкой предсказания моделью. 

Вкратце, выбор предсказателя зависит от его СКО предсказний предыдущих значений S&P 500. Заглядывания в будущее нет. Предсказатель может меняться по времени, но в конце тестируемого отрезка он в основном перестаёт меняться. Моя модель выбрала PPICRM с задержкой в 2 квартала как первый вхoд для предсказания Q2 2015. Линейная регрессия S&P 500 выбранным входом PPICRM(2) за 1960 - Q4 2014 показана внизу. Чёрные кружки - линейная регрессия. Разноцветные кружки - исторические данные за 1960 - Q4 2014. Цвет кружка означает время.


Предсказания S&P 500 в стационарном виде (красная линия):

 

Предсказания S&P 500 в исходном виде (красная линия):

 

Из графика видно что модель предсказывает рост S&P 500 во втором квартале 2015 года. Добавление второго входа увеличивают ошибку предсказаний:

1 err1=0.900298 err2=0.938355 PPICRM (2)

2 err1=0.881910 err2=0.978233 PERMIT1 (4) 

где err1 это ошибка регрессии. Очевидно что она уменьшается от добавления второго входа. err2 это средне-квадратичная ошибка предсказания, делённая на ошибку случайных предсказаний. То есть err2>=1 означает что предсказание моей моделью не лучше чем случайные предсказания. err2<1 означает что предсказание моей моделью лучше чем случайные предсказания.

PPICRM = Producer Price Index: Crude Materials for Further Processing

PERMIT1 = New Private Housing Units Authorized by Building Permits - In Structures with 1 Unit

Описанная выше модель может быть перефразирована таким образом. Собираем 10 тыс экономистов и просим их предсказать рынок на квартал вперёд. Каждый экономист проходит со своим предсказанием. Но вместо того чтобы выбрать какое-то предсказание на основе количества написанных ими учебников или полученных Нобелевских премий в прошлом, мы ждём несколько лет, собирая их предсказания. После существенного количества предсказаний, мы видим какой экономист более точный и начинаем верить его предсказаниям до тех пор пока какой-нибудь другой экономист не превзойдёт его по точности.

Federal Reserve Economic Data - FRED - St. Louis Fed
Federal Reserve Economic Data - FRED - St. Louis Fed
  • fred.stlouisfed.org
Download, graph, and track 240,000 economic time series from 77 sources.
 
gpwr:
Продолжение следует ...
не смущает тот факт, что правительство США с целом и комиссию по открытым рынкам в частности неоднократно подозревали в фальсификации и манипуляции макроэкономической статистикой по рынку труда США и ВВП США в целях нужного воздействия на финансовые рынки?
 
Demi:
не смущает тот факт, что правительство США с целом и комиссию по открытым рынкам в частности неоднократно подозревали в фальсификации и манипуляции макроэкономической статистикой по рынку труда США и ВВП США в целях нужного воздействия на финансовые рынки?
Да, смущает. Смущает также тот факт что опубликованные данные корректируются много раз после их выпуска. Но с другой стороны, трейдеры реагируют на те данные, которые им предоставляет правительство США, двигая рынок в ту или другую сторону, будь те данные фальсифицированы или неполными или преждевременными. Так что методика предсказания рынка на основе этих данных в принципе должна работать.
 
gpwr:
Да, смущает. Смущает также тот факт что опубликованные данные корректируются много раз после их выпуска. Но с другой стороны, трейдеры реагируют на те данные, которые им предоставляет правительство США, двигая рынок в ту или другую сторону, будь те данные фальсифицированы или неполными или преждевременными. Так что методика предсказания рынка на основе этих данных в принципе должна работать.

Вас интересует только S&P или он взят лишь как пример?

Просто у S&P своеобразная модель движения, не похожая на отношение валют.

 
Urain:

Вас интересует только S&P или он взят лишь как пример?

Просто у S&P своеобразная модель движения, не похожая на отношение валют.

Взят как пример из-за лёгкости нахождения (в общем доступе) входных данных. Таким способом можно моделировать всё что угодно: экономику России, обменочные курсы валют, и прочее. Рыночные цены наиболее трудно предсказывать так как в них много шума. Предсказание физических процессов намного легче.
 
gpwr:
Да, смущает. Смущает также тот факт что опубликованные данные корректируются много раз после их выпуска. Но с другой стороны, трейдеры реагируют на те данные, которые им предоставляет правительство США, двигая рынок в ту или другую сторону, будь те данные фальсифицированы или неполными или преждевременными. Так что методика предсказания рынка на основе этих данных в принципе должна работать.

Ок, давай посмотрим. Я этим тоже занимался. 

Настойчивая подсказка-пожелание - форвард тест 

 
gpwr:

Итак, задача предсказать S&P 500 индекс на основе имеющихся экономических показателей.

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

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

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

 
алгоритм регрессии поможет спрогнозировать любой показатель на основе любых данных даже если нет явной связи между ними
 
forexman77:

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

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


 Большое или малое количество входных данных - это все относительно.

Важнее другое.

Все входные данные делятся на две категории:

  • имеющие влияние на целевую переменную
  • не имеющую влияния или же имеющие слабое влияние.

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

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

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

Мне известно несколько десятков алгоритмов определения важности переменных, которые я опробовал на наборе из своей статьи и книги (до 100 входных переменных). Результат именно такой как описал. Ручками отобрал некоторый перечень, а потом отфильтровал алгоритмом и получил перечень. Причем ценность такого перечня носит принципиальный характер: модели, использующие такой набор "влияющих" исходных данных  (использую 3 разных типов моделей), НЕ обладают свойством переобученности, которая и является главной засадой. Именно переобученность является главным следствием использования "шумовых" исходных данных.

 

ПС.

Стационарность никакой роли в моих моделях не играет, а это randomForest, ada, SVM. 

 
gpwr:

...

.... Без стационарности не одна модель работать не будет.

...

Требование стационарности -- очень жёсткое и совершенно неоправданное.

.

А "без стационарности" модели вполне себе работают ;)

 
transcendreamer:
алгоритм регрессии поможет спрогнозировать любой показатель на основе любых данных даже если нет явной связи между ними
Так можно сказать о любой моделе, не только регрессии но и нейроных моделях, ARMA и прочих. Если связи между входами и выходом нет, любая модель сгенерирует предсказание, только неточное.
Причина обращения: