แบบจำลองเชิงเวลาเบื้องต้นในการทำนายราคาขายน้ำมันปิโตรเลียมในประเทศไทย (Basic time-series model for Thai oil price forecasting)


Share this article

การทำนายราคาขายของน้ำมันเป็นสิ่งที่สำคัญและทำอยู่กันอย่างแพร่หลายในปัจจุบัน แต่ทว่าด้วยปัจจัยหลาย ๆ อย่างที่ไม่มีความแน่นอน เช่น เรื่องของทรัพยากรและความต้องการของผู้ใช้งาน (Demand and Supply) การนำทรัพยากรทดแทนมาใช้งานอย่างแก๊สที่นำมาใช้แทนน้ำมันรถ การพัฒนาทางเศรษฐกิจ อีกทั้งยังมีเรื่องของการเมืองเข้ามาเกี่ยวข้อง ที่จะมาขับเคลื่อนกลไกตลาดน้ำมัน ซึ่งปัจจัยเหล่านี้สามารถส่งผลต่อราคาน้ำมันในตลาดได้ทั้งสิ้น ทำให้การทำนายราคาขายของน้ำมันนั้นเป็นสิ่งที่มีความยากและท้าทาย

ในการทำนายราคาน้ำมันนั้น มีการศึกษาและทดลองไว้มากมาย หนึ่งในนั้นก็คือการทำแบบจำลองเชิงเวลา (Time-series model) ซึ่งเป็นแบบจำลองที่ทำกับตัวข้อมูลที่ขึ้นกับลำดับเวลา และสำหรับบทความนี้ จะใช้วิธีการทำนายราคาขายน้ำมันปิโตรเลียมโดยใช้โมเดล ARIMA ใน python โดยข้อมูลราคาขายของน้ำมันที่ได้นำมาใช้นั้น มาจากกระทรวงพลังงานที่จะมีการให้ข้อมูลในทุกวัน ไม่รวมวันเสาร์อาทิตย์ และวันหยุดนักขัตฤกษ์ ทั้งหมดเป็นช่วงเวลา 2 ปี ตั้งแต่เดือนมกราคม 2561 ไปจนถึงธันวาคม 2562

ARIMA Model

ในส่วนของโมเดล ARIMA นั้นเป็นการรวมกันระหว่างแนวคิดของ Auto Regressive (AR) ที่เป็นส่วนของการนำค่าในอดีตมาใช้ และ Moving Average (MA) ที่เป็นส่วนของการนำค่า errors มาใช้ และตัวข้อมูลที่จะนำมาใช้ในโมเดลจะต้องมีการตรวจสอบความเป็น stationarity (ไม่มี trend ที่ทำไปในทางที่เพิ่มขึ้นหรือลดลงในทางใดทางหนึ่งดังรูปที่ 1 และไม่มี seasonality ที่บ่งบอกถึงตัวข้อมูลที่เป็นรูปแบบเดียวกันซ้ำ ๆ ดังรูปที่ 2) เพื่อที่จะได้เลือกใช้ paramter ในตัวโมเดล ARIMA ได้ถูกต้อง ซึ่งสามารถตรวจสอบความเป็น stationarity ได้โดยสังเกตจากกราฟ หรือมีอีกวิธีนั่นคือ การตรวจสอบโดยการทำ Augmented Dickey Fuller test (ฟังก์ชัน adfuller จาก statmodels package ใน python)

รูปที่ 1 ตัวอย่างข้อมูลที่มี trend และมีความเป็น seasonality
รูปที่ 2 ตัวอย่างข้อมูลที่มีความเป็น seasonality

 

โมเดล ARIMA นั้น มี 3 parameter หลักที่จะต้องพิจารณาคือ d, p และ q โดยเริ่มจาก d ที่เป็นตัวไว้กำหนดการทำ differencing ซึ่งจะทำให้ข้อมูลมีความเป็น stationarity ถ้าหากข้อมูลมีความเป็น stationarity อยู่แล้วนั้น ค่า d ที่จะใช้ในโมเดลจะถูกกำหนดไว้ที่ 0 ส่วนค่า p คือลำดับของพจน์ในส่วน Auto regressive ซึ่งจะบ่งบอกถึงจำนวน lag ของค่า y ที่ใช้เป็นตัวทำนาย ที่จะถูกใช้ในโมเดล และสุดท้ายค่า q คือลำดับในส่วนของ Moving average ซึ่งบ่งบอกถึงจำนวน lag ของค่าความผิดพลาด หรือค่า error ที่ถูกใช้ในโมเดลเช่นกัน

ARIMA Tutorial <Python>

เริ่มต้นโดยการอ่านข้อมูลโดยใช้โค๊ดในรูปที่ 1

รูปที่ 3 โค้ดที่ใช้อ่านข้อมูลราคาน้ำมัน

หลังจากนั้นเช็คหน้าตาของข้อมูลที่อ่านเข้ามาดังรูปที่4

รูปที่ 4 ข้อมูลราคาน้ำมันที่อ่านเข้ามา

หลังจากนั้นเลือกเพียงเฉพาะข้อมูลที่ต้องการเท่านั้นดังรูปที่5

รูปที่ 5 เลือกเฉพาะข้อมูลที่เป็นราคาขายน้ำมัน

หลังจากนั้นเลือกเฉพาะข้อมูลราคาน้ำมันของ “Gasohol95 E85” เท่านั้นดังรูปที่6

รูปที่ 6 เลือกข้อมูลราคาขายน้ำมันของ Gasohol95 E85

หลังจากนั้นลองพล็อตกราฟเพื่อดูการเปลี่ยนแปลงของราคาน้ำมัน Gasohol95 E85 ซึ่งแสดงให้เห็นดังรูปที่ 7

รูปที่ 7 ข้อมูลราคาขาย Gasohol95 E85 ในช่วงวันที่ 3 มกราคม 2561 ถึงวันที่ 27 ธันวาคม 2562

หลังจากนั้นเรียกฟังก์ชัน addfuller เพื่ือทำ Augmented Dickey Fuller test ดังรูปที่8

รูปที่ 8 ผลที่ได้จากการตรวจสอบความเป็น stationarity โดยใช้ Augmented Dickey Fuller test

จากข้อมูลของราคาขายน้ำมัน Gasohol95 E85 ในช่วงเวลา 2 ปี ตั้งแต่ต้นปีพ.ศ. 2561 ไปจนถึง ปลายปีพ.ศ. 2562 เมื่อสังเกตจากกราฟจากรูปที่ 7 จะเห็นได้ว่ากราฟดูมีความเป็น stationarity อยู่พอสมควร อาจจะดูมี trend เล็กน้อย แต่ไม่มีความเป็น seasonality หากนำไปตรวจสอบด้วย Augmented Dicker Fuller test นั้นจะเห็นได้ว่า p-value ที่ได้จากการตรวจสอบในรูปที่ 8 นั้นมีค่าน้อยกว่า 0.05 นั่นหมายความว่า ข้อมูลนี้มีความเป็น stationarity (ถ้าหากมากกว่า 0.05 นั้น ข้อมูลจะไม่ค่อยมีความเป็น stationarity) ซึ่งจะกำหนดค่า d ไว้ที่ 0 เนื่องจากข้อมูลมีความเป็น stationarity

หลังจากนั้นลองทดลองใช้ค่า p=1, d=0, q=1 ในการใช้ ARIMA Model ได้ผลดังรูปที่9

รูปที่ 9 ผลสรุปของโมเดล ARIMA ที่กำหนดค่า p=1, d=0 และ q=1 (ARIMA(1,0,1))

หลังจากได้ทดลองสร้างโมเดล ARIMA(1, 0, 1) (1st order AR, 1st order MA) ได้ผลของโมเดลที่ให้ข้อมูลมาดังรูปที่ 9 เมื่อโฟกัสที่ค่า p-value ของ ar.L1.y ของพจน์ 1st order AR และ ma.L1.y ของพจน์ 1st order MA สามารถสรุปได้ว่าส่วนที่เป็น ar.L1.y นั้นมีส่วนสำคัญต่อการทำนายด้วยค่า p-value ที่น้อยกว่า 0.05 และ ma.L1.y ไม่ใช่ส่วนสำคัญต่อการทำนายด้วยค่า p-value ที่มากกว่า 0.05 เนื่องจากส่วนที่เป็น MA ไม่ใช่ส่วนสำคัญต่อการทำนายในครั้งนี้ จึงได้ทดลองเปลี่ยนค่า q จาก 1 เป็น 0 (นำส่วนที่เป็น MA ออก) ดังรูปที่ 10

READ  หรือ Intelligence System จะไม่ปลอดภัยอีกต่อไป? เมื่อ Machine learning ถูกหลอกด้วย Adversarial Example
รูปที่ 10 ผลสรุปของโมเดล ARIMA ที่กำหนดค่า p=1, d=0 และ q=0 (ARIMA(1,0,0))

 

รูปที่ 11 ผลการทำนาย(สีฟ้า) เมื่อเทียบกับราคาขายจริง(สีส้ม) ของโมเดล ARIMA(1, 0, 0)

 

รูปที่ 12 ค่า mean squared error และ mean absolute percentage error ของโมเดล ARIMA(1, 0, 0)

ซึ่งหลังจากที่นำส่วนที่เป็น MA ออกนั้น จะเห็นว่า ค่า error อื่น ๆ อย่าง AIC ก็ลดลงด้วยดังที่เห็นในรูปที่ 9 ที่เป็นโมเดล ARIMA(1, 0, 1) และรูปที่ 10 ที่เป็นโมเดล ARIMA(1, 0, 0) เมื่อดูกราฟที่เปรียบเทียบผลที่ได้จากการทำนายและค่าจริงนั้นจากรูปที่ 11 ก็มีความใกล้เคียงกัน เมื่อนำมาทดสอบหา error ด้วยการหา mean absolute percentage error จากรูปที่ 12 จะเห็นว่า error เพียง 0.53 % (ไม่ถึง 1%) ทั้งหมดทั้งมวลนี้ ARIMA เป็นหนึ่งในโมเดลที่ใช้กับข้อมูลที่เป็น time-series ซึ่งยังมีโมเดลประเภทนี้อีกอย่าง SARIMA, SARIMAX, VAR, GARSH ซึ่งจะมีเงื่อนไขในการใช้ที่ต่างกันไปขึ้นอยู่กับแต่ละโมเดล

Reference

Fakhradine El BAHI, H. El MOUSSAMI, and Z. Aman, “Modeling and Forecasting of Fuel Selling Price Using Time Series Approach: Case Study”, 2018.

https://machinelearningmastery.com/time-series-forecasting/

https://medium.com/@kangeugine/time-series-check-stationarity-1bee9085da05

https://otexts.com/fpp2/non-seasonal-arima.html

https://towardsdatascience.com/machine-learning-part-19-time-series-and-autoregressive-integrated-moving-average-model-arima-c1005347b0d7

https://towardsdatascience.com/time-series-introduction-7484bc25739a

https://people.duke.edu/~rnau/411arim.htm

https://towardsdatascience.com/the-akaike-information-criterion-c20c8fd832f2

https://www.aptech.com/blog/introduction-to-the-fundamentals-of-time-series-data-and-analysis/


ลงทะเบียนรับข่าวสาร

ไม่พลาดทุกการอัพเดทจาก Big Data Experience Center

Big Data Experience Center (BX)

ชั้น 14 อาคาร Knowledge Exchange Center (KX)
110/1 ถนนกรุงธนบุรี, แขวงบางลำภูล่าง เขตคลองสาน กรุงเทพฯ 10600
อีเมล์: [email protected]

ABOUT

SERVICES