การทดสอบระบบกลยุทธ์เทรดย้อนหลัง (Backtesting) ใน Python: การพิจารณา และ Open Source Framework

ในบทความนี้ Frank Smetana  หนึ่งในผู้เชี่ยวชาญจะมาอธิบายถึงการใช้งาน Python เป็น Open Source ในการทดสอบ Backtesting บนซอฟต์แวร์ และ ให้คำแนะนำบนกระบวนการที่จะให้คุณนำไปใช้อย่างเหมาะสม

การ Backtest จัดว่าเป็นเนื้อหาที่สำคัญที่สุดของ กระบวนการทดสอบระบบกลยุทธ์ย้อนหลัง (STS) อยู่ระหว่าง การพัฒนากลยุทธ์ และการนำไปใช้เทรดจริง ( Live Trade)  หากกลยุทธ์มีความบกพร่อง การ Backtest อย่างจริงจังจะช่วยปกป้องไม่ให้เรานำไปปฏิบัติใช้จริง

มีตัวเลขหนึ่งที่ถูกนำมาทับซ้อนกับการ Backtest รวมถึงการเทรดจำลอง และการเทรดจริง การ Backtest จะนำข้อมูลสถิติเชิงมาหาจำนวนประสิทธิภาพ STS การเทรดจำลอง จะนำขั้นตอนของการ Backtest มาแสดงผลในแต่ละแท่งราคาจับสัญญานการเทรด การจำลอง/การเทรดจริง ถูกนำมาใช้ทดสอบ STS แบบ Real time: สัญญาณการเทรด , การส่งคำสั่ง , เส้นทางคำสั่งไปยังโบรกเกอร์ และดูแลสถานะของคำสั่งที่ถูกรันอยู่

Framework ส่วนใหญ่ เป็นมากกว่า การ Backtest รวมถึงความสามารในการ Live Trade จึงค่อนข้างสะดวกถ้าเราต้องการนำ Backtest framework ไปใช้งานกับโบรกเกอร์ที่เราชอบ และข้อมูลที่เราจะใช้ Quantopian/Zipline ได้ล้ำหน้าไปแล้ว มีกระบวนการพัฒนาเชื่อมโยง , ทดสอบย้อนหลัง และนำไปโซลูชันไปใช้งาน

ในคอมมูนิตี้ ของ Python ถูกเตรียมไว้อย่างดี , อย่างน้อยกว่า 6 Opensource Backtesting Framework ราย พร้อมให้ใช้งาน แม้ว่าพวกเขาจะมีขั้นตอนการพัฒนา และเอกสารที่ต่างกัน เราอาจจะสนุกกับการทำงานบน Opensource Backtest Framework ที่ถูกเตรียมเอาไว้แล้ว เช็คเอาท์ได้จาก Github repo ของพวกเขา

พึงละลึกถึง การกำหนดความต้องการที่ชัดเจนใน STS ของเรา ก่อนที่จะประเมินการทดสอบ Backtest Framework

อะไรเป็นข้อมูลสำคัญสำหรับการเทรดของเรา?  ในขณะที่ Framework ส่วนใหญ่ รองรับข้อมูลตราสารทุนในสหรัฐ ผ่าน YahooFinance , ถ้ากลยุทธ์ในอนุพันธ์ , ETFs หรือ EM Securities นั้น Data ต้องถูกนำมาใช้ Import หรือ ถูกเอามาใช้ใน Framework  Asset Class ครอบคลุมเหนือยิ่งกว่าข้อมูล มีคำถามว่า Framework สามารถจัดการกับผลิตภัณฑ์ที่มีวันหมดเวลา​ Future & Option และจัดการ Roll-over ข้ามซีรีย์ได้อย่างอัตโนมัติหรือไม่? อะไรคือการไหลของตลาด , จะตั้งสมมติฐานตามความเป็นจริงในการส่งคำสั่งจำนวนมากได้อย่างไร?

อะไรเป็นข้อมูลความถี่และรายละเอียดของเราในการสร้าง STS? ในระบบเทรดต้องการทุก Tick , Bid/Ask ซึ่งมีความแตกต่างอย่างมากกับประเด็นการจัดการข้อมูลที่มีระยะห่างมากกว่า 5 นาที หรือระดับชั่วโมง. กองทุนป้องกันความเสี่ยง & HFT Shop ลงทุนในการสร้าง Backtest Framework ที่มีความแข็งแรง ขยับขยายได้ เพื่อที่จัดการกับชุดข้อมูล และความถี่ บางแพล็ตฟอร์มมี ชุดข้อมูลที่สมบูรณ์ครบถ้วนสำหรับสินทรัพย์ต่างๆ อาทิเช่น S&P Stock, ในระดับหนึ่งนาที

อะไรคือแบบการส่งคำสั่ง ( Order Type) ที่ STS ของเราต้องนำมาใช้?  ขั้นต่ำ คือ Limit , Stop และ OCO ควรจะถูกรองรับ โดย Framework

(ผู้แปล: OCO order เป็นออร์เดอร์ที่รวม limit and / or stop-loss order ไว้ด้วยกัน)

ระดับของการซัพพอร์ต และเอกสาร เป็นสิ่งจำเป็น ในตอนต้นนี้ Framework ยังมีเอกสารที่น้อย และในคอมมูนิตี้ก็ยังมีการซัพพอร์ตน้อยกว่าคอมมูนิตี้อื่นๆ

องค์ประกอบของการ Backtest Framework

ข้อมูล และ STS ที่มีอยู่:  องค์ประกอบที่ได้รับมานั้น ต้องใช้ STS Script/Definition File และให้ข้อมูลที่จำเป็นสำหรับทดสอบ ถ้า Framework ต้องใช้ STS ใดๆ เพื่อที่จะบันทึกผลหลังจากทดสอบ ตัวของ Framework นั้นควรจะรองรับ Canned Function ซึ่งเป็นเทคนิคอลอินดิเคเตอร์ที่นิยมสูงสุด เพื่อให้การทดสอบ STS รวดเร็ว ผู้ใช้กำหนดระยะเวลา Historical period เพื่อที่จะ Backtest บน Framework ที่อยู่ หรืออะไรก็ตามที่ถูก Import เข้ามาได้

การทดสอบประสิทธิภาพ ปรับใช้ให้เข้ากับตรรกะ STS โดยต้องการ Historic Data และคำนวณกรอบช่วงของความเสี่ยง และ Performance Metric รวมถึง Max drawdown , Sharpe & Sortino ratios โดยส่วนมากแล้ว Framework ทุกอันจะรองรับจำนวนความสามารถมองเห็นอย่างเหมาะสม รวมถึง equity curves และ deciled-statistics

การ Optimization มีแนวโน้มที่จะต้องใช้ทรัพยากรการคำนวณร่วมกันในกระบวนการ STS ถ้าหากเราจำเป็นต้องเพิ่มประสิทธิภาพใน STS ของเราแล้ว ขอให้โฟกัสกับ Framework ที่รองรับการขยาย การกระจาย และ ประมวลผลแบบ Parallel ได้

ในบริบทของการพัฒนากลยุทธ์เพื่อพัฒนาเทคนิคอลอินดิเคเตอร์ นักพัฒนาระบบต้องพยายามหาให้ได้ว่า Optimal Set ของ Parameter ในแต่ละอินดิเคเตอร์  มาปรับให้เหมาะสมที่สุด เราอาจพบว่า เส้นค่าเฉลี่ย Moving Average 6 และ 10 วัน ตัดกันนั้น ให้ผลลัพธ์เชิงทดสอบสถิตที่ดีกว่าค่าเฉลี่ย อื่นๆ ตัดกัน ระหว่างค่า 1-20 ตามตัวอย่างดังกล่าว 20 คูณ​ 20 = 400 Parameter ทุกค่าจะถูกคำนวณทั้งหมด และถูกนำมาจัดอันดับ

ใน Portfolio Context, การ Optimization ค้นหา เพื่อที่จะเจอว่าควรจะให้น้ำหนักสินทรัพย์ใดใน Portfolio รวมถึงการ Short และเลือกตราสารที่มี Leverage บนช่วงที่กำหนด , Portfolio ถูกปรับให้สมดุล ผลลัพธ์ของการซื้อ และการขายใน Portfolio ที่ถืออยู่ ถูกปรับให้สอดคล้องกับการให้น้ำหนักตามที่ Optimize

ขนาดของออเดอร์ที่ถือครอง เป็นการเพิ่มเติมจากการใช้ Optimization , ช่วยให้นักพัฒนาจำลอง และวิเคราะห์ผลกระทบของ Leverage , Dynamic Position sizing ใน STS และประสิทธิภาพใน Portfolio

6 Backtest Framework สำหรับ Python

ความสามารถมาตรฐานของ แพลต์ฟอร์ม Open source Python backtesting ครอบคลุมถึง

มีการขับเคลื่อน
ยืดหยุ่น ไม่ถูกจำกัดด้วย License
มีตัวชี้วัดทางเทคนิคอลอินดิเคเตอร์ที่เหมาะสมไว้ให้พร้อมใช้
มีการวัดผลที่มีประสิทธิภาพ ตามมาตรฐาน
มีความสามารถ คำนวณ / แสดงภาพการทดสอบ / ออกรายงาน

PyAlgoTrade

PyAlgoTrade มีการเติบโต , เอกสารสมบูรณ์ Backtest Framework พร้อมด้วย Paper และความสามารถ Live Trade มี Data Support สมบูรณ์จากทั้ง Yahoo! Finance , Google Finance , NinjaTrader และ CSV หลากหลายรูปแบบจาก Based time series เช่นเดียวกับ Quandl รองรับ Order แบบต่างๆ รวมถึง Market , Limit , Stop และ StopLimit

PyAlgoTrade รองรับการเทรด Bitcoin ผ่าน Bitstamp และข้อมูล Real time Twitter event handling

Project Page: github.

Amibroker AFL: สอนขั้นตอนแบบ Step By Step ตอนที่ 1

Amibroker ถูกพิจารณาว่าเป็นหนึ่งในเครื่องมือที่ดีที่สุดสำหรับเทรดเดอร์ เป็นที่รู้จักอย่างกว้างขวางในโลก และสำหรับทุกสาย ไม่ว่าจะเป็นสาย Discretionary และ System Traders โดยเครื่องมือมาพร้อมด้วยเครื่องมือที่จัดว่า มีพลังในการ Backtest และ สามารถ Optimization engine แยกออกจากฟังก์ชันของชาร์ตที่ใช้ปกติ มีส่วนของเขียน Custom Indicator เอง และสร้าง Automate Trading system อย่างสมบูรณ์ ออกจาก Amibroker

ในการสร้างระบบเทรดผ่าน Amibroker  เราต้องมีความคุ้นเคยกับภาษาของ Amibroker เราเรียกว่า Amibroker  AFL โดยเป็นโปรแกรมมิงขั้นสูง และง่ายมากๆที่เราจะทำความเข้าใจ และเริ่มเขียนพื้นฐานต่างๆ ไม่ว่าจะเป็ใครก็ตามที่ไม่มีความรู้ทางด้านโปรแกรมเลยสามารถเลย ก็สามารถเรียน AFL และไม่จำเป็นต้องเสียค่าใช้จ่ายราคาแพงเพื่อซื้อ AFL ที่ถูกพัฒนามาแล้ว

ในโพสต์นี้ เราจะมาลองเรียนรู้ Amibroker  AFL แบบว่าไม่รู้อะไรเกี่ยวกับมันมาก่อนเลย ด้วยตัวอย่าง และ Code ที่สามารถดาวน์โหลดได้ เรารู้ว่าคุณเตรียมลงโปรแกรมเรียบร้อย และสามารถไปดึง Data จาก Live หรือ Historical Data Feed ได้แล้ว รวมถึงมีความรู้พื้นฐานของเทคนิคอลวิเคราะห์หุ้นมาพอสมควรแล้ว และ ทราบถึงการส่งคำสั่งซื้อขาย เพราะเป็น Pre-requisite สำหรับการเขียน Amibroker Coding

ใน Code นี้ มีคำอธิบาย และสามารถนำไป Copy &Pasted ได้เลย จึงค่อนข้างตรงไปตรงมา และจะเพิ่มความซับซ้อนขึ้นเรื่อยๆในขั้นตอน โดยสามารถ Comment หากมีข้อสงสัยได้ในแต่ละจุด

My First Amibroker AFL: Plotting a line chart

//------------------------------------------------------

//  Formula Name:    Basic Line Chart

//  Author/Uploader: Trading Tuitions

//  E-mail: support@tradingtuitions.