Kategori: R

R ve quantmod ile Temel BTC Grafiği

quantmod

R’ı daha önce duymuştum fakat sadece ekonometrik analiz için bir yazılım sanıyordum (cahil ben!). Yapabildiği şeyleri duyunca bu programlama diline merak sardım ve neler yapabilirim diye kurcalamaya başladım. Başlıca kullandığım kaynak ilk etapta R for Data Science oldu. Bu yazıda temel düzeyde veri çekme ve grafik çizme maceramı anlatacağım.

R ile kod yazmak ve çalıştırmak için aslında fazla şeye ihtiyaç yok. Biri R (http://cran.r-project.org),  diğeri de işleri kolaylaştırmak için RStudio (http://www.rstudio.com).

RStudio’yu açtığınızda karşınıza şu ekran gelecek:
Sol üst R dosyamızı, sol alt konsolu, sağ üst değişken vb.lerin gösterileceği kısmı, sağ alt ise paketleri, yardım dosyalarını ama en önemlisi grafiğin gösterileceği plot sekmelerini içeriyor.

quantmod ile Yahoo’dan veri çekme ve grafiğini çıkartma

R iktisatçılar için birçok analize yardımcı olacak paketler içeriyor. Buna çeşitli kaynaklardan veri çeken paketler de dahil. Kullanımı en kolay olanlardan biri quantmod.

Paketleri R’a yüklemek çok kolay. quantmod için:

install.packages(“quantmod”)
library(quantmod)

Büyük-küçük harf ayrımı R için önemli, her karaktere, tırnak işareti vs. dikkat edilmesi gerekiyor. Bu iki komutu çalıştırınca quantmod paketi aktif hale geliyor.

quantmod’un getSymbols fonksiyonu veriyi çekmeye yarıyor ve şu şekilde işliyor (Tabi ki fonksiyonun çok fazla değişkeni var, ama benim işimi en basit düzeyde olanı görecek.) :

getSymbols(“KUR/HİSSE VB.”, src = “yahoo”, from = “BAŞLANGIÇ TARİHİ”, to = “BİTİŞ TARİHİ”)

Kurlar için USDTRY=X, USDEUR=X vb., BİST’te işlem gören şirketler için ADEL.IS, PETKM.IS vb. kullanabiliyorsunuz. Yahoo!’dan ticker listesine bakabilirsiniz.

Mesela THY için 2016’dan 2018 ortalarına fiyatları çekecek olursak;

getSymbols(“THYAO.IS”, src = “yahoo”, from = “2016-01-01”, to = “2018-06-01”)

THYAO.IS veriseti (zaman serisi) oluştu. summary(THYAO.IS) ile değişkenleri ve bilgilerini kısaca görmek istersek aşağıdaki ekran geliyor. Adlarından da anlaşılabileceği gibi her bir kolonda açılış, kapanış, en düşük fiyat vb. bilgiler var.

Son olarak chartSeries(THYAO.IS) ile aşağıdaki grafiği elde edebiliyoruz.

Kriptopara benim asıl ilgi alanlarımdan biri. Finansal analiz kısmıyla pek ilgilenmesem de “para” olarak sahip olduğu potansiyeli beni heyecanlandırıyor. Bu yazıda temel olarak BTC/USD kurunu quantmod ile Yahoo!’dan çekme ve candlestick chart oluşturma üzerinde durmakla beraber, 5 yıllık BTC verisinden de ne tür grafikler çıkartılabilir paylaşacağım.

quantmod ile Yahoo!’dan BTCUSD verisi çekme

Öncelikle quantmod’u yüklüyor ve veri setim için başlangıç ile bitiş tarihleri oluşturuyorum. candlestick yaparken grafiği net görebilmek adına 1 aylık bir veri alıyorum.

library(quantmod)
start <- as.Date(“2018-01-01”)
end <- as.Date(“2018-02-01”)

Daha önce yazdığım gibi kurlar USDTRY=X, USDEUR=X gibi ifade ediliyor. BTC için de durum aynı.

getSymbols(“BTCUSD=X”, src = “yahoo”, from = start, to = end)

BTCUSD=X adında zaman serisi oluştu. O “=” işareti yazarken işleri bazen bozabiliyor. Veri setinin adını BTCUSD yapıyorum.

BTCUSD <- `BTCUSD=X`

Kapanış fiyatları ile normal bir grafik çıkartalım.

plot(BTCUSD[, “BTCUSD=X.Close”], main = “BTC/USD Kuru”)

Eğer biraz daha finansal analiz meraklısıysanız, candlechart denen grafikleri duymuşsunuzdur. Renkler, çizgiler vb. fiyatla ilgili çeşitli değişimleri sembolize ediyor.

candleChart(BTCUSD,theme=’white’, type=’candles’)

Bazı işlem hacmi bilgileri eksik olduğu için o günler 0 gözükmekte. candleChart komutunun çok fazla değişkeni var, bu kısım pek ilgimi çekmediği için dileyenlere bırakıyorum bu grafiği göze daha hoş hale getirmeyi.

5 yıllık BTC verisi

reddit’te şu başlıkta bulunan 5 yıllık BTC ve altcoin verileri coinmarketcap kaynaklı ve .csv formatında. Üzerinde oynamak için güzel bir veri seti. Ben dosyayı “BTC.csv” adıyla kaydettim.

Öncelikle dosyayı R’ın içine aktarmamız gerekiyor.

bitcoindata <- read.csv(“klasör adresi/alt klasör/BTC.csv”)

Yükledikten sonra 800.000 küsür gözlem ve 10 değişken göreceksiniz. Sembol, tarih, en yüksek fiyat, en düşük fiyat vb. gözlemler var. 

Diyelim ki ben BTC, LTC, ETH, XRP için ayrı bir set oluşturmak istiyorum. Bir filtre oluşturuyorum ve R’a “Symbol” kolonunda bu filtreye uyanları “BTCLTCETHXRP” olarak kaydet diyorum.

filtre <- c(“BTC”, “LTC”, “ETH”, “XRP”)
BTCLTCETHXRP <- bitcoindata[bitcoindata$Symbol %in% filtre,]

Tarih kolonunda saat bilgisi de var, saatlik veya çok ileri bir analiz yapmadığım için gerek yok. Kaldırıyorum.

BTCLTCETHXRP$Date <- as.Date(BTCLTCETHXRP$Date, format = “%Y-%m-%d”)

Grafikte gözükeceği için “Symbol” kolonunu değiştiriyorum.

colnames(BTCLTCETHXRP)[3] <- “Sembol”

Grafiğe döküyorum. Her sembol için bir renk atadım geom_line komutunda. Geri kalan taraflar başlık vb. bilgiler.

library(tidyverse)
library(ggthemes)
ggplot(data=BTCLTCETHXRP) +
labs(title = “Zaman ve Kriptopara”, subtitle = “Fiyat Hareketleri”, x = “Tarih”, y = “Fiyat(USD)”, caption = “(Coinmarketcap verileri)”)+
geom_line(mapping = aes(x = Date, y = Close, color = Sembol))+
theme_economist()

Bir zaman aralığı için ise;

min <- as.Date(“2017-1-1”)
max <- as.Date(“2018-7-1”)

ggplot(data=BTCLTCETHXRP) +
labs(title = “Zaman ve Kriptopara”, subtitle = “Fiyat Hareketleri”, x = “Tarih”, y = “Fiyat(USD)”, caption = “(Coinmarketcap verileri)”)+
geom_line(mapping = aes(x = Date, y = Close, color = Sembol))+
scale_x_date(limits = c(min, max))+
theme_economist()

R ile TCMB’den Veri Çekme, Mevsimsellikten Arındırma vb.

R ileVeriyi Çekme

TCMB’nin EVDS sistemi bizi iktisatçılar için bir nimet. Bankanın sitesinde bu veriseti ve grafikleri görüntüleyebildiğiniz gibi Excel’e aktarmanın yolu da anlatılıyor. Ben ise bu verileri R’a çekmekten bahsedeceğim, bu sayede grafikleri çok daha fazla özelleştirme imkanına sahip olunuyor çünkü.

İlk olarak TCMB EVDS’nin sitesine üye olmak ve kullanıcı ekranından API anahtarı almak gerekiyor. Üstteki menüden “Giriş Yap” kısmından giriş yaptıktan sonra orada ismimiz çıkıyor, tekrar tıklayıp “Profil” kısmına giriyoruz. Altta “API Anahtarı” butonu mevcut. Tıkladığımızda aldığımız anahtarı ileride R’a tanımlayacağız.

Önce gerekli paketleri yüklemekle başlıyoruz:

install.packages(“XML”)
install.packages(“RCurl”)
install.packages(“plyr”)

library(XML)
library(RCurl)
library(plyr)

İlk olarak aldığımız API anahtarını bir değişken olarak tanımlamak gerekiyor:

anahtar <- “XXXXXXXXXXXXX”

Daha sonra aşağıdaki fonksiyonu kullanıyoruz. Bu fonksiyonu yazan Barış Sanlı, ben de sitesinden aldım. Frekans kısmını ben ekledim, geri kalan her şey için benim de çok şey öğrendiğim bu siteye bir bakmanızı tavsiye ederim.

tcmb_evds <- function(veriseti,baslangic,son, anahtar, frekans) {
adres=”https://evds2.tcmb.gov.tr/service/evds/”
seri=paste(“series=”, veriseti, sep=””)
tarihler=paste(“&startDate=”, baslangic,”&endDate=”, son, sep=””)
tamamlayici=paste(“&type=xml&key=”,anahtar, sep=””)
frekansi=paste(“&frequency=”, frekans, sep=””)
veriadresi <- paste(adres,seri,tarihler,tamamlayici, frekansi, sep=””)
xmlveri <- getURL(veriadresi, .opts = list(ssl.verifypeer = FALSE))
return(xmlveri)
}

Basitçe düşünürsek fonksiyon normalde TCMB’nin kendisinin oluşturduğu XML tablosunu oluşturuyor ve R’a aktarıyor. Örnek vermek gerekirse dolar kuru için 01.01.2005 ve 01.02.2017 arasındaki veriseti şu şekilde oluşuyor, fonksiyon bunu otomatik hale getirmekte. Dikkat ederseniz işi fazla karıştırmamak için “avg” olarak tanımlı aggregationTypes değişkeni ekli değil. İlgilenenler biraz kurcalayınca eklemenin yolunu bulacaktır.

https://evds2.tcmb.gov.tr/service/evds/series=TP.DK.USD.S.YTL&startDate=01-01- 2005&endDate=01-02- 2017&type=xml&key=XXXXXXXX&aggregationTypes=avg&formulas=1&frequency=8

Artık fonksiyon tanımlı ve aşağıdaki komut bize XML formatında veri çekmek için hazır:

tcmb_evds(“ÇEKİLECEK VERİ”, “BAŞLANGIÇ TARİHİ”, “BİTİŞ TARİHİ”, anahtar, FREKANS)

Merkez Bankası hangi parametreyi, nasıl tanımlamış derseniz eğer;

Bizim fonksiyonumuzda gözlem parametreleri ve formül parametreleri yok, ama dediğim gibi, algoritma aşağı yukarı belli olduğundan eklenebilir. Barış beyin yazdığı orijinal fonksiyon üzerinden giderek ben de frekans kısmını eklemiştim.

Seri kodları için standart bir gösterim yok maalesef. TCMB’den bakmak gerekiyor. Kurlar için aşağı yukarı belli ama. TP.DK.USD.ATP.DK.EUR.A vs.

Örnek olarak Japon Yeni kurunu(alış) çekelim, frekans günlük olduğu için “1” yazıyoruz.

JPY <- tcmb_evds(“TP.DK.JPY.A”, “01-01-2015”, “01-01-2018”, anahtar, 1)

JPY adında XML dosyasını çektik fakat pek anlam ifade etmiyor. Bunu XML formatından R’a uygun dataframe’e çeviriyoruz.

JPY <- xmlToDataFrame(JPY)

Aslında gayet anlaşılır bir formata geldi ama gereksiz kolonları da kaldıralım.

JPY$text <- NULL
JPY$UNIXTIME <- NULL

Aşağı yukarı şöyle bir tablo oluştu, dikkat haftasonları boş.

Önce tarihi “Date” formatına getirelim.

JPY$Tarih <- as.Date(JPY$Tarih,format = “%d-%m-%Y”)

Kuru is numerik yapıyoruz.

JPY$TP_DK_JPY_A <- as.numeric(as.character(JPY$TP_DK_JPY_A))

Kur bilgisinin olmadığı haftasonu vb. tarihleri(NA) kaldırıyoruz, newJPY olarak kaydediyoruz.

newJPY <-JPY[complete.cases(JPY), ]

Artık grafiğe hazırız. Biraz da süsleyelim.

library(tidyverse)
library(scales)
library(ggthemes)
ggplot(newJPY, aes(x=Tarih, y=TP_DK_JPY_A))+
labs(title = “JPY/TRY”, subtitle = “2015-2017”, caption = “(TCMB Verileri, 100 Japon Yeni = …)”)+
ylab(“Kur\n”)+
xlab(“\nTarih”)+
scale_x_date(breaks = pretty_breaks(10))+
theme(text=element_text(size=10, family=”Verdana”), axis.title=element_text(size=7))+
geom_line(color=”blue”)+
theme_economist()

Mevsimsellik Etkisi

Bazı verilerin yapısı doğası gereği çeşitli mevsimsellik özellikleri taşıyor. Altında yatan bir trend, rastgele değerler ve mevsimsellik veri setini etkileyebiliyor. Ben de TCMB EVDS’den işsizlik verilerini önceki yazıdaki fonksiyonu kullanarak çekecek ve mevsimsel etkiyi gözlemeye çalışacağım.

Öncelikle gerekli paketleri(hatta daha fazlasını) R’a yüklüyorum, eğer eksik olan varsa install.packages(“paket adı”) komutu ile önce paketi indirmeniz gerekiyor.

library(XML)
library(RCurl)
library(plyr)
library(tidyverse)
library(zoo)
library(ggthemes)
library(scales)
library(TTR)
library(xts)

Önceki yazıda aldığım anahtar hâlâ tanımlıysa sorun yok, yoksa tekrar tanımlıyorum ve yine önceden kullandığım tcmb_evds fonksiyonunu çalıştırıyorum.  Merkez Bankası seriye “TP.TIG07” adını vermiş, 2010-2018 aylık olarak çektiğim için frekansı yine EVDS tanımına göre 5 olarak giriyorum.

unemp <- tcmb_evds(“TP.TIG07”, “01-01-2010”, “01-01-2018”, anahtar, 5)

XML formatında yükledik, data.frame’e çeviriyoruz.

UNEMPTR <- xmlToDataFrame(unemp)

Gereksiz kolonları kaldırıyorum.

UNEMPTR$text <- NULL
UNEMPTR$UNIXTIME <- NULL

Seri adını “UNEMPTR” olarak değiştiriyor ve numerik hale getiriyorum.

UNEMPTR = rename(UNEMPTR, UNEMP=TP_TIG07)
UNEMPTR$UNEMP <- as.numeric(as.character(UNEMPTR$UNEMP))

R yıl-ay verisini tarih olarak pek tanımaya istekli değil. Çözüm olarak sonuna -01 ekliyorum her ayın. Bu sayede bir tarih vektörü oluşturabiliyorum. Bu vektörü de oluşturduğum UNEMPTR data.frame’in içine atıyorum.

Tarih <- paste(UNEMPTR$Tarih,”-01″,sep=””)
Tarih <- as.Date(Tarih, format = “%Y-%m-%d”)
UNEMPTR$Tarih <- Tarih

Eksik değerleri atarak en son versiyonu da oluşturuyorum.

UNEMPTRFINAL <- UNEMPTR[complete.cases(UNEMPTR), ]

Biraz tema vs. kullanarak en son veriyi grafiğe döküyorum.

ggplot(UNEMPTRFINAL, aes(x=Tarih, y=UNEMP))+
geom_line()+
scale_x_date(breaks = pretty_breaks(9))+
theme_wsj()

Mevsimsellik Etkisi

Şimdi iş geldi mevsimsellik, trend vb. parçalara ayırmaya. Bunun için zaman serisine çevirmemiz gerekiyor. Bu konuda baya uğraştım ve en sonunda şu fonksiyonla çözümü buldum. 12 (aylık) periyot ile 2010 başından itibaren UNEMP verisi ile zaman serisi oluşturdum.

UNEMPTS2 <- ts(UNEMPTRFINAL$UNEMP, frequency=12, start=c(2010,1))

Mevsimsellik vb. etkileri R otomatik ayırabiliyor. Burada önemli olan etkilerin “additive” mi “multiplicative” mi olduğu. Eğer değerler büyüdükçe mevsimsellik etkisi de büyüyorsa multiplicative denilebiliyor kabaca. Kabaca ama, bu önemli.

Mevsimsellik etkisini ayırmak için stl fonksiyonunu kullanıyorum ve grafiğe döküyorum.

stlUNEMP <- stl(UNEMPTS2, “periodic”)

plot(stlUNEMP)

Görüldüğü gibi işsizlik trendinde bir artış ve kışları işsizlikte artış var. Mevsimsel işsizlik.

stlUNEMP serisinde her kolonda biri olmak üzere mevsimsellik, trend vb. var. Bunları da ayırmak isterseniz şu komutlar yeterli.

mevsimsellikUNEMP <- stlUNEMP$time.series[,1]
trendUNEMP <- stlUNEMP$time.series[,2]
randomUNEMP <- stlUNEMP$time.series[,3]

Mevsimsellik etkisinden arındırmak için (additive varsaydım);

unempenson <- UNEMPTS2-mevsimsellikUNEMP

plot(unempenson)

Durum kısaca böyle. Ben bu noktada en çok TCMB verisini ayarlarken zorlandım. Umarım eksik bir veri yoktur, yoksa kayma oluyor. En çok sıkıntı tarih kısmında oluyor.