R ile finansal veri analizi nasıl yapılır?

0 beğenilme 0 beğenilmeme
166 kez görüntülendi

R ile finansal veri analizi yapmak için hangi araçlar kullanılır, analizler nasıl yapılır?

5, Kasım, 2017 Uygulamalı Bilgisayar Bilimi kategorisinde Salih Durhan (1,259 puan) tarafından  soruldu

1 cevap

0 beğenilme 0 beğenilmeme

Bu cevabı http://ud.matkafasi.com/ornek-projeler/dakikalik-bist100-verisi-ile-temel-teknik-analiz/ adresindeki küçük rehber üzerinden veriyorum. Öncelikle finansal veri analizi çok çetrefilli ucu bucağı olmayan bir konudur. Benim anlatacağım sadece bir örnek. 


Veri setimiz 2 Mayıs 2016 - 10 Haziran 2016 tarihleri arasında BİST100 endeksinin dakikalık değerlerinden oluşuyor. Bu verinin dağıtımı Borsa İstanbul'un tasarrufunda olduğundan burada paylaşamıyorum. Bu verilere BİST'in onayladığı veri merkezleri üzerinden ulaşılabilir. Fiyatların hareketli ortalamalarını kullanarak, kısa zaman dilimlerinde düşüş ve artışları etkin bir şekilde tahmin eden bir strateji oluşturacağız. Burada amacım kullanılan tekniklerin bir kısmını tanıtmak. Gerçek bir alım-satım stratejisi oluşturmak için analizleri derinleştirmek gerekir.

Kayıtlı veri dosyasını R'a yükleyip zaman serisi olarak (xts object) kaydedelim ve verinin nasıl göründüğüne bir bakalım.

library(quantmod)
library(xgboost)
library(methods)
library(pander)
library(ggplot2)
library(ggfortify)

XU100<-read.csv("data\\XU100_02_05_to_10_06_2016")
time <- as.POSIXct(paste(XU100$DATE, XU100$TIME), format = "%d.%m.%Y %H:%M:%OS")
XU100.IS<-xts(x = XU100[,-c(1,2)], order.by = time)

pander(head(XU100.IS))

Hareketli ortalamalar fiyatın yönünü tahmin etmek için sıkça başvurulan göstergelerdir. Özellikle farklı aralıklarda tanımlı hareketli ortalamaların birbirine ve fiyata göre konumları kısa vadeli tahminlerde kullanılır. 13 ve 34 dakikalık hareketli ortalamaları kullanacağız (3,5,8,13,21,34,55,... şeklinde Fibonacci sayılarından gelen parametreler kullanmak adettendir).

den<-SMA(XU100.IS$CLOSE, n=13)
colnames(den)[1]<-"SMA13"
XU100.IS<-merge.xts(XU100.IS,den)

den<-SMA(XU100.IS$CLOSE, n=34)
colnames(den)[1]<-"SMA34"
XU100.IS<-merge.xts(XU100.IS,den)

Fiyat ve hareketli ortalamaların değerlerine ek olarak değişim hızlarını da kullanacağız. Bu parametrelerdeki değişim hızı da fiyatın yönü hakkında bilgi verir. Kapanış fiyatını CLOSE, 13 birimlik hareketli ortalamayı SMA13, 34 birimlik hareketli ortalamayı SMA34 olarak adlandırık, ayrıca bunların yüzdelik değişilerini sırasıyla CLOSE.1, SMA13.1, SMA34.1 adlarıyla aşağıdaki kodla oluşturup bu analizde kullanmayacağımız değişkenlerini veriden siliyoruz.

den<-diff(XU100.IS)/XU100.IS[-nrow(XU100.IS),] * 100

XU100.IS<-merge.xts(XU100.IS,den)

XU100.IS<-XU100.IS[,-c(5, 8,9,10,12)]

İlk Model:

Eğer BİST100 endeksi 13 dakikalık hareketli ortalamasının altındaysa ve ayrıca 13 dakikalık hareketli ortalama da 34 dakikalık hareketli ortalamanın altındaysa, o zaman endeksin yakın vadede (biz yakın vadeyi gelecek 10 dakika olarak alacağız) artmasını bekleriz. Bakalım bu beklenti ne kadar doğru.

indices<- which( XU100.IS$CLOSE < XU100.IS$SMA13 & XU100.IS$SMA13 < XU100.IS$SMA34 )

w20<-NULL
d<-NULL
wusd<-NULL
e<-NULL

for(i in indices){


d<- max(XU100.IS[(i+1):(i+10),]$CLOSE) - (XU100.IS[i,]$CLOSE)


w20<-rbind(w20, d)

}
mean(w20,na.rm=TRUE)
sum(w20>0, na.rm=TRUE)/length(w20)*100

Bu model yüzde 82 ihtimalle kar getiriyor, ve ortalama kar 68TL. Kar/Zarar grafiğini görmek isterseniz:

autoplot(w20, ts.geom = 'bar', colour ='blue')

Fakat maalesef bu analize dayanarak gerçek bir yatırım stratejisi oluşturamayız. İncelediğimiz noktalardan sonraki 10 dakika içerisinde maksimum fiyatı değerlendirdik ama bu maksimum değerin ne zaman olacağını (yani en yüksek karla ne zaman satış yapacağımızı) bilmiyoruz. Endeks ilk bir iki dakika artıp sonradan derin bir düşüşe başladığı durumlarda yukarıdaki analiz bize kar yazıyor ama gerçekte zarar edebiliriz. Bir başka sorun da grafiğe bakılınca görünüyor. Beklediğimiz koşulun gerçekleştiği durumlar sıklıkla birbirini takip eden dakikalarda gerçekleşiyor. Yukarıdaki grafiğe bakarsanız aslında toplamda 30 kadar birbirinden ayrık zaman diliminde bu koşulun gerçekleştiğini göreceksiniz (ki bu da çok fena değil).


Çok daha iyi bir model

Şimdi biraz daha uygulanabilir bir strateji örneği üzerinde çalışalım. Aşağıdaki durumların hepsi birden gerçekleştiğinde endeksin artacağını düşünüyoruz:

  • Endeks, 13 dakikalık hareketli ortalamasının en az 40 puan altında,
  • 13 dakikalık hareketli ortalama, 34 dakikalık hareketli ortalamanın en az 40 puan altında,
  • 34 dakikalık hareketli ortalama ivmelenerek artıyor.

Bu koşullar gerçekleştikten sonraki 15 dakikalık zaman dilimini 5'er dakikalık aralıklara bölüp bu aralıklarda endeksin ortalama değerlerini bularak iddiamızı test edeceğiz.

indices<- which( XU100.IS$CLOSE +40 < XU100.IS$SMA13 & XU100.IS$SMA13 +40 < XU100.IS$SMA34 & diff(XU100.IS$SMA34.1) > 0.002)

ma15<-NULL
e<-NULL
f1<-NULL
f2<-NULL
f3<-NULL

for(i in indices){

f1<- mean(XU100.IS[(i+1):(i+5),]$CLOSE)
f2<- mean(XU100.IS[(i+6):(i+10),]$CLOSE)
f3<- mean(XU100.IS[(i+11):(i+15),]$CLOSE)

e<- max(f1,f2,f3) - (XU100.IS[i,]$CLOSE)

ma15<-rbind(ma15, e)

}
mean(ma15,na.rm=TRUE)
sum(ma15>0, na.rm=TRUE)/length(ma15)

Yüzde 75 ihtimalle, 15 dakika içerisinde ortalama 70 puan kara geçeceğiz. Hiç fena değil. Bu analizin de tam olduğunu söyleyemeyiz ama bunun üzerine biraz daha çalışarak (zarar kes, kar al noktaları belirlemek gibi) etkin bir alım satım stratejisi oluşturabiliriz. En son olarak kazanç ve kayıpların grafiğine bakmak isterseniz:

autoplot(ma15, ts.geom = 'bar', colour ='blue')

5, Kasım, 2017 Salih Durhan (1,259 puan) tarafından  cevaplandı
...