Экспоненциальное сглаживание с учетом тренда и сезонности. Метод Холта-Винтерса

Возвращаясь к экспоненциальному сглаживанию...

 

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

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

 

Метод получил название Холта-Винтерса по именам разработчиков: Холт предложил метод учета тренда, Винтерс добавил сезонность.

 

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

,

где Lt — усредненный по известному правилу «общий уровень», то при наличии тренда появляется поправка


,

то есть к общему уровню добавляется оценка тренда. Причем как общий уровень, так и тренд мы будем усреднять независимо по методу экспоненциального сглаживания. Что понимается под усреднением тренда? Мы предполагаем, что в нашем процессе присутствует локальный тренд, определяющий систематическое приращение на одном шаге — между точками t и t-1, например. И если для линейной регрессии линия тренда проводится по всей совокупности точек, мы считаем, что более поздние точки должны вносить больший вклад, поскольку рыночное окружение постоянно меняется и более свежие данные более ценны для прогноза. В итоге Холт предложил использовать уже два рекуррентных соотношения — одно сглаживает общий уровень ряда, другое сглаживает трендовую составляющую.


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

  1. Начальный уровень равен первому значению ряда, начальный тренд равен нулю.

  2. Берем первые несколько точек (штук 5), проводим линию регрессии (ax+b). Начальный уровень задаем как b, начальный тренд как a.

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

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

 

Поэтому (вслед за господином Винтерсом) усложним модель и будем делать прогноз с учетом сезонности:


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




где s — лаг сезонности.

 

И вновь заметим, что выбор начальных значений, как и величин постоянных сглаживания — вопрос воли и мнения эксперта.

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

  1. Берем первые 12 точек ряда, чтобы нивелировать сезонность.

  2. Проводим линию регрессии

  3. Задаем начальное значение уровня 1021,41

  4. Задаем начальное значение тренда 26,24

  5. Задаем начальные значения 12ти сезонных коэффициентов как факт, деленный на значение регрессии в точке

 

Теперь начальные значения определены.

 

  1. Идем по процедуре, получая сглаженный уровень
  2. Для интереса нарисуем модель с учетом сезонности

  3. Создаем прогноз уровня на 12 точек вперед

  4. И прогноз с учетом сезонности

 

Результаты всего этого безобразия:

Заключение

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

У Вас:
Lt = a * Yt / St-s + (1-a) * (Lt-1 - Tt-1)

Правильно так:
Lt = a * Yt / St-s + (1-a) * (Lt-1 + Tt-1)

И еще, спасибо за создание сайта. Очень интересная информация.

In reply to by ivanov

как только найду редактор, нормально генерящий формулы в виде графики, заменю все. по уму лучше бы использовать MathML, но недоделанный IE его не понимает. во всяком случае, вплоть до версии 6. а у нас им пользуются очень многие

у меня вопрос. Я в этой теме сейчас пытаюсь разобраться....

А почему когда мы итоговую модель рассчитываем...получается что для Yt+p мы просто умножаем Lt*St...а не делаем так как по модели ....(Lt+p*Tt)*St....то есть почему не добавляется тренд?

In reply to by olyasfika

у меня вопрос. Я в этой теме сейчас пытаюсь разобраться....

А почему когда мы итоговую модель рассчитываем...получается что для Yt+p мы просто умножаем Lt*St...а не делаем так как по модели ....(Lt+p*Tt)*St....то есть почему не добавляется тренд?

обратите внимание, на шаге 3 сумма как раз и есть L+T. и потом мы ее домножаем на сезонный коэффициент.

In reply to by stanley

Возник очень важный вопрос насчет нахождения формулы L(t). Так как L(t)=a*Y+(1-а)*(L(t-1)+T(t-1) то получаеться формула L(t)=a*(Yt/St-12))+(1-a)*(L(t-1)+T(t-1), а у вас получается L(t)=a*Yt/S(t-12)+(1-a)*(L(t-1)+T(t-1)

 

П.с. прошу ответить скорее .. очень надо спасибо!