Optimize trading system With Gradient Boosting Machine

cway investment
cw-quantlab
Published in
5 min readOct 8, 2018

กระบวนการทำ Optimization ในระบบเทรดถือว่าเป็นขั้นตอนสำคัญ ในการพัฒนาระบบ เพื่อปรับปรุงและเพิ่มประสิทธิภาพ แต่ปัญหาคือเทคนิคการทำ optimization แบบเดิมมีข้อจำกัด รวมถึงต้องประสบกับปัญหาเมื่อสภาวะตลาด พฤติกรรมข้อมูลมีความไม่คงตัว

บทความนี้ผมจะมาสาธิตตัวอย่าง การพัฒนาระบบของ Lab ที่เรานำเอา Machine Learning เข้ามาใช้ในงาน Optimization เพื่อเพิ่มประสิทธิภาพการทำงานของระบบเทรด โดยใช้ Data จาก Trading Record นั้นคือ ข้อมูลผลการเทรดจริงในตลาด ของ System มาทำการวิเคราะห์หาจุดอ่อนและข้อจำกัด เพื่อใช้ในการปรับปรุง หรือวางแผนจัดการ

บทบาทของ Machine Learning จะเป็นเหมือน Model ที่ทำการ วิเคราะห์ และเรียนรู้ รูปแบบการขาดทุน(Loss / Fail Pattern) ของระบบเทรด เพื่อสกัดเอา insight ออกมา ในงานวิจัยนี้ ผมเลือกใช้ Gradient Boosting Machine เป็น algorithm ในการวิเคราะห์ข้อมูล

Data

การสาธิตใช้ข้อมูล ของระบบเทรด ในตลาดหุ้นไทย ในการวิเคราะห์ โดยแบ่งข้อมูลเป็น 2 ส่วนดังนี้

1. Trading Record Data

>> ข้อมูลการทำงาน ผลการเทรดของระบบ โดยเลือกโฟกัสเฉพาะผลการเทรดที่ขาดทุน(Loss) และผลการเทรดที่ เสมอตัว หรือ ขาดทุนค่าคอมมิชั่นและเวลา(Even)

ตัวอย่างภาพข้อมูลผลการเทรด บางส่วน

2. Market Data

>> ข้อมูลเกี่ยวข้องกับ ราคาสินค้า , ปริมาณการซื้อขายและอื่นๆ เป็นตัวแทน สภาวะตลาด ในช่วงระบบทำการเทรด

ตัวอย่างภาพข้อมูล market condition บางส่วน

ทำการจัดการข้อมูล และ คลีนข้อมูล เพื่อเตรียมเข้าสู่การทำ Feature Engineering

Exploratory data analysis

งานด้าน Machine Learning หนีไม่พ้นต้องทำเรื่องของ EDA เพราะเป็นพื้นฐานการวิเคราะห์ข้อมูล เพื่อทำให้เราได้ ไกด์ไลน์ในการสร้าง Learning Model และใช้ขจัดสิ่งแปลกปลอมจากข้อมูล

- การทดสอบนี้เริ่มต้นจาก การวิเคราะห์ทางสถิติเพื่อดู พฤติกรรมข้อมูลก่อนเริ่มทำ Feature Selection

- วิเคราะห์พฤติกรรมการกระจายตัวข้อมูล และค่านัยยะสำคัญ เพื่อจำแนก Feature และทำ Correlation Matrix

- แยกวิเคราะห์เพื่อ พยายามทดสอบสมมติฐาน โดยโฟกัสไปที่ Volatility ซึ่งเป็นจุดอ่อน ของ trading strategies ของระบบเทรดแบบ Momentum Trading ที่ใช้

จากภาพ วิเคราะห์ผลการขาดทุน(Loss) เทียบกับ Volatility ของราคาที่เกิดในจุด เข้าซื้อ

วิเคราะห์ความสัมพันธ์ระหว่าง Holding Period และ Loss ที่เกิด จะพบว่าบาง Order ที่มีการเข้าเทรดอาจจะมีกำไรช่วงแรก แล้วกลับกลายเป็นติดลบขาดทุน ในระยะยาว กว่าจะเข้าถึงจุด stoploss ที่ระบบวางไว้ ตรงนี้ แม้ loss ไม่มากแต่เป็นภาวะของการ Fail ที่ทำให้เกิดการเสียโอกาสของทรัพยกร เงิน ที่จมลงไป

ภาพบนแสดงค่า MAE หรือ Maximum Adverse Excursion และ MFE หรือ Maximum Favorable Excursionที่เป็นตัวเลขบ่งชี้ประสิทธิภาพของการเทรดที่สำคัญ

ในภาพทำการวิเคราะห์ ข้อมูล MAE และ MFE ร่วมกันเพื่อประเมินค่าความสัมพันธ์ และทิศทางการเปลี่ยนแปลง ของ Loss ที่เกิด จะเห็นระบบบเทรดช่วงเกิด DD สูงจะพบ MAE ของ Order จะดีดถ่างออกมามากถึงระดับ -10% โดยมี Order ที่ขาดทุนจำนวนมากจะมี MAE สูง แต่ MFE ต่ำสะท้อนการเข้า Order ที่ผิด หรือเปิด Position แล้ว ขาดทุนต่อเนื่องทันที

ค่าของ MAE และ MFE นี้แหละครับ เราจะใช้เป็นตัวระบุพฤติกรรมการขาดทุน หรือ Loss Pattern โดยจำแนก Loss เป็น 3 Class คือ

1. Bad Trading การขาดทุนหนัก

2. Poor Trading การขาดทุนทั่วไป(มีกำไรบ้างกลับมาขาดทุน)

3. Timeout เท่าทุน Even ขาดทุนกลับมาปิดเสมอตัว / ออกเพราะหมดอายุ เวลาถือครองนาน

ตอนนี้เราทำการจัดการข้อมูล คลีนข้อมูลและทำงานด้าน Feature Engineering สำเร็จแล้ว พร้อมนำข้อมูล เข้าสู่ กระบวนการ Training Model สำหรับ Machine Learning ต่อไป

ดั่งที่เราได้คุยกันเรื่องของปัญหาในการ optimization ระบบเทรดแบบเดิม ที่เกิดจากปัญหาของความผันผวนในตลาดที่เกิดขึ้น(ส่วนใหญ่แตกต่างจากภาวะปิดคงตัวที่เราทดสอบระบบ) มาถึงเรื่องของการวิจัยพัฒนา นำเอา Machine Learning เข้ามาใช้ ในการวิเคราะห์ ข้อมูลผลการเทรด ที่ขาดทุน ขอเรียกว่า Loss Pattern

ตอนสองนี้เราจะมาทำการสร้าง Machine Learning ด้วยเทคนิคการเรียนรู้แบบ Gradient Boosting Machine (GBM) ถ้าเป็น developer สายฝึก Machine Learning หรือเคยลงแข่งขันกับ kaggle น่าจะรู้จัก Gradient Boosting ดี(เรียกว่าเป็นไม้ตายในการเพิ่มประสิทธิภาพของ Model) โดยเราจะใช้ข้อมูล ที่ได้เตรียมและทำ Feature Selection ในตอนก่อนหน้า มาเป็นตัว Training สำหรับ Machine ซึ่งจะทำให้ Machine รู้จัก Loss Pattern ที่เกิด จากระบบเทรด

ตรงนี้นำมาซึ่งการสร้าง Model ในการหาค่าความน่าจะเป็น โอกาสที่จะเกิดการขาดทุน(Loss / Fail) จากการใช้งานระบบเทรด นอกจากนี้เรายังนำเอา predictive model ไปใช้ในการปรับปรุงระบบเทรด เช่นการสร้าง tactic หรือแผนการปิดจุดอ่อนของ ระบบเทรด หรือนำไปใช้เป็นการคำนวณเพื่อทำ Risk Management ต่อไปได้อีก

เริ่มต้นจุดนี้เนื่องจาก Gradient Boosting เป็นเทคนิค Machine Learning ที่ซับซ้อนพอสมควร ผมจะขออธิบายแบบแนวคิดหลัก พอสังเขป และมี link เนื้อหารายละเอียดให้ท่านสนใจไปอ่านเพิ่มเติม โดยก่อนเริ่มต้น ทำ Machine Learning ด้วย Gradient Boosting จะต้องเข้าใจ 3 องค์ประกอบ คือเรื่องของ Gradient Descent Algorithm ที่ใช้เป็นตัวสำคัญในการคำนวณหาค่าที่เหมาะสมในส่วนของ Ensemble learning

ซึ่งเราจะเลือกใช้ Boosting technique มาเป็นตัวพัฒนาโมเดล บน Classification and Regression Trees (CART) ซึ่งเป็น Decision tree learning model ที่เราจะใช้บน Data ของเรา

CART

คือ Decision Trees สำหรับ Supervised Machine Learning การสร้างโมเดลลักษณะแผนภูมิต้นไม้ ที่ใช้ตัว features ในการแบ่งและสร้างโครงสร้างต้นไม้ขึ้นมา โดย Decision Trees ลองรับทั้งการวิเคราะห์แบบ regression และ classification ลักษณะของโมเดล CART เป็น adaptive basis function models มีลักษณะการสร้าง Model จาก Data โดยตรง ลักษณะของโมเดลเป็นแบบ non linear ปรับ adjust ตัวเองเข้ากับ ลักษณะของ Data แต่แน่นอนว่าก็มีข้อจำกัดเช่นกัน

Decision Trees for Classification

หลักการทำงาน ของ CART เป็นแบ่ง feature space เป็น regions แต่ละ level เป็นการแยกแบบ binary classification ซึ่งจะมีวิธีการทำ attribute selection เพื่อวางเป็น node และสร้างเงื่อนไขในการ Split เพื่อสร้างโครงสร้างต้นไม้ โดยจะมีสองประเภทหลัก Gini Index และ Information gain (Entropy)

การวิเคราะห์ข้อมูลนี้ เราเลือกใช้ information Gain เป็น criterion ในการสร้าง Decision Tree ของเราขึ้นมา ซึ่งโมเดลทำการวัดค่า Entropy และ ค่า Information Gain ของแต่ละ attribute ใช้มันเป็นค่าชี้วัดในการ split node

สมการสำหรับ Entropy measure

ทดลองทำการ Training Model ด้วย Decision Tree กับข้อมูลที่เราเตรียม โดยจะจำแนกรูปแบบการขาดทุนหรือ Loss Pattern เป็น 3 แบบ [Bad,Poor, Even] โดยใช้ค่า MAE ,MFE และ P/L เป็นตัวจำแนก รายละเอียดตามบทความก่อนหน้า

ซึ่งการประมวลผลด้วย Decision Tree Classification จะจำกัดขนาดของ Tree ไม่ให้ใหญ่เกินกว่า 10 Level และใช้ Information Gain Method เป็นเงื่อนไขในการสร้างโครงสร้างต้นไม้

จากข้อมูลทั้งหมดที่มี ทำการแบ่ง 70% มาทำการ Training Model และใช้ 30% ในการ Testing โดยผลการทดสอบ ได้ค่า Accuracy ของ Training Model ที่ 60.8% ขั้นตอนต่อไปเราจะทำการ เพิ่มประสิทธิภาพของ Decision Tree โดยการทำ Boosting ด้วย Gradient Boosting ต่อไป

Stochastic gradient boosting

ข้อเด่นของการใช้ Decision Trees คือความชัดเจน ง่ายต่อการ implement และการแปลผล โดยลักษณะคล้ายกับ “if-else” rules ตรงนี้เหมือนกับ algorithm ในระบบเทรดของเรา ทำให้ง่ายต่อการ integrate ตัวโมเดลเข้ากับการทำงานของระบบเทรดต่อไป แต่ข้อจำกัดคือเรื่องของ over fitting ที่โมเดลจะ fit เข้ากับ Data จนทำให้เกิดประสิทธิภาพของการทำงานที่ต่ำ (low accuracy)

ตรงจุดนี้ตามมาซึ่งการใช้ ensemble method เพื่อปรับปรุงคุณภาพของ Decision Trees ด้วย Gradient Boosting ซึ่งเป็นกระบวนการที่มีรายละเอียดและขั้นตอนที่มาก ดังนั้นจะขออธิบายเชิงแนวคิดกว้างเพื่อให้ พวกเราเห็นภาพรวมเป็นหลักก่อน โดยอาจจะละประเด็นเชิงเทคนิคและรายละเอียดเชิงลึกบางส่วนออกไป

ประเด็นหลักที่เราเลือกใช้ boosting algorithm เพราะต้องการทำการสร้าง Strong Model จาก Weak Model โดย algorithm จะทำการสุ่มสร้าง Decision Tree จำนวนหลายร้อยโมเดล ทำซ้ำ(iteration) และประเมินผลแต่ละโมเดลจนกว่า จะได้โมเดล Decision Tree ที่สมบูรณ์

กระบวนการ Boosting ข้อดีคือได้มีการทดลอง ปรับโครงสร้างของ Tree, ทั้ง depth of tree ,การย่อการขยาย Node , การ split node เพื่อให้ผลลัพธ์สุดท้ายของโมเดล มี Accuracy ที่ดี และปรับเรื่องของ Variance ของโมเดล ไปในตัวด้วย (อ่านรายละเอียด Boosting ได้จาก บทความนี้)

การทำ Parameter Tuning ใน Gradient Boosting เป็นเรื่องของประสบการณ์ ที่ developer ต้องเรียนรู้ เพราะมีกระบวนการปรับ parameter จำนวนมากหลายหลาก โดยเฉพาะส่วนของ Cost function ,Learning Rate Random sampling และอื่นๆ ในส่วนของ Lab เราใช้ loss function เป็น logistic regression และใช้ criterion เป็น MSE

ส่วนการปรับค่าของ parameter นั้นเริ่มจากการสร้าง range ของแต่ละ parameter เพื่อใช้หาค่าที่เหมาะสมจาก GRID Search Optimization

ตัวอย่างภาพ Decision Tree ที่ได้ จากการวิเคราะห์ข้อมูล Loss Pattern ของระบบเทรด

ทดลองรัน GBM โดยใช้ค่าที่ได้จากการทำ GRID Search จากนั้นประเมินความถูกต้องทางสถิติของโมเดล

ภาพแสดงการทำ k-fold cross-validation เพื่อประเมินผลการทำงานของโมเดล

เพื่อให้เกิดความแน่นอนทำการประเมินผลประสิทธิภาพของโมเดล ด้วย k-fold cross-validation ซึ่งเราจะใช้ค่า K= 10

จากภาพจะเห็นว่าค่า accuracy ของ GBM เพิ่มสูงขึ้นจาก Tree ก่อนหน้า ที่ระดับ 75% สอดคล้องกับค่า accuracy ที่ได้จาก cross-validation ซึ่งค่าเฉลี่ยอยู่ที่ 0.695% ถือว่าใช้งานได้ กรณีใช้ GBM การปรับค่า accuracy ให้สูงหรือมากไปอาจจะมีผลต่อประเด็น Bias–variance tradeoff และกลายเป็น Over fitting ตรงนี้ต้องระมัดระวัง

ตอนนี้เราได้โมเดล Gradient Boosting ที่พร้อมใช้ในการวิเคราะห์ Loss Pattern ของเราแล้ว ตรงนี้ลองทำ Decision boundary เพื่อทดสอบการทำงานของโมเดล จากภาพเราเห็นการ classify ตัว Order โดยใช้ค่า Momentum และ Volatility ที่ได้ โดย สิ่งที่พบจะสอดคล้องกับ สมมติฐานที่วางไว้ก่อนหน้า ระบบ Momentum Trading ภาวะ Volatility สูง ทำให้มีโอกาสที่เกิดการ Loss ที่รุนแรงได้ (Bad)

และถ้าพิจารณา โซน Low Volatility และ Low Momentum จะพบการเกิด Loss ประเภททั่วไปได้ เช่นกัน ผลลัพธ์ที่ได้จาก Model คือยังสามารถใช้ GBM ในการคำนวณหาค่า ความน่าจะเป็น ของการเกิด Bad Result

โดย input จากค่าของ Volatility Momentum และ signal จากระบบ ได้อีกด้วย ตรงนี้ สามารถใช้นำไปคำนวณ Position size สำหรับการเทรด เพื่อลดความเสี่ยง และผลกระทบจากการขาดทุนของระบบได้ และยังช่วยทำให้ คุมขนาดของ MaxDD ของระบบได้ดีอีกด้วยครับ

ศึกษาเพิ่มเติม

https://www.quantstart.com/articles/Beginners-Guide-to-Decision-Trees-for-Supervised-Machine-Learning

http://www.kdnuggets.com/2016/10/decision-trees-concise-technical-overview.html

https://dataaspirant.com/2017/01/30/how-decision-tree-algorithm-works/

https://www.quantstart.com/articles/bootstrap-aggregation-random-forests-and-boosted-trees

http://arogozhnikov.github.io/2016/06/24/gradient_boosting_explained.html

http://machinelearningmastery.com/gentle-introduction-gradient-boosting-algorithm-machine-learning/

http://blog.kaggle.com/2017/01/23/a-kaggle-master-explains-gradient-boosting/

https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3885826/

--

--