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

Я понимаю, что 2022 год значительно отличается от предыдущих лет. После того, как в начале 2020 года мир потрясла глобальная пандемия вируса COVID-19, было предсказано, что 2022 год станет началом восстановления мировой экономики.

С точки зрения экономики Индонезии мы можем наблюдать, что годовой ВВП в 2022 году, по прогнозам, продолжит свой рост (с темпами роста 5,31%) по сравнению с ВВП в 2021 году. Политика правительства, такая как снижение процентных ставок и реализация монетарных стимул, можно считать успешным в возрождении экономической деятельности.

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

В связи с феноменом пандемии COVID-19 мне интересно найти ответы относительно будущего прогноза инфляции. Можно ли эффективно предсказать инфляцию, учитывая циклический характер экономики? Эта формулировка проблемы побудила меня выбрать эту тему, а именно прогнозирование инфляции с использованием данных процентных ставок с помощью модели векторной авторегрессии (VAR).

Модель векторной авторегрессии (VAR)

Модель векторной авторегрессии (VAR) — это статистический метод, обычно используемый в эконометрике для анализа взаимосвязей между несколькими переменными во времени. Это позволяет нам фиксировать динамические взаимодействия между переменными, моделируя их прошлые значения и современные отношения между ними.

Модель VAR широко используется в эконометрике по нескольким причинам, таким как:

  • Исследование сложных систем. Позволяет анализировать сложные системы с несколькими взаимосвязанными переменными, такими как ВВП, инфляция и процентные ставки.
  • Причинно-следственные связи. Модель VAR может помочь определить причинно-следственные связи между переменными, давая представление о направлении и силе этих взаимосвязей.
  • Гибкость. Модель VAR не навязывает строгих предположений о лежащем в основе процесса генерации данных, что делает ее гибкой основой для учета динамики различных экономических явлений.
  • Возможности прогнозирования. Это позволяет исследователям изучать и прогнозировать экономические переменные, не полагаясь на ограничительные предположения, что приводит к более точному и надежному анализу.

Импорт библиотеки

# preprocessing, visualization, statistical test library
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import statsmodels.api as sm
import math
from datetime import datetime

from statsmodels.tsa.stattools import adfuller
from statsmodels.stats.diagnostic import acorr_ljungbox
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
from sklearn.model_selection import train_test_split
from scipy.stats import pearsonr
from statsmodels.tsa.stattools import grangercausalitytests
from statsmodels.tsa.stattools import coint
from statsmodels.stats.stattools import durbin_watson
from tqdm.notebook import tqdm
from sklearn.model_selection import ParameterGrid

# time series model
from statsmodels.tsa.statespace.varmax import VARMAX

# Error Evaluation
from sklearn.metrics import mean_absolute_percentage_error
from sklearn.metrics import mean_squared_error
from statistics import mean
from sklearn.metrics import mean_absolute_error

Ниже приведены библиотеки, используемые в реализации кода.

Подготовка данных

Данные по инфляции и справочной процентной ставке для Индонезии были получены независимо с сайта центрального статистического агентства (ссылка: https://www.bps.go.id/). Оба данных представлены в месячных единицах и охватывают период с января 2000 г. по октябрь 2022 г.

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

Анализ данных: анализ взаимосвязей со статистическим тестом

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

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

Это код для каждого теста.

# Granger Causality Test
granger_1 = grangercausalitytests(df[['inflation-YoY','suku_bunga']], maxlag=5)

# Pearson Correlation Test
pcor , _ = pearsonr(df['inflation-YoY'], df['suku_bunga'])
print("pearson's correlation: {}".format(pcor))

# Cointegration
co = coint(df['inflation-YoY'], df['suku_bunga'])
print(f'ADF Statistic: {co[0]}')
print(f'p-value: {co[1]}')

Основываясь на результатах тестов корреляции Пирсона, коинтеграции и причинности Грейнджера, мы наблюдаем, что значения p ниже порога значимости 0,05 (5%). Таким образом, мы можем сделать вывод, что:

  • Существует доминирующая связь Грейнджера между процентными ставками и инфляцией.
  • Между этими двумя переменными существует относительно высокая корреляция .
  • Существует долгосрочная коинтеграция.

Стационарный тест

Стационарный набор данных необходим для анализа временных рядов. Есть 2 формы стационарного процесса, а именно стационарный тренд и стационарный разностный. Разностно-стационарный содержит колеблющееся среднее значение стохастического тренда, а тренд-стационарный содержит флуктуирующее среднее значение детерминированного временного тренда.

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

Мы можем наблюдать тенденцию к снижению. Эту тенденцию к снижению также можно увидеть в самых высоких уровнях инфляции за последние годы, начиная с 15% в 2002 г., повышаясь до 17,5% в 2006 г., снижаясь до 12% в 2009 г., далее снижаясь до 8% в 2018 г. и продолжая снижаться. и колеблются в пределах 2–8%.

Таким образом, с учетом долгосрочной тенденции, наблюдаемой в течение последних 20 лет, в модели используется допущение о том, что данные являются стационарными с колебаниями вокруг своей тенденции. Таким образом, в тесте на стационарность с использованием расширенного теста Дики-Фуллера (ADF) мы соглашаемся включить детерминированные переменные тренда в тест ADF. Если данные проходят тест, данные считаются стационарными по тренду.

# regression = 'ct' means the test include constant and trend variable. 
# the default here is regression = 'c', which only include contants variable
ad_fuller_result_1 = adfuller(df['inflation-YoY'], regression='ct')

print('inflasi')
print(f'ADF Statistic: {ad_fuller_result_1[0]}')
print(f'p-value: {ad_fuller_result_1[1]}')

print('\n---------------------\n')

ad_fuller_result_2 = adfuller(df['suku_bunga'], regression='ct')

print('suku bunga')
print(f'ADF Statistic: {ad_fuller_result_2[0]}')
print(f'p-value: {ad_fuller_result_2[1]}')

тест ADF на стационарность применяется путем включения детерминированного тренда в формулу теста единичного корня, чтобы зафиксировать наличие тренда в данных. По результатам теста p-значение для переменных инфляции и процентной ставки ниже уровня значимости 5%. В результате характеристики стационарной формы тренда для обеих переменных.

Моделирование векторной авторегрессии (VAR)

После проведения тестов на стационарность переходим к процессу моделирования. Здесь мы начинаем с:

  • Интерпретация графиков функции автокорреляции (ACF) и функции частичной автокорреляции (PACF). Эти графики помогают нам понять взаимосвязь корреляции и запаздывания в данных. ACF показывает корреляцию переменной с ее лаговыми значениями, а PACF показывает корреляцию между переменной и ее лаговыми значениями после устранения эффектов промежуточных лагов.
  • Выбор порядка модели векторной авторегрессионной скользящей средней (VARMA) на основе значения информационных критериев Акаике (AIC). Критерий AIC помогает нам выбрать оптимальный порядок, уравновешивая точность модели с ее сложностью. . Более низкие значения AIC указывают на лучшую производительность модели.
  • Выполнение моделирования на обучающих данных. После того, как мы определили порядок модели VARMA, мы можем оценить параметры модели и подогнать ее к обучающим данным, чтобы зафиксировать отношения и динамику между переменными.
# ACF and PACF graph
fig,ax = plt.subplots(4,1,figsize=(12,25))
fig = plot_acf(df['inflation-YoY'], alpha=.05, lags = 40, zero=False, ax=ax[0], title='ACF of inflation')
fig = plot_pacf(df['inflation-YoY'], alpha=.05, lags = 40, zero=False, method='ywm', ax=ax[1], title='PACF of inflation') 
fig = plot_acf(df['suku_bunga'], alpha=.05, lags = 40, zero=False, ax=ax[2], title='ACF of interest rates')
fig = plot_pacf(df['suku_bunga'], alpha=.05, lags = 40, zero=False, method='ywm', ax=ax[3], title='PACF of interest rates')
plt.show()

Для инфляции

  • Лаговая АКФ инфляции сходит на нет или постепенно уменьшается, указывая на отсутствие значительных заказов для модели MA или MA(0).
  • Лаг PACF инфляции обрывается при лаге 3, поэтому для порядка p выбирается лаг перед отсечкой, равный лагу-2. Поэтому выбирается AR(2).

Для процентной ставки

  • Лаговая АКФ процентных ставок сходит на нет или постепенно уменьшается, указывая на то, что выбрана MA(0).
  • Лаг PACF процентных ставок показывает отсечки при лаге-4 и лаге-8. Таким образом, выбранная задержка находится между задержкой-3 и задержкой-7, что предполагает порядок AR(3) или AR(7).

Таким образом, комбинация MA(0) и AR(2), AR(3), AR(7) или любое значение ниже 7 считается оптимальным порядком для модели.

# Selecting the order of VARMA model based on the lowest AIC 
param_grid = {'p': [1,2,3,4,5,6,7], 'q':[0], 'tr': ['ct']}
pg = list(ParameterGrid(param_grid))

col = ['inflation-YoY', 'suku_bunga']
df_col = df[col]

df_fitted_VARMA = pd.DataFrame(columns=['p', 
                                         'q', 
                                         'tr',
                                         'AIC'])

for a,b in enumerate(pg):
    p = b.get('p')
    q = b.get('q')
    tr = b.get('tr')
    model = VARMAX(df_col, order=(p,q), trend=tr, freq='MS')
    model_fit = model.fit(maxiter=30, disp=False)

    # find AIC
    aic = model_fit.aic

    # append into the list
    dtemp = {'p': [p],
             'q': [q],
             'tr':[tr],
             'AIC':[aic]}
    temp = pd.DataFrame(dtemp)
    df_fitted_VARMA = pd.concat([df_fitted_VARMA, temp])

    # sort the AIC's model order combinations 
    df_fitted_VARMA.sort_values(by=['AIC']).head()

Наименьшее значение информационных критериев Акаике (AIC) наблюдается для порядка p = 5 и q = 0. Следовательно, полученная модель представляет собой VARMA (5,0) или VAR (5).

# Modeling
# Here we do the one step ahead forecast
plt.rcParams["figure.figsize"] = (20,7)

df_pred = pd.DataFrame()

n = len(df_test)
for i in tqdm(range(n)):
    
    training_data = df[['inflation-YoY','suku_bunga']][:(-n+i)]
    
    varma_model = VARMAX(endog=training_data, order=(5,0), trend='ct', enforce_stationarity=True, freq='MS')
    varma_model_fit = varma_model.fit(maxiter=30, disp=False)
    pred_temp = varma_model_fit.get_forecast(1).summary_frame()
    df_pred = pd.concat([df_pred, pred_temp])

df_pred['inflation-YoY'] = df['inflation-YoY'][-n:]

ax = df_pred['inflation-YoY'].plot(label='observed',color = 'green', figsize=(12,8))
df_pred['mean'].plot(ax=ax, label='one step ahead forecast', color ='red', alpha=.7, figsize=(12,8))
ax.fill_between(df_pred.index,
                 df_pred['mean_ci_lower'],
                 df_pred['mean_ci_upper'], color='lightblue', alpha=0.5)
ax.set_xlabel('date')
ax.set_ylabel('inflasi')
plt.title('VARMA{}, Inflasi'.format(varma_model.order))
plt.legend(['actual','forecast'])
plt.grid()
plt.show()

Основываясь на результатах, прогноз модели является точным, когда колебания инфляции с течением времени минимальны. Однако внезапные и значительные изменения инфляции (увеличение или уменьшение) могут негативно сказаться на эффективности модели, поскольку она медленно реагирует на такие изменения. Например, заметное увеличение инфляции примерно на 4% произошло всего за 10 месяцев с января по октябрь 2022 года. Напротив, с середины 2020 года до конца 2021 года динамика инфляции оставалась на уровне около 1,5%-2% и слегка колебалась. .

Оценка: расчет средней абсолютной ошибки в процентах (MAPE)

mape = mean_absolute_percentage_error(df_pred['mean'],  df_pred['inflation-YoY'])
print("----------------------------------------------------")
print("Mape :{}".format(round(mape, 3)))

Чтобы поддержать производительность сгенерированной модели VAR(5) и увидеть влияние процентной ставки, используемой на результат прогнозирования, в качестве модели сравнения выбран одномерный аналог, модель авторегрессионного скользящего среднего (ARMA). На основе значения AIC каждой комбинации заказов в модели ARMA была выбрана модель ARMA(2,10), что означает использование моделей AR(2) и MA(10).

Основываясь на значении MAPE для каждого сценария, можно сказать, что модель VAR может прогнозировать более оптимально по сравнению с моделью ARMA.

Заключение

  • Создание модели VARMA для прогнозирования инфляции может включать в себя включение процентных ставок на основе сильной связи Грейнджера между процентными ставками и инфляцией.
  • Модель VARMA (5,0) или VAR(5) превосходит модель ARMA по значениям MAPE. Указывает на несколько улучшенную производительность с включением процентных ставок.
  • Эффективность модели может снижаться в определенные периоды из-за ее неспособности отражать внезапные изменения инфляции или непредвиденные потрясения.

Для будущих исследований можно сделать некоторые обновления, например:

  • Включение экзогенных переменных, отличных от процентных ставок, и нелинейных членов может повысить производительность модели при учете внезапных изменений и учете нелинейности между переменными.