SET_panic_gornnutagorn_cover_blog2

สวัสดีครับ

R Workshop จะเป็นบทความที่พูดถึง ตัวอย่างการที่ผมนำ R ไปใช้จริงเลยครับ

ช่วงนี้ผมกำลังสนใจการเล่นหุ้นแบบ Technical เป็นพิเศษ ผมอยากรู้ว่าในช่วงที่หุ้นร่วงแรงๆ หรือเกิด Panic รูปกราฟ SET Index ทั้งก่อนและหลัง จะเป็นอย่างไร?

มันเชื่อมไปเรื่องเช่นว่า ถ้าเล่น Tfex เปิด LONG อยู่ควรทนประมาณไหน(drawdown) ? ถ้าถือหุ้น หรือ ถือ call อยู่ เราควรเลือกที่จะ รอ / ถัว หรือ คัท ดี หากมองในมุมกราฟ? ….หรือมันคือโอกาส ในการช้อน!!! ……

เนื่องจาก ผมแค่อยากรู้ว่า ช่วงๆนั้น (ประมาณ 2 อาทิตย์) ก่อนและเกิด Panic แท่งเทียน Day มีการเคลื่อนไหวอย่างไร ไปแล้วไม่กลับหรือเปล่า? ผมจึงใช้ R มาช่วย เนื่องจาก กราฟมันเยอะมาก ประมาณว่า
– ถ้าผมกำหนด Panic ที่ -4% ลงไป จะต้องพล็อต 30 กว่ากราฟ
– ถ้าผมกำหนด Panic ที่ -3% ลงไป จะต้องพล็อต 80 กว่ากราฟ

ผมเลยลองรวบรวมพล้อตรูปกราฟแบบ EOD  ในช่วงเวลานั้นๆมาว่าเป็นอย่างไร ซึ่งใช้ข้อมูลตั้งแต่ปี 2006 ถึง วันที่ 9 พ.ย. 2018 คือ ข้อมูลประมาณ 13 ปีครับ โดยผมใช้วิธีการดังนี้ครับ

เดี๋ยวผมจะอธิบายสเปคกราฟก่อน หลังจากใส่รูปแล้ว แล้วจะเป็นการอธิบายโค้ด R อย่างละเอียดครับ

แนวคิดการ Plot Chart

1 เลือกวันที่ทำ Low เทียบกับ Close เมื่อวาน ร่วงมากกว่าหรือเท่ากับ -4% ซึงเกิด 30 กว่าครั้ง (ถ้าใช้ -3% กราฟจะดูเยอะไปครับ) ทั้งนี้ผมใช้ค่า Low เป็นเพราะ ผมคาดว่าการร่วงแรงส่วนมากน่าจะเป็น Panic และน่าจะเด้งในเวลาต่อมา (เดี๋ยวมาดูกันครับ)

2 แต่ละรูปจะประกอบไปด้วยเทียน 13 แท่ง คือก่อนและหลังวันเกิด low นั้นๆ ข้างละ 6 วัน

3 บนหัวแต่ละรูปผมจะระบุไว้แล้วว่า เกิดวันไหน ทำ Bottom ที่กี่เปอร์เซ็นต์ เทียบกับ Close ก่อนหน้าครับ

จากการดูคร่าวๆนะครับ (โคตรคร่าวๆ) พบว่า เฉพาะช่วง Subprime (2008) และ หนี้ยุโรป (2011) ที่ค่อนข้างชัดเจนว่า ลงแล้วกู่ไม่ค่อยกลับครับ ดังนั้นผมอาจมีความเห็นว่า โดยทั่วไปถ้าเกิด Panic แรงๆ ถ้าทนถือ Position ต่อไปได้ ก็น่าถือ ถ้าไม่ได้มีเหตุทาง Fundamental ที่เกิดแบบชัดเจนและยาวนานครับ

 

ผมจะใส่ตัวอย่างให้ดู 3 รูปเต็มๆนะครับ จะเป็นกราฟแท่งเทียน 13 วัน ซึ่งผมจะระบุวันที่เกิด พร้อม Low ที่เกิด บนหัวภาพนะครับ

SETpanic2006-09-21_bygornnutagorn
SETpanic2006-09-21_bygornnutagorn
SETpanic2006-12-19_bygornnutagorn
SETpanic2006-12-19_bygornnutagorn
SETpanic2007-08-16_bygornnutagorn
SETpanic2007-08-16_bygornnutagorn

 

 

เนื่องจากภาพค่อนข้างเยอะ 30 กว่าภาพ ผมจึงขอใส่ Thumbnail ไว้แทน โดยสามารถดูรูปทั้งหมดได้ในเพจผมตามลิงค์ด้านล่างนี้ครับ

ผมอยากรู้ว่าในช่วงที่หุ้นร่วงแรงๆ หรือเกิด Panic รูปกราฟ SET Index ทั้งก่อนและหลัง จะเป็นอย่างไร? ถ้าเล่น Tfex เปิด…

โพสต์โดย GornNutagorn เมื่อ วันเสาร์ที่ 10 พฤศจิกายน 2018

 

————————————-

มาเข้าสู่ช่วงของ Code R กันครับ

ผมจะขออธิบายตามลำดับ และจะใส่โค้ดทั้งหมดไว้ข้างล่างสุดเลยนะครับ

1. โหลดแพคเกจที่ต้องใช้มา

2. ผมโหลดข้อมูล SET EOD มาจาก efinance ตั้งแต่ตลาดหุ้นเปิด ในรูป Excel แล้วมาเซฟเป็นไฟล์ xlsx ไว้ใน working directory ก่อน แล้ว

  • เพิ่ม row index เป็นวัน
  • เปลี่ยนชื่อ column
  • แปลงเป็น object แบบ xts

สาเหตุที่ผมใช้ไฟล์ Excel เพราะผมแค่อยากลอง เอาไฟล์ Excel มาทำ เป็น xts ประกอบกับว่า ผมไม่รู้ว่า quantmod จะดึงข้อมูลพวกนี้ได้โดยตรงหรือเปล่าครับ (บทความที่แล้ว ผมเขียนเรื่องการดึงราคาโดย quantmod ง่ายๆไว้ตามลิงค์นี้ครับ
https://gornnutagorn.com/2018/08/31/r-candlestick-pattern-recognition/
)

(ตัวอย่างไฟล์ Excel ที่เอามาจาก efinance ครับ)

3. filter ช่วงเวลาตั้งแต่ปี 2006 (อันนี้ผมดูใน Excel แล้วเลือก row ครับ)

4. เพิ่ม column previous close price เข้ามา และลบข้อมูล วันแรกทิ้ง (ไม่มีราคาปิดวันก่อนหน้า)

5. เพิ่ม

  • column : pbottom เพื่อหา % ของ Low วันนี้ เทียบ Close วันก่อนหน้า
  • column : event โดยให้วันที่เกิด pbottom <= -4% มีค่าเป็น 1 (นอกนั้น 0)

6. เพิ่ม column : eventrank เพื่อใส่ลำดับเป็น integer ในวันที่เกิด event เพื่อเตรียมการทำ looping ภาพ

7. ดูจำนวนครั้งที่เกิดเหตุการณ์ ใน data ชุดนี้

8. เตรียมรูปภาพสำหรับแปะ Signature … คือสุดท้าย ผมอยากใส่ signature ไว้ในภาพด้วย ผมเลยต้องเตรียม template ภาพไว้ก่อนครับ ตามนี้ครับ (เป็นภาพพื้นขาวขนาด 960 x 600 px โดยมี signature ด้านล่าง  คือผมเผื่อไป Merge กับภาพ chart ขนาด 960 x 540 px ที่ผมกำลังจะทำในขั้นตอนต่อไปครับ)

ภาพพื้นขาว เตรียมใส่ signature

9. อันนี้ จะหลายขั้นหน่อยนะครับ

  • ผมจะ loop ไปตาม integer ตั้งแต่ 1 ถึง จำนวน event ทั้งหมดที่เกิด
  • หา row ที่เกิด event ก่อน [bottompoint]
  • กำหนด ช่วง row ที่จะเอามาพล็อตกราฟ ( -6 / +6 จากวันที่เกิด Event) [lbp,hbp]
  • เตรียมข้อมูลวันที่ และ % ที่เกิด [percminus,fname]
  • เตรียมคำพูดสำหรับใส่หัวชาร์ต เช่น 2001-10-12 SET Index made low by -5 percent [chartanno]
  • เตรียม path และ ชื่อไฟล์ ที่จะเซฟ [fnameloc]
  • สร้างกราฟแท่งเทียนก่อนออกมาเป็น png โดย plot ด้วย chartSeries() ขนาด 960×540 px
  • ดึงภาพกราฟเข้ามาอีกทีให้เป็น object ของ package magick
  • รวมกราฟ และ ภาพพื้นขาวที่ลง signature ด้วยกัน และเซฟกลับไปอีกที ด้วยชื่อเดิม

จบครับ และภาพทุกอย่างจะวิ่งเข้าไปใน folder เหมือนใน thumbnail ด้านบนที่ผมทำไว้ครับ

*หมายเหตุ : ผมยกเว้นไม่ได้ใส่ 1 กราฟใน thumbnail ครับ

ในบทความนี้ มีอีกอย่างที่อยากฝากเป็นหมายเหตุก่อนอ่าน syntax ที่ผมเขียนด้านล่างนะครับ คือบางท่านที่ใช้ R บ่อยๆ อาจสังเกตว่า ผมไม่ค่อยใช้ package ที่เกี่ยวกับ data manipulation รวมถึงโครงสร้างจะไม่เหมือนที่ programmer เขียน เช่นไม่ค่อยเขียน function แต่จะเถือกเถือ เขียนสั่งไปเรื่อยๆนะครับ … อันนี้ คือความถนัดของผมเองครับ ผมแค่อยากบอกว่า ที่จริงอย่างที่ผมทำมันไม่ค่อยจะดี โดยท่านสามารถเขียน code ให้สั้นกว่าผมและเป็นระเบียบกว่าได้เยอะเลยครับ (ผมไม่ค่อยได้โฟกัส ตราบที่มันไม่ได้ run ช้าอะไรมาก)  เลยอยากฝากกับคนที่ตั้งใจจะใช้ R เป็นประจำไว้หน่อยครับ ว่านี่อาจเป็นตัวอย่างที่ไม่ค่อยดีในด้านหนึ่ง

 

Code R ทั้งหมด

# 1. prepare required library
library(xlsx)
library(readxl)
library(data.table)
library(xts)
library(quantmod)
library(magick)

# 2. prepare xlsx file from eFinance and transform it to xts format 
set <- read.xlsx("./set.xlsx",stringsAsFactors = FALSE,sheetIndex = 1)
row.names(set) <- set$Timestamp
set$Vol <- as.numeric(as.character(set$Vol))
set$Timestamp <- NULL
colnames(set) <- c("open","high","low","close","volume")
setts <- as.xts(set)

# 3. select time period from 2006 (manually explored in Excel)
data1 <- setts[7553:10694,]

# 4. add close price (t-1) column
closem1temp <- c(0,data1[,"close"])
closem1 <- closem1temp[2:length(closem1temp)-1]
data2 <- cbind(data1,closem1)
colnames(data2)[6] <- "closem1"
data3 <- data2[-1,]


# 5. add current low price percentage column compared to previous close price 
# add boolean column for those events (SET Index made bottom equal or lower than -4%)
data3 <- cbind(data3,round((data3[,"low"]-data3[,"closem1"])/data3[,"closem1"],digits=4))
colnames(data3)[7] <- "pbottom"
data3 <- cbind(data3,ifelse(data3[,"pbottom"]<= -0.04,1,0))
colnames(data3)[8] <- "event"


# 6. add rank column for those events
data3$eventrank <- NA
eventrankvalue <- NA
for(i in seq.int(1:nrow(data3))){
  ifelse(data3[i,"event"]==1,
  eventrankvalue <- sum(data3[1:i,"event"]),
  eventrankvalue <- 0)
  data3[i,"eventrank"] <- eventrankvalue
}


# 7. show all events occured
allevent <- max(data3$eventrank)


# 8. prepare my signature image file to combine with upcoming chart images
templatestock <- image_read("./pic/templatestock.png")


# 9. looping to create chart images showing each time 
# SET Index made bottom equal or lower than -4%
for(s in 1:allevent){
  bottompoint <- which(data3$eventrank == s)
  lbp <- ifelse((bottompoint-7)<=0,0,bottompoint-7)
  hbp <-ifelse((bottompoint+6)>max(nrow(data3)),nrow(data3),(bottompoint+6))
  percminus <- data3[data3$eventrank==s,"pbottom"][[1]]*100
  fname <- substr(index(data3[data3$eventrank==s,]),1,10)
  chartanno <- paste(fname,"SET Index made low by",percminus,"percent")
  fnameloc <- paste("./panicpic/SETpanic",fname,"_bygornnutagorn.png",sep="")
  png(filename = fnameloc, width = 960,
      height = 540, units = 'px', res = 100)
  chartSeries(data3[lbp:hbp,1:5],name=chartanno)
  dev.off()
  magickimg <- image_read(fnameloc)
  mergeimg <- c(templatestock,magickimg)
  image_write(image_mosaic(mergeimg),fnameloc,format = "png")
}

 

ขอขอบคุณที่อ่านจนจบครับ

Created by : GornNutagorn

ช่องทางอื่นๆของ GornNutagorn

Facebook : https://www.facebook.com/GornNutagorn/

Youtube : www.youtube.com/c/GornNutagornChannel

 

Sponsored by :

#####################################

grocerlock_โกรเซอล็อค

 

สนับสนุนโดย : www.grocerlock.com (คลิกเพื่อเข้าเว็บ)

ซุปเปอร์มาร์เก็ตออนไลน์ ขายสินค้าอุปโภคบริโภคทั่วไป

ขายปลีก-ส่ง / ต่อรองได้ / ส่งทั่วประเทศ

FB อินบ้อกได้ที่ : https://www.facebook.com/grocerlock (คลิกเพื่อส่งข้อความทางอินบ็อกซ์)

ซื้อผ่านไลน์ได้ที่ Line ID : @grocerlock (คลิกเพื่อเพิ่มเพื่อน)

#####################################

LEAVE A REPLY

Please enter your comment!
Please enter your name here