กรองสัญญาณเทรดง่ายๆ ด้วย K-mean clustering

สวัสดีครับ ห่างหายจากการอัพบล๊อคกันไปนานมาก เนื่องจากติดภารกิจหลายเดือน วันนี้จะกลับมาเขียนอัพบล็อคตามปรกติแล้วครับ ขอถือโอกาสมาปัดฝุ่นกันด้วยไอเดียง่ายๆ ที่ใช้ในการกรองสัญญาณเทรดด้วย Machine Learning กันก่อนก็แล้วกันครับ

ข้อมูล

ในที่นี้เราจะใช้ ขอมูลหุ้น MSFT(microsoft corporation) เป็นตัวอย่างในการทดลองนี้นะครับ โดยใช้ข้อมูลในการทดลองตั้งแค่ปี 2016 จนถึงปี 2018

ข้อมูลสอน (Training set)

เริ่มทำงาน

โดยแรกเริ่ม เราจะใช้กลยุทธ์อย่าง Trend Following แบบธรรมดาๆ คือ ใช้ Feature หรือ indicator แค่ Simple Moving Average (SMA) 2 เส้น เท่านั้น

  • SMA1 เส้นเร็ว xx วัน โดยผมจะปรับให้สั้นเพื่อให้เกิด noise
  • SMA2 เส้นช้า yy วัน โดยผมจะปรับให้สั้นเพื่อให้เกิด noiseเช่นกัน

จากนั้น ก็ประยุกต์ใช้ไอเดียง่ายๆ ที่ทราบกันอยู่แล้วคือ ให้ SMA1 ตัดเส้น SMA2 ขึ้นเป็นสัญญาณซื้อ SMA2 ตัด SMA1 ลงเป็นสัญญาณขาย ตามปรกติ

ปล. 1 – เหตุที่ให้วันเป็น xx และ yy เพราะไม่ได้สำคัญอะไรนะครับ เราไม่ได้ต้องการจะสื่อตรงนั้น

ปล. 2 – ช่วงเวลาที่เลือกอาจจะเป็นแค่ขาขึ้นอย่างเดียวแต่ไม่เป็นไรครับเป้าหมายของเราคือการทดสอบกรอง noise ผู้อ่านอาจจะไปทำการทดสอบกับช่วงเวลาอื่นๆ ได้ตามชอบใจครับ

ผลลัพธ์ก่อนการใช้ ML

จากนั้นเรามาดูผลลัพธ์กันหน่อยว่า ถ้าทำตามระบบง่ายๆโดยใช้การทดสอบแบบ Event-based กำหนดให้มีเงินตั้งต้น 100,000 เหรียญ และ ซื้อหุ้นเท่าที่เงินในพอร์ตจะเหลือพอหลังจากรวมค่าคอมมิชชั่น 0.25% แล้ว ผลที่จะเป็น ดังนี้

ผลงาน backtest ของระบบ มีการซื้อขายทั้งหมด 24 ครั้ง

จะเห็นว่าผลที่ได้มีการซื้อขายอยู่ที่ 24 ครั้ง และผลลัพธ์ที่ ได้กำไร 19.33% เราลองมาคิดๆการเทรดแต่ละครั้งก็ต้องมี commission ถ้าเทรดมากก็ต้องเสียเงินมาก และถ้าเจอช่วงที่มี noise สูงๆก็อาจจะเกิดสัญญาณหลอก (False signal) ให้เรามาซื้อขายและอาจจะขาดทุนได้มาก

สมมุติฐานของเราก็อาจจะเกิดขึ้นมา เช่น ในการใช้ระบบ trend following แบบนี้ ยิ่งเทรดน้อยยิ่งดีรึเปล่า? (แน่นอนว่าไม่เสมอไป บางระบบก็ต้องอาศัยความถี่ในการทำกำไร เช่น High Frequency Trading – HFT)

ทดลองกรองสัญญาณเทรดด้วย ML

ด้วยสมมุติฐานนี้ เราลองมาหาวิธีกรองสัญญาณดูครับ ถ้าเป็นการเทรดในระบบแบบปรกติเราก็คงมองหา Feature อื่นๆ มาใช้ร่วมกันไปเช่น Relative Strength Index (RSI) หรือ Average Directional Index (ADX) เป็นต้น แต่ในบทความนี้เราจะไม่ไปยุ่งกับอะไรพวกนั้น เราจะเลือกสิ่งที่พื้นฐานที่สุดอย่าง SMA สองตัวนี้เท่านั้นแหละครับ เพื่อมาทดสอบไอเดียของเรา

ก่อนอื่น มาสร้างข้อมูลเพิ่มอีกนิดนะครับ เพื่อให้มี Features ในการทำงานที่มีประสิทธิภาพเพิ่มขึ้น ซึ่งในที่นี้ Features ที่จะเพิ่มขึ้นมาก็คือ ผลต่างระหว่างค่า Simple Moving Average และ ราคาปิด ดังนี้

  • SMA1 diff คือ ระยะห่างระหว่าง SMA1 และ ราคาปิด
  • SMA2 diff คือระยะห่างระหว่าง SMA2 และ ราคาปิด

จากนั้นเรามาแมปกันแล้วลองพล๊อตเป็น Scatter (การพล็อตแบบจุด) ดูจะได้ดังนี้

Scatterplot ของ SMA1 diff และ SMA2 diff

จากรูปเราจะเริ่มเห็นไอเดียเล็กน้อย ว่าจากรูปแบบข้อมูลที่ได้เห็นจากการพล็อตนี้ เราจะน่าจะจัดกลุ่มเพื่อ “กรองวันที่เราอยากจะทำการซื้อ-ขายได้” เมื่อได้ไอเดียแบบนั้นเราก็ลอง Applied อัลกอริทึ่มในการแบ่งกลุ่ม (Clustering) อย่างง่ายซักตัว เนื่องจากเป็นการทดลองเราก็เลือกมาแค่ k-mean ก็พอ จากนั้นผมก็ทดลองแบ่งมันเป็น 3 กลุ่มจากนั้นนำมาพล๊อตกราฟดูจะได้

Scatterplot ของ SMA1 diff และ SMA2 diff แบ่งเป็น 3 กลุ่ม

พอได้ข้อมูลเพิ่มมาอีก 3 กลุ่มดังนี้เราก็มาลองทดสอบเทรดเฉพาะบางกลุ่มดูดีกว่าครับ ในที่นี้ผมจะทดลองกรองข้อมูลบางส่วนออกไป เช่น ผมจะไม่เอาข้อมูลในวันที่ข้อมูลตกอยู่ที่ cluster 2 ออกไปจากการทดสอบเมื่อลองมาทดสอบดูใหม่ผลที่ได้จะเป็น

ผลลัพธ์ที่ได้จากโมเดล applied machine learningหลังการตัด cluster 2

จะเห็นว่าถึงจำนวนการเทรด จะต่างกันไม่มากนัก ที่ 23 ครั้งน้อยกว่าระบบก่อนแค่ 1 ครั้ง แต่ถ้าเรามาดูรายละเอียดเราจะเห็นว่าวันเวลาการซื้อและขายของเรามีการเปลี่ยนแปลงไปครับจากการกรอง noise ของผ่าน cluster ของเรา และ signal ของเราก็น้อยลงไป 1 ตัวด้วย สัญญาณขายวันที่ 18 เดือน 12 ปี 2018 โดนกรองออกไป ผลงานที่ได้ก็ดีขึ้นเป็น 34.44% จากเดิมที่ 19.33% นับว่าเพิ่มอย่างมีนัยสำคัญทีเดียว

แต่เดี๋ยวก่อน ข้อมูลนี่มันเป็นข้อมูล In-sample นี่ กล่าวคือเราได้ข้อมูลของ SMA ทั้งสองตัวตั้งแต่วันแรกของปี 2017 มาจนถึงวันสุดท้ายของปี 2018 แล้ว จากนั้นเราค่อยนำมาจัดกลุ่ม แล้วย้อนกลับไปเทรด!!! ซึ่งในโลกของความเป็นจริงมันเป็นไปไม่ได้ ฉะนั้นเราต้องทดสอบแบบ Out-of-sample กันครับ

cr: Adam Nowakowski on Upsplash

ทดสอบกับข้อมูล Out-of-sample

ข้อมูล In-sample ของการทำระบบแบบทั่วไป คือการเอาข้อมูลที่นอกเหนือไปจากการ optimize ของเรา เช่น รัน SMA ทั้งคู่ SMA1 จากค่า 5 วันไปถึง 10 วัน นำมาใช้คู่กับ SMA2 20-40 วัน แล้วหาค่าที่ดีที่สุดมาใช้ในการเทรดกับข้อมูล Out-of-sample แล้ววัดผล

ส่วนสำหรับโมเดล Applied machine learning เราก็เอาข้อมูลในปี 2017-2018 มาใช้ในการสร้างโมเดล k-mean จากนั้นให้เราเซฟโมเดลไว้ ไปทดลองกับข้อมูลที่โมเดลของเราไม่เคยเห็นมาก่อน ในที่นี้ก็คือปี 2019 ผมจะยกตัวอย่างมาซักหนึ่งคือ วันที่ 01/02 มีค่า SMA1 Diff เท่าไหร่ SMA 2 Diff เท่าไหร่ จากนั้นส่งข้อมูลนั้นไปในโมเดลที่เราสร้างไว้จากข้อมูลปี 2017-2018 แล้วให้โมเดลนั้นจัดกลุ่มข้อมูลที่ไม่เคยเห็นให้เรา หลังจากที่แปะป้าย cluster ให้กับวันที่ 1 ว่าอยู่ใน cluster ไหน ถ้าอยู่ใน cluster ที่เรากรองออก เราก็ไม่เอาข้อมูลวันนั้นมาพิจารณา ถ้าไม่อยู่ใน Cluster ที่เรากรองออก เราก็นำข้อมูลวันนั้นมาพิจรณาว่าจะซื้อขายหรือไม่ตามเดิม

ผล Out of Sample โดยไม่ใช้ ML

ก่อนอื่นที่จะไปถึง Out-of-sample ของกลยุทธ์ที่ Applied machine learning นั้นผมจะนำผลทดสอบ Out-of-sample ของระบบ SMA ตัดขึ้นตัดลงมาให้ดูก่อนเพื่อใช้ในการเปรียบเทียบกับโมเดล applied machine learning ภายหลัง โดยจะใช้ข้อมูลในปี 2019 มาใช้ในการทดสอบนะครับ

ข้อมูลทดสอบ (testing set)

มาดูผลกันครับ

ผลงาน out-of-sample ของ trend following ในปี 2019

ผลงานที่ได้คือเทรด 15 ครั้ง กำไร 23.03 % นะครับ ในที่นี้กำไรมากน้อยเราก็ไม่ต้องสนใจอะไรมากนะครับ เพราะจุดสำคัญคือเราจะดูว่าโมเดลอีกตัวของเราผลงานดีกว่าหรือไม่ จำนวน transaction ลดลงหรือไม่

ผล Out of Sample โดยมีการประยุกต์ใช้ ML ในการกรองสัญญาณ

มาดูผลงานระบบ applied machine learning กันบ้างครับ

ผลงาน out-of-sample ของ applied machine learning ในปี 2019

จะเห็นว่าแม้ในการใช้ข้อมูลทดสอบโมเดล applied machine learning ของเราก็ยังทำผลงานได้ดีกว่าระบบ trend following โดยมีกำไรเพิ่มมาเป็น 25.30% หรือมากกว่าโมเดลเก่า 2% นิดๆ ขณะที่ transaction ลดลงจาก 15 เหลือแค่ 11 transaction ครับ

ประเด็นที่น่าสนใจ

แล้วเราจะสรุปว่าการกรองข้อมูลแบบนี้ทำให้ผลงานดีขึ้นไหม?

คำตอบคือ “ใช่และไม่ใช่” ครับ เราตอบได้แค่ว่าการกรองสัญญาณในลักษณะนี้มีผลเชิงบวกสำหรับหุ้นตัวนี้ พารามิเตอร์นี้ ในช่วงเวลานี้เท่านั้นเอง เรายังสรุปว่ามันต้องดีแน่ๆ ไม่ได้ จนกว่าเราจะทดสอบให้มากพอที่จะหาข้อสรุปครับ ว่ามันทำให้ดีขึ้นจริงๆ

แต่ที่เราได้แน่ๆ ก็คือ ไอเดียในการทดลองต่อครับ หวังว่า ด้วยโมเดลง่ายๆนี้จะเราชี้ให้เห็นอีกช่องทางของการใช้โมเดล Machine learning ง่ายๆ เข้าช่วยเพิ่มประสิทธิภาพของระบบกันได้นะครับ

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s