ARIMA model หรือ ชื่อเต็มๆ ก็คือ "(AutoRegressive Integrated Moving Average)" คิดว่าหลายท่านที่ทำงานคุ้นเคยกับข้อมูลที่มีลักษณะเป็นอนุกรมเวลา (Time Series) คงจะเคยได้ยินกันนะครับ โมเดลนี้ สำหรับตัวผมเอง ก็เป็นโมเดลที่ศึกษาเป็นโมเดลแรกๆ เลยก็ว่าได้ ตั้งแต่ก้าวเข้ามาทำงานกันข้อมูลหุ้น วันนี้ ผมจะมาเล่าให้ฟังเท่าที่เข้าใจนะครับ ว่าเจ้า ARIMA นี่มันมีหลักการทำงานอย่างไร


ARIMA(AutoRegressive Integrated Moving Average)
ประกอบไปด้วย Combination ของ Time Series 3 เทคนิค คือ AR (Autoregressive), I (Integrated), MA (Moving average) โดยผมจะค่อยๆ อธิบายให้ฟังทีละตัวนะครับ แต่โดยหลักๆ แล้วทุกเทคนิค คือการร่วมกันกำจัด “Noise” ออกจากข้อมูลเพื่อพยายามลด Error term ให้ได้มากสุดจนสามารถมั่นใจได้ว่า ข้อมูลนั้น Reliable หรือ เชื่อถือได้ ซึ่งจะทำให้การทำนาย (Forecast) ในขั้นตอนต่อไปมีประสิทธิภาพมากขึ้นนั่นเองครับ

ถ้าจะเปรียบเทียบเทคนิคทั้ง 3 เทคนิคนี้ ก็จะเปรียบได้กับการ “ตากผ้า” ซึ่ง ผ้า ในที่นี้ก็จะหมายถึง “ข้อมูล” นะครับ ขั้นแรก บิดน้ำออกจากผ้า (Check Data) ขั้นตอนต่อไปก็ สะบัดผ้า (Diff data) และสุดท้ายก็คือ ตากผ้า (ARIMA) นั่นเองครับ มาดูรายละเอียดกันเลยครับ


1) กระบวนการเช็คข้อมูลก่อนจะทำ ARIMA

ก่อนอื่นมาเริ่มกันที่กระบวนการตรวจสอบข้อมูลกันก่อนครับ กระบวนการตรวจสอบข้อมูลก่อนจะทำ ARIMA มีขั้นตอน ดังนี้

Step 1.1 -- ตรวจดูว่าข้อมูล Time Series ของเรา มี “White noise” ที่ไม่สามารถกำจัดมันออกไปได้หรือไม่? ถ้ามี แปลว่า Time Series นั้นๆ มัน Uncorrelated กันครับ เหมือนมันเป็นอะไรที่ราคาในแต่ละวันนั้นแรนด้อมจากกันโดยสิ้นเชิง ยกตัวอย่างเช่น วันแรก 348,720 วันที่สอง 500,000 วันที่สาม 9,783 วันที่สี่ 170,000 และ อยู่ในฟอแมทนี้ไปเรื่อยๆ ตลอดทั้งชุดข้อมูล ดังนั้น การเอา ARIMA มาใช้ก็ออกจะไม่สมเหตุสมผลเท่าใดนัก ตัวอย่างเช่น AR คือตัวมันเองใน x วันที่ผ่านมาคูณกับ Coefficient เท่าไหร่ก็ว่า แต่ ถ้าข้อมูลเป็นแบบที่ผมยกตัวอย่างมันก็เจ๊งแล้ว

Step 1.2 -- ข้อมูลนี่มันเป็น Stationary หรือเปล่า ถ้า ไม่ ก็ Differencing มันให้เป็น Stationary ซะก่อน (term Integrated นั่นไง)

Step 1.3 -- สุดท้าย จึงเอา ARIMA มาใช้งานกับข้อมูลนั้นๆ ได้

องค์ประกอบของ ARIMA(p,d,q) ประกอบด้วยพารามิเตอร์ 3 ตัว จาก 3 วิธีการที่นำมารวมเป็น โมเดล ARIMA โดยที่ p เป็นพารามิเตอร์ของ AR, d เป็นพารามิเตอร์ของ I, q เป็นพารามิเตอร์ของ MA ขอเริ่มดูที่ I กันก่อนเลยนะครับ

2) Integrated (I)

พารามิเตอร์ d ของวิธีการ Integrated ตัวนี้นำมาหาความเป็น Stationary ของ Time Series ซึ่งต้องคงสถานะนี้เมื่อเวลาผ่านไป เป็นสิ่งที่ สำคัญมากในโมเดล ARIMA หรือ พูดง่ายๆ ก็คือ ข้อมูลอย่าง ค่าเฉลี่ย (Mean), ความแปรปรวน (Variance) ต้องมีค่าคงที่เมื่อเวลาผ่านไปกล่าวคือ ถ้าข้อมูลมีแนวโน้ม (Trend) หรือ มี seasonal มันก็จะไม่ใช่ Stationary แล้ว เพราะข้อมูลจำพวก Mean และ Variance จะไม่คงที่ เราจึงต้องทำให้ข้อมูลเป็น Stationary ก่อนจึงจะสร้างโมเดลจากข้อมูลนั้นๆ ได้ การทำให้ข้อมูลเป็น Stationary โดยปกติแล้วสามารถทำได้โดยการ Differencing ข้อมูล คำถามใหม่ที่ตามก็คือ แล้วเราต้องทำ Differencing ข้อมูล (ตัวแปร d) แค่ไหนล่ะ? แค่ไหนจึงจะถือว่าข้อมูล Stationary แล้ว?


พูดถึง Stationary กันมาพอสมควร มาทดสอบดูกันหน่อยดีกว่าครับ จากรูปด้านล่าง พอจะบอกกันได้มั้ยครับว่า ข้อมูลตัวไหนมีลักษณะเป็น Stationary บ้าง???


เฉลยนะครับ ข้อมูลที่เป็น Stationary ซึ่งไม่มี Trend หรือ Seasonal เลยมีเพียงตัวเดียวคือ ข้อมูลในรูป b ครับ ตอบถูกกันมั้ยครับ? ไม่ง่ายใช่มั้ยครับ การดู Stationary ด้วยตาเปล่า?

ดังที่เห็นไปแล้วจากตัวอย่างด้านบนว่าไม่ใช่ว่าข้อมูล Time Series ทั้งหมดจะเป็น Stationary ปัญหาก็คือถ้าข้อมูลไม่เป็น Stationary แล้วเราควรทำอย่างไร? เลิกทำไปเลยหรอ? ไม่ครับ คำตอบคือ เราก็ต้องทำให้ข้อมูลนั้นกลายเป็น Stationary ด้วยการ Differencing มันนั่นเองครับ มาดูตัวอย่างกันครับ

ตัวอย่างการ Differencing ของ พารามิเตอร์ d ของฟังก์ชั่น I ใน ARIMA(p,d,q) 1 และ 2 ตามลำดับ เห็นมั้ยครับฟังเหมือนจะยาก จริงๆ ก็ไม่ได้ยากนักหรอกครับ ถ้าข้อมูลไม่เป็น Stationary ก็จะทำการ differencing ข้อมูลซะ จากนั้นก็นำมาเข้าสมการทางคณิตศาสตร์ Augmented Dickey–Fuller test (ADF) เพื่อเช็คว่าข้อมูลเป็น Stationary หรือยัง เท่านี้เองครับ

มาดูตัวอย่างกันอีกซักหนึ่งตัวอย่างดีกว่าครับ++


รูปที่ 1 (ด้านบนสุด) : เป็นข้อมูลการพลังงานอเมริกา จะเห็นได้ชัดเจนว่าข้อมูลดิบยังมี Trend ชัดเจนมากก็คือ เห็นได้ชัดว่า ไม่เป็น Stationary นั่นเองครับ

รูปที่ 2 : ข้อมูล Log Scale ซึ่งสร้างมาจาก การนำข้อมูลดิบมา take Logarithm เข้าไป จะเห็นได้ว่า ก็ยังมี Trend ชัดเจนอยู่ ก็คือ ยังไม่เป็น Stationary อีกแล้วครับ

รูปที่ 3 : รูปนี้มีการเริ่มทำ Differencing รอบแรก จะเห็นว่าข้อมูลเริ่มเป็น Stationary มาขึ้นแล้ว (Trend เริ่มหายไป) แล้วแต่ยังมี Season หรือ Seasonality อยู่ครับ

รูปที่ 4 (รูปล่างสุด) : นำข้อมูล Seasonality จากรูปที่ 3 มา Differencing อีกรอบ และ ในที่สุด ในขั้นตอนนี้เอง ข้อมูลของเราก็ได้กลาย เป็น Stationary โดยสมบูรณ์ แล้วครับ

เห็นมั้ยครับ ไม่ยากเลยครับ แต่ถ้าจะให้ดูด้วยตาเปล่าอาจจะดูยากซักนิดนึง อย่างที่กล่าวไปแล้วด้านบน จริงๆ แล้วตอนทำ จะทดสอบว่าเป็น Stationary หรือไม่นั้น ต้องใช้ค่าสถิติทดสอบนะครับ (Augmented Dickey–Fuller test (ADF))

Auto Regressive (AR)

Auto Regressive ตามความหมายก็คือ การใช้ค่าของตัวมันเองในการทำนายวันถัดไปนั่นเองครับ โดยที่พารามิเตอร์ p ของ AR ก็คือ จำนวนเวลาที่ lag ใน time series นั่นเอง โดยการคำนวนจะมีการถ่วงหน้ำหนักด้วย ของ time series ก่อนหน้าหน้าที่ p อีกทีหนึง สรุปง่ายๆ ก็คือ สมการนี้ตั้งอยู่บนสมมุติฐานที่ว่า ค่าของวันที่เราจะทำนายมีความสัมพันธ์กับค่าในอดีตของตัวมันเอง ครับ เช่น ราคาหุ้นวันนี้จะขึ้นกับราคาหุ้นของ x วันก่อน เป็นต้น นี่เป็นคอนเซปที่ AR นำมาใช้กันครับ มาดูสมการกันหน่อย

Screenshot from 2017-06-11 18-57-35.png

จากสมการ

c = ค่าคงที่

&i = order ของ auto regressive

Xt-i = ค่าของ time series ที่เวลา t-i

Et = ค่า error ของโมเดล

ตัวอย่างเช่น สมมุติฟังก์ชั่นคำนวน c ออกมาแล้วได้ 5 และ & คือ coefficient ของ AR ตัวอย่างเช่น ราคาหุ้นในวันนี้จะอยู่บนสมมุติฐานที่ว่า จะเท่ากับกี่เปอร์เซ็นของราคาเมื่อวานเป็นต้น เรามาลองสมมุติว่า จะถ่วงน้ำหนักของวันก่อนหน้าที่ 0.85 และ ถ้าในที่นี้พารามิเตอร์ p อยู่ที่ 1 วัน ความหมายก็คือ ค่าที่ทำนายขึ้นกับค่าวันก่อนหน้า 1 วันนั่นเอง ก็จะ i ใน Xt-i เป็น Xt-1 และสมมุติว่า Xt-1 มีค่าเท่ากับ 28 จะได้ดังนี้

AR = 5 + 0.85(28)+Et

ถ้ากรณีที่พารามิเตอร์ p ของ AR มากกว่า 1 นั้นหมายความว่าราคาหุ้นของวันนี้จะเท่ากับ ราคาหุ้นของเมื่อวาน * coefficient + ราคาหุ้นของเมื่อวานซืน * coefficient (ในกรณีที่ i เป็น 2) + Et เป็นต้น

การประเมินพารามิเตอร์ p นั้นสามารถทำได้หลายทาง ทางหนึ่งคือ ดู Auto Correlation Function และ Partial Autocorrelation Function ของมัน แต่ผมว่าประเมินด้วย GRID Search จะง่ายกว่า

Moving Average (MA)

คอนเซปของ MA นี้นั้นจะค่อนข้างคล้ายกับคอนเซปของ AR แต่จะตั้งบนสมมุติฐานของ Error แทนครับ เช่น ถ้าพารามิเตอร์ q ของ MA เป็น 2 เป้าหมาย ณ วันนี้จะเท่ากับ Error ของเมื่อวาน * coefficient + ด้วย Error ของเมื่อวานซืน * coefficient นั่นเองครับ ดั่งสมการด้านล่างนี้

Screenshot from 2017-06-11 20-30-51

จากสมการ

u = ค่าคงที่

Et = Error Term ของโมเดล

Oi = order ของ moving average

Et-i = คือผลรวมของ error term t-i

maq-570x306.png

จากรูป MA (1) คือ lag 1 dependency ของโมเดล MA MA(2) คือ lag 2 dependency ของมันนั่นเองจะเห็นว่า ก็เหมือนๆกันกับ AR อยู่พอสมควร

สรุปนะครับ ใน ARIMA นั้น MA(q) จะถูกนำมาประเมินร่วมกับ AR(p) โดยทั้งสองตัวนี้จะต้องมีค่า Coefficient ที่แตกต่างกันด้วย ต่อมา Differential เทอม I(q) จะถูกรวมเข้ามาด้วย จากกระบวนการทั้งหมดมารวมกัน จึงกลายเป็น ARIMA(p,d,q) ที่สามารถทำนายค่าได้อย่างมีประสิทธิภาพมากขึ้น เห็นมั้ยครับว่า จริงๆ ARIMA ถ้าเราแยกเป็นส่วนๆ ให้เห็นการทำงาน ก็ไม่ได้น่ากลัวอย่างที่คิดเลย

แล้วรู้ได้อย่างไรว่า (p, d, q) แค่ไหนดี?

เราสามารถเทสค่าเหล่านี้ว่าดีหรือไม่ได้ด้วยวิธีการทาง Statistic ที่มีชื่อว่า Akaike Information Ccriterion (AIC) ซึ่งโมเดลที่ได้ค่า AIC ต่ำสุดคือโมเดลที่สามารถอธิบายข้อมูลของ Time Series โดย ARIMA มากที่สุด โดยในส่วนนี้เราจะไม่เข้าไปที่คณิตศาสตร์ของมันมากนะครับ หลักๆ เราก็เขียนโปรแกรม GRID Search เพื่อหาวนลูปเทส AIC แล้วเช่น (p, d, q) ={(1, 0, 0), (1, 1, 0), (1, 1, 1), (2, 0, 0), (2, 1, 0), (2, 1, 1), (2, 2, 1) …..( ?, ?, ?)} แล้วจึง เลือกวิธีการที่ให้ค่า AIC ต่ำสุดครับ แต่วิธีเขียนโปรแกรมเทสก็ไม่ได้ยากมากนักไว้โอกาสหน้าจะเขียนให้ดูครับ

ARIMA เป็นโมเดลที่ถูกคิดค้นขึ้นมาจาก 2 ป๋าในวงการ Time Series คือ คุณ Box และ คุณ Jenkins ตั้งแต่ปี 1976 นู้นเลยครับ เห็นไหมครับมันมีมานานแค่ไหนแล้ว เพราะฉะนั้น เราคงพูดได้เลยว่าถ้าจะเอามันมาเก็งกำไรแบบ Original นี่ยากแล้วครับเพราะตลาดมันปรับปรุงเปลี่ยนแปลงไปเรื่อยๆ โมเดลเก่าอย่าง ARIMA อาจจะตกยุคไปแล้วสำหรับ Quant Trading ในยุคนี้เทคนิค (จริงๆ แล้วหลายๆ เทคนิคในตลาดที่พวกเราใช้ๆ กันอยู่ทุกวันนี้ เช่น movingaverage crossover + RSI > 20 แล้วซื้อหรือขาย พวกนั้นน่ะเกิดมาก่อน ARIMA อีกนะครับฉะนั้นจะใช้ต้องระวัง) ส่วนตัวผมเคยทำวิจัยกับ Statistical Model มาบ้างแต่ไม่ได้ลึกซึ้งกับมันมากนักแต่ทำให้รู้ว่าใช้จริงๆ มันไม่ค่อยจะ Stable (ประสิทธิภาพไม่คงที่) นัก ผมเลยคิดค้นวิธีเพิ่มประสิทธิภาพออกมาวิธีหนึง ซึ่งผมก็คงจะไม่เล่าในที่นี้นะครับแต่ต้องบอกไว้ก่อนว่าถ้าเราจะใช้มันแบบเดิมๆ มันก็พอไปได้ครับแต่เราต้องวิธีมา Validation มันว่าวิธีการนี้มันใช้งานได้จริง

ปล. ARIMA ยังมีเวอร์ชั่นอื่นคือ ARIMAX ใช้ External feature, SARIMAX (Seansonal ARIMAX) อีกด้วย แต่มันคงจะทำให้ยาวเกินไปสำหรับโพสนี้ ยังไงก็ขอจบแค่นี้ก่อนละกันครับ

CR. https://www.otexts.org/fpp/8/1


สำหรับผู้อ่านท่านใดที่อยากจะลองลงมือทำการทำนายค่า Time Series ด้วย ARIMA ก็สามารถติดตามบท "ตัวอย่างการใช้ ARIMA ในการทำนายค่า GDP ของประเทศไทย พร้อม Source code" ด้านล่างได้เลยค่ะ

1) "ตัวอย่างการใช้ ARIMA ในการทำนายค่า GDP ของประเทศไทย พร้อม Source code ตอนที่ 1"

https://algoaddict.com/blog/54547/arima_th_gdp_1

2) "ตัวอย่างการใช้ ARIMA ในการทำนายค่า GDP ของประเทศไทย พร้อม Source code ตอนที่ 2"

https://algoaddict.com/blog/54679/arima_th_gdp_2