Dolar Kurunun Tahmini Üzerine Bir Vaka Çalışması: A Case Study on Forecast of USD Exchange Rate

Daha önce dolar alış kuruna ilişkin olarak bu site üzerinde tanımlayıcı istatistiklere yer verilmişti. Ancak geleceğe yönelik bir tahmin ve öngörü yapılmamıştı.

Bu çalışmada ise T.C. Merkez Bankası Dolar alış kuru kullanılarak tahmin yapılmıştır. Dolar alış kuru tahmininde kullanılan değişken, yaklaşık 40 yıllık günlük “dolar alış kuru” değeridir. Dolar kurunu etkileyen birçok farklı değişken modele sokularak dolar alış kurunun tahmin edilmesi elbette her zaman mümkündür. Bu durumda dolar kuru ve diğer değişkenler arasındaki nedensellik (causality) ilişkisi ortaya konulmasından sonra  model oluşturularak dolar kuru tahmini yapılabilir. Ancak bu çalışmada sadece dolar kurunun kendi içinde izlediği seyir dikkate alınarak model oluşturulmuştur. Deneysel olarak Merkez Bankası veri tabanından 25.04.2019 tarihinde indirilmiş dolar alış kuru verisi üzerinden 02.02.2020 tarihine kadar (dahil) geçen 284 günlük bir tahmin yapılması amaçlanmıştır. Bu kapsamda sırasıyla izlenen adımlar şöyle özetlenebilir:

  1. Merkez Bankası online veri tabanından 02.01.1980 tarihinden 24.04.2019 tarihine kadar (bu tarih dahil) olan günlük dolar alış kuru verisi xlsx olarak indirilmiştir. Gözlem sayı 9915’dir.
  2. Veri seti R programına yüklendikten sonra aylık, yıllık maksimum ve minimum kur değerlerine ilişkin grafikler verilmiştir.
  3. Maksimum ve minimum kur değerleri esas alınarak yıllık ve aylık dalga boyları hesaplanarak grafikleri çizilmiştir. Dalga boyu, ilgili döneme ait maksimum dolar alış kuru değerinin minimum dolar alış kuru değerinden farkının minimum dolar alış kuru değerine bölünerek 100 ile çarpılmasını ifade etmektedir. Dalga boyu en yalın ifadeyle aşağıdaki eşitlik yardımıyla hesaplanmıştır: Dalga Boyu= ((Maksimum Kur Değeri-Minimum Kur Değeri) / Minimum Kur Değeri) X 100
  4. 02.01.1980 tarihinden 24.04.2019 tarihine kadar zaman serisi oluşturularak dolar alış kurunun izlediği seyir zaman serisi bağlamında ele alınmıştır. Bu kapsamda dolar alış kurunun seyri farklı dönemlere göre ayrıştırılmıştır.
  5. TBATS (Exponential smoothing state space model with Box-Cox transformation, ARMA errors, Trend and Seasonal components) metodu kullanılarak 25.04.2019 tarihinden 02.02.2020 tarihine kadar (dahil) geçen 284 günlük bir tahmin yapılmıştır. Tahmin edilen son tarih olarak 02.02.2020 tarihinin seçilmesinin nedeni o gün doğum günüm olmasıdır. Bunun dışında başka bir esprisi yoktur :).
  6. 25.04.2019 tarihinden 02.02.2020 tarihine kadar (dahil) geçen zaman dilimine ait tahmini dolar alış kur değerleri ile 02.01.1980 tarihinden 24.04.2019 tarihine kadar olan gerçekleşmiş dolar alış kuru değerlerinin grafiği çizilerek dolar alış kurunun izlediği trend bir bütün olarak gösterilmiştir.
  7. 284 günlük dolar alış kuru tahminleri “xlsx” (Microsoft Office Excel) uzantılı olarak “tahminlerimtbulut” adlı excel kitabına yazdırılmıştır.

İlk olarak R’da analiz için gerekli aşağıdaki kütüphaneler yüklenmiştir.

library(nnfor)
library(dplyr)
library(forecast)
library(xts)
library(zoo)
library(lubridate)
library(tidyr)
library(tibble)
library(readxl)
library(ggplot2)
library(xlsx)
library(formattable)

Analiz kullanılan Merkez Bankası Dolar Alış Kuru veri setine xlsx uzantılı olarak aşağıdaki linkte yer verilmiştir.

Analizde kullanılan Merkez Bankası Dolar Alış Kuru verisinin yüklenmesi için yazılan R kod bloğu aşağıda verilmiştir.

df <-read_excel("data_set.xlsx")

Veri setinin yüklenmesinden sonra veri setinin “tibble” tablo düzenine alınması ve tarih verisinin ay ve yıla dönüştürülmesi için gerekli R kod bloğuna aşağıda yer verilmiştir.

d1<-tibble(Tarih=dmy(df$Tarih), Yıl= year(dmy(df$Tarih)), Ay=month(df$Tarih), Kur=df$Kur)

Veri setinden yıllara göre üretilen döviz alış kurunun seyrini gösteren grafiğe ilişkin R kod bloğu ise aşağıdadır.

d1 %>% ggplot(aes(Kur, Yıl,  color=Yıl))+
       geom_point()+
       scale_y_continuous(breaks=seq(1980, 2019, 3))+
       scale_x_continuous(breaks=seq(min(d1$Kur), max(d1$Kur),1.7))+
       theme(axis.text.x = element_text(face="bold", 
                           size=8, angle=0),
             axis.text.y = element_text(face="bold", 
                           size=8, angle=0))+
       xlab("Kur") + ylab("Yıl")+
       labs(caption = "Source: Tevfik Bulut")

Yukarıdaki R kod bloğunun çalıştırılmasından sonra elde edilen yıllara göre dolar alış kuru seyri aşağıdaki grafikte verilmiştir.

Aylara göre döviz alış kurundaki maksimum ve minimum kur değerleri ile maksimum ve minimum kur farkının yüzdesel değişimi (Dalga Boyu)’ni hesaplamak için yazılan R kod bloğu aşağıdadır. Burada aynı zamanda tabloda yıl ve ayın olduğu sütunlar “Yilin_Ayi” adında birleştirilerek ayrı bir değişken olarak tanımlanmıştır.

ay<-d1 %>% group_by(Ay, Yıl)%>%summarise(Max_Kur=max(Kur), Min_Kur=min(Kur), Dalga_Boyu=((max(Kur)-min(Kur))/(min(Kur))*100))
ay$Yilin_Ayi<-paste(ay$Yıl,"-",ay$Ay)
ay

Dolar alış kurlarının en yüksek olduğu ayları içeren ilk 25 kayıt bulunduğu yılı içerek şekilde aşağıdaki kod bloğu ile verilmiştir.

k<-ay %>% select(Yilin_Ayi, Max_Kur)%>%
           arrange(desc(Max_Kur))
k1<-head(k[, -1],25)
k1 %>% ggplot(aes(Max_Kur,Yilin_Ayi,  color=Max_Kur))+
       geom_point()

Yukarıdaki kod bloğunun çalıştırılmasıyla dolar alış kurlarının en yüksek olduğu ayları içeren ilk 25 kayıt bulunduğu yıla göre aşağıdaki şekilde verilmiştir.

Dolar alış kurlarının en düşük olduğu ayları içeren ilk 25 kayıt bulunduğu yılı içerek şekilde aşağıdaki kod bloğu ile verilmiştir.

k2<- ay %>% select(Yilin_Ayi, Min_Kur)%>%
     arrange((Min_Kur))
k3<- head(k2[, -1],25)
k3 %>% ggplot(aes(Min_Kur,Yilin_Ayi,  color=Min_Kur))+
       geom_point()

Yukarıdaki kod bloğunun çalıştırılmasıyla dolar alış kurlarının en düşük olduğu ayları içeren ilk 25 kayıt bulunduğu yıla göre aşağıdaki şekilde verilmiştir.

Dolar alış kurlarında aylık dalga boylarının en yüksek olduğu ayları içeren ilk 25 kayıt bulunduğu yılı içerek şekilde aşağıdaki kod bloğu ile verilmiştir.

k4<- ay %>% select(Yilin_Ayi, Dalga_Boyu)%>%
     arrange(desc(Dalga_Boyu))
k5<- head(k4[, -1],25)

k5 %>% ggplot(aes(x=Yilin_Ayi, y=Dalga_Boyu,  color=Dalga_Boyu))+
     geom_area()+
     theme(axis.text.x = element_text(face="bold", 
                           size=8, angle=90),
           axis.text.y = element_text(face="bold", 
                           size=8, angle=90))+
     geom_hline(yintercept=mean(k5$Dalga_Boyu), linetype="twodash", color = 
     "red", size=1)+
     ggtitle("Döviz Alış Kuru Aylık Dalga Boyları") +
     xlab("Yılın Ayı") + ylab("Dalga Boyu (%)")+
     labs(caption = "Source: By Tevfik Bulut")+
     theme(plot.title = element_text(family = "Trebuchet MS", face="bold", 
     size=16, hjust=0.5)) +
     theme(axis.title = element_text(family = "Trebuchet MS", face="bold", 
     size=12))

Yukarıdaki kod bloğunun çalıştırılmasından sonra dolar alış kurlarında aylık dalga boylarının en yüksek olduğu ayları içeren ilk 25 kayıt bulunduğu yılı içerek şekilde aşağıdaki grafikte verilmiştir. Aşağıdaki şekilde x eksenine yatay kırmızı çizgi dalga boylarının ortalamasını göstermektedir.

Dolar alış kurlarının yıllara göre maksimum kur değerleri aşağıdaki kod bloğu ile verilmiştir.

yil<- d1 %>% group_by(Yıl)%>%summarise(Max_Kur=max(Kur), Min_Kur=min(Kur), 
             Dalga_Boyu=max(Kur)-min(Kur))

yil %>% ggplot(aes(Yıl, Max_Kur, color=Max_Kur))+
        geom_line()+
        scale_x_continuous(breaks=seq(1980, 2019, 3))+
        ggtitle("Döviz Alış Kuru Yıllık Maksimum Kur Değerleri") +
        xlab("Yıl") + ylab("Maksimum Değer")+
        labs(caption = "Source: By Tevfik Bulut")+
        theme(plot.title = element_text(family = "Trebuchet MS", 
        face="bold", size=16, hjust=0.5)) +
        theme(axis.title = element_text(family = "Trebuchet MS", 
        face="bold", size=12))

Yukarıdaki kod bloğunun çalıştırılmasından sonra dolar alış kurlarının yıllara göre maksimum kur değerleri aşağıdaki şekilde verilmiştir.

Dolar alış kurlarının yıllara göre minimum kur değerleri aşağıdaki kod bloğu ile verilmiştir.

yil %>% ggplot(aes(Yıl, Min_Kur, color=Min_Kur))+
        geom_line()+
        scale_x_continuous(breaks=seq(1980, 2019, 3))+
        ggtitle("Döviz Alış Kuru Yıllık Minimum Kur Değerleri") +
        xlab("Yıl") + ylab("Minimum Değer")+
        labs(caption = "Source: By Tevfik Bulut")+
        theme(plot.title = element_text(family = "Trebuchet MS", 
              face="bold", size=16, hjust=0.5)) +
        theme(axis.title = element_text(family = "Trebuchet MS", 
              face="bold", size=12))

Yukarıdaki kod bloğunun çalıştırılmasından sonra dolar alış kurlarının yıllara göre minimum kur değerleri aşağıdaki şekilde verilmiştir.

Dolar alış kurlarında yıllık dalga boylarının en yüksek olduğu ilk 25 kayıt aşağıdaki kod bloğu ile verilmiştir.

yil<-ay %>% select(Yıl, Dalga_Boyu)%>%
            arrange(desc(Dalga_Boyu))

ydb<-head(yil[,-1],25)

ydb %>% ggplot(aes(x=Yıl, y=Dalga_Boyu,  color=Dalga_Boyu))+
        geom_line(size=1, col="Red")+
        scale_x_continuous(breaks=seq(1980, 2019, 2))+
        theme(axis.text.x = element_text(face="bold", 
                           size=8, angle=90),
              axis.text.y = element_text(face="bold", 
                           size=8, angle=90))+
        geom_hline(yintercept=mean(ydb$Dalga_Boyu), linetype="twodash", 
                   color = "green", size=1)+
        ggtitle("Döviz Alış Kuru Yıllık Dalga Boyları") +
        xlab("Yıl") + ylab("Dalga Boyu (%)")+
        labs(caption = "Source: Tevfik Bulut")+
        theme(plot.title = element_text(family = "Trebuchet MS", 
              face="bold", size=16, hjust=0.5)) +
        theme(axis.title = element_text(family = "Trebuchet MS", 
              face="bold", size=12))

Yukarıdaki kod bloğunun çalıştırılmasından sonra dolar alış kurlarında yıllık dalga boylarının en yüksek olduğu ilk 25 kayıt aşağıdaki şekilde verilmiştir. Şekilde x eksenine yatay yeşil çizgi dalga boylarının ortalamasını göstermektedir.

Dolar alış kurunun tahmininde kullanılan yöntem TBATS olup, aşağıdaki yer alan bileşenleri bünyesinde barındırır.

  1. Üstel Düzeltme Metodu (Exponential Smoothing Method)
  2. Box-Cox Dönüşümü (Box-Cox Transformation)
  3. Artıklar için ARMA modeli (ARMA model for residuals)
  4. Mevsimsellik terimlerinin trigonometrik ifadesi (The trigonometric expression of seasonality terms)

R’da TBATS yöntemine ilişkin algoritmaya ulaşmak için kullanılan R fonksiyonuna aşağıda yer verilmiştir.

tbats.components

TBATS yönteminin bileşenleri yukarıdaki fonksiyonun çalıştırılmasından sonra algoritmasıyla birlikte R kod bloğu olarak aşağıda sunulmuştur.

function (x) 
{
    if (!is.null(x$lambda)) {
        y <- BoxCox(x$y, x$lambda)
        lambda <- attr(y, "lambda")
    }
    else {
        y <- x$y
    }
    tau <- ifelse(!is.null(x$k.vector), 2 * sum(x$k.vector), 
        0)
    w <- .Call("makeTBATSWMatrix", smallPhi_s = x$damping.parameter, 
        kVector_s = as.integer(x$k.vector), arCoefs_s = x$ar.coefficients, 
        maCoefs_s = x$ma.coefficients, tau_s = as.integer(tau), 
        PACKAGE = "forecast")
    out <- cbind(observed = c(y), level = x$x[1, ])
    if (!is.null(x$beta)) {
        out <- cbind(out, slope = x$x[2, ])
    }
    if (tau > 0) {
        nonseas <- 2 + !is.null(x$beta)
        nseas <- length(x$seasonal.periods)
        seas.states <- cbind(x$seed.states, x$x)[-(1:(1 + !is.null(x$beta))), 
            ]
        seas.states <- seas.states[, -ncol(seas.states)]
        w <- w$w.transpose[, -(1:(1 + !is.null(x$beta))), drop = FALSE]
        w <- w[, 1:tau, drop = FALSE]
        j <- cumsum(c(1, 2 * x$k.vector))
        for (i in 1:nseas) out <- cbind(out, season = c(w[, j[i]:(j[i + 
            1] - 1), drop = FALSE] %*% seas.states[j[i]:(j[i + 
            1] - 1), ]))
        if (nseas > 1) {
            colnames(out)[nonseas + 1:nseas] <- paste("season", 
                1:nseas, sep = "")
        }
    }
    out <- ts(out)
    tsp(out) <- tsp(y)
    return(out)
}

Veri seti zaman serisine dönüştürüldükten sonra dolar alış kurunun izlediği seyir aşağıdaki kod bloğunda verilmiştir.

y10<-as.Date(df$Tarih, format = "%d - %m - %Y")
zoo(df[,2], y10)
t1<-as.xts(t)
plot(t1, xlab="Yıl", ylab="Alış Kuru", main="Yıllara Göre Dolar Alış Kuru", col="red")

Yukarıdaki kod bloğunun çalıştırılmasından sonra dolar alış kurunun izlediği seyir aşağıdaki grafikte sunulmuştur.

By Tevfik Bulut

Dolar alış kurundaki gün (gözlem sayısı=9915) değişkenine ait veri sayısal veriye dönüştürüldükten sonra gün bazlı izlediği seyre ilişkin R kod bloğu aşağıda verilmiştir.

y10<-as.Date(df$Tarih, format = "%d - %m - %Y")

tev<-ts(as.vector(df[,2]), as.vector(y10))

autoplot(tev, col="red") +
  ylab("Alış Kuru") +
  xlab("Zaman") +
  ggtitle("Dolar Alış Kurunun İzlediği Seyir") +
  theme_bw()+
  scale_x_continuous(breaks=seq(7306,17220,1416))+
  scale_y_continuous(breaks=seq(0,7,1.7))+
  theme(plot.title = element_text(hjust = 0.5))

Yukarıdaki kod bloğunun çalıştırılmasından sonra dolar alış kurunun izlediği seyir gün bazlı olarak aşağıdaki grafikte sunulmuştur.

Dolar alış kurunun izlediği seyir zaman serisi bağlamında farklı dönemlere göre ayrıştırılarak aşağıdaki R kod bloğu ile grafiği çizilmiştir.

data <- msts(tev,seasonal.periods=c(7,365.25))
t1_donem <- decompose(data)
plot(t1_donem)

Yukarıdaki kod bloğunun çalıştırılmasından sonra dolar alış kurunun izlediği seyir zaman serisi bağlamında farklı dönemlere göre aşağıdaki grafikle sunulmuştur.

Şimdi sıra TBATS yöntemi kullanılarak modelin oluşturulmasına gelmiştir. Dolar alış kuruna ait 284 günlük bir zaman serisi için tahmin yapılacağı için aşağıdaki R kod bloğunda h=284 olarak belirlenmiştir. Kurulan modele, kurulan modelden üretilen tahminlere ilişkin grafik için R kod bloğu bir bütün olarak aşağıda sunulmuştur.

data <- msts(tev,seasonal.periods=c(7,365.25))
model <- tbats(data)
sonuc<-forecast(model,h=284)
autoplot(sonuc) +
    ylab("Alış Kuru") +
    xlab("Zaman") +
 ggtitle("Forecasted USD Buying Rate/Tahmin Edilen Dolar Alış Kuru") 
 theme_bw()+
 theme(plot.title = element_text(hjust = 0.5))+
 labs(caption = "Source: Tevfik Bulut")

Yukarıdaki kod bloğunun çalıştırılmasından sonra elde edilen güven aralıklı (CI: Confidence Interval) 284 günlük dolar kuru tahminleri aşağıdaki şekilde verilmiştir. Burada, maviyle gösterilen alan güven aralıklarıyla birlikte dolar alış kuru tahminlerini, önceki alan ise mevcut dolar alış kuru gerçekleşmelerini göstermektedir. Maviyle gösterilen alanda yer alan eğri ise nokta tahmin (point forecast)’leri göstermektedir.

Elde edilen 284 günlük dolar alış kuru tahmin değerleri, tahmin edilen tarih ile bu tarihlere ait dolar alış kur değerleri xlsx (Microsoft Office Excel) uzantılı “tahminlerim_tbulut” adlı dosyaya yazdırılmıştır. Bahsedilen bu işlemleri gösterir R kod bloğunu aşağıda yer verilmiştir.

tahmin < -as_tibble(sonuc)

tarih < -seq(from = as.Date("2019-04-25"), to = as.Date("2020-02-02"), by = 1)
tarih < -format(tarih, format="%d/%m/%Y")

dolaraliskurutahmini<-tibble(Tahmin_Edilen_Tarih=tarih, 
                             Nokta_Tahmin_Değeri=round(tahmin$`Point Forecast`,4)

write.xlsx(dolaraliskurutahmini, file = "tahminlerim_tbulut.xlsx",
           sheetName = "tahmin_aliskuru_tbulut", append = FALSE)

Yukarıdaki R kod bloğunun çalıştırılmasından sonra elde edilen tahmini dolar alış kur değerleri tahmin edilen tarihe göre xlsx uzantılı olarak aşağıda verilmiştir. Buradaki linkten sonuçları indirebilirsiniz.

Kurulan modelden elde edilen tahminlere göre örnek vermek gerekirse; 31.12.2019 tarihinde Merkez Bankası gerçekleşen döviz alış kur değeri 5,9400 TL‘dir. TBATs yöntemi kullanılarak üretilen tahminlerime göre ise aynı tarihte tahmin edilen döviz alış kur değeri 6,0808 TL‘dir. Aradaki fark çok az olup, sadece 0,1408‘dir. Bu tarihte tahmin edilen dolar alış kur değeri gerçekleşen döviz alış kur değerinden sadece % 2,37 fazladır.

Kurulan modelden 02.02.2020 tarihini de içerek şekilde tahmin edilen son 10 dolar alış kur değerine ilişkin R kod bloğu aşağıda verilmiştir.

formattable(tail(dolaraliskurutahmini, 10))

Yukarıdaki kod bloğunun çalıştırılmasıyla elde edilen 02.02.2020 tarihini de içeren son 10 dolar alış kuru tahmini aşağıdaki tabloda verilmiştir.

Sonuç olarak TBATS modeli ARIMA, ELM (Extreme Learning Machine), Neural Network Autoregression (NNAR) ve HoltWinters yöntemleriyle de karşılaştırılmıştır. Ancak, TBATS modeli diğerlerine göre daha iyi sonuçlar ortaya koyduğundan bu model seçilerek onun uygulama sonuçlarına burada yer verilmiştir.

Faydalı olması ve farkındalık oluşturması dileğiyle.

Bilimle ve teknolojiyle kalınız.

Saygılarımla…

Not: Emeğe saygı adına, burda yapılan çalışmanın başka bir mecrada ya da ortamda paylaşılması halinde alındığı yer adının belirtilmesini rica ederim.

Note: In the name of respect for labor, I would kindly request that the name of the place where this work is taken if the work done on this web site is shared in another medium or environment.

Yararlanılan Kaynaklar

https://www.r-project.org/

De Livera, Alysha M. “Automatic forecasting with a modified exponential smoothing state space framework.” Monash Econometrics and Business Statistics Working Papers 10, no. 10 (2010).

De Livera, Alysha M., Rob J. Hyndman, and Ralph D. Snyder. “Forecasting time series with complex seasonal patterns using exponential smoothing.” Journal of the American Statistical Association 106, no. 496 (2011): 1513-1527.

http://tagteam.harvard.edu/hub_feeds/1981/feed_items/273923

sonaligupta.pdf erişimi için tıklayın

7c33e1a4f01c45c44479df3356ad191dafb6.pdf erişimi için tıklayın

Antonio Preti & Gianluca Lentini (2016) Forecast models for suicide: Time-series analysis with data from Italy, Chronobiology International, 33:9, 1235-1246, DOI:10.1080/07420528.2016.1211669

https://yintingchou.com/posts/bats-and-tbats-model/

https://michaeltoth.me/the-ultimate-opinionated-guide-to-base-r-date-format-functions.html

https://robjhyndman.com/publications/complex-seasonality/

https://otexts.com/fpp2/combinations.html

https://tevfikbulut.com/2019/09/30/doviz-kurlarindaki-dalga-boylarinin-hesaplanmasina-yonelik-yontem-onerileri-ii-wt-ve-ct-yontemleri/

Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Google fotoğrafı

Google hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Connecting to %s