Нефтяные ряды в R

    «Графики цен великолепны, чтобы предсказывать прошлое»
    Питер Линч



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

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

    При работе с нормальными временными рядами можно использовать стандартный подход:

    1. Визуальный анализ
    2. Разложение ряда и изучение его компонент: сезонность, цикличность, тренд
    3. Построение математической модели и прогнозирование



    Есть весьма удобный источник данных — Quandl; он предоставляет интерфейс для Matlab, Python, R. Для R достаточно установить один пакет: install.packages("Quandl"). Меня интересует Europe Brent Crude Oil Spot Priceспотовая цена на нефть марки «Брент» (ниже используются три набора данных в разной детализации).

    library(Quandl)
    oil.ts <- Quandl("DOE/RBRTE", trim_start="1987-11-10", trim_end="2015-01-01", type="zoo")
    oil.tsw <-Quandl("DOE/RBRTE", trim_start="1987-11-10", trim_end="2015-01-01", type="zoo", collapse="weekly")
    oil.tsm <-Quandl("DOE/RBRTE", trim_start="1987-11-10", trim_end="2015-01-01", type="ts", collapse="monthly")
    plot(oil.tsm, xlab="Year", ylab="Price, $", type="l")
    lines(lowess(oil.tsm), col="red", lty="dashed")
    



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

    plot(decompose(oil.tsm, type="multiplicative"))
    




    С трендом вроде бы все понятно — в 21 веке есть устойчивая до недавнего времени тенденция к росту (за исключением интересных годов), ряд нестационарный — это доказывает и расширенный тест Дикки-Фуллера:

    >library(tseries)
    >library(forecast)
    >adf.test(oil.tsm, alternative=c('stationary'))
    
    	Augmented Dickey-Fuller Test
    
    data:  oil.tsm
    Dickey-Fuller = -2.7568, Lag order = 6, p-value = 0.2574
    alternative hypothesis: stationary
    

    С другой стороны, с достаточно высокой степенью уверенности можно утверждать, что разности первого порядка ряда стационарны, т.е. это интегрированный временной ряд первого порядка (этот факт в дальнейшем позволит нам применить методологию Бокса — Дженкинса).

    >adf.test(diff(oil.tsm), alternative=c('stationary'))
    
    	Augmented Dickey-Fuller Test
    
    data:  diff(oil.tsm)
    Dickey-Fuller = -8.0377, Lag order = 6, p-value = 0.01
    alternative hypothesis: stationary
    
    > ndiffs(oil.tsm)
    [1] 1
    

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

    L <- BoxCox.lambda(ts(oil.ts, frequency=260), method="loglik")
    Lw <- BoxCox.lambda(ts(oil.tsw, frequency=52), method="loglik")
    Lm <- BoxCox.lambda(oil.tsm, method="loglik")
    

    Что же касается наиболее скользкой темы, а именно — экстраполяции, то в статье «Crude Oil Price Forecasting Techniques: a Comprehensive Review of Literature» авторы отмечают, что в зависимости от длины временного промежутка применимость моделей такова:

    1. для среднесрочного и долгосрочного периода в большей степени походят нелинейные модели — те же нейронные сети, машины опорных векторов;
    2. для краткосрочного периода ARIMA часто превосходит нейронные сети.

    После всех формальностей воспользуемся как раз присутствующей в пакете forecast функцией nnetar(), с помощью которой без лишних сложностей можно построить нейросетевую модель ряда. При этом сделаем это для трех рядов — от более детализированного (по дням) до менее детализированного (по месяцам). Заодно посмотрим, что будет в среднесрочном периоде — например, за 2 года (на графиках это отображено синим цветом).
    Скрытый текст
    # Fit NN for long-run
    fit.nn <- nnetar(ts(oil.ts, frequency=260), lambda=L, size=3)
    fcast.nn <- forecast(fit.nn, h=520, lambda=L)
    
    fit.nnw <- nnetar(ts(oil.tsw, frequency=52), lambda=Lw, size=3)
    fcast.nnw <- forecast(fit.nnw, h=104, lambda=Lw)
    
    fit.nnm <- nnetar(oil.tsm, lambda=Lm, size=3)
    fcast.nnm <- forecast(fit.nnm, h=24, lambda=Lm)
    
    par(mfrow=c(3, 1))
    plot(fcast.nn, include=1040)
    plot(fcast.nnw, include=208)
    plot(fcast.nnm, include=48)
    




    Что хорошо получилось на верхнем графике, так это переобучение: нейронная сеть отловила последний паттерн в ряду и принялась его копировать. На среднем графике сеть не только копирует последний паттерн, но еще и хорошо совмещает его с трендом, что придает некоторую реалистичность прогнозу. На нижнем графике получилась… какая-то невразумительная кривая. Графики хорошо иллюстрируют, как изменяются предсказания в зависимости от сглаживания данных. В любом случае для товаров с высокой (по разным причинам) волатильностью предсказаниям на такой временной промежуток верить нельзя, поэтому сразу перейдем к краткосрочному периоду, а заодно и сравним несколько разных моделей — ARIMA, tbats и нейронную сеть. Будем использовать данные за последнее полугодие и особенно выделим декабрь месяц в серию short.test — для целей тестирования.
    Скрытый текст
    # Fit ARIMA, NN and ETS for short-run
    short <- ts(oil.ts[index(oil.ts) > "2014-06-30" & index(oil.ts) < "2014-12-01"], frequency=20)
    short.test <- as.numeric(oil.ts[index(oil.ts) >= "2014-12-01",])
    h <- length(short.test)
    
    fit.arima <- auto.arima(short, lambda=L)
    fcast.arima <- forecast(fit.arima, h, lambda=L)
    
    fit.nn <- nnetar(short, size=7, lambda=L)
    fcast.nn <- forecast(fit.nn, h, lambda=L)
    
    fit.tbats <-tbats(short, lambda=L)
    fcast.tbats <- forecast(fit.tbats, h, lambda=L)
    
    par(mfrow=c(3, 1))
    plot(fcast.arima, include=3*h)
    plot(fcast.nn, include=3*h)
    plot(fcast.tbats, include=3*h)
    




    Нейронная сеть, переобучившись, несколько ушла в астрал, а ARIMA показала весьма интересную зависимость — интересную в плане близости к реальной картине. Ниже — сравнение предсказания каждой модели с реальными данными в декабре и mean absolute percentage error:
    Скрытый текст
    par(mfrow=c(1, 1))
    plot(short.test, type="l", col="red", lwd=5, xlab="Day", ylab="Price, $", main="December prices",
         ylim=c(min(short.test, fcast.arima$mean, fcast.tbats$mean, fcast.nn$mean),
                max(short.test, fcast.arima$mean, fcast.tbats$mean, fcast.nn$mean)))
    lines(as.numeric(fcast.nn$mean), col="green", lwd=3,lty=2)
    lines(as.numeric(fcast.tbats$mean), col="magenta", lwd=3,lty=2)
    lines(as.numeric(fcast.arima$mean), col="blue", lwd=3, lty=2)
    legend("topright", legend=c("Real Data","NeuralNet","TBATS", "ARIMA"), 
           col=c("red","green", "magenta","blue"), lty=c(1,2,2,2), lwd=c(5,3,3,3))
    grid()
    




    Скрытый текст
    mape <- function(r, f){
      len <- length(r)
      return(sum( abs(r - f$mean[1:len]) / r) / len * 100)
    }
    mape(short.test, fcast.arima)
    mape(short.test, fcast.nn)
    mape(short.test, fcast.tbats)
    


    ARIMA NNet TBATS
    1.99% 18.26% 4.00%


    Вместо заключения


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

    1. за сентябрь на 5%;
    2. за октябрь — на 10%;
    3. за ноябрь — на 15%;
    4. за декабрь ...?

    Это как бы намекает нам, что процесс изменения цены на нефть далек от процесса, который регулируется случайными параметрами.
    Share post

    Similar posts

    Comments 30

      +8
      Это всё интересно, серьёзно.

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

      К примеру: завтра изобретут батарею, которая может хранить сотни мегаватт, а послезавтра откроют сверхэффективный источник энергии, который сможет эти батареи наполнять. И всё, тут же цена на нефть полетит в тартарары, а математический прогноз останется лишь прогнозом. Я намеренно утрировал пример, чтобы была понятна мысль. Да вы ведь и сами в последнем абзаце соглашаетесь, что в данном конкретном случае математика плохой помощник.
        +1
        Где я сейчас могу купить такую батарею? График выглядит так как буд-то она появилась, а мы все знаем что она не появилась. Отсюда и вывод автора в конце.
          0
          недавно была ссылка на ycombinator на гравитационную «батарею», что-то типа такого, большая мощность, быстрый отклик, долгий срок эксплуатации без деградации

          к примеру выше — недавно Гейм заявил, что смог использовать графен для выделения водорода, потребление топлива в США падает, появляются более эффективные солнечные батареи и так далее

          т.е. оно не так, конечно — «завтра изобретут батарею», но в целом технологии развиваются, и это всё не считая сланцевых технологий

          а по сабжу — можно в R анализировать, а можно посмотреть, когда сбили Боинг над Украиной и посмотреть, куда пошли цены на нефть после этого события, думаю станет более очевидно что почему и откуда
            –1
            Такую «гравитационную» батарейку давным давно используют рядом с большими электростанциями. Где вода перекачивается из нижнего водоема в верхний когда генерация больше потребления. И используется для генерации электроэнергии потом.

            солнечная энергетика до сих пор дороже угольной. Для выделения водорода можно много чего использовать. Чтобы его выделить таки нужно потратить энергию.

            Развивается и эффективное использование нефти :) и эффективное использование бензина и много чего еще. Потребности человечества растут каждый день. И все эти улучшения эффективности этот рост не компенсирует но удешевляет в пересчете на еденицу.

            Конечно давным давно ясно что эти события инницированны одним и тем же соединенным государством. Само соединенное государство насчет второго уже и не скрывается в своих политических заявлениях.

              +1
              Само соединенное государство насчет второго уже и не скрывается в своих политических заявлениях.

              Простите, я из текста комментария не понял, чего «второго»?
            0
            На днях была статья на GeekTimes об автомобилях Toyota на водороде. Там даже прямо цитировалось, что эра нефти подходит к концу.
              0
              это заявление тиражируется уже лет 15ть. Нефть это не только топливо, это еще и всякие пластмассы, химия
              0
              Может мы не все знаем и батареях?! )
              В примере хорошо показано что технологический аспект «изобретение батареи» влияет на социальный — «падение цен». Связь между ними лежит в плоскости психологии коллективного бессознательного.
              Т.е. «батареей» могут являться не технологии, а политические процессы, или же психологические процессы в коллективном бесознательном. А скорее всего синергетический эффект от всех факторов и является той самой «батареей»
                0
                Автор же написал — завтра. И завтра тоже — завтра. ;)
              +6
              Реквестирую аналогичную статью по курсу валют.
                +1
                Предсказывать курс валют сейчас еще более неблагодарное дело, чем стоимость барреля :)
                0
                Это мне напоминает прогноз погоды. На пару дней (неделю) системы диффуров могут что-то предсказать по локальным данным и моделям, а что дальше — только богу известно. Правда есть одно отличие, экономика — результат действия людей. По идее, должно быть возможным всё просчитать, только без нейронных сетей, конечно.
                Почему бы не создать такие же супер-компы, как для прогноза погоды? Фик с ним с долгосрочными прогнозами, но на месяц-то можно сделать расчёт, используя локальные данные по странам. Даже если управление ручное, всё равно, думаю, можно рассчитать введение ручного управления. Ведь тот, кто управляет вручную, делает это с определённой целью, значит есть план, последовательность действий, и их можно увидеть.
                Я слышал, что вроде бы есть какая-то модель глобальной экономики и есть программа, которая пытается что-то там симулировать. Хотелось бы лучше про это узнать.

                Кстати, нейронные сети используются при прогнозе погоды? Там же вроде бы всё периодическое :) Насколько я слышал и видел, там используются решатели систем диффуров, как, в общем, и много где (симулировании электроники).
                  +7
                  От того, что вы делаете прогноз погоды, погода не изменится. От того, что какой-то (более-менее) доступный крупным участникам рынка инструмент выдает некоторый прогноз, меняется поведение участников рынка.
                    0
                    Кого пугают обратные связи в вычислительном смысле? Информацию из «будущего» можно подать на вход в настоящем (рекурсивные цифровые фильтры). Проблема в адекватном описании локального во времени поведения системы. Для прогноза погоды, насколько я видел, поверхность планеты делят на локальные участки и для каждого решают систему диффуров, которая описывает упрощённую модель поведения атмосферы. Берут реальные локальные данные и получают расчетный результат на небольшое время вперёд. Периодически решение корректируется, сравнивая результат с текущим состоянием.

                    Не обязательно иметь формулу всего. Можно разбить мировую экономику на локальные участки, задать простые правила (начать с правил Кирхгофа для потоков, ведь для электроники, труб и транспорта они работают), взять начальные условия и выполнять расчёт на небольшой период времени вперёд, потом корректировать результат по текущим данным. Постепенно модели уточнять. По-моему это должно выглядеть так, а не использование каких-то мифических нейронных сетей на выборке из суммарных трендов.
                      0
                      Пример. Я спрашиваю у алгоритма — что завтра на рынке будет дороже, яблоки или груши? Загружаю данные об урожае, сезоне, спросе и фазе луны. Получаю прогноз — яблоки. Затариваюсь яблоками и… Бах! Я — крупный, но не монопольный игрок. Таких игроков еще с десяток и все с таким же алгоритмом. На рынке избыток предложения яблок, цена падает. Что бы не предсказал алгоритм, мы своими действиями рушим его предсказание, даже если заведем свои решения в этот алгоритм. Инсайд, известный всем крупным игрокам, это уже не инсайд.

                      Если вам хочется в терминах теории систем, то может возникнуть, условно говоря, алгебраическая петля, не имеющая разрешения. Есть реализуемый (proper) объект «алгоритм», есть реализуемый объект «я, крупный игрок». А замкнутая система из двух объектов оказывается уже not proper, физически не реализуемой. Так бывает.
                        0
                        Мне хочется в терминах ЧЯ (черного ящика). Если поведение системы повторяемо и я могу анализировать состояние на входе и выходе, то я могу построить модель системы в своих терминах, не обязательно точно соответствующую реальной.
                        Если система нелинейная, то её разбивают на линейные куски, которые аппроксимируют нелинейную зависимость.

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

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

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

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

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

                              Поэтому можно предусмотреть такие же «ключи» для ручного включения или отключения дополнительных вычислительных модулей или данных. Да, текущая ситуация в данном случае будет отличаться от расчетной, но дальше то тоже нужно думать что делать. Мы корректируем модель (данные) и опять делаем расчёт.

                              Также ведь никто не мешает моделировать коридор для текущего результата расчёта. Если кто занимался теорией надежности на практике, то в лабораторных (у радиотехников) были задания по анализу устойчивости выходных параметров схемы при варьировании величин её частей. Это нужно для предъявления допусков для деталей, т.к. схема может быть рассчитана для одних номиналов, а по факту есть другие.

                              Таким же образом делаем вероятные предположения для «ожиданий», включаем их в разные части модели и рассчитываем наихудшие и наилучшие варианты расчетов «ожиданий». Делаем заготовки что делать при худшем или лучшем расчете. В радиотехнике есть анализ методом Монте-Карло, когда величины элементов варьируются случайным образом, после чего смотрят на разброс параметров системы. Точно так же можно и его использовать и найти самый худший вариант.

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

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

                                Ограничение набора предположений — и есть тот самый фундаментальный анализ, который редко рассматривает прошлые цены.
                      0
                      Не превратится ли такой прогноз в Самоисполняющееся пророчество?
                        0
                        Это будет не прогноз, а расчет, котрый делается не один раз, а периодически повторяется с учетом вновь поступивших данных. Я больше практик, чем теоретик и в такого рода вопросах про курицу и яйцо я сторонник подхода: покажите мне конкретное яйцо с курицей и я скажу кто был первым.

                        Если расчет делать периодически, то он мог бы учесть действия участников рынка при получении предыдущих данных. У меня есть уверенность, что существующих вычислительных мощностей хватило бы для подобного рода расчетов, учитывая, что сейчас таким образом рассчитывается погода по всей планете.
                          0
                          Тут скорее всего имели в виду, если есть супер программа вычисляющая курсы валют для Форбса и значительная часть следует её указаниям, то с большой вероятностью даже совершенно случайные прогнозы будут сбываться.
                        0
                        Проблема кроетася в задаче трех тел. Смысл в том, что выходные данные модели сильно зависят от точности входных. И зависимость эта нелинейна. Т.е. с ростом времени на которое делается прогноз, требование к точности входных параметров очень быстро устремляется к бесконечности.
                        +3
                        Очень любопытно посмотреть на вашу экстраполяцию, но с отступом в прошлое, например на год, а потом сравнить экстраполяцию и реальные показатели цены за этот год. Это позволит оценить на сколько точно прогноз строится и сейчас.
                          0
                          А есть способы работы с несколькими связанными временными рядами? Например, исследовать динамику цен на нефть вместе с климатом.
                            0
                            Возникает чувство что все модели предсказывают одинаково плохо (а точнее вообще никак не предсказывают), просто для одной из моделей результаты случайно оказались более близки к реальности. Tbats, на мой взгляд, кстати в целом показывает картину лучше ARIMA, так как Tbats предсказывает падение, а ARIMA стабильность цены и цена на 6 день очень близка с реальностью (важен не столько график скачков, сколько тенденция прогноза). Увы, сложность экстрополяции на коротких промежутках в том что даже просто генерируя абсолютно случайные графики рано или поздно можно найти похожий на реальность, но это ничего не говорит о качестве модели, модель можно будет считать проверенной если она будет близка к реальности хотя в 2-3 разных временных промежутков.
                              +3
                              Спасибо автору за иллюстрирование возможностей R — для меня лично очень полезно.

                              Однако по поводу
                              Это как бы намекает

                              не намекает — поверьте на слово. Технический анализ не может лежать в основе долгосрочных прогнозов. Когда мой научный руководитель в 2004 при ценах около 45$ за Brent говорил о выходе цен на новый уровень не ниже 100$ — верилось с трудом. Однако ближе к 2008 его прогноз, основанный на данных фундаментального анализа, всплыл в памяти. Не уверен, что в 2004 кто-либо из классических «технарей» мог такое предвидеть)

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

                                Only users with full accounts can post comments. Log in, please.