Türkiye’nin Enflasyonu Üzerine Makroekonomik Bir Gösterge Panosu

Giriş 

Enflasyon günümüzde hem küresel anlamda hem Türkiye için sıcak bir konudur. Rami Krispin’den ilham alarak onun ABD Elektrik göstergeler tablosunu tersine çevirdim ve Türkiye’deki enflasyon tahminini keşfetmek için bir göstergeler tablosu  oluşturdum. Bu gönderide, gösterge tablosunu oluşturmaya giden bazı teknolojilerden bahsetmeye başlamak istiyorum. Veriler ve makine öğrenimi ardışık düzenleri Docker, Github Actions ve R Markdown aracılığıyla otomatikleştirilir. Pano, tek bir blog gönderisinde ele alınamayacak kadar çok boyuta sahip, bu nedenle bu blog gönderisinde, temel ekonomiye ve seçtiğim tahmin yöntemi olan Elastic Net’e odaklanıyorum. Önümüzdeki blog yazılarında, flexdashboard, Docker gibi farklı yönler veya Keras on R kullanarak LSTM gibi daha ilginç bir tahmin yöntemi hakkında yazabilirim.  

Başlayalım  

Öncelikle gerekli kütüphaneleri ve veri setini yüklüyoruz. 

library(tidyverse)
library(lubridate) 
library(caret)
library(zoo)
library(ggthemes)
library(magick)

load("processed_data.Rdata")

Veri seti 

Veri seti aylık makroekonomik değişkenlerden oluşmaktadır. Bağımlı değişken, CPI’daki Y-o-Y değişimidir ve bağımsız değişkenler aşağıdakilerin gecikmeleridir  

  • Fiyat endeksleri 
  • Ekonomik ajanların eğilim anketleri 
  • Üretim istatistikleri 
  • Ödemeler dengesi istatistikleri 
  • Döviz kuru getirisi  
  • Ay (mevsimselliği hesaba katmak için) 
  • TBATS modelinin CPI Tahmini (yığınlama yöntemlerinden esinlenilmiştir) 

İlk olarak, yalnızca geriye dönük önyargıdan veya “her şeyi biliyordu” fenomeninden kaçınmak için gecikmeleri dahil ettim. Örneğin bugün itibarıyla model Mart enflasyonunu öngörüyor. Ancak Mart istatistikleri henüz açıklanmadı. Model Mart istatistiklerini kullanacak şekilde oluşturulmuşsa, gerçek hayattaki tahminde hiçbir değeri yoktur. 

İkincisi, analiz faiz oranlarının enflasyon üzerindeki etkisini kapsamamaktadır. Bunun nedeni, aylık değişkenleri çekmek için önceden yazılmış bir komut dosyam olması. Bu nedenle frekansı ayarlamak için zaman harcamak istemiyorum. Ayrıca, faiz oranının etkisi zaten biliniyor. Merkez bankaları, enflasyonu yönetmenin birincil aracı olan faiz oranlarını değiştirerek paranın fiyatını (veya borçlanma maliyetini) değiştirir. Faiz oranındaki artışın iki etkisi vardır: Birincisi, borçlanmayı daha maliyetli hale getirir, böylece insanlar tüketimini erteler. İkincisi, finansal varlıkların bugünkü değerini azaltabilir. Dolayısıyla, negatif bir servet etkisi yaratmak. Her iki etki de enflasyonist baskıların hafiflemesine neden oluyor. 

Eğitim verisi; 

forecast_date = "2022-03-31"

train_data <- forecast_df %>% 
  filter(Date < forecast_date)

tail(train_data,3)
## # A tibble: 3 × 94
##   Date         CPI CPI_Lag1 CLI_Lag1 Domestic_PPI_Lag1 Inflation_Expectation_La…
##   <date>     <dbl>    <dbl>    <dbl>             <dbl>                     <dbl>
## 1 2021-12-31 0.361    0.213     102.             0.546                      15.6
## 2 2022-01-31 0.487    0.361     102.             0.799                      21.4
## 3 2022-02-28 0.544    0.487     101.             0.935                      25.4
## # … with 88 more variables: FS_Confidience_Lag1 <dbl>,
## #   RS_Confidience_Lag1 <dbl>, Production_Volume_Lag1 <dbl>,
## #   Export_Orders_Lag1 <dbl>, BoP_Lag1 <dbl>, Utilization_Rate_Lag1 <dbl>,
## #   Consumer_Confidience_Lag1 <dbl>, Import_Annual_Ret_Lag1 <dbl>,
## #   Import_Monthly_Ret_Lag1 <dbl>, UsdTry_Annual_Ret_Lag1 <dbl>,
## #   UsdTry_Monthly_Ret_Lag1 <dbl>, CPI_Lag2 <dbl>, CLI_Lag2 <dbl>,
## #   Domestic_PPI_Lag2 <dbl>, Inflation_Expectation_Lag2 <dbl>, …

Test verisi; 

test_data <- forecast_df %>% 
  filter(Date  == forecast_date)

head(test_data)
## # A tibble: 1 × 94
##   Date         CPI CPI_Lag1 CLI_Lag1 Domestic_PPI_Lag1 Inflation_Expectation_La…
##   <date>     <dbl>    <dbl>    <dbl>             <dbl>                     <dbl>
## 1 2022-03-31    NA    0.544     101.              1.05                      24.8
## # … with 88 more variables: FS_Confidience_Lag1 <dbl>,
## #   RS_Confidience_Lag1 <dbl>, Production_Volume_Lag1 <dbl>,
## #   Export_Orders_Lag1 <dbl>, BoP_Lag1 <dbl>, Utilization_Rate_Lag1 <dbl>,
## #   Consumer_Confidience_Lag1 <dbl>, Import_Annual_Ret_Lag1 <dbl>,
## #   Import_Monthly_Ret_Lag1 <dbl>, UsdTry_Annual_Ret_Lag1 <dbl>,
## #   UsdTry_Monthly_Ret_Lag1 <dbl>, CPI_Lag2 <dbl>, CLI_Lag2 <dbl>,
## #   Domestic_PPI_Lag2 <dbl>, Inflation_Expectation_Lag2 <dbl>, …

Modelleme 

Birden çok makine öğrenimi algoritmasını değerlendirdim: Elastik Ağ, genelleştirilmiş doğrusal modeller, Rastgele Orman ve Destek Vektör Makineleri. Elastic Net’in çok önemli avantajları olduğuna karar verdim. İlk olarak, açıklayıcı değişkenler arasında çok yüksek bir korelasyon vardır. Belirli bir değişkenin birden çok gecikmesini dahil ettiğime dikkat edin. Ayrıca, iki farklı değişkenin birden fazla makroekonomik kanal aracılığıyla ilişkileri olabilir. Bu nedenle çoklu doğrusal bağlantı dikkate alınmalıdır. İkinci olarak, model sonuçlarını stilize edilmiş makroekonomik gerçeklerle doğrulamak için yorumlanabilir bir modeli tercih ediyorum. Üçüncüsü, bu durumda, Destek Vektör Makineleri veya Rastgele Orman gibi daha karmaşık modellere kıyasla daha yüksek performansa (RMSE ve MAPE açısından) sahiptir. Bu nedenle, Elastic Net yorumlanabilirlik, performans ve hız için bana tatlı bir nokta sağlıyor. 

Peki, Elastik Ağ Nedir? L_1 ve L_2 cezalarını doğrusal olarak birleştiren düzenli bir regresyon tekniğidir. Temel olarak, LASSO ve Ridge regresyonlarının bir kombinasyonudur. Başka bir deyişle, katsayıların bir grubunu sıfıra ayarlar ve kalanları sıfıra doğru küçültür. 

Matematiksel olarak, Elastic Net aşağıdaki denklemi optimize eder: 

LASSO, Ridge ve Elastic Net cezaları arasında görsel karşılaştırma:  

magick::image_read(path = "elastic-net.png")

Kaynak: Zou, H., & Hastie, T. (2005). Regularization and variable selection via the elastic net.

# Construct time slices for time-series cross validation

time_slices <- trainControl(
  method = "timeslice",
  initialWindow = 36,
  fixedWindow = TRUE,
  horizon = 3,
  savePredictions = TRUE,
  verboseIter = FALSE
)

# Train the model

elastic_net_fit <- train(
  CPI ~ .,
  data = train_data[,-1],
  na.action = "na.pass",
  method = "glmnet",
  preProcess = c("center", "scale"),
  trControl = time_slices
)

Hiper parametreleri ayarlamak ve model performansını değerlendirmek için sabit bir pencere boyutuna sahip zaman serisi çapraz doğrulama kullanıyorum. Benim fikrim, enflasyon dinamiklerinin gelişebileceği yönünde. Örneğin son yıllarda döviz kurunun enflasyon üzerindeki artan etkisini gözlemledik. Ancak emtia süper döngüsünün bir sonucu olarak, üretici fiyat endeksinin devreye girdiğini görebiliriz. Bu nedenle zamana göre daha esnek bir model yapısına sahip olmak mantıklıdır. 

Bu durumda model ilk 36 gözlem üzerinde eğitilir ve test setindeki ardışık 3 değer üzerinden değerlendirilir. Ardından, zaman dilimi bir ay kayar. 

Sonuçlar  

İlk olarak, en iyi hiper parametreleri alıyorum ve seçilen modelin tahminlerini topluyorum. 

# Visualize results

lasso_preds %>% 
  rename(Actual = CPI,
         Forecasted = pred) %>% 
  gather(key = "Variable", value = "Value", Actual:Forecasted) %>% 
  ggplot(aes(x = Date, y = Value, color = Variable))+
  geom_line(size = 0.75, alpha = 0.5)+
  geom_point(size = 0.75, alpha = 0.75)+
  scale_color_manual(values = c("steelblue4", "darkred"))+
  theme_bw()+
  scale_y_continuous(labels = scales::percent)+
  scale_x_date(breaks = seq(min(lasso_preds$Date), 
                            max(lasso_preds$Date), 
                            by="4 months"),
             date_labels = '%m-%y')+
  labs(x = "",
       y = "",
       subtitle = "Based on YoY CPI changes",
       title = "One-month ahead inflation forecast",
       color = "")+
  expand_limits(y = 0)+
  theme(plot.subtitle = element_text(face = "italic"))

Grafik, yıllık TÜFE değişikliklerine dayalı fiili enflasyonu  ve bir aylık enflasyon tahminini gösteriyor. 

lasso_preds %>% 
  ggplot(aes(x = pred, y = CPI))+
  geom_point(size = 1.5, alpha = 0.8, color = "darkred")+
  geom_abline(intercept = 0, 
              slope = 1, 
              size = 0.3, 
              linetype = 3, 
              alpha = 0.8, 
              color = "steelblue4")+
  theme_bw()+
  scale_y_continuous(labels = scales::percent)+
  scale_x_continuous(labels = scales::percent)+
  expand_limits(y = 0, x = 0)+
  labs(title = "Model Prediction & True Value",
       x = "Model Prediction",
       y = "True Value")

İkinci grafik, gerçek değerlere karşı tahminleri gösterir. Noktaların 45 derecelik çizgi etrafında yığıldığını görmeyi beklersiniz. Model, aşağıdaki grafikte daha belirgin hale gelecek olan üç aykırı değer dışında tahminlerinde tutarlı görünüyor. 

lasso_preds %>% 
  mutate(Residual = CPI - pred) %>% 
  ggplot(aes(x = Date, y = Residual))+
  geom_point(size = 1.5, alpha = 0.8, color = "steelblue4")+
  geom_ribbon(stat='smooth', se=TRUE, alpha=0.05) +
  geom_line(stat='smooth', alpha=1, color = "darkred")+
  theme_bw() +
  labs(y = "Residuals",
       x = "",
       title = "Elastic Net Model Residuals",
       subtitle = "Over time")+
  scale_y_continuous(labels = scales::percent)

Üçüncü grafik, zaman içindeki model artıklarını gösterir. Model performansının zamanla arttığına (2021’e kadar), düzleştirilmiş artık eğrinin sıfıra yaklaştığına ve aykırı değerlerin sıklığının azaldığına dikkat edin. Ancak 2021 yılından itibaren model performansı ekonomik şoklar nedeniyle bozulmaya başlamıştır. Dikkate alınamayacak farklı bir dinamik devreye giriyor. 

var_names <- coef(elastic_net_fit$finalModel, 
                  elastic_net_fit$finalModel$lambdaOpt) %>% 
  rownames()

var_values <- coef(elastic_net_fit$finalModel, 
                   elastic_net_fit$finalModel$lambdaOpt) %>% 
  as.numeric()

model_result <- tibble(Variable_Names = var_names,
                       Coefficients = var_values)

model_result %>% 
  mutate(Variable = gsub('[[:digit:]]+', '', 
                         str_remove(model_result$Variable_Names, 
                                    "_Lag"))) %>% 
  group_by(Variable) %>% 
  summarise(Overall_Effect = sum(Coefficients)) %>% 
  filter(!Overall_Effect == 0) %>%
  filter(!Variable == "(Intercept)") %>% 
  mutate(If_Positive = ifelse(Overall_Effect >0, "Positive", "Negative")) %>% 
  mutate(Sum = sum(abs(Overall_Effect))) %>% 
  mutate(Percent_Effect = Overall_Effect / Sum) %>% 
  ggplot(aes(x = reorder(Variable, abs(Overall_Effect)), y = abs(Percent_Effect), fill = If_Positive))+
  geom_col(alpha = 3)+
  scale_y_continuous(labels = scales::percent)+
  expand_limits(y = c(0,0.45))+
  coord_flip() +
  labs(y = "",
       x = "",
       fill = "",
       title = "The weighted effects macroeconomic variables on Turkey's Inflation",
       subtitle = "Shows the overall effect through different lags", 
       caption = "Source: CBRT")+
  theme_bw()+
  scale_fill_wsj()

Son grafik, makroekonomik değişkenlerin Türkiye enflasyonu üzerindeki ağırlıklı etkisini göstermektedir. İki şeye dikkat edin. Birincisi, x eksenindeki değerler katsayılar değil, her bir değişkenin toplam etkideki payıdır. İkincisi, çoklu gecikmelerden gelen genel etkiyi gösterir. Öngörü yeteneklerinin ötesinde, bulgular makroekonomik gerçeklerle tutarlıdır. Model sonuçlarını yorumlamak istediğimizi unutmayın. Birincisi, TÜFE’nin en yüksek payı, enflasyondaki iyi bilinen “atalet” olgusunu teyit etmektedir.” Atalet”, tüm ekonomideki fiyatların, fiyat endeksindeki değişimle uyum sağladığı bir durumu ifade eder. Bu nedenle, kendi kendini idame ettiren bir durum yaratır.  

İkinci olarak, ithalat fiyatlarındaki yıllık değişimlerin etkisi TÜFE’yi takip etmektedir. Türkiye enflasyonunun en önemli belirleyicilerinden biri olarak biliniyor. Esas olarak Türkiye ekonomisinin ve üretiminin yapısından kaynaklanmaktadır. Enflasyon beklentileri üçüncü en yüksek etkiye sahiptir. 

Son olarak, yurt içi üretici fiyat endeksi, “geçişlilik etkisi” ile tutarlı olarak görece daha yüksek ağırlıklı bir değişkendir. Üretici fiyat endeksi şoklara karşı duyarlılığının yüksek olması nedeniyle daha oynaktır, ancak uzun vadede üretici ve tüketici fiyat endekslerinin birlikte hareket etmesi beklenmektedir. Bu nedenle, nispeten kısa vadeli bir analizde (altı ayı kapsayan), kısmi bir “geçiş” etkisi gözlemliyoruz.