อนุกรมเวลา(Time Series)

อนุกรมเวลาคือ ชุดข้อมูลที่มีเวลาเป็นเข้าเป็นปัจจัยหรือบอกลำดับของข้อมูลชุดนั้น เช่น ราคาหุ้นรายวัน อัตราการเติบโตของ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)

สหสัมพันธ์ขอบอัตโนมัติ(Autocorrelation)

สหสัมพันธ์แบบอัตโนมัตินี้ คือการวัด

par(family = "TH Sarabun New")  
acf(PTT$close,main="สหสัมพันธ์แบบอัตโนมัติของราคาปิดของหุ้น PTT")

### สหสัมพันธ์แบบอัตโนมัติบางส่วน (Partial autocorrelation)

par(family = "TH Sarabun New")  
pacf(PTT$close,main="สหสัมพันธ์แบบอัตโนมัติบางส่วนของราคาปิดของหุ้น PTT")

package สำคัญสำหรับการดึงข้อมูลทางเศรษฐศาสตร์จากฐานข้อมูล

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
  1. Government expenditure by function (COFOG)
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
  1. General Government Debt - Maastricht

เมื่อได้ชื่อข้อมูลแล้ว ก็สามารถดึงมาวิเคราะห์ได้โดยใช้คำสั่ง “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 เป็นต้น

package Quandl

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

คำสั่งย่อยภายในที่น่าสนใจสำหรับคำสั่ง Quandl

สำหรับข้อมูลทางการเงินเช่น ราคาหุ้น ข้อมูลที่ดึงได้คือ ข้อมูลรายวัน(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 ตัว ข้อมูลอนุกรมเวลา ส่วนมากจะไม่สามารถเก็บได้เอง ต้องอาศัยการดึงข้อมูลจากฐานข้อมูลเป็ณส่วนใหญ่

สำหรับรายละเอียดเชิงลึกสำหรับตัวแบบการบวก และตัวแบบการคูณ และตัวแบบอนุกรมเวลาอื่นๆ จะอธิบายอย่างละเอียดในหนังสือเล่มต่อๆไป ถ้ามีโอกาสได้เขียน และหนังสือหรือเอกสารเล่มได้รับความนิยมมากพอ(เป็นกำลังใจให้เขียนเล่มใหม่)