Прогнозирование – это важный инструмент экономики. Оно позволяет осуществлять рациональные закупки, вырабатывать долгосрочные планы действий или же, как в случае аудита, спрогнозировать будущие затраты. Прогнозирование так же является одной из областей Data Science.

Давайте рассмотрим создание простой прогнозной модели на основе линейного тренда с помощью эконометрических методов.

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

import pandas as pd
excel_data_df = pd.read_excel('analysis.xlsx')
excel_data_df.head()

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

8

12

11

9

10

 

 

(8+12+11+9+10)/5

 

 

8

12

10

9

10

Есть так же формула взвешенной скользящей средней. Его отличие в том, что вес центральной точки при перерасчете удваивается:

8

12

11

9

10

 

 

(8+12+(2*11)+9+10)/6

 

 

8

12

10,2

9

10

Данный способ прост и легко применим. Однако имеет и свои недостатки: так, мы либо теряем крайние значения ряда, либо оставляем их в исходном виде.

Но, применим его с сохранением исходных крайних точек, остановившись на последовательности из трех элементов:

yts = []
yts.append(excel_data_df['yt'][0])
i=0
for element in excel_data_df['yt']:
  i=i+1
  if(i>excel_data_df['yt'].size-2):
    pass
  else:
    yts_per = (excel_data_df['yt'][i-1]+2*excel_data_df['yt'][i]+excel_data_df['yt'][i+1])/4
    yts.append(yts_per)
yts.append(excel_data_df['yt'][i-1])

На выходе получим новый столбец:

excel_data_df['yts'] = yts
excel_data_df.head()

Теперь построим графики, сравнив исходные данные и данные, после применения сглаживания (синий – исходные данные, оранжевый – сглаженные):

import matplotlib.pyplot as plt
plt.plot(excel_data_df['t'], excel_data_df['yt'])
plt.plot(excel_data_df['t'], excel_data_df['yts'])

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

t_list=excel_data_df['t'].values.tolist()
yts_list=excel_data_df['yts'].values.tolist()
i=0
t_sum=0
t2_sum=0
yts_sum=0
ytst_sum=0
while i<len(t_list):
  t_sum=t_list[i]+t_sum
  t2_sum=t_list[i]*t_list[i]+t2_sum
  yts_sum=yts_list[i]+yts_sum 
  ytst_sum=yts_list[i]*t_list[i]+ytst_sum
  i=i+1
print("Сумма по t:", t_sum, "| Сумма по t^2:", t2_sum, "| Сумма по yt:", yts_sum, "| Сумма по yt*t:", ytst_sum)

Первый коэффициент (возьмем за k1) – это количество значений ряда (t). В нашем случае – это 30.

Второй коэффициент (k2) – это сумма по t.

Третий коэффициент (k3) – сумма по t в квадрате.

Четвертый коэффициент (k4) – сумма значений ряда (y при t)

Пятый коэффициент (k5) – сумма по y умноженному на t. Получив эти данные, строим СЛАУ вида:

Подставим наши значения:

Теперь надо найти b0 и b1, воспользуемся библиотекой numpy:

import numpy as np
Matrix = np.array([[len(t_list), t_sum], [t_sum, t2_sum]]) 
Vektor = np.array([yts_sum, ytst_sum]) 
result_slau=np.linalg.solve(Matrix, Vektor)
print(result_slau)

Массив Matrix – это левая часть СЛАУ, массив Vektor – свободные члены или же правая часть СЛАУ.

Получив корни, можем построить функцию вида:

что и является линейным трендом.

Наш тренд:

для простоты восприятия.

b1– это неслучайная функция, описывающая связь значения и времени, а b— это случайное отклонение. Сверим полученную формулу с расчетами Excel:

Сверим полученную формулу с расчетами Excel:

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

Грубо говоря – это точность прогноза. Значение больше 0,8 говорит о хорошей предсказуемости. Наша же модель имеет предсказуемость 0,96. При значении меньше 0,8, стоило бы обратить внимание на другие модели, допустим экспоненциальную и полиномиальную.

Таким образом, у нас получилось быстро и точно создать простейшую прогнозную модель. И, наконец, остается только посмотреть на полученный прогноз:

Код и исходные данные можно найти на: https://github.com/ikarteeva/econometrictrend

Комментарии (12)


  1. MilashchenkoEA
    15.10.2021 07:25
    +4

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


    1. GospodinKolhoznik
      15.10.2021 21:22

      Хорошо предсказывается цена акций по вчерашним данным. Просто не надо от этого прогноза пытаться взять больше, чем он может дать.

      Если вчера акция стоила 101, позавчера 98, до этого 103, а ещё днем раньше 102, то скорее всего и завтра она будет стоить около 100. Не миллион, не миллиард, и не 10^666 а примерно 100. Нормально прогнозируется. А то, что с помощью этого нельзя обоготиться, это не проблемы прогноза, а проблемы того, что умников-прогнозистов то поди много, а зайцев поди мало!


      1. YuryB
        16.10.2021 22:12

        :) самый точный прогноз насчёт того что будет завтра - примерно тоже что и сегодня, проблема только в том, что со временем прогнозное и фактическое разбегутся, т.е. такой прогноз не имеет практического смысла, т.к. из него невозможно извлечь полезных данных, кроме "растём" или "падаем".


        1. GospodinKolhoznik
          17.10.2021 12:35

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

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

          А для таких вещей как температура воды в море, например, скользящее среднее работает отлично. Мы понимаем, что теплоемкость воды большая, следовательно температура меняется медленно, и что если вчера вода была 26, а позавчера 25, то и сегодня температура воды будет комфортная для того, чтобы в ней купаться.


    1. ba965
      18.10.2021 06:07

      А как бы вы сделали прогноз,и какие методы вы бы использовали?


    1. NewTechAudit Автор
      18.10.2021 09:08

      Добрый день! Статья нацелена на развитие понимания основ работы подобных методов. Спасибо за проявленное внимание)


  1. MilashchenkoEA
    17.10.2021 09:57

    О том и речь, по трендам и т. п. можно только надеяться, что сегодня будет примерно тоже, что и вчера, но надежды могут не оправдаться.


    1. NewTechAudit Автор
      18.10.2021 09:09

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


  1. Vendings
    18.10.2021 06:07
    +3

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


    1. NewTechAudit Автор
      18.10.2021 09:11

      Добрый день! В начале статьи говорится о том что генезис не имеет значения. Это не решение прикладной задачи, а создание простейшей модели, которая ни на что не претендует. Отнеситесь к этому как к чему-то более абстрактному и спасибо за Ваши уточнения)


  1. Andrey_Khohlov
    18.10.2021 06:07
    +2

    1. Перед применением сглаживания, хорошо вычленит и зафиксировать периодичность.

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

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


    1. NewTechAudit Автор
      18.10.2021 09:12

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