Package Quantmod seringkali digunakan sebagai pengolah data saham alias trading saham. Quantmod nenggunakan datasource dari yahoo. Beragam analisis teknikal seperti Simple Moving Average, Exponential moving average, Bollinger band, Momentum, ROC, MACD, RSI. Namun saya tidak akan membahas itu semuanya, walaupun kalau kalian menggunakan jasa broker online, maka analisis teknikal tersebut sudah ada secara default.
Disini saya hanya menggunakan Quantmod untuk menarik data dari yahoo untuk disimpan dalam file excel, namun yang bikin sedikit ribet yaitu nama header tiap kolom mengikuti nama kode emitennya.
library(quantmod) start_date<-as.Date("2019-01-01") end_date<-as.Date("2019-12-31") emiten = "TLKM.JK" SAHAM= getSymbols(emiten, from=start_date, to=end_date, src='yahoo',auto.assign=FALSE) print(head(SAHAM,5))
Hasilnya yaitu
TLKM.JK.Open TLKM.JK.High TLKM.JK.Low TLKM.JK.Close TLKM.JK.Volume TLKM.JK.Adjusted 2019-01-01 3750 3750 3750 3750 0 3519.844 2019-01-02 3750 3760 3700 3730 31355300 3501.072 2019-01-03 3710 3770 3690 3740 83842400 3510.458 2019-01-04 3690 3740 3690 3710 73936900 3482.299 2019-01-07 3760 3790 3750 3770 83678100 3538.617
Begitu pun kalau kita mengganti kode emiten yang lainnya (BBCA)
BBCA.JK.Open BBCA.JK.High BBCA.JK.Low BBCA.JK.Close BBCA.JK.Volume BBCA.JK.Adjusted 2019-01-01 26000 26000 26000 26000 0 25246.75 2019-01-02 26000 26225 26000 26200 7191200 25440.96 2019-01-03 26000 26100 25575 25900 14471600 25149.65 2019-01-04 25875 26025 25625 26025 10293000 25271.03 2019-01-07 26325 26625 26225 26225 14687600 25465.24
Walaupun sih untuk mengakses price sebuah data diatas ada 3 yaitu (misalkan harga close) menggunakan
- function Cl();
Cl(SAHAM)
- akses langsung no kolomnya;
SAHAM[,4] #kolom ke 4
- ataupun menggunakan akses operator $
SAHAM$TLKM.JK.Close #package DPLYR
Hal diatas kurang menarik kalau suatu saat dataset tersebut akan dimasukan ke sebuah rumus di R menggunakan notasi Close ~ Open+High+Low
Tentu akan dibuat beda-beda untuk setiap emiten, hal ini menjadi sangat merepotkan, misalkan untuk TLKM akan ditulis lengkap seperti berikut
TLKM.JK.Close ~ TLKM.JK.Open + TLKM.JK.High + TLKM.JK.Low
kalau saham BBCA pun juga demikian!
Bagaimana mengubah nama header tiap kolom menjadi Open, High, Low, dan Close?
Untuk mengubah nama header tersebut secara otomatis yaitu dengan menghilangkan kode emitennya, cukup menggunakan perintah gsub()
gsub(pattern, replacement, x, ignore.case = FALSE, perl = FALSE, fixed = FALSE, useBytes = FALSE)
- pattern: string to be matched, supports regular expression
- replacement: string for replacement
- x: string or string vector
- perl: logical. Should perl-compatible regexps be used? Has priority over extended
- fixed: logical. If TRUE, pattern is a string to be matched as is. Overrides all conflicting arguments
- useBytes: logical. If TRUE the matching is done byte-by-byte rather than character-by-character
mari kita terapkan saja langsung
#untuk ganti nama kolom colnames(SAHAM) = gsub(pattern = paste(emiten,".",sep=""), replacement = "", x = colnames(SAHAM), fixed = TRUE) print(head(SAHAM,10))
Hasilnya untuk saham TLKM
Open High Low Close Volume Adjusted 2019-01-01 3750 3750 3750 3750 0 3519.844 2019-01-02 3750 3760 3700 3730 31355300 3501.072 2019-01-03 3710 3770 3690 3740 83842400 3510.458 2019-01-04 3690 3740 3690 3710 73936900 3482.299 2019-01-07 3760 3790 3750 3770 83678100 3538.617 2019-01-08 3770 3800 3750 3800 67963700 3566.775 2019-01-09 3820 3830 3730 3730 98529400 3501.072 2019-01-10 3760 3800 3740 3800 126396700 3566.775 2019-01-11 3820 3860 3800 3860 116753700 3623.093 2019-01-14 3810 3850 3790 3850 68487000 3613.707
Hal diatas memudahkan kita untuk menyimpan kedalam file excel menggunakan package openxlsx
Mengubah class xts menjadi vector
Ketika dataset diubah seperti diatas, akan sangat mudah mengaksesnya karena seragam! Namun bila kalian akses dan cek jenis class tersebut
open = SAHAM$Open class(open)
hasil
> class(open) [1] "xts" "zoo"
Yup merupakan jenis xts = matrix + times, yaitu dataframe yang menggunakan index berupa date/time
Bisa dicek menggunakan perintah
index(open)
Sedangkan untuk mengambil datanya, gunakan perintah coredata()
data_open = coredata(open) class(data_open)
Hasilnya data_open berubah menjadi matrix
[1] "matrix" "array"
Jadi sekarang jangan bingung lagi ya