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.

İyiliği Tokenize Edebilir Miyiz?

Farklı olayların zamanları kesiştiğinde ortaya değişik bakış açıları çıkabiliyor. Şu an ormanlar yanarken Fenerbahçe’nin token haberini gördüğümde de aklıma bu soru geldi: iyiliği tokena çevirmek mümkün olabilir mi? Bu sayede insanları daha fazla fedakar davranışa teşvik edebilir miyiz? En azından denemeye değer.

Evet, iktisat teorilerine göre bizler rasyonel, bencil, faydasını minimum maliyetle maksimize etmeye çalışanlar bireyleriz. Neyse ki davranışsal iktisat gibi alanlar ile zaten gerçek olmadığını bildiğimiz bu görüşleri çürütebiliyoruz, birçoğumuz özünde iyilik yapmaktan haz duyan ve toplumda karşılık beklemeden bu davranışları sergilemeye meyilli bireyleriz. Bazen ufak dürtmeler gerekebiliyor tabii.

Diğer taraftan gelişen bir kripto para ekosistemi ve blokzincir kavramı var. Belki ilk dönemlerdeki gibi devrim diye dolaşmıyor herkes ama potansiyeline ulaşmadığını düşünüyorum. Ezberledik biraz da, blokzincir şeffaf, blokzincir hızlı, blokzincir doğrulanabilir. Eğer biz iyilik yaptığımıza emin olmak istiyorsak neden blokzinciri kullanmayalım? Eğer süreçleri daha hızlı hale getirebilecekse neden benimsemeyelim? Olası maliyetleri faydalarından fazla olabilir mi?

Token kelimesini duyup da tam bilmeyenler için hemen özet geçelim. Belirli bir değeri veya kullanım amacını ifade eden “kripto para birimi” bu. Meşhur NFTler de bu grupta aslında, sanat eserlerinin vb. bağlandığı tokenlar. Para olma niyetinden çok bir değer, sahiplik ifade etme aracı. Binance’in kendi ağı BSC’de veya Ethereum platformu olan ERC-20’de yer alıyorlar genellikle. Jeton olarak nitelendirebileceğimiz bu şeyler kripto paralardan farklı. Çok daha geniş kullanım amaçlarına hizmet edebiliyorlar. Tabii ki fiziksel bir metayı (altını, gümüşü vb.) kolayca tokenize edebilirsiniz, hisse senedi vb. değerleri de. İşler soyutlaştıkça biraz daha karmaşık hale geliyor.

Peki STK’lar, bağış toplayan kurumlar bu tür yaklaşımları benimserse neler daha iyi olabilir?

Güven ve Şeffaflık: Bir fon transferi sağladığınız anda nereye ulaştığının, neye harcandığının değiştirilemez bir kaydının oluştuğunu düşünün. Doğrulama mekanizmaları tatmin edici düzeyde çalışırsa bağışların yönlendirilmesi için bir devrim olacaktır.

Hız: Bankacılık sistemi artık FAST vb. yollarla eskiye nazaran daha hızlı. Ne var ki yurtdışından bağış yapmak isteyenler için bu yöntem çok cazip olabilir. Yurtdışından gelen bağış miktarı fazla ise burada çevrilip kur oynaklığı riski minimize edilebilir.

Seçenek Sunma: Tek bir ağda fon toplanırken nereye ne kadar yollamak istediğinizi veya toplanan genel amaçlı fonların ihtiyaç anında nerelere nasıl aktarıldığını takip edebileceğinizi bilmek güvene katkı sağlayacaktır. İlerisi için motivasyon.

Daha Az Süreç: Bürokratik süreçler bazen gerekli olabilir ama bir kriz anında kendi kendini doğrulayabilen bir sistem çok daha hızlı ve verimli olacaktır. Sorgulanabilir ve şeffaf şekilde geri dönüşü yazılım sağlar.

Tabii ki riskler de beraberinde gelecek;

Denetim: Evet, kanuni düzenleme kısmı zor. Hayır, kripto paralar suç gelirlerinin aklanmasında şimdi de geleneksel bankacılık sisteminden fazla kullanılmıyor. Düzenleme kısmı tartışmalı, ama şeffaf bir şekilde kaynakların yönlendirilmesi bu kısmı kolaylaştırabilir.

Oynaklık: Aslında burada bir yatırımdan çok iyilikten ve bir şeyleri geri beklememekten söz ediyoruz. Sabit fiyatlı token çözüm olarak benimsenebilir.

Teknolojik İhtiyaçlar: Bu adaptasyon süreci hem teknolojiyle arası olmayan bireylerin sürece dahil edilmesi, hem de altyapının güncel ve işler tutulması için belirli kaynak tahsisi anlamına gelecektir. Ödeme yöntemlerinin adaptasyonu, veri güvenliği gibi faktörler de dikkat edilmesi gereken ayrı başlıklar olarak değerlendirilebilir.

Klasik iktisatçılar ne derse desin, insanlar iyilik yapmak istiyor. Bir ağın içinde olduğunu bilmek, toplumsal bir inisiyatife ait olmak, dikilen bir fidanın binlerce ağaç arasında on yıllar boyu büyürken benzersiz bir sahiplik kodunun sırf sizde olması ve takip edilebilmesi, belki bir sertifika, belki de sadece bir QR kodu insanları harekete geçirmek için gerekli motivasyon, gerekli dürtme anlamına gelebilir.