Применение метода релевантных векторов (ARD) для краткосрочного прогнозирования и анализа финансовых временных рядов
Теоретическое обоснование выбора спецификации моделей временных рядов различными подходами. Классический подход на базе метода максимального правдоподобия. Байесовский подход на базе метода релевантных векторов. Тестирование подходов на реальных данных.
Рубрика | Экономико-математическое моделирование |
Вид | дипломная работа |
Язык | русский |
Дата добавления | 01.12.2019 |
Размер файла | 3,6 M |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
Размещено на http://www.allbest.ru/
ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ АВТОНОМНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ
НАЦИОНАЛЬНЫЙ ИССЛЕДОВАТЕЛЬСКИЙ УНИВЕРСИТЕТ
«ВЫСШАЯ ШКОЛА ЭКОНОМИКИ»
Факультет экономических наук
Образовательная программа " Прикладная экономика"
«Применение метода релевантных векторов (ARD) для краткосрочного прогнозирования и анализа финансовых временных рядов»
Выпускная квалификационная работа - МАГИСТЕРСКАЯ ДИССЕРТАЦИЯ
по направлению подготовки 38.04.01 Экономика
Кирин Роман Валерьевич
Москва 2019
Оглавление
байесовский подход вектор релевантный
Введение
Глава 1. Обзор литературы, сбор и обработка данных
1.1 Обзор литературы
1.2 Сбор, обработка данных и формирование выборки
Глава 2. Теоретическое обоснование выбора спецификации моделей временных рядов различными подходами
2.1 Классический подход на базе метода максимального правдоподобия
2.2 Байесовский подход на базе метода релевантных векторов
Глава 3. Тестирование подходов на реальных данных
3.1 Сравнительный анализ эмпирических результатов
Заключение
Список литературы
Приложение №1 - Код на Python
Приложение №2 - Код на R
Введение
В последнее время во многих областях науки набирают популярность байесовские методы. Байесовский подход дает теоретическое обоснование таким приемам как L1-, L2-регуляризация, а также обладает широким инструментарием учета более сложных априорных представлений об изучаемом объекте.
Одним из таких инструментов является метод релевантных векторов (Automatic Relevance Determination, ARD), который позволяет осуществлять отбор релевантных признаков, что в значительной степени должно препятствовать переобучению моделей. Используя все преимущества метода релевантных векторов, теоретически возможно улучшение качества краткосрочного прогнозирования финансовых временных рядов.
Актуальность данного исследования обусловлена тем, что ранее данный метод не был применен для прогнозирования финансовых временных рядов, однако потенциально является достойным конкурентом классической процедуре Бокса-Дженкинса.
Цель исследования - апробация метода релевантных векторов для краткосрочного прогнозирования финансовых временны рядов, а также сравнение результатов с классической ARIMA моделью на выборке акций американских компаний.
В соответствии с поставленной целью были определены следующие задачи:
1) осуществить сбор, обработку и анализ данных котировок акций американских компаний;
2) для полученных временных рядов оценить множество моделей при помощи метода релевантных векторов и процедуры Бокса-Дженкинса;
3) провести сравнительный анализ оцененных моделей и результатов прогнозирования.
Глава 1. Обзор литературы, сбор и обработка данных
1.1 Обзор литературы
В рамках данного исследования рассматриваются два подхода к моделированию временных рядов: классический - ARIMA(p,d,q) и байесовский - AR(p) процесс, полученный при помощи метода релевантных векторов. Так как предполагается использование обоих подходов, ниже отдельно приводится обзор статей и материалов, на которых базируется теоретическая основа работы.
Классический подход
Анализ временных рядов имеет достаточно длинную историю, однако фундаментальные основы современного классического подхода были заложены в конце 70-х годов прошлого века в работах Бокса и Дженкинса (Box, G. E. P., Jenkins, G. M.) [1].
Канторович Григорий Гельмутович обобщил и систематизировал знания о классическом подходе к анализу и прогнозированию одномерных временных рядов моделями класса ARIMA, GARCH, а также многомерных временных рядов моделями VAR, SVAR в серии лекций [14].
В свете теоретического обоснования в рамках классического подхода получили развитие модели класса ETS (Error Trend Seasonality) [4]. В данной работе сделан акцент на более устоявшийся подход построения моделей класса ARIMA, однако среди обоих классов имеются аналоги, поэтому результаты могут быть частично обобщены.
Байесовский подход
Наиболее полно теоретические основы метода релевантных векторов описал Дэвид Маккей (David J.C. MacKay) в работе «Bayesian methods for adaptive models» [6]. В ряде случаев автор проводил сравнительный анализ классического и байесовского подходов в задаче восстановления регрессии, однако, во-первых, используемые выборки не являлись временными рядами, во-вторых, были протестированы нелинейные модели (Legendre polynomials, RBF, Splines models).
Для получения итоговых формул и явного байесовского вывода были использованы материалы и записи лекций спецкурса по байесовским методам Дмитрия Петровича Ветрова [13], а также статься Тристана Флетчера (Tristan Fletcher, 2010) [10].
1.2 Сбор, обработка данных и формирование выборки
Для тестирования различных подходов к краткосрочному прогнозированию временных рядов (на один шаг вперед) были использованы котировки фондового рынка США. За основу был взят листинг акций на начало марта 2019 года (6394 котировки) [7].
Основным источником для загрузки данных служил Yahoo Finance [12]. Альтернативным источником мог стать Google Finance [3], однако возникли проблемы с доступом к данному сервису через библиотеку Python [8]. В процессе загрузки не были найдены ряды для 287 котировок, что, вероятнее всего, связано с неполнотой данных использованного источника.
На первом этапе обработки данных было принято решение о тестировании на стационарность скорректированных цен закрытия в уровнях. Были использованы тесты Дикки-Фуллера [23] и KPSS [22] во всевозможных спецификациях. В процессе тестирования была выявлена ошибка в данных: для некоторых временных рядов была неверно произведена корректировка, то есть Adjusted Price оказалась ошибочной (Рис. 1-2).
Рис. 1 - Динамика цены закрытия: CCEP
Рис. 2 - Динамика скорректированной цены закрытия: CCEP
Для исключения временных рядов с неверной корректировкой были рассчитаны модули парных коэффициентов корреляции Пирсона для цен закрытия с корректировкой и без (Таблица 1). Как и следовало ожидать, коэффициент корреляции для цен CCEP оказался близок к нулю (0.0333).
Таблица 1 - акции с наименьшими значениями модулей коэффициентов корреляции Пирсона
Аббревиатура |
Corr |
Abs(Corr) |
|
PNF |
-0.000838 |
0.000838 |
|
NAZ |
0.002251 |
0.002251 |
|
CEV |
-0.002291 |
0.002291 |
|
EVN |
-0.002435 |
0.002435 |
|
GOODM |
-0.003233 |
0.003233 |
Для всех, выше указанных, рядов различие динамики цены акции и скорректированной цены акции обусловлено активной дивидендной политикой. Например, для PNF (PIMCO New York Municipal Income Fund) характерно сильное расхождение динамики цен с конца 2015 г., именно в данный период компания начала выплачивать инвесторам дивиденды (Рис. 3-4) [5].
Рис. 3 - Динамика цены закрытия: PNF
Рис. 4 - Динамика скорректированной цены закрытия: PNF
Ниже приведена таблица децилей (Таблица 2), на основании которой можно утверждать, что, исключив примерно 20% выборки, модуль коэффициента корреляции для цен акций окажется не ниже 0.93, что (субъективно) достаточно для исключения рядов с ошибочной корректировкой. Также данный критерий позволит отсеять часть котировок компаний, ведущих активную дивидендную политику, что вносит элемент манипулирования скорректированной ценой акции со стороны компаний. После применения данной эвристики из выборки было исключено 1136 временных рядов.
Таблица 2 - Децили модулей коэффициентов корреляции
Дециль |
0.0 |
0.1 |
0.2 |
0.3 |
0.4 |
0.5 |
0.6 |
0.7 |
0.8 |
0.9 |
1.0 |
|
Abs(Corr) |
0.001 |
0.659 |
0.935 |
0.982 |
0.996 |
1.0 |
1.0 |
1.0 |
1.0 |
1.0 |
1.0 |
В таблице 3 представлены результаты тестирования рядов на стационарность в уровнях. Около 65% рядов были признаны всеми тестами нестационарными на 5% уровне значимости. Также были выявлены 3 стационарных ряда, однако данный результат оказался ложным (Рис. 5-7). Данным рядам характерно наличие нескольких скачков, из-за чего тесты дали неверный ответ.
Таблица 3 - Таблица положительных ответов тестов на стационарность
Кол. тестов |
Кол. рядов |
Доля рядов |
|
0 |
3072 |
0.654 |
|
1 |
775 |
0.165 |
|
2 |
372 |
0.079 |
|
3 |
210 |
0.045 |
|
4 |
246 |
0.052 |
|
5 |
20 |
0.004 |
|
6 |
3 |
0.001 |
Рис. 5 - Графика для анализа временного ряда: AJXA
Рис. 6 - Графика для анализа временного ряда: ALT
Рис. 7 - Графика для анализа временного ряда: DTW
На втором этапе были проведены тесты на стационарность логарифмических доходностей, оцененных на скорректированных ценах закрытия акций (с учетом фильтра на корреляцию). Результаты тестирования приведены в таблице 4.
Таблица 4 - Таблица положительных ответов тестов на стационарность
Кол. тестов |
Кол. рядов |
Доля рядов |
|
0 |
5 |
0.001 |
|
1 |
18 |
0.004 |
|
2 |
10 |
0.002 |
|
3 |
10 |
0.002 |
|
4 |
64 |
0.014 |
|
5 |
362 |
0.077 |
|
6 |
4226 |
0.900 |
Так как после перехода к логарифмическим доходностям 90% временных рядов были признаны всеми тестами стационарными, было принято решение использовать для тестирования моделей именно логарифмические доходности. Для сопоставимости результатов работы алгоритмов были отобраны ряды, признанные стационарными всеми шестью тестами, так как построение байесовской модели не предполагает взятие дополнительных разностей.
После первичного запуска алгоритмов потребовалось формирование случайной подвыборки из 1 000 временных рядов, так как длительность исполнения кода на R оказалась критической. Без использования параллельных вычислений одна котировка могла обрабатываться от 1 минуты до 45 минут. Полный цикл обработки выборки с учетом параллельного исполнения (в нескольких редакторах) мог бы занять около 12 дней непрерывной работы. Использование встроенной библиотеки parallel [19], создающей кластер на ПК, привело лишь к замедлению процесса обработки, так как наблюдались затяжные периоды частичной (~30%) загрузки ЦП.
По приблизительным оценкам построение моделей и получение прогнозов с помощью ARD для 4 тыс. временных рядов при параллельном исполнении с помощью joblib [18] заняла бы около 3 суток непрерывной работы.
В качестве дополнительного источника вычислительной мощности был использован облачный сервис RStudio Cloud [9], который поддерживает автономное исполнение кода на сервере, через создание job'ов.
Также была возможность использования Google Colab [2]. Сервис предоставляет мощный GPU, однако для данной задачи имелась возможность использовать лишь 2 дополнительных логических ядра.
Глава 2. Теоретическое обоснование выбора спецификации моделей временных рядов различными подходами
2.1 Классический подход на базе метода максимального правдоподобия
В рамках классического подхода для выбора наиболее подходящей модели используется процедура Бокса-Дженкинса, которая в упрощенном виде может быть представлена следующими этапами [21]:
1) проверка временного ряда на стационарность:
a. если ряд нестационарный, взятие разности и повторное тестирование;
b. если ряд стационарный переход к следующему пункту.
2) оценивание множества моделей c различными параметрами p и q;
3) выбор модели с наименьшим значением заданного критерия.
В рамках классического подхода применяются два информационных критерия: критерий Акаике (Akaike information criterion, AIC) [15] и критерий Шварца (Bayesian information criterion, BIC) [16]. В обоих критериях фигурирует значение логарифма функции правдоподобия , которое отвечает за качество аппроксимации, а также элемент налагающий штраф за количество параметров.
На практике для отбора оптимальной модели, как правило, используется критерий Акаике:
Также может быть использован критерий Шварца, однако ввиду склонности данного критерия выбирать более простую модель, чаще применяется AIC. Склонность к более простым моделям обусловлена тем, что с увеличением длинны временного ряда возрастает штраф за количество коэффициентов:
Для нахождения математического ожидания [14, лекция №5] произвольного стационарного процесса использовался классический подход. Пусть оценен произвольный ARMA(p, q) процесс:
Тогда, взяв математическое ожидание суммы, будет получено следующее выражение:
Так как предполагается, что процесс является стационарным (в широком смысле) выполняется следующее условие: , следовательно
Используя последнее выражение может быть получена простая формула для безусловного математического ожидания произвольного стационарного ARMA процесса:
Стоит отметить, что для чистых MA процессов, математическое ожидание определяется константой .
Также в данной работе производился поиск корней AR(p) полиномов [14, лекция №2]. Полиномы MA(q) части были проигнорированы, так как их корни влияют лишь на представилось процесса в виде
При помощи лагового оператора любой ARMA процесс может быть записан в следующем виде:
Так как лаговый оператор в положительной степени сдвигает ряд на заданное число шагов назад, итоговый AR полином может быть записан в следующем виде:
Для нахождения корней AR(p) полинома была использована одна из статистических библиотек Python [20].
2.2 Байесовский подход на базе метода релевантных векторов
Теоретическая часть [6]
При решении задачи восстановления регрессии, к классу которых можно отнести оценивание коэффициентов AR(p) процесса, результат байесовского вывода близок к принципу «бритвы Оккама» («Occam's razor»), согласно которому необоснованно сложные модели не должны быть более предпочтительными, чем простые. Далее будет показано строгое математическое реализация данного принципа в рамках метода релевантных векторов.
Краеугольным камнем байесовского подхода является формула Байеса (в данной части работы сохранена запись Дэвида Маккейя), частным случаем которой является:
В данной записи определяет вектор коэффициентов, - i-тую спецификацию модели, D - набор данных. Соответственно - вероятность возникновения вектора коэффициентов при имеющихся данных и заданной спецификации модели (значение апостериорной функции плотности распределения параметров); - вероятность возникновения выборки при заданной спецификации модели и наборе коэффициентов (значение функции правдоподобия); - вероятность набора коэффициентов при заданной спецификации (значение совместной априорной функции плотности распределения коэффициентов); - вероятность появления данных при заданной спецификации (нормировочная константа).
В рамках классического подхода используется некоторое упрощение данной формулы. Во-первых, в явном виде не задается априорная функция плотности распределения на вектор параметров; если быть более точным, используется равномерное распределение на достаточно широком интервале, в результате чего значение априорной функции плотности не влияет на моду апостериорной плотности распределения. Во-вторых, полностью игнорируется нормировочная константа , именуемая обоснованностью (evidence). Так как классический подход решает только задачу поиска моды апостериорного распределения, величина нормировочной константы не имеет значения.
Основным отличием байесовского вывода от классического подхода в данной задаче заключается в том, что как правило не делается ни одно, из выше перечисленных, упрощений. Если учет априорных представлений о распределении коэффициентов модели имеет ряд преимуществ и недостатков, то использование аналитических свойств нормировочной константы неоспоримо является преимуществом байесовского вывода.
Не первом этапе вывода решается аналогичная классической задача выбора оптимальных весов для модели .
На втором этапе производится отбор наиболее обоснованной модели. Для введения понятия обоснованности (evidence) следует привести иную запись формулы Байеса:
В данной записи определяется - вероятность возникновения конкретной спецификации модели при - правдоподобии данной спецификации (нормировочная константа из уравнения (1), обоснованность), - априорных представлениях о истинности данной спецификации. Очевидно, что вероятность возникновения данных одинакова для всех моделей, поэтому далее данная константа не будет упоминаться. -В предположении, что для множества моделей нет необходимости вводить различные априорные вероятности (то есть ), возможен отбор наиболее правдоподобной модели на основании обоснованности.
Для явного получения обоснованности конкретной спецификации модели необходимо взятие следующего интеграла:
Если является константой и для апостериорной функции плотности характерен пик в окрестности точки максимума, то для приближенного оценивания обоснованности справедливо следующее выражение:
Первая часть уравнения - ничто иное как значение функции правдоподобия для данного коэффициента в точке максимума. Часть произведения, взятая в квадратные скобки, называется Occam Factor, так как является математическим воплощением принципа Оккама.
Рис. 8 - The Occam Factor [6, стр. 13]
Если априорные представления заданы равномерным распределением на некотором отрезке, - является -процентным доверительным интервалом для априорной плотности (Рис. 8), то Occam Factor может быть получен при помощи интуитивной формулы:
Таким образом Occam Factor показывает во сколько раз сузился доверительный интервал для оценки коэффициента после получения данных.
Если является k-мерным вектором, тогда справедлива следующая формула (как и ранее в квадратных скобках указан Occam Factor):
Использованная имплементация метода
В рамках данного параграфа приводится аналитический байесовский вывод для линейных моделей временных рядов на базе статьи Тристана Флетчера [10] и лекций Дмитрия Ветрова [13]. В конце параграфа указаны отличия теоретических материалов от использованной имплементации.
Предположим, что наблюдаемый временной ряд является AR(p) процессом порядка, не превышающего p (некоторые коэффициенты могут быть равны нулю):
Как и в классической постановке ошибка является белым шумом:
соответственно функция плотности распределения для конкретного периода может быть задана как
Здесь и далее для удобства записи будет использовано векторное обозначение для временного ряда , признаков и весов , а также матричное обозначение для признаков . Также для упрощения записи заменено на .
Пусть каждый коэффициент в модели имеет нормальное распределение с нулевым математическим ожиданием и уникальной дисперсией, то есть , откуда в предположении о независимости вытекает, что совместная функция плотности где - диагональная матрица элементами которой являются .
На первом этапе следующим образом решается классическая задача поиска моды апостериорного распределения по с учетом априорной функции плотности (на базе формулы (1); на первой итерации ):
В выше указанной формуле соответствует ковариационно-вариационной матрице . Используя полученное решение, максимизируется обоснованность текущей спецификации по параметрам (на базе формулы (2)):
В данный момент вводится замена и применяется аппроксимация Лапласа (разложение логарифма функции в точке максимума в ряд Тейлора до третьего элемента и экспоненцирование):
В данном случае знак равенства оправдан тем, что является произведением функций плотностей нормально распределенных случайных величин, поэтому является многомерной параболой. Очевидно, что градиент в точке максимума соответствует нулевому вектору, поэтому экспоненцирование выражения и замена матрицы Гессе на приводит к следующей продолжению доказательства:
Последний интеграл является нормировочной константой многомерного нормального распределения, поэтому был взят аналитически (аналог формулы (3)).
Применяя операцию логарифмирования обоснованности получаем:
Так как зависит от параметров (формула (4)) для максимизации обоснованности используется вариационная нижняя оценка [13, лекция №4], которая предполагает замену на :
Имея данное выражение, производится поиск оптимального значения методом простой итерации:
Использование не случайно, так как на практике данный прием повышает скорость сходимости алгоритма.
Далееосуществляется поиск оптимального параметра :
Матрица путем ряда преобразования может быть представлена в более интуитивном виде:
При решении уравнения 6 и подстановке 7 получается итоговая формула для итерационного поиска -:
Изучение кода текущей имплементации функции ARDRegression [17] показало, что имеет место некоторое расхождение с теоретическими материалами:
1) в формуле (4) делается замена обратной матрицы по формуле Вудберри [24];
2) в формулах (5), (8) дополнительно включены параметры априорных гамма-распределений, однако в качестве значений по умолчанию используется одна миллионная, поэтому данный момент может быть проигнорирован.
3)
Глава 3. Тестирование подходов на реальных данных
3.1 Сравнительный анализ эмпирических результатов
В рамках данного исследования для построения моделей и получения прогнозов различными методами использовались различные языки программирования. Для оценки классических моделей класса ARIMA была использована имплементация процедуры Бокса-Дженкинса в R [21]. Для построения моделей методом релевантных векторов была применена функция ARDRegression из популярного пакета для анализа данных на Python [17].
В качестве обучающей выборки использовалось скользящее окно из 30 наблюдений. За тестовую выборку принималось следующее фактическое значение ряда.
Стоит отметить, что скорость построения прогнозов для одного временного ряда в R примерно в 1.5 раза превышает скорость получения прогнозов для того же ряда в Python. Во многом данное наблюдение может быть следствием имплементации в статистическом пакете, тем не менее не стоит упускать из внимания данный факт.
Рис. 9 - График оценок RMSE для ARD и ARIMA
Рисунок 9 показывает расчетные значения квадратного корня среднеквадратичной ошибки (RMSE) для обеих моделей (каждая точка соответствует одному временному ряду).
На основании данного графика можно сделать вывод, что прогнозы ARD в ряде случаев значительно хуже, классической ARIMA(p,d,q). Объяснение данного наблюдения кроется в аппроксимации взрывных процессов. В таблице 5 приведены статистики для трех временных рядов с наибольшими значениями RMSE для ARD, ниже проведен детальный анализ данных рядов.
Таблица 5 - Статистики для топ-3 рядов с наибольшим RMSE (ARD)
RMSE (Python) |
RMSE (R) |
Название |
Длинна ряда |
Корреляция прогноза/факта (Python) |
Корреляция прогноза/факта (R) |
Корреляция ошибок |
|
13.886800 |
0.470631 |
TBC |
2008 |
0.000389 |
0.099520 |
0.044395 |
|
9.556422 |
1.061211 |
NEXT |
2146 |
0.026714 |
0.398263 |
0.101020 |
|
4.063271 |
0.051342 |
FTAI |
5768 |
0.003451 |
0.027867 |
0.009172 |
TBC (AT&T Inc. 5.625% Global Notes)
Рис. 10 - Динамика ряда в уровнях, ACF и PACF: TBC
Рис. 11 - Динамика log-доходностей ряда, ACF и PACF: TBC
Не смотря на достаточно строгий критерий при определении стационарности временных рядов, визуально данный ряд не является стационарным как в уровнях, так и в виде логарифмических доходностей (Рис. 10-11). Характерный линейный рост - интерполяция, связанная с прерыванием данных на интервале между 2007, 2008 и 2010 годами. Резкое падение в середине 2018 г. может быть связано с неучтенной split операцией, так как в тот же период значительно возрос объем торгов [11].
Рис. 12 - Результаты прогнозирования: TBC
Рис. 13 - Зависимость ошибки от максимального корня: TBC
Как показывает рисунок 12, для ARD модели в ряде случаев значительно изменялась оценка среднего, что имело отражение в ошибке прогноза. Причиной является то, что для аппроксимации динамики ряда был использован взрывной процесс, что подтверждает наличие корней AR(p) полинома, превышающих единицу (Рис. 13).
Не смотря на большую разницу в значениях RMSE оценки среднего в окрестности точки (0, 0) на диаграмме рассеяния имеют почти линейную форму (Рис. 12).
NEXT (NextDecade Corporation)
Рис. 14 - Динамика ряда в уровнях, ACF и PACF: NEXT
Рис. 15 - Динамика log-доходностей ряда, ACF и PACF: NEXT
Данный временной ряд визуально достаточно слабо схож со стационарным процессом, не смотря на поведение автокорреляционной и автоковариационной функции (Рис. 14-15).
Также прослеживается высокая волатильность оценок среднего для ARD, корреляция среднего для обеих моделей при низких значениях log-доходностей, а также почти линейная связь ошибок (Рис. 16).
Рис. 16 - Результаты прогнозирования: NEXT
Рис. 17 - Зависимость ошибки от максимального корня: NEXT
При построении AR(p) моделей методом релевантных векторов также возникали корни (Рис. 17), превышающие единицу, что вновь послужило причиной ухудшения прогнозов относительно классической модели.
FTAI (Fortress Transportation and Infrastructure Investors LLC)
Рис. 18 - Динамика ряда в уровнях, ACF и PACF: FTAI
Рис. 19 - Динамика log-доходностей ряда, ACF и PACF: FTAI
Для данного временного ряда характерно значительное падение в середине 2015 г., которое не имеет очевидного объяснения (Рис. 18-19). Именно данное наблюдение привело к значительной ошибке при аппроксимации AR(p) процесса (Рис. 20). В данном примере также имеется множество корней, по модулю превышающих единицу (Рис. 21).
Рис. 20 - Результаты прогнозирования: FTAI
Рис. 21 - Зависимость ошибки от максимального корня: FTAI
Возвращаясь к результатам построения моделей, стоит отметить, что в целом полученные прогнозы как методом релевантных векторов, так и при помощи процедуры Бокса-Дженкинса имеют достаточно низкую предсказательную силу. Нередко коэффициент корреляции прогнозного и фактического значения имеет отрицательный знак (Рис. 22).
Рис. 22 - Корреляция фактических и прогнозных значений
Приведенный выше график, показывает, что для длинных временных рядов (от 5000 наблюдений) значительная часть точек попадает в область положительной корреляции для обеих моделей.
На основании рисунка 23 можно предположить, что разброс корреляции ошибок прогнозов для длинных временных рядов меньше, чем для коротких. Данное явление может объяснятся тем, что длинные ряды имеют более четкую структуру, поэтому прогнозы обоих подходов имеют схожие ошибки.
Рис. 23 - Коэффициенты корреляции для ошибок прогнозов в зависимости от длинны временного ряда
Также было замечено, что для длинных временных рядов, разброс оценок корреляции прогнозных и фактических значений ниже, чем для коротких (Рис. 24).
Рис. 24 - Зависимость корреляции прогнозных и фактических значений от длинны временного ряда
Так как выше были рассмотрены только временные ряды, имеющие низкое качество прогноза методом релевантных векторов, далее приведен анализ трех временных рядов с наилучшим качеством, в таблице 6 находятся статистики для данных рядов.
Таблица 6 - Статистики для топ-3 рядов с наименьшим RMSE (ARD)
RMSE (Python) |
RMSE (R) |
Название |
Длинна ряда |
Корреляция прогноза/факта (Python) |
Корреляция прогноза/факта (R) |
Корреляция ошибок |
|
0.001700 |
0.001748 |
CNAC |
360 |
0.066012 |
0.088460 |
0.927043 |
|
0.001708 |
0.001718 |
TOTA |
95 |
-0.049321 |
-0.155019 |
0.974263 |
|
0.001816 |
0.001764 |
LHC |
188 |
-0.001073 |
-0.024227 |
0.961902 |
CNAC (Constellation Alpha Capital Corp.)
Рис. 25 - Динамика ряда в уровнях, ACF и PACF: CNAC
Рис. 26 - Динамика log-доходностей ряда, ACF и PACF: CNAC
В самом начале данного временного ряда наблюдается значительное падение цены (Рис. 25-26), что вероятнее всего связано с первичным листингом на бирже. По результатам торгов 8 августа 2017 г. цена акции составила 11 долларов и 25 центов, однако уже на следующий торговый день (10 августа) на момент закрытия цена достигла отметки 9.7 доллара.
Рис. 27 - Результаты прогнозирования: CNAC
Примечательно, что для данного ряда динамика оценки среднего достаточно схожа для ARIMA и ARD, что особенно четко прослеживается в период с 03-12-2018 по 01-01-2019, однако полученные спецификации моделей достаточно сильно разнятся (Рис. 27). Также на диаграмме рассеяния для ошибок моделей четко прослеживается линейная форма взаимосвязи, и то, что при высоких и низких значениях log-доходностей модели достаточно сильно ошибаются.
Рис. 28 - Зависимость ошибки от максимального корня: CNAC
Не смотря на значительное падение цены в начале ряда, максимальный корень полинома, полученный методом релевантных векторов, среди всех временных интервалов составил ~0.94. Вероятно, благодаря большей гибкости и отсутствию аппроксимации взрывных процессов (Рис. 28), в данной ситуации метод релевантных векторов показал лучший результат.
TOTA (Tottenham Acquisition I Limited)
Рис. 29 - Динамика ряда в уровнях, ACF и PACF: TOTA
Рис. 30 - Динамика log-доходностей ряда, ACF и PACF: TOTA
Данный временной ряд похож на кусочно-постоянный процесс, причиной чему может служить низкая торговой активность данным инструментом (Рис. 29-30).
Рис. 31 - Результаты прогнозирования: TOTA
В данной ситуации также прослеживается некоторое совпадение оценок средних значений для обеих моделей (Рис. 31), более того в период с 19-12-2018 по 26-12-2018 с учетом того, что коэффициенты ARD при разных лагах компенсировали друг друга были оценены почти одинаковые модели.
Рис. 32 - Зависимость ошибки от максимального корня: TOTA
Для данного конкретного случая максимальные модули корней AR полиномов для ARIMA модели превзошли аналогичные оценки ARD (Рис. 32).
LHC (Leo Holdings Corp.)
Рис. 33 - Динамика ряда в уровнях, ACF и PACF: LHC
Рис. 34 - Динамика log-доходностей ряда, ACF и PACF: LHC
Динамика скорректированных цен закрытия для данного инструмента также напоминает кусочно-постоянный процесс с тенденцией к увеличению (Рис. 33). В виде логарифмических доходностей данный ряд похож на белый шум, если исключить из внимания периоды неизменных цен (Рис. 34).
Рис. 35 - Результаты прогнозирования: LHC
В данном конкретном случае динамики оценок математических ожиданий моделей абсолютно не сходятся, однако наблюдается высокая корреляция ошибок прогнозов (Рис. 35). Почти в 93% случаев авто ARIMA определяет процесс как белый шум с нулевым ожиданием, в то время как ARD ни разу не приравнял к нулю все авторегрессионные коэффициенты. Также динамика ожидания для ARD в значительной степени напоминает динамику исходного ряда в уровнях.
Рис. 36 - Зависимость ошибки от максимального корня: LHC
Как и ранее для данного ряда не был аппроксимирован взрывной процесс. Максимальный модуль корня полинома для ARD составил ~0.89.
Заключение
В рамках данной работы была достигнута цель, а также все поставленные задачи. На основании полученных результатов возможно дальнейшее развитие темы в части адаптации метода релевантных векторов для прогнозирования временных рядов с учетом классических знаний предметной области.
В процессе сбора и анализа данных была выявлена ошибочная корректировка цен акций на момент закрытия торгов в Yahoo Finance, а также предложен способ отбора рядов, не имеющих данной ошибки.
Был выявлен класс ложно стационарных временных рядов, имеющих специфическую динамику, в результате чего тесты Дикки-Фуллера и KPSS во всех спецификациях дают неверный ответ.
По результатам анализа 1 000 временных рядов в виде логарифмических доходностей были определены следующие характерные черты текущей имплементации метода релевантных векторов (в Python) и процедуры Бокса-Дженкинса (в R):
1) оценка моделей методом релевантных векторов осуществляется примерно в 1.5 раза быстрее, чем построение ARIMA моделей с отбором на основании критерия Акаике (AIC);
2) в ряде случаев качество прогнозирования методом релевантных векторов (на основании RMSE) значительно уступает классическому подходу Бокса-Дженкинса из-за наличия единичных и превышающих единицу корней оцененного AR(p) полинома;
3) процедура Бокса-Дженкинса более консервативна и часто в качестве оптимальной спецификации использует гаусовский белый шум, в то время как ARD редко использует данную спецификацию;
4) модель ARD является более гибкой и нередко динамика оцененного математического ожидания процесса повторяет динамику исходного ряда в уровнях, что, однако, может свидетельствовать о переобучении;
5) обе модели достаточно часто ошибаются при высоких и низких значениях логарифмических доходностей, имеют высокую корреляцию ошибок, а также меньший разброс качества прогнозов (на основании корреляции Пирсона) на длинных (более 5000 наблюдений) временных рядах.
Список литературы
1) Box G. E. P. and Jenkins G. M. Time Series Analysis, Forecasting and Control, rev. Ed., San Francisco: Holden-Day, 1976.
2) Google Colab (официальный сайт). URL: https://colab.research.google.com
3) Google Finance (источник биржевых данных). URL: https://www.google.com/finance
4) Hyndman, Rob & Koehler, Anne & D Snyder, Ralph & Grose, Simone. (2002). A State Space Framework for Automatic Forecasting Using Exponential Smoothing Methods. International Journal of Forecasting. 18. 439-454. URL: http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.468.7646&rep=rep1&type=pdf
5) Investing (потоковый график с детализацией, PNF). URL: https://ru.investing.com/equities/pimco-new-york-municipal-income-chart
6) MacKay, David J.C. (1992) Bayesian methods for adaptive models. Dissertation (Ph.D.), California Institute of Technology. URL: http://www.inference.org.uk/mackay/thesis.pdf
7) NYSE (листинг акций компаний). URL: https://www.nyse.com/listings_directory/stock
8) pandas_datareader, загрузка биржевых данных (ссылка на документацию). URL: https://pandas-datareader.readthedocs.io/en/latest/
9) RStudio Cloud (официальный сайт). URL: https://rstudio.cloud
10) Tristan Fletcher (2010) Relevance Vector Machines Explained. URL: http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.651.8603&rep=rep1&type=pdf
11) Yahoo Finance (детализация динамики, TBC). URL: https://finance.yahoo.com/quote/TBC?p=TBC&.tsrc=fin-srch
12) Yahoo Finance (источник биржевых данных). URL: https://finance.yahoo.com
13) Ветров Д.П. Байесовские методы машинного обучения (курс лекций) 2018:
a. URL 1 (материалы): http://www.machinelearning.ru/wiki/index.php?title=Бммо
b. URL 2 (записи лекций): https://www.youtube.com/watch?v=Q65APl9MFTs
14) Канторович Г.Г. Лекции: Анализ временных рядов // Экономический журнал ВШЭ. 2002. URL: http://institutiones.com/download/lecture/804-analiz-vremennih-ryadov.html
15) Критерий Акаике, AIC in R (ссылка на документацию). URL: https://www.rdocumentation.org/packages/stats/versions/3.6.0/topics/AIC
16) Критерий Шварца, BIC in R (ссылка на документацию). URL: https://www.rdocumentation.org/packages/lme4/versions/0.999375-37/topics/BIC
17) Метод релевантных векторов, ARDRegression in Python (ссылка на документацию). URL: https://scikit-learn.org/stable/auto_examples/linear_model/plot_ard.html
18) Параллельные вычисления в Python, joblib.Parallel (ссылка на документацию). URL: https://joblib.readthedocs.io/en/latest/generated/joblib.Parallel.html
19) Параллельные вычисления в R, Parallel in R (ссылка на документацию). URL: https://stat.ethz.ch/R-manual/R-devel/library/parallel/doc/parallel.pdf
20) Поиск корней полиномов, numpy.roots (ссылка на документацию). URL: https://docs.scipy.org/doc/numpy/reference/generated/numpy.roots.html
21) Процедура Бокса-Дженкинса, auto.arima in R (ссылка на документацию). URL: https://www.rdocumentation.org/packages/forecast/versions/8.7/topics/auto.arima
22) Тест KPSS в Python, kpss (ссылка на документацию). URL: https://www.statsmodels.org/dev/generated/statsmodels.tsa.stattools.kpss.html
23) Тест Дики-Фуллера, adfuller (ссылка на документацию). URL: https://www.statsmodels.org/dev/generated/statsmodels.tsa.stattools.adfuller.html
24) Формула Вудбери. URL: http://mathworld.wolfram.com/WoodburyFormula.html
Приложение №1 - Код на Python
### рабочие директории (для сохранения и загрузки файлов)
wd = 'C:/Users/Роман/Desktop/Python/Диссертация/'
wd_r = 'C:/Users/Роман/Desktop/R/Dissertation/'
### загрузка библиотек
import numpy as np
import pandas as pd
from pandas_datareader import data
# графики
from matplotlib import pyplot as plt
import matplotlib.dates as mdates
# классическая статистика на Python
import statsmodels.tsa.api as smt
import statsmodels.api as sm
# тесты на стационарность
from statsmodels.tsa.stattools import adfuller
from statsmodels.tsa.stattools import kpss
# Automatic Relevance Determination Regression (ARD)
from sklearn.linear_model import ARDRegression
# параллельные вычисления
from joblib import Parallel, delayed
# прочие библиотеки
from datetime import datetime # работа с датами/временем
import pickle # сохранение/загрузка объектов pkl
from selenium import webdriver # парсинг сайтов
from time import sleep # пауза в исполнении кода
from os import walk # работа с файловой системой
import gc # чистильщик памяти
import csv # чтение/запись в csv файлы
### график временных рядов (Источник: https://habr.com/ru/company/ods/blog/327242/)
def tsplot(y, lags=None, ticker_name = '', save_path = None, figsize=(12, 7), style='bmh'):
if not isinstance(y, pd.Series):
y = pd.Series(y)
with plt.style.context(style):
fig = plt.figure(figsize=figsize)
layout = (2, 2)
ts_ax = plt.subplot2grid(layout, (0, 0), colspan=2)
ts_ax.xaxis.set_major_locator(mdates.YearLocator())
ts_ax.xaxis.set_major_formatter(mdates.DateFormatter('%Y'))
acf_ax = plt.subplot2grid(layout, (1, 0))
pacf_ax = plt.subplot2grid(layout, (1, 1))
plt.subplots_adjust(hspace = 0.4)
y.plot(ax=ts_ax)
ts_ax.set_title('Time Series Analysis Plots: '+ticker_name)
smt.graphics.plot_acf(y, lags=lags, ax=acf_ax, alpha=0.5)
smt.graphics.plot_pacf(y, lags=lags, ax=pacf_ax, alpha=0.5)
print("Критерий Дики-Фуллера: p=%f" % sm.tsa.stattools.adfuller(y)[1])
if save_path is not None:
plt.savefig(save_path+ticker_name+'.png')
plt.show()
__Загрузка данных__
### парсинг списка с тикерами на NYSE
# количество стрниц для парсинга
last_pg_num = 640
first = True
# запуск драйвера Chrome
driver = webdriver.Chrome('C:/Users/Роман/Desktop/Python/Chrome_driver/chromedriver.exe')
# получение первичной страницы
driver.get('https://www.nyse.com/listings_directory/stock')
# путь к кнопке Next
next_xpath = '//*[@id="content-aa395ece-e341-4621-9695-3642148ea198"]/div/div[2]/div[2]/div/ul/li[8]/a'
# парсинг таблицы
for i in range(last_pg_num):
# список под результаты
res_tab = []
for row in driver.find_element_by_tag_name('tbody').find_elements_by_tag_name('tr'):
res_row = []
for el in row.find_elements_by_tag_name('td'):
res_row.append(el.text)
res_tab.append(res_row)
# сохранение результатов
if first:
tickers = pd.DataFrame(res_tab, columns = ['ticker', 'full_name'])
else:
tickers = tickers.append(pd.DataFrame(res_tab, columns = ['ticker', 'full_name']))
# переключение режима записи
first = False
# переключение на новую страницу
driver.find_element_by_xpath(next_xpath).click()
# пауза
sleep(3)
# выгрузка результатов в csv
#tickers.to_csv('tickers.csv')
# дата загрузки - 06.03.2019
### загрузка таблицы с тикерами
tickers = pd.read_csv(wd+'tickers.csv', engine = 'python').drop('Unnamed: 0', axis = 1)
print(tickers.shape)
tickers.head()
### загрузка котировок через API
# настройки для скачивания тикеров
start_date = '1980-01-01'
end_date = '2019-03-08'
counter = 0
start = datetime.now()
error_list = []
for t in tickers['ticker']:
try:
data.DataReader(t, 'yahoo', start_date, end_date).to_csv(wd+'ts_data/'+t+'.csv')
except KeyboardInterrupt:
print('Выполнение остановлено пользователем.')
break
except:
error_list.append(t)
counter += 1
if counter%100 == 0:
print('Обработано рядов: ', counter,' | Текущее время выполнения: ', datetime.now()-start)
# сохранение списка незагруженных тикеров
with open(wd+'ts_data/error_list.txt', 'wb') as fp:
pickle.dump(error_list, fp)
print('Время выполнения: ', datetime.now()-start)
### загрузка списка необработанных тикеров
with open(wd+'ts_data/error_list.txt', 'rb') as fp:
error_list = pickle.load(fp)
print(len(error_list))
error_list
# пример загрузки данных
pd.read_csv(wd+'ts_data/AAPL.csv', engine = 'python').tail()
# отрицательные Adj Close с типом данных object (!)
aan = data.DataReader('AAN', 'yahoo', start_date, end_date)
aan.head()
__Проверка на стационарность__
### функция для выведения результатов тестов на стационарность
def stationarity_tests(ticker):
y_tmp = pd.read_csv(wd+'ts_data/'+ticker+'.csv',
engine = 'python', usecols = ['Adj Close'])
list_tmp = []
for test_type in ['c', 'ct', 'ctt', 'nc']:
list_tmp.append(adfuller(y_tmp['Adj Close'], regression = test_type)[1])
for test_type in ['c', 'ct']:
list_tmp.append(kpss(y_tmp['Adj Close'], regression = test_type)[1])
list_tmp.append(y_tmp.shape[0])
return pd.DataFrame([list_tmp],
columns = ['adf_c', 'adf_ct', 'adf_ctt', 'adf_nc', 'kpss_c*', 'kpss_ct*', 'T'],
index = [ticker])
### проведение ADF и kpss теста для тикеров и выгрузка результатов в csv
# игнорирование предупреждений
import sys
if not sys.warnoptions:
import warnings
warnings.simplefilter('ignore')
# тело цикла
counter = 0
start = datetime.now()
error_list_1 = []
for t in tickers['ticker']:
try:
stationarity_tests(t).to_csv(wd+'adf_test/'+t+'.csv')
except KeyboardInterrupt:
print('Выполнение остановлено пользователем.')
break
except:
error_list_1.append(t)
counter += 1
if counter%100 == 0:
print('Обработано рядов: ', counter,' | Текущее время выполнения: ', datetime.now()-start)
# сохранение списка с необработанными тиекрами
with open(wd+'adf_test/error_list_1.txt', "wb") as fp:
pickle.dump(error_list_1, fp)
# включение предупреждений
import sys
if not sys.warnoptions:
import warnings
warnings.simplefilter('default')
print('Время выполнения: ', datetime.now()-start)
### загрузка списка необработанных тикеров
with open(wd+'adf_test/error_list_1.txt', 'rb') as fp: # Unpickling
error_list_1 = pickle.load(fp)
print(len(error_list_1))
error_list_1
### загрузка результатов тестов на стационарность
tmp_list = []
for t in tickers['ticker']:
try:
tmp_list.append(pd.read_csv(wd+'adf_test/'+t+'.csv', engine = 'python'))
except FileNotFoundError:
pass
stat_res = pd.concat(tmp_list, axis = 0)
del tmp_list
### сохранение результатов в одной таблице
stat_res = stat_res.rename(columns = {'Unnamed: 0': 'ticker'}).reset_index(drop = True)
stat_res.to_csv(wd+'adf_test/stat_res.csv')
### пример ошибочной корректировки цены закрытия
y_tmp = pd.read_csv(wd+'ts_data/'+'CCEP'+'.csv',
engine = 'python', usecols=['Date', 'Close', 'Adj Close'],
converters = {'Date': pd.to_datetime}).set_index(['Date'])
tsplot(y_tmp['Close'], lags = 10, ticker_name = 'CCEP Close', save_path = wd+'pict_1/')
tsplot(y_tmp['Adj Close'], lags = 10, ticker_name = 'CCEP Adj Close', save_path = wd+'pict_1/')
### пример верной корректировки цены закрытия
y_tmp = pd.read_csv(wd+'ts_data/'+'AAPL'+'.csv',
engine = 'python', usecols=['Date', 'Close', 'Adj Close'],
converters = {'Date': pd.to_datetime}).set_index(['Date'])
tsplot(y_tmp['Close']['2000-01-01':], lags = 10, ticker_name = 'AAPL Close', save_path = wd+'pict_1/')
tsplot(y_tmp['Adj Close']['2000-01-01':], lags = 10, ticker_name = 'AAPL Adj Close', save_path = wd+'pict_1/')
### расчет парных корреляций для цен закрытия и скорректированных цен закрытия
tmp_list = []
def det_corr_df(ticker_name):
try:
y_tmp = pd.read_csv(wd+'ts_data/'+ticker_name+'.csv',
engine = 'python', usecols=['Date', 'Close', 'Adj Close'],
converters = {'Date': pd.to_datetime,
'Close': np.float64, 'Adj Close': np.float64}).set_index(['Date'])
return {'ticker_name': ticker_name, 'corr': y_tmp.corr(method='pearson').iloc[0, 1]}
except FileNotFoundError:
return {'ticker_name': ticker_name, 'corr': np.nan}
corr_df = pd.DataFrame(
Parallel(verbose=True, max_nbytes=None, n_jobs=4)(
delayed(det_corr_df)(ticker_name) for ticker_name in tickers['ticker'])
)
# опреледение индекса
corr_df.set_index('ticker_name', inplace=True)
# расчет авсолютных значений коэффициентов корреляции
corr_df['corr_abs'] = corr_df['corr'].apply(np.abs)
# сохранение результатов
corr_df.to_csv(wd+'corr_df.csv')
### загрузка результатов
corr_df = pd.read_csv(wd+'corr_df.csv', engine = 'python').set_index('ticker_name')
print(corr_df.shape)
corr_df.head()
### поиск ряда с неверной скорректированной ценой
corr_df.loc[['CCEP']]
### топ-5 тикеров с наименьшими значениями коэффициентов корреляции
corr_df.sort_values('corr_abs', ascending=True).head()
### пример ряда с низкой корреляцией
y_tmp = pd.read_csv(wd+'ts_data/'+'PNF'+'.csv',
engine = 'python', usecols=['Date', 'Close', 'Adj Close'],
converters = {'Date': pd.to_datetime,
'Close': np.float64, 'Adj Close': np.float64}).set_index(['Date'])
tsplot(y_tmp['Close'], lags = 10, ticker_name = 'PNF Close', save_path = wd+'pict_1/')
tsplot(y_tmp['Adj Close'], lags = 10, ticker_name = 'PNF Adj Close', save_path = wd+'pict_1/')
### децили по абсолютным значениям коэффициентов уорреляции
corr_df[['corr_abs']].quantile([0.1*i for i in range(11)]).T
### список акций для исключения из выборки
drop_list = corr_df[corr_df['corr_abs'] < 0.93].index.tolist()
print(len(drop_list))
drop_list[:5]
### загрузка результатов
stat_res = pd.read_csv(wd+'adf_test/stat_res.csv', engine = 'python').drop('Unnamed: 0', axis = 1)
print(stat_res.shape)
# исключение записей по корреляцией цен
stat_res = stat_res[stat_res['ticker'].isin(drop_list) == False]
print(stat_res.shape)
stat_res.head()
### расчет количества тестов, подтверждающих стационарность рядов (в уровнях)
stat_res['n_stat'] = (stat_res[['adf_c', 'adf_ct', 'adf_ctt', 'adf_nc']] < 0.05).sum(axis = 1) + \
(stat_res[['kpss_c*', 'kpss_ct*']] >= 0.05).sum(axis = 1)
# таблица частот
tmp_df = pd.crosstab(stat_res['n_stat'], 'count')
tmp_df['share'] = tmp_df['count']/tmp_df['count'].sum()
tmp_df
### пример нестационарных рядов (в уровнях)
stat_res[stat_res['n_stat'] == 0]
### графики нестационарных рядов (в уровнях)
for ticker_name in stat_res[stat_res['n_stat'] == 0]['ticker'].sample(n = 10, random_state = 123):
y_tmp = pd.read_csv(wd+'ts_data/'+ticker_name+'.csv',
engine = 'python', usecols=['Date', 'Adj Close'],
converters = {'Date': pd.to_datetime}).set_index(['Date'])['Adj Close']
y_tmp.index.name = None
tsplot(y_tmp, lags = 10, ticker_name = ticker_name, save_path = wd+'pict_1/')
### пример стационарных рядов (в уровнях)
stat_res[stat_res['n_stat'] == 6]
### графики стационарных рядов (в уровнях)
for ticker_name in stat_res[stat_res['n_stat'] == 6]['ticker']:
y_tmp = pd.read_csv(wd+'ts_data/'+ticker_name+'.csv',
engine = 'python', usecols=['Date', 'Adj Close'],
converters = {'Date': pd.to_datetime}).set_index(['Date'])['Adj Close']
y_tmp.index.name = None
tsplot(y_tmp, lags = 10, ticker_name = ticker_name, save_path = wd+'pict_1/')
# Тесты на стационарность №2 - переход к log доходностям
### функция для выведения результатов тестов на стационарность
def stationarity_tests_log_ret(ticker):
y_tmp = pd.read_csv(wd+'ts_data/'+ticker+'.csv',
engine = 'python', usecols = ['Adj Close']).apply(np.log).diff().dropna()
list_tmp = []
for test_type in ['c', 'ct', 'ctt', 'nc']:
list_tmp.append(adfuller(y_tmp['Adj Close'], regression = test_type)[1])
for test_type in ['c', 'ct']:
list_tmp.append(kpss(y_tmp['Adj Close'], regression = test_type)[1])
list_tmp.append(y_tmp.shape[0])
return pd.DataFrame([list_tmp],
columns = ['adf_c', 'adf_ct', 'adf_ctt', 'adf_nc', 'kpss_c*', 'kpss_ct*', 'T'],
index = [ticker])
### проведение ADF и kpss теста для тикеров и выгрузка результатов в csv
# игнорирование предупреждений
import sys
if not sys.warnoptions:
import warnings
warnings.simplefilter("ignore")
# тело цикла
counter = 0
start = datetime.now()
error_list_2 = []
for t in tickers['ticker']:
try:
stationarity_tests_log_ret(t).to_csv(wd+'stat_test_2/'+t+'.csv')
except KeyboardInterrupt:
print('Выполнение остановлено пользователем.')
break
except:
error_list_2.append(t)
counter += 1
if counter%100 == 0:
print('Обработано рядов: ', counter,' | Текущее время выполнения: ', datetime.now()-start)
with open(wd+'stat_test_2/error_list_2.txt', "wb") as fp: #Pickling
pickle.dump(error_list_2, fp)
# включение предупреждений
import sys
if not sys.warnoptions:
import warnings
warnings.simplefilter("default")
print('Время выполнения: ', datetime.now()-start)
### загрузка списка необработанных тикеров
with open(wd+"stat_test_2/error_list_2.txt", "rb") as fp: # Unpickling
error_list_2 = pickle.load(fp)
print(len(error_list_2))
error_list_2
### загрузка результатов тестов на стационарность
tmp_list = []
for t in tickers['ticker']:
try:
tmp_list.append(pd.read_csv(wd+'stat_test_2/'+t+'.csv', engine = 'python'))
except FileNotFoundError:
pass
stat_res_1 = pd.concat(tmp_list, axis = 0)
del tmp_list
stat_res_1.head()
### сохранение результатов в одной таблице
stat_res_1 = stat_res_1.rename(columns = {'Unnamed: 0': 'ticker'}).reset_index(drop = True)
stat_res_1.to_csv(wd+'stat_test_2/stat_res_1.csv')
stat_res_1.head()
### загрузка результатов
stat_res_1 = pd.read_csv(wd+'stat_test_2/stat_res_1.csv', engine = 'python').drop('Unnamed: 0', axis = 1)
print(stat_res_1.shape)
# исключение записей по корреляцией цен
stat_res_1 = stat_res_1[stat_res_1['ticker'].isin(drop_list) == False]
print(stat_res_1.shape)
stat_res_1.head()
### количество тестов, подтверждающих стационарность рядов (в разностях)
stat_res_1['n_stat'] = (stat_res_1[['adf_c', 'adf_ct', 'adf_ctt', 'adf_nc']] < 0.05).sum(axis = 1) + \
(stat_res_1[['kpss_c*', 'kpss_ct*']] >= 0.05).sum(axis = 1)
...Подобные документы
Классические подходы к анализу финансовых рынков, алгоритмы машинного обучения. Модель ансамблей классификационных деревьев для прогнозирования динамики финансовых временных рядов. Выбор алгоритма для анализа данных. Практическая реализация модели.
дипломная работа [1,5 M], добавлен 21.09.2016Теоретические выкладки в области теории хаоса. Методы, которые используются в математике, для прогнозирования стохастических рядов. Анализ финансовых рядов и рядов Twitter, связь между сентиметными графиками и поведением временного финансового ряда.
курсовая работа [388,9 K], добавлен 01.07.2017Основные элементы эконометрического анализа временных рядов. Задачи анализа и их первоначальная обработка. Решение задач кратко- и среднесрочного прогноза значений временного ряда. Методы нахождения параметров уравнения тренда. Метод наименьших квадратов.
контрольная работа [37,6 K], добавлен 03.06.2009Статистические методы анализа одномерных временных рядов, решение задач по анализу и прогнозированию, построение графика исследуемого показателя. Критерии выявления компонент рядов, проверка гипотезы о случайности ряда и значения стандартных ошибок.
контрольная работа [325,2 K], добавлен 13.08.2010Структурные компоненты детерминированной составляющей. Основная цель статистического анализа временных рядов. Экстраполяционное прогнозирование экономических процессов. Выявление аномальных наблюдений, а также построение моделей временных рядов.
курсовая работа [126,0 K], добавлен 11.03.2014Влияние девальвации национальной валюты на цены активов и процентных ставок на фондовый рынок. Анализ отраслевых взаимосвязей и закономерностей в динамике биржевых индикаторов и множества других временных рядов. Оценка моделей методом "rolling window".
дипломная работа [1,7 M], добавлен 06.11.2015Изучение особенностей стационарных временных рядов и их применения. Параметрические тесты стационарности. Тестирование математического ожидания, дисперсии и коэффициентов автокорреляции. Проведение тестов Манна-Уитни, Сиджела-Тьюки, Вальда-Вольфовитца.
курсовая работа [451,7 K], добавлен 06.12.2014Тесты, с помощью которых можно построить эконометрические модели. Эконометрическое моделирование денежного агрегата М0, в зависимости от валового внутреннего продукта и индекса потребительских цен. Проверка рядов на стационарность и гетероскедастичность.
курсовая работа [814,0 K], добавлен 24.09.2012Анализ временных рядов с помощью статистического пакета "Minitab". Механизм изменения уровней ряда. Trend Analysis – анализ линии тренда с аппроксимирующими кривыми (линейная, квадратическая, экспоненциальная, логистическая). Декомпозиция временного ряда.
методичка [1,2 M], добавлен 21.01.2011Временные ряды и их характеристики. Факторы, влияющие на значения временного ряда. Тренд и сезонные составляющие. Декомпозиция временных рядов. Метод экспоненциального сглаживания. Построение регрессионной модели. Числовые характеристики переменных.
контрольная работа [1,6 M], добавлен 18.06.2012Расчет суммы издержек для плана выпуска продукции. Коэффициенты линейного уравнения парной регрессии. Характеристика графической интерпретации результатов. Развитие экономических процессов. Особенности эконометрического моделирования временных рядов.
контрольная работа [723,3 K], добавлен 22.02.2011Предпрогнозное исследование рядов урожайности с применением фрактального и R/S-анализа, бинарной кодировки. Расчет коэффициента Херста природных и экономических рядов. Оценка соотношения "детерминированность-стохастичность" для разных областей Украины.
курсовая работа [2,2 M], добавлен 18.09.2010Создание комбинированных моделей и методов как современный способ прогнозирования. Модель на основе ARIMA для описания стационарных и нестационарных временных рядов при решении задач кластеризации. Модели авторегрессии AR и применение коррелограмм.
презентация [460,1 K], добавлен 01.05.2015Понятие, задачи и основные цели регрессионного анализа. Прогнозирование, основанное на использовании моделей временных рядов. Определение степени детерминированности вариации критериальной переменной предикторами. Ошибки, возникающие при измерении данных.
контрольная работа [785,9 K], добавлен 13.11.2011Классификационные принципы методов прогнозирования: фактографические, комбинированные и экспертные. Разработка приёмов статистического наблюдения и анализа данных. Практическое применение методов прогнозирования на примере метода наименьших квадратов.
курсовая работа [77,5 K], добавлен 21.07.2013Статистическое исследование динамики производительности труда на примере производственного кооператива "Маяк". Разработка мер по эффективному использованию различных ресурсов с применением метода динамических рядов и корреляционно-регрессионного метода.
курсовая работа [156,1 K], добавлен 20.02.2011Модели стационарных и нестационарных рядов, их идентификация. Системы эконометрических уравнений, оценка длины периода. Определение и свойства индексов инфляции. Использование потребительской корзины и индексов инфляции в экономических расчетах.
книга [5,0 M], добавлен 19.05.2010Линейное программирование как инструмент исследования линейных моделей. Основы симплекс-метода. Моделирование экономической ситуации в инструментальном цехе. Применение симплекс-метода для оптимизации плана производства. Применимость линейной модели.
курсовая работа [112,0 K], добавлен 09.12.2014Статистические методы прогнозирования и их роль в экономической практике. Классификация экономических прогнозов. Требования, предъявляемые к временным рядам, и их компонентный состав. Сопоставимость уровней ряда и допустимая длина временных рядов.
контрольная работа [1,2 M], добавлен 13.08.2010Устойчивость двойственных оценок. Чувствительность оптимального решения задачи к изменению свободных членов. Графический метод решения задачи линейного программирования. Прогнозирование экономических процессов с использованием моделей временных рядов.
курсовая работа [2,3 M], добавлен 05.12.2011