อนุกรมเวลาคือ ชุดข้อมูลที่มีเวลาเป็นเข้าเป็นปัจจัยหรือบอกลำดับของข้อมูลชุดนั้น เช่น ราคาหุ้นรายวัน อัตราการเติบโตของGDP รายไตรมาส ข้อมูลยอดขายรายเดือน หรือ จำนวนผู้บริการของร้านละดวกซื้อรายชั่วโมง เป็นต้น ซึ่งข้อมูลแบบนี้จะมีระยะห่างด้านเวลาเป็นตัวกำกับ ว่าข้อมูลชุดต่อไป จะเกิดขึ้นที่เวลาใด ส่วนการนำไปใช้นั้น ข้อมูลอนุกรมเวลา จะถูกนำไปพยากรณ์ค่าที่จะเกิดขึ้นในอนาคต และเครื่องมือที่ใช้และสมมุติฐานที่สำคัญ จะกล่าวถึงต่อไปถายหลัง ในบทนี้เราจะพูดเรื่องการสร้างกราฟของอนุกรมเวลา ขึ้นมาก่อนเพื่อช่วยในการพิจารณาหาตัวแบบที่เหมาะสมกับข้อมูลชุดนั้นๆ ต่อไป สำหรับภาษาอาร์ ข้อมูลอนุกรมเวลาควรจัดการข้อมูลให้อยู่ในรูปของกรอบข้อมูล(data frame)ที่มีการตั้งชื่อแต่แถวของข้อมูลด้วยเวลาเพื่อ ให้ง่ายต่อการนำไปวิเคราะห์ ในบทนี้จะนำเสนอการดึงข้อมูลอนุกรมเวลาทางการเงิน จาก package ที่มีชื่อว่า “quantmod”
library(quantmod)
จะใช้ข้อมูลราคาหุ้น PTT จากฐานข้อมูล yahoo โดยเลือกเป็นราคาหุ้นรายสัปดาห์ ระหว่างวันที่ 1 ม.ค. 2015 ถึง 31 ธ.ค. 2018
getSymbols('PTT.BK',src='yahoo',periodicity = "weekly", # หุ้นที่ต้องการ จากแหล่งไหน เวลาแบบใด
return.class = 'xts', # ชนิดข้อมูลที่ต้องการใช้ คือ xts
index.class = 'Date', #
from = "2015-01-01", to ="2018-12-31") #เวลาเริ่มต้น และเวลาสิ้นสุด
## [1] "PTT.BK"
head(PTT.BK)
## PTT.BK.Open PTT.BK.High PTT.BK.Low PTT.BK.Close PTT.BK.Volume
## 2015-01-01 32.4 33.5 30.6 33.4 210016000
## 2015-01-08 34.6 34.9 32.1 32.2 313653000
## 2015-01-15 32.6 33.5 31.5 33.0 277159000
## 2015-01-22 33.5 35.5 33.3 34.9 256490000
## 2015-01-29 34.9 38.2 34.6 37.8 275580000
## 2015-02-05 36.8 38.0 35.3 35.7 309133000
## PTT.BK.Adjusted
## 2015-01-01 26.04361
## 2015-01-08 25.10791
## 2015-01-15 25.73171
## 2015-01-22 27.21324
## 2015-01-29 29.47451
## 2015-02-05 27.83703
ข้อมูลที่ได้จากฐานข้อมูล yahoo ประกอบไปด้วยข้อมูลราคาเปิด ราคาปิด ราคาต่ำสุด ราคาสูงสุด และราคาหุ้นที่ได้รับการจัดการเรื่องการแตกหุ้นและปันผล(ซึ่งจะไม่ได้พิจารณา) เพื่อให้ง่ายเราจะทำการเปลี่ยนชื่อตัวยแปรใหม่เพื่อให้ง่ายต่อการทำไปใช้
# เปลี่ยนตัวแปรเพื่อให้ใช้งานได้ง่ายขึ้น
PTT<- PTT.BK
# เปลี่ยนชื่อตัวแปรภายในกรอบข้อมูลให้สั้นลงเวลา เรียกใช้งาน
colnames(PTT)<- c("open","high","low","close","volume","adjusted")
str(PTT)
## An 'xts' object on 2015-01-01/2018-12-27 containing:
## Data: num [1:209, 1:6] 32.4 34.6 32.6 33.5 34.9 ...
## - attr(*, "dimnames")=List of 2
## ..$ : NULL
## ..$ : chr [1:6] "open" "high" "low" "close" ...
## Indexed by objects of class: [Date] TZ: UTC
## xts Attributes:
## List of 2
## $ src : chr "yahoo"
## $ updated: POSIXct[1:1], format: "2021-07-16 09:54:14"
ข้อมูลของตัวแปร PTT นี้เป็นข้อมูลชนิด xts ซึ่ง เกี่ยวข้องกับเวลา คำสั่งเบื้องต้นที่ควรคือ first() สำหรับเรียกดูข้อที่มีหน่วยเป็นเวลา วัน(day) สัปดาห์(week) เดือน(month) ไตรมาส(quarter) ปี(year) โดยมีจำนวนที่ต้องแล้วตามด้วยหน่วยที่จะใช้ เช่น ข้อมูล 2 เดือนแรก
first(PTT,"2 month") # ข้อมูล 2 เดือนแรก
## open high low close volume adjusted
## 2015-01-01 32.4 33.5 30.6 33.4 210016000 26.04361
## 2015-01-08 34.6 34.9 32.1 32.2 313653000 25.10791
## 2015-01-15 32.6 33.5 31.5 33.0 277159000 25.73171
## 2015-01-22 33.5 35.5 33.3 34.9 256490000 27.21324
## 2015-01-29 34.9 38.2 34.6 37.8 275580000 29.47451
## 2015-02-05 36.8 38.0 35.3 35.7 309133000 27.83703
## 2015-02-12 35.5 36.9 35.2 35.6 202875000 27.75906
## 2015-02-19 35.5 35.6 33.7 33.8 177483000 26.35551
## 2015-02-26 34.0 35.2 33.4 34.0 141462000 26.51146
ข้อมูล 2 อาทิตย์แรก
first(PTT,"2 week") # ข้อมูล 2 อาทิตย์
## open high low close volume adjusted
## 2015-01-01 32.4 33.5 30.6 33.4 210016000 26.04361
## 2015-01-08 34.6 34.9 32.1 32.2 313653000 25.10791
คำสั่งต่อไป คือ last() ก็จะเหมือนกับคำสั่ง first() แต่จะนับจากสุดท้าย เช่น ข้อมูลไตรมาสสุดท้าย
last(PTT,"1 quarter") # ข้อมูล 3 เดือนแรก
## open high low close volume adjusted
## 2018-10-04 53.25 54.00 51.75 54.00 332829300 48.24397
## 2018-10-11 51.25 52.00 50.75 51.00 322065700 45.56376
## 2018-10-18 50.75 51.50 48.50 48.50 229040300 43.98181
## 2018-10-25 47.75 51.00 47.75 51.00 350488900 46.24892
## 2018-11-01 50.75 51.00 49.00 50.25 332235300 45.56879
## 2018-11-08 50.75 51.25 48.50 49.00 274523800 44.43523
## 2018-11-15 49.00 49.25 48.00 48.25 214516300 43.75511
## 2018-11-22 48.50 49.50 48.00 49.00 158446200 44.43523
## 2018-11-29 49.25 52.25 49.00 51.50 243836000 46.70234
## 2018-12-06 50.50 50.75 48.75 49.00 225337500 44.43523
## 2018-12-13 49.00 49.25 46.25 47.00 349786100 42.62156
## 2018-12-20 46.75 48.25 45.25 45.50 230989200 41.26129
## 2018-12-27 47.00 47.50 45.25 46.00 133355400 41.71471
เราสามารถผสมคำสั่งของ first กับlast ก็ได้ เช่นต้องการ ข้อมูลตัวแรกของไตรมาสสุดท้าย
first(last(PTT,"1 quarter"),"1 week") # อาทิตย์แรก จากข้อมูล 3 เดือนแรก
## open high low close volume adjusted
## 2018-10-04 53.25 54 51.75 54 332829300 48.24397
จากข้อมูลบหุุ้น PTT รายสัปดาห์ ถ้าเราต้องการว่าจำนวนข้อมูลทั้งหมดในหน่วยเวลาต่างๆ เป็นอย่างไร เช่นถ้่าต้่องการทราบจำนวนข้อมูลทั้งมีกี่วัน ให้ใช้
ndays(PTT) # จำนวนข้อมูลทั้งหมด
## [1] 209
จำนวนสัปดาห์
nweeks(PTT) # จำนวนอาทิตย์ที่นับได้จากข้อมูล
## [1] 209
จำนวนเดือน
nmonths(PTT) # จำนวนเดือนทั้งหมด ที่นับได้จากข้อมูล
## [1] 48
จำนวนไตรมาส
nquarters(PTT) # จำนวนไตรมาสทั้งหมด
## [1] 16
จำนวนปี
nyears(PTT) # จำนวนปีที่เก็บข้อมูล
## [1] 4
จากข้อมูล PTT เราสามารถเลือกข้อมูลในช่วงเวลาที่ต้องการได้ดังนี้ โดยใช่้ PTT[“A/B”] A และ B คือช่วงเวลาที่ต้องการ ถ้าต้องการข้อมูลเดือน ม.ต. 2015- ก.พ.2015 สามารถทำได้โดยใช้่คำสั่ง
PTT["2015-01/2015-02"] # ข้อมูลเดือน ม.ค. 2015-ก.พ. 2015
## open high low close volume adjusted
## 2015-01-01 32.4 33.5 30.6 33.4 210016000 26.04361
## 2015-01-08 34.6 34.9 32.1 32.2 313653000 25.10791
## 2015-01-15 32.6 33.5 31.5 33.0 277159000 25.73171
## 2015-01-22 33.5 35.5 33.3 34.9 256490000 27.21324
## 2015-01-29 34.9 38.2 34.6 37.8 275580000 29.47451
## 2015-02-05 36.8 38.0 35.3 35.7 309133000 27.83703
## 2015-02-12 35.5 36.9 35.2 35.6 202875000 27.75906
## 2015-02-19 35.5 35.6 33.7 33.8 177483000 26.35551
## 2015-02-26 34.0 35.2 33.4 34.0 141462000 26.51146
หรือถ้าต้องการต้อง 15 พ.ย. 2018 จนถึงช้อมูลสุดท้าย ให้ใช้
PTT["2018-11-15/"] # ข้อมูลตั้งแต่ 15 พ.ย. 2018 เป็นต้นไป
## open high low close volume adjusted
## 2018-11-15 49.00 49.25 48.00 48.25 214516300 43.75511
## 2018-11-22 48.50 49.50 48.00 49.00 158446200 44.43523
## 2018-11-29 49.25 52.25 49.00 51.50 243836000 46.70234
## 2018-12-06 50.50 50.75 48.75 49.00 225337500 44.43523
## 2018-12-13 49.00 49.25 46.25 47.00 349786100 42.62156
## 2018-12-20 46.75 48.25 45.25 45.50 230989200 41.26129
## 2018-12-27 47.00 47.50 45.25 46.00 133355400 41.71471
ทำนองเดียวกันต้้องต้องการข้อมูลตั้งแต่ตัวแรกจนถึง 1 ก.พ. 2015 ให้ใช้่คำสั่ง
PTT["/2015-02-01"] # ข้อมูลตัวแรกจนถึง 1 ก.พ. 2015
## open high low close volume adjusted
## 2015-01-01 32.4 33.5 30.6 33.4 210016000 26.04361
## 2015-01-08 34.6 34.9 32.1 32.2 313653000 25.10791
## 2015-01-15 32.6 33.5 31.5 33.0 277159000 25.73171
## 2015-01-22 33.5 35.5 33.3 34.9 256490000 27.21324
## 2015-01-29 34.9 38.2 34.6 37.8 275580000 29.47451
เราสามารถใช้คำสั่ง plot เพื่อช่วยในการ plot กราฟได้ดังนี้ ถ้าต้องการสร้างกราฟหุ้น PTT
plot(PTT$close)
ถ้าต้องการกราฟแค่บางช่วงเวลา ก็สามาถทำได้ดังนี้ เช่นต้องการเฉพาะปี 2016
plot(PTT$close,subset="2016")
หรือต้องการ ช่วงเวลา 12 มิ.ย. 2015 ถึง ก.ย. 2016
plot(PTT$close,subset="2015-06-12/2016-09")
ถ้าต้องการเพิ่มชื่อเรื่องก็สามารถใช้คำสั่ง
par(family = "TH Sarabun New") # เปลี่ยนฟอนด์เพื่อให้แสดงเป็นภาษาไทยได้
plot(PTT$close, # ใช้ข้อมูลราคาปิดของหุ้น PTT
main ="ราคาหุ้น PTT รายสัปดาห์" # แสดงชื่อของกราฟ
)
หมายเหตุ(ปกติภาษาอาร์ไม่สามารถแสดงผลเป็นภาษาไทยได้ จึงจำเป็นต้องใช้คำสั่ง par ในการเปลี่ยน font เพื่อให้แสดงภาษาไทยได้) ถ้าต้องเส้นกราฟเป็นสีแดงก็สามารถทำได้ดังนี้
par(family = "TH Sarabun New") # เปลี่ยนฟอนด์เพื่อให้แสดงเป็นภาษาไทยได้
plot(PTT$close, # ใช้ข้อมูลราคาปิดของหุ้น PTT
main ="ราคาหุ้น PTT รายสัปดาห์", # แสดงชื่อของกราฟ
col = "red" # เลือกใช้เส้นสีแดง
)
ถ้าต้องการให้เส้นความหนาขึ้นก็สามารถทำได้ดังนี้
par(family = "TH Sarabun New") # เปลี่ยนฟอนด์เพื่อให้แสดงเป็นภาษาไทยได้
plot(PTT$close, # ใช้ข้อมูลราคาปิดของหุ้น PTT
main ="ราคาหุ้น PTT รายสัปดาห์", # แสดงชื่อของกราฟ
col = "red", # เลือกใช้เส้นสีแดง
lwd = 4 # เลือกใช้ความหนาของเส้นเท่ากับ 4
)
ค่ามาตราฐานคือ lwd = 1 ต่อไป ถัาต้องการให้เส้นเป็น รายจุด ก็สามารถใช้คำสั่ง
par(family = "TH Sarabun New") # เปลี่ยนฟอนด์เพื่อให้แสดงเป็นภาษาไทยได้
plot(PTT$close, # ใช้ข้อมูลราคาปิดของหุ้น PTT
main ="ราคาหุ้น PTT รายสัปดาห์", # แสดงชื่อของกราฟ
col = "red", # เลือกใช้เส้นสีแดง
lwd = 4, # เลือกใช้ความหนาของเส้นเท่ากับ 4
lty = 3 # lty เท่ากับ 3 คือ เส้นจุด
)
ค่ามาตรฐานของคำสั่ง lty คือ 1 คำสั่งนี้มีค่าให้เลือกเปลี่ยน 1-6 อยากให้ผู้อ่านลองทำด้วยตัวเองว่า ถ้าเปลี่ยนค่า lty แล้วจะเส้นกราฟเป็นอย่างไร ถ้าต้องการวาดกราฟของราคาเปิด
par(family = "TH Sarabun New")
# กราฟราคาปิดหุ้น PTT ให้เส้นสีแดง
plot(PTT$close,main ="ราคาหุ้น PTT รายสัปดาห์",col="red")
# เพิ่มเส้นกราฟราคาเปิดของหุ้น PTT โดยใช้เส้นเป็นสีฟ้า และมีความหนาเท่ากับ 2
lines(PTT$open,col ="blue",lwd=2)
หรือจะเพิ่มราคาสูงสุด และต่ำสุดเข้าไปก็ได้
par(family = "TH Sarabun New")
# กราฟราคาปิดหุ้น PTT ให้เส้นสีแดง
plot(PTT$close,main ="ราคาหุ้น PTT รายสัปดาห์",col="red")
# เพิ่มเส้นกราฟราคาเปิดของหุ้น PTT โดยใช้เส้นเป็นสีฟ้า และมีความหนาเท่ากับ 2
lines(PTT$open,col ="blue",lwd=2)
# เพิ่มเส้นกราฟราคาสูงสุดของหุ้น PTT โดยใช้เส้นเป็นสีเหลือง และมีความหนาเท่ากับ 2
lines(PTT$high,col ="yellow",lwd=2)
# เพิ่มเส้นกราฟราคาต่ำสุดของหุ้น PTT โดยใช้เส้นเป็นสีเขียว และมีความหนาเท่ากับ 2
lines(PTT$low,col ="green",lwd=2)
กราฟเหมือนข้างบนแต่ใช้ความหนาของเส้นเท่า 1 และ แสดงกล่องข้อความบอกข้อมูลของเส้นแต่ละสี
par(family = "TH Sarabun New")
plot(PTT$close,main ="ราคาหุ้น PTT รายสัปดาห์",col="red",lwd=1)
lines(PTT$open,col ="blue",lwd=1)
lines(PTT$high,col ="yellow",lwd=1)
lines(PTT$low,col ="green",lwd=1)
# เพิ่มกล่องข้อมูลแสดงข้อมูลของแต่ละเส้น
addLegend(legend.loc = "bottomright", on=0,
legend.names = c("close", "open","high","low"),
lty=c(1, 1,1,1), lwd=c(1, 1,1,1),
col=c("red","blue","yellow","green"),bty="o")
legend.loc สามารถเลือกได้ดังนี้ bottomright bottom bottomleft left topleft top topright right และ center กรณีต่อไป ลองวาดสองกราฟให้อยู่กรอบเดียวกันสามารถทำได้ดังนี้ เช่น ต้องการวาดกราฟของราคาปิด และราคาเปิด ถ้าต้องการให้ 1 แถว 2 สดมภ์
par(mfrow = c(1, 2), #กราฟต่อจะแสดงโดยมี 1 แถวและ 2 สดมภ์
family = "TH Sarabun New")
plot(PTT$close,
main ="ราคาปิดหุ้น PTT รายสัปดาห์",col="red",lwd=1)
plot(PTT$open,
main ="ราคาเปิดหุ้น PTT รายสัปดาห์",col="blue",lwd=1)
ถ้าต้องการ 2 แถว 1 สดมภ์ ก็แค่เปลี่ยนmfrow = c(2,1)
par(mfrow = c(2,1), # กราฟต่อจะแสดงโดยมี 2 แถวและ 1 สดมภ์
family = "TH Sarabun New")
plot(PTT$close,
main ="ราคาปิดหุ้น PTT รายสัปดาห์",col="red",lwd=1)
plot(PTT$open,
main ="ราคาเปิดหุ้น PTT รายสัปดาห์",col="blue",lwd=1)
ถ้าต้องการเพิ่มตรงขนาดกันแกน x สามารพใช้คำสั่ง abline(h=a) โดยที่ a คือค่าที่ต้องการ สมมุติให้ a คือค่าเฉลี่ยของราคาปิดของหุ้น PTT ดังนั้น
par(family = "TH Sarabun New")
plot(PTT$close,
main ="ราคาหุ้น PTT รายสัปดาห์",col="red",lwd=1)
PTT$mean=mean(PTT$close) # เพิ่มตัวแปร mean(ค่าเฉลี่ย)
lines(PTT$mean, col = "blue") # เพิ่มเส้นค่าเฉลี่ย
ถ้าต้องการ สร้างเส้นแนวตั้งสามารถใช้คำสั่ง addEvenlines() สมมุติต้องการสร้างเส้นตั้งฉากวันที่ราคาปิดของ PTT มีราคา ต่ำที่สุด
par(family = "TH Sarabun New")
plot(PTT$close,
main ="ราคาหุ้น PTT รายสัปดาห์",col="red",lwd=1)
min_price <- which(PTT$close==min(PTT$close))
event<- xts(min(PTT$close),index(PTT)[min_price]) # วันที่หุ้น PTT ต่ำที่สุด
addEventLines(event,col="blue") # วาดเส้นแนวตั้งโดยใช้วันที่ราคาหุ้นต่ำสุด
หมายเหตุ สำหรับข้อมูลแบบ xts คำสั่ง index คือการดูวันที่ของข้อมูลแบบ xts เทียบได้กับ rownames ในการดูชื่อที่ตั้งให้่ข้อกับเวคเคอร์ หรือ เมตริกซ์ หรือกรอบข้อมูล การสร้างกราฟต่อไป ก็การสร้างกราฟของ acf(autocorrelation function) และ pacf(patial auticorrelation function)
สหสัมพันธ์แบบอัตโนมัตินี้ คือการวัด
par(family = "TH Sarabun New")
acf(PTT$close,main="สหสัมพันธ์แบบอัตโนมัติของราคาปิดของหุ้น PTT")
### สหสัมพันธ์แบบอัตโนมัติบางส่วน (Partial autocorrelation)
par(family = "TH Sarabun New")
pacf(PTT$close,main="สหสัมพันธ์แบบอัตโนมัติบางส่วนของราคาปิดของหุ้น PTT")
package ที่ใช้โหลดข้อมูลจากองค์การเพื่อความร่วมมือและการพัฒนาทางเศรษฐกิจ(Organisation for Economic Co-operation and Development - OECD) ชื่อว่า package “OECD”
library(OECD)
คำสั่งสำคัญสำหรับ package OECD คือ “get_dataset()”
Mydata<-get_datasets()
เป็นดูชื่อข้อมูลและรายละเอียดเบื้องต้น
str(Mydata)
## tibble [1,488 × 2] (S3: tbl_df/tbl/data.frame)
## $ id : chr [1:1488] "QNA" "PAT_IND" "SNA_TABLE11" "EO78_MAIN" ...
## $ title: chr [1:1488] "Quarterly National Accounts" "Patent indicators" "11. Government expenditure by function (COFOG)" "Economic Outlook No 78 - December 2005 - Annual Projections for OECD Countries" ...
head(Mydata)
| id | title |
|---|---|
| QNA | Quarterly National Accounts |
| PAT_IND | Patent indicators |
| SNA_TABLE11 |
|
| EO78_MAIN | Economic Outlook No 78 - December 2005 - Annual Projections for OECD Countries |
| ANHRS | Average annual hours actually worked per worker |
| GOV_DEBT | Central Government Debt |
เมื่อได้ข้อมูลทั้งหมดแล้ว สามารถใช้่คำสำคัญในการชื่อข้อมูลที่ต้องการได้ เช่น “Government Debt” โดยใช้คำสั่ง “search_dataset” ดังนี้
search_dataset("Government Debt",Mydata)
| id | title |
|---|---|
| GOV_DEBT | Central Government Debt |
| SNA_TABLE750 |
|
เมื่อได้ชื่อข้อมูลแล้ว ก็สามารถดึงมาวิเคราะห์ได้โดยใช้คำสั่ง “get_dataset”
GOV<-get_dataset("GOV_DEBT")
str(GOV)
## tibble [96,281 × 8] (S3: tbl_df/tbl/data.frame)
## $ COU : chr [1:96281] "AUS" "AUS" "AUS" "AUS" ...
## $ DTYP : chr [1:96281] "AMT" "AMT" "AMT" "AMT" ...
## $ FREQ : chr [1:96281] "A" "A" "A" "A" ...
## $ UNIT : chr [1:96281] "USD" "USD" "USD" "USD" ...
## $ DVAR : chr [1:96281] "3" "3" "3" "3" ...
## $ TIME_FORMAT: chr [1:96281] "P1Y" "P1Y" "P1Y" "P1Y" ...
## $ obsTime : chr [1:96281] "1980" "1981" "1982" "1983" ...
## $ obsValue : num [1:96281] 13140 13637 11466 12891 19193 ...
รายละเอียดปลีกย่อย สามารถศึกษาเพิ่มได้โดยโดยใช้ คำสั่ง ? แล้วตามคำสั่งที่ต้องการใน package OECD เช่น ?get_data เป็นต้น
library(Quandl)
เป็นอีก package หนึ่งที่สามารถใช้การค้นหาทางการเงินหรือทางเศรษฐกิจได้คำสั่งที่น่าสนใจ การจะดึงข้อมูลออกมาได้ ให้ผู้อ่านเข้าไปสมัครสมาชิกก่อนที่ https://www.quandl.com มีทั้งแบบใช้งานได้้ฟรีและแบบเสียค่าใช้จ่าย เมื่อสมัครเรียบร้อยก็ได้ api_key มาเพื่อใช้สำหรับการค้นหาแล้วโหลดข้อมูล
เมื่อได้มาแล้วก็สามารถใช้คำสั่งดังนี้
#api_key ได้จากการลงทะเบีบนที่ www.quandl.com
# สมมุติได้ api_key <- "Pp9w4rc38cn4mEj-XXXX"
Quandl.api_key(api_key) # log in ด้วย api key
ก็จะสามารถใช้งานได้ เช่นหาต้องการข้อมูลน้ำมันโดยใช้คำว่า “economic” ในการค้นหา
search.econ<-Quandl.search("economic",per_page=1000,silent=TRUE)
คำสัง “per_page=1000” คือต้องการ แสดงข้อมูลที่ค้นด้วยคำว่า “economic” ไม่เกิน 1000 ชุด ส่วนคำสั่ง “silent=TRUE” ไม่ต้องการให้แสดงผลบนหน้าจอ ถ้าใช้บริการแบบ free ไม่ใช่ premium ข้อมูลที่สามารถนำมาใช้วิเคราะห์ได้คือ ตัวแปรในกรอบข้อมูลที่ชื่ิิอว่า premium มีค่าเท่ากับ FALSE
#แสดงข้อมูล 10 ชุดแรกที่เจอ โดยแสดงค่าชื่อตัวแปรที่ต้องการ
search.econ[1:10,c(2,3,12)]
| dataset_code | database_code | premium |
|---|---|---|
| G170801A027NBEA | FRED | FALSE |
| G160141A027NBEA | FRED | FALSE |
| G170921A027NBEA | FRED | FALSE |
| G160531A027NBEA | FRED | FALSE |
| W696RC1A027NBEA | FRED | FALSE |
| G160901A027NBEA | FRED | FALSE |
| W585RC1A027NBEA | FRED | FALSE |
| G170811A027NBEA | FRED | FALSE |
| G170821A027NBEA | FRED | FALSE |
| W690RC1A027NBEA | FRED | FALSE |
หรือใช้คำว่า “oil” ในค้นหา
search.oil<-Quandl.search("oil",per_page=1000,silent=TRUE)
search.oil[1:10,c(2,3,12)]
| dataset_code | database_code | premium |
|---|---|---|
| OIL | XTSX | TRUE |
| OIL | CBARH | TRUE |
| OIL | QRM | TRUE |
| OIL | EOD | TRUE |
| OIL | VOL | TRUE |
| OIL | OPT | TRUE |
| OIL | QOR | TRUE |
| OIL | XDUS | TRUE |
| OIL | XBER | TRUE |
| OIL_1 | XNYS | TRUE |
ข้อมูล oil จากฐานข้อมูลต่างๆ เหล่านี้ จะไม่สามารถโหลดมาใช้ได้ฟรีได้ เลือกข้อมูล จากsearch.oil$premium ที่มีึค่าเท่ากับ FALSE โดยใข้คำสั่ง filter จาก package tidyverse
library(tidyverse)
Oil<-filter(search.oil,premium==FALSE)
head(Oil[,c(2,3,12)])
| dataset_code | database_code | premium |
|---|---|---|
| OIL_RSEXKL_PAN | JODI | FALSE |
| OIL_RSEXKB_PER | JODI | FALSE |
| OIL_RSIMKB_PER | JODI | FALSE |
| OIL_RSDEKT_NGA | JODI | FALSE |
| OIL_RSIMKT_SWE | JODI | FALSE |
| OIL_RSEXKD_SUR | JODI | FALSE |
การดึงข้อมูลมาใช้ต้องรู้ชื่อฐานข้อมูล จากตัวแปร “database_code” และข้อมูลที่ต้องการจากตัวแปร “dataset_code” โดยเขียนต่อกันเป็น “database_code/dataset_code” ถ้าต้องการดึงข้อมูลจากฐาน “FRED” ชื่อข้อมูลคือ “G170801A027NBEA” ทำได้โดย
Econ.data <-Quandl("FRED/G170801A027NBEA")
head(Econ.data)
| Date | Value |
|---|---|
| 2019-01-01 | 6.487 |
| 2018-01-01 | 6.377 |
| 2017-01-01 | 6.423 |
| 2016-01-01 | 6.170 |
| 2015-01-01 | 6.163 |
| 2014-01-01 | 7.437 |
สำหรับข้อมูลทางการเงินเช่น ราคาหุ้น ข้อมูลที่ดึงได้คือ ข้อมูลรายวัน(daily) รายสัปดาห์(weekly) รายเดือน(monthly) รายสามเดือน(quaterly) และรายปี(annual) เช่น ถ้าต้องการข้อมูลรายวัน ให้คำสั่งย่อย “collapse=daily”
ถ้าต้องการข้อมูลให้เรียงลำดับเวลาจากอดีตที่ต้องการ ถึงปัจจุบันที่ต้องการคือ ใช้คำสั่งย่อย “order=”asc") จากข้อมูล Econ.data เป็นการเรียงจากข้อมูลล่าสุดไปหาข้่อมูลในอดีต
ช่วงเวลาที่ต้องการใช้่ข้อมูล “start_date” คือวันเวลาที่ต้องการของข้อมูลเริ่มต้น เช่น start_date=“2013-01-01” “end_date” คือวันเวลาที่ต้องการของข้อมูลสุดท้าย เช่น end_date=“2018-01-01” สุดท้ายคือ ชนิดของข้อมูลที่ต้องการก่อนนำไปวิเคราะห์ เช่นข้อมูลแบบ “ts” หรือ “xts” หรือ “timeSeries” เป็นต้น
สมมุติต้องการค้นด้วยคำว่า “NSE”
NSE<-search.econ<-Quandl.search("NSE",per_page=1000,silent=TRUE)
head(NSE[,c(2,3,12)])
| dataset_code | database_code | premium |
|---|---|---|
| NSE_2_UADJ | XTSX | TRUE |
| NSE_2 | XTSX | TRUE |
| 7869_VALUES | RB1 | TRUE |
| 7869_INCOME | RB1 | TRUE |
| 7869_CASHFLOW | RB1 | TRUE |
| 7869_HYCASHFLOW | RB1 | TRUE |
เลิอกโหลดข้อมูล “ALNSE” จากฐาน “EURONEXT” ตั้งแต่ “2015-01-01” ถึง “2019-01-01” เรียงข้อมูลอดีตถึงเท่าที่ต้องการ โดยโหลดข้อมูลเป็นรายสัปดาห์ และต้องการข้อมูลเป็นชนิด “xts” สามารถใช้คำสั่งได้ดังนี้
ALNSE <-Quandl(code="EURONEXT/ALNSE",collapse="weekly",
start_date="2015-01-01", end_date ="2019-01-01",
order= "asc",type="xts")
head(ALNSE,2)
## Open High Low Last Volume Turnover
## 2015-01-04 10.3 10.30 10.15 10.15 26 264.05
## 2015-01-11 10.2 10.75 10.20 10.75 114 1202.45
tail(ALNSE,2)
## Open High Low Last Volume Turnover
## 2018-12-30 8.75 8.9 8.75 8.9 201 1789
## 2019-01-06 8.90 8.9 8.90 8.9 1 9
ข้อสังเหตุ ช่วงเริ่มต้นที่เลือก จะเลิอกที่ใกล้ที่สุด แต่ไม่ก่อนวันที่ “2015-01-01” ข้อมูลสุดท้ายที่ตั้งค่าจะเป็นว่าที่ใกล้ที่สุดที่มีค่ามากกว่าหรือเท่ากับ “2019-01-01”
จะใช้ข้อมูล AirPassengersเป็นตัวอย่างในการวิเคราะห์
AirPassengers
## Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
## 1949 112 118 132 129 121 135 148 148 136 119 104 118
## 1950 115 126 141 135 125 149 170 170 158 133 114 140
## 1951 145 150 178 163 172 178 199 199 184 162 146 166
## 1952 171 180 193 181 183 218 230 242 209 191 172 194
## 1953 196 196 236 235 229 243 264 272 237 211 180 201
## 1954 204 188 235 227 234 264 302 293 259 229 203 229
## 1955 242 233 267 269 270 315 364 347 312 274 237 278
## 1956 284 277 317 313 318 374 413 405 355 306 271 306
## 1957 315 301 356 348 355 422 465 467 404 347 305 336
## 1958 340 318 362 348 363 435 491 505 404 359 310 337
## 1959 360 342 406 396 420 472 548 559 463 407 362 405
## 1960 417 391 419 461 472 535 622 606 508 461 390 432
plot.ts(AirPassengers)
จากข้อมูลและกราฟนี้ ผู้อ่านสังเกตุเห็นอะไรบ้าง?
ข้อชุดนีี้อาจมีแนวโน้ม(trend) ข้อมูลลมีลักษณะเพิ่มขึ้นเรื่อยๆ เมื่อเวลาเพิ่มขึ้น
ข้อมูลนี้อาจมีฤดูกาลมาเกี่ยวข้อง(seasonal)เพราะจากกราฟ มีลักษณะบางเดือนมีค่าสูงสุดทุกปีและบ้างเดือนมีค่าต่ำสุดทุกปี
หมายเหตุ ข้อมูลกรมเวลาบ้างชุดอาจจะมีวัฏจักร(cycle) เข้าเกี่ยวด้วยก็ได้ และเมื่อทำการพยากรณ์ เป็นได้ยากที่จะทำการพยากรณ์ได้ถูกต้อง 100% ดังนี้ โดยตัวแบบเบื้องต้นสร้างได้โดย
1) ตัวแบบการบวก(additive model) \[Y_t=T_t+S_t+\varepsilon_t \] 2) ตัวแบบการคูณ(multiplicative model) \[Y_t=T_t\times S_t\times\varepsilon_t \] โดยที่
\(Y_t\) คือข้อมูลตัวที่ \(t,t=1,2,\cdots,n\)
\(T_t\) คือค่าของแนวโน้ม ณ เวลาที่ \(t\)
\(S_t\) คือค่าฤดูกาล ณ เวลาที่ \(t\)
\(\varepsilon_t\) คือคาดเคลื่อนจากการพยากรณ์ ณ เวลาที่ \(t\)
ค่า พยากรณ์ที่เวลา \(t\) ใดๆ สำหรับตัวแบบการบวกคือ \[\widehat{Y}_t=T_t+S_t \] ตัวแบบการคูณ \[\widehat{Y}_t=T_t\times S_t \] ตัวแบบการคูณสามารถเปลี่ยนเป็นตัวแบบการบวกได้ ถ้าค่า \(Y_t\) มากกว่าศูนย์ทั้งหมด \[\log(Y_t)=\log(T_t)+ \log(S_t)+\log(\varepsilon_t) \] ## การแยกองค์ประกอบข้อมูลออกมาด้วย คำสั่ง decompose จากข้อมูล AirPassengers ถ้าเลือกตัวแบบการบวก
Air.add <- decompose(AirPassengers, type="additive")
plot(Air.add)
เช็คความถูกต้องเบื้องต้น จากการพิจารณาข้อมูล Air.add ที่ไม่ได้มีเป็น \(NA\) หมายเหตุ ที่บางค่ามีค่าเป็น NA เนื่องจากผลของการคำนวณโดยภาษาอาร์
head(Air.add$trend,7)
## [1] NA NA NA NA NA NA 126.7917
AirPassengers[7]
## [1] 148
Air.add$trend[7]+Air.add$seasonal[7]+Air.add$random[7]
## [1] 148
ถ้าเป็นตัวแบบการคูณ ทำได้โดย
Air.mult <- decompose(AirPassengers, type="multiplicative")
plot(Air.mult)
เช็คความถูกต้องเบื้องต้น จากการพิจารณาข้อมูล Air.mult ที่ไม่ได้มีเป็น \(NA\)
head(Air.mult$trend,7)
## [1] NA NA NA NA NA NA 126.7917
AirPassengers[7]
## [1] 148
Air.mult$trend[7]*Air.mult$seasonal[7]*Air.mult$random[7]
## [1] 148
ถ้าเลือกใช้คำสั่ง docompose การพยากรณ์ค่าในอนาคตทำได้ยาก ดังนี้จะขอนำเสนอให้ใช้ package forecast แทน ค่าที่คำนวณได้อาจไม่เท่ากันแต่เพราะมีการคำนวณแนวโน้มหรือฤดูกาลที่แตกต่างกัน
library(forecast)
และใช้คำสั่งดังนี้สำหรับตัวแบบการบวก
Air.add2 <- tslm(AirPassengers ~ trend + season)
ถ้าต้องการพยากรณ์ล่วงหน้า 12 เดือน
Air.add2.forecast <- forecast(Air.add2,h=12)
Air.add2.forecast
## Point Forecast Lo 80 Hi 80 Lo 95 Hi 95
## Jan 1961 449.2557 413.5574 484.9540 394.4287 504.0827
## Feb 1961 442.5057 406.8074 478.2040 387.6787 497.3327
## Mar 1961 477.6723 441.9740 513.3707 422.8453 532.4994
## Apr 1961 474.5890 438.8907 510.2873 419.7620 529.4160
## May 1961 479.3390 443.6407 515.0373 424.5120 534.1660
## Jun 1961 519.1723 483.4740 554.8707 464.3453 573.9994
## Jul 1961 558.8390 523.1407 594.5373 504.0120 613.6660
## Aug 1961 558.5890 522.8907 594.2873 503.7620 613.4160
## Sep 1961 509.9223 474.2240 545.6207 455.0953 564.7494
## Oct 1961 474.0890 438.3907 509.7873 419.2620 528.9160
## Nov 1961 440.3390 404.6407 476.0373 385.5120 495.1660
## Dec 1961 469.3390 433.6407 505.0373 414.5120 524.1660
autoplot(Air.add2.forecast)
สำหรับตัวแบบการคูณก็ทำนองเดียวกัน
Air.mult2 <- tslm(AirPassengers ~ trend * season)
Air.mult2.forecast <- forecast(Air.mult2,h=12)
Air.mult2.forecast
## Point Forecast Lo 80 Hi 80 Lo 95 Hi 95
## Jan 1961 422.3636 398.1224 446.6049 385.1183 459.6090
## Feb 1961 394.4545 370.2133 418.6958 357.2092 431.6999
## Mar 1961 450.1667 425.9254 474.4079 412.9213 487.4120
## Apr 1961 458.1515 433.9102 482.3928 420.9062 495.3968
## May 1961 476.7424 452.5011 500.9837 439.4971 513.9877
## Jun 1961 551.8939 527.6527 576.1352 514.6486 589.1393
## Jul 1961 631.8788 607.6375 656.1201 594.6335 669.1241
## Aug 1961 629.6970 605.4557 653.9382 592.4516 666.9423
## Sep 1961 524.2121 499.9708 548.4534 486.9668 561.4574
## Oct 1961 464.6970 440.4557 488.9382 427.4516 501.9423
## Nov 1961 403.2424 379.0011 427.4837 365.9971 440.4877
## Dec 1961 446.1515 421.9102 470.3928 408.9062 483.3968
autoplot(Air.mult2.forecast)
จากกราฟ จะเห็นว่านอกจากค่าพยากรณ์แล้วยังมีค่าของช่วงความเชื่อมั่นที่ 80% และ 90% ด้วย เนื่องจากเป็นข้อมูล AirPassengers เป็นข้อมูล รายเดือน จำนวน 22 ปี ดังนั้น ฤดูกาลจะมีทั้งหมด 12 ตัว ถ้าเป็นข้อมูลราย 3 เดือนฤดูกาลจะมี 4 ตัว ข้อมูลอนุกรมเวลา ส่วนมากจะไม่สามารถเก็บได้เอง ต้องอาศัยการดึงข้อมูลจากฐานข้อมูลเป็ณส่วนใหญ่
สำหรับรายละเอียดเชิงลึกสำหรับตัวแบบการบวก และตัวแบบการคูณ และตัวแบบอนุกรมเวลาอื่นๆ จะอธิบายอย่างละเอียดในหนังสือเล่มต่อๆไป ถ้ามีโอกาสได้เขียน และหนังสือหรือเอกสารเล่มได้รับความนิยมมากพอ(เป็นกำลังใจให้เขียนเล่มใหม่)