Python for trading: Optimization

หลังจากหายไปนานเพราะทำวิจัยหนักไม่ค่อยว่างเลยช่วงนี้ วันนี้เราจะมาลองทดลองเขียน Optimization ใน Python ดูหน่อยนะครับ โดยที่ความจริงการทำอะไรแบบนี้ในโปรแกรมสำเร็จรูปอย่าง Amibroker คงง่ายมากกว่าการมาทำเองอยู่มาก แต่ทำไมเราจึงควรลองทำเองด้วยโปรแกรมที่สามารถวิเคราะห์ข้อมูลโดยเฉพาะ เช่น Python R หรือ Matlab? เหตุผลก็คือ

  1. ความยืดหยุ่นในการโปรแกรม เราจะสามารถปรับอะไรได้เยอะกว่าโปรแกรมสำเร็จรูป
  2. สามารถวิเคราะห์ข้อมูลด้วย Stat ได้ในระดับที่ลึกกว่า
  3. สนับสนุนการวิจัยเชิง Machine Learning ได้อย่างเต็มรูปแบบ ตัวอย่าง เช่น Deep Learning ที่กำลังดังๆตอนนี้ (จริงๆที่เมืองนอกดังมาหลายปีแล้วครับ) ซึ่ง ณ เวลานี้ ไม่มีทางเลยที่จะทำในโปรแกรมสำเร็จรูปได้
  4. สามารถสร้าง Product ของตัวเอง ที่สามารถพัฒนา Algorithm อะไรที่เราสร้างขึ้นมาเข้าไปได้อย่างสะดวก

แล้วข้อเสียล่ะ?

  1. แน่นอนว่ามันยุ่งยากกว่าครับ และมีเงื่อนไขคือต้องเขียนโปรแกรมได้ (แต่มันก็ไม่ยากเกินไปที่จะเรียนรู้ จริงมั้ยครับ?)

ทั้งนี้ทั้งนั้นก็ขึ้นอยู่กับความต้องการส่วนบุคคล ถ้าท่านไม่ได้มีความสนใจใน 4 ข้อด้านบนมากนักก็ใช้โปรแกรมสำเร็จรูปไป แต่สำหรับท่านที่มีความต้องการพัฒนาอัลกอริทึ่มเทรดเชิงลึก เราก็มาเริ่มกันเลยครับ

Import Library ที่ต้องใช้

01.png

เริ่มต้นด้วยการ Import Library พื้นฐานที่ต้องใช้ แต่ %matplotlib inline นี่ใช้เฉพาะใน Jupyter Notebook นะครับสำหรับคนที่ใช้ IDE ตัวอื่นบรรทัดนี้ไม่ต้องก็ได้

สร้างฟังก์ชั่นสำหรับกลยุทธย์การเทรด

02.png

สร้างฟังก์ชั่นสำหรับ backtest กลยุทธ์ Moving Average Crossover รายละเอียดผมได้คอมเม้นไว้แล้ว โดยคร่าวๆ ฟังก์ชั่นนี้เราทำเพื่อ

  • ทดสอบการซื้อขาย แบบ MACrossOver โดยให้สัญญาณเป็น Long only ไม่มี Short
  • ทำการ Long เมื่อ shortMA มีค่ามากกว่า longMA
  • เมื่อนำมาคิดผลลัพธ์เราก็ทำการ Lag มัน 1 วัน(.Shift(1)) เพื่อป้องกันการ Look-ahead Bias
  • จากนั้นเราก็นำมาคำนวณ Sharpe Ratio และ Return ของ Strategy เรา แล้วส่งผลลัพธ์ทั้งคู่ออกจากฟังก์ชั่น

กำหนด พารามิเตอร์สำหรับ Moving Average ทั้ง Short และ Long

ที่เราจะทำกันในวันนี้ก็คือ Optimization ตัวอย่างนี้เราจะมาทดลอง Optimization เส้น Moving average กันครับ

03.png

โดยเราจะกำหนดขอบเขตของเส้น Moving average ทั้ง Long และ Short ด้วยคำสั่ง linspace โดย มีโครงสร้างดังนี้ (ค่าเริ่มต้น, ค่าสุดท้าย, จำนวนข้อมูลทั้งหมด) ลองมาดูผลที่ได้กันครับ

04.png

จะเห็นว่าทั้ง short และ long จะมีความจำนวนอย่างละ 10 ข้อมูล โดย short เริ่มตั้งแต่ 10-30 และ long ตั้งแต่ 40-60

สร้างอาเรย์สำหรับเก็บผลลัพธ์ Return และ Sharpe Ratio

ตรงส่วนนี้เราจะสร้างตัวแปรเตรียมไว้สำหรับเก็บ Return และ Sharpe Ratio ของการ backtest แต่ละรอบ

05.pngnp.zero คือการสร้างตัวแปรอาเรย์ที่จะ Assign ค่า 0 ให้ โดยให้มีขนาดเป็น ขนาดของ short และ ขนาดของ long ซึ่งก็คือ ขนาด 10*10 นั่นเองครับ

ลองดูตัวแปรที่เราสร้างมาจะอยู่ในรูปแบบนี้

06

กำหนดหุ้นและวันเริ่มและวันจบ

ในที่นี้เราจะเตรียมการโหลดข้อมูลหุ้นจาก Yahoo โดยกำหนดตัวแปร 3 ตัว คือ โดย Format ของ Yahoo คือ ชื่อหุ้น.BK  จากนั้นก็วันเริ่มต้นที่เราต้องการให้โปรแกรมทำการโหลดมา และวันสุดท้ายตามลำดับ

07.png

วนลูปทดลอง

วนลูปทดลองกับข้อมูลสร้าง moving average crossover โดยนำ เส้น short และ long ทั้งหมดมาคูณไขว้กัน ในนี้ได้ เราก็ต้องรันเป็น 10 * 10 รอบ โดยที่แต่ละรอบเราจะเก็บ Return กับ Sharpe Ratio ไว้

08

Visualize data

เอาล่ะเรามาดูผลลัพธ์กันดีกว่า ลองดู Sharpe Ratio ดูซักอัน ด้วยคำสั่ง

10.png

จะเห็นว่าข้อมูลจะประกอบด้วยข้อมูล 100 ตัว ซึ่งก็คือ ค่าของ Sharpe ratio ที่เกิดจากการกันตัดกันของ short และ long moving averages ที่เรากำหนดไว้ข้างต้น แต่ถ้าเรามองแบบนี้เราจะวิเคราะห์ผลยาก เดี๋ยวเรามาลองพล็อตกราฟแสดงผลใหม่กันดีกว่าครับ มาใช้ Library seaborn ที่ import มาแต่ยังไม่ได้ใช้ ให้เป็นประโยชน์ดีกว่า

Return  :

11.png

Sharpe Ratio :

Screenshot from 2017-04-01 16-30-24.png

นี่คือ Heatmap ของ Return และ Sharpe Ratio ด้านบน แต่เราเอามาทำให้ดูง่ายๆ โดยมี แกน X เป็น Moving Average Long แกน Y เป็น Moving Average Short โดยการดูเราก็ดูแกน X และ Y ลากไปจนมันบรรจบกันครับ โดยถ้าเรามองไปยัง Short MA ที่ 16 และ Long MA ที่ 51 จากรูปทั้งสองเราจะได้ Return ที่ 0.66 หรือ 66 % ขณะที่ Sharpe ที่ 0.9

ลองมาทดสอบหน่อยดีกว่าว่าถูกต้องไหม

13

ก็มีการปัดเศษนิดหน่อยแต่โดยรวมก็ตรงกันดี

จากรูปนี้เราก็เห็นคร่าวๆแล้วนะว่านี่คือตาราง Optimization แบบ Heatmap เพื่อหาจุดลงตัวของพารามิเตอร์ที่จะใช้พัฒนาไป เช่น เราอาจจะสนใจเฉพาะข้อมูลตามรูปพารามิเตอร์ในวงกลมสีแดงด้านล่างนี้ ซึ่งก็คือโมเดลที่มี short MA = 16 และ long MA = 53 นั่นเองครับ เท่านั้นที่เราจะนำไปพัฒนาต่อไป เพื่อจำกัดขอบเขตพารามิเตอร์ในการทดลอง

14

แต่นี้แค่ตัวอย่างนะครับ เพราะพูดก็พูดการใช้โมเดลแบบนี้(Moving Average Crossover)มันเก่ามากแล้ว มันเป็นของ Quant เมื่อ หลาย 20 – 30 ปีมาแล้ว มันคงไม่ทำให้ได้ผลกำไรเป็นกอบเป็นกำอย่างมั่นคงในระยะยาวได้หรอก และนี้ก็เป็นการหามันในแบบ In-Sample ด้วย ทำให้เราต้องสร้างระบบเพื่อจำกัดขอบเขตและนำไปใช้ในการเทสแบบ Walk-Forward หรือการ Simulation ในรูปแบบอื่นๆต่อไป

สรุปเรายังต้องค้นคว้าทดลองกันอีกเยอะครับ ขอให้ตัวอย่างนี้เป็นแค่ไอเดียในการทดลองเพื่อสร้างระบบในขั้นต่อไป(เช่นเลือกฟีเจอร์ที่สนใจไปทำการสอนในโมเดล ML ซึ่งแน่นอนว่าเราต้องแก้โค้ดเปลี่ยน Threshold ในการวัดผล)แล้วกันครับขอบคุณที่สละเวลาอ่านครับ

Advertisements

One thought on “Python for trading: Optimization

  1. เขียนได้เข้าใจง่ายดีครับ _/|\_ ขอบคุณครับ

    Like

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