การทดสอบระบบกลยุทธ์เทรดย้อนหลัง (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

bt – Backtesting for Python

bt“ มุ้งเน้น สร้างความง่ายในการทดสอบ , การนำกลับใช้ และความยืดหยุ่นของ Block ของตรรกะกลยุทธ์ เพื่อนำมาพัฒนาสร้างกลยุทธ์ที่มีความซับซ้อนได้อย่างรวดเร็ว

Framework มีความเหมาะสมอย่างมากที่จะนำมาเทสกับ Portfolio-Based STS ด้วยอัลกอรึซึม สำหรับการถ่วงน้ำหนักสินทรัพย์ และการจัดสมดุลของ Portfolio การปรับเปลี่ยนกลยุทธ์เพื่อที่จะรันในเวลาความถี่ที่แตกต่างกัน หรืออีกทางเลือกในการถ่วงน้ำหนักที่มีการปรับแต่งรหัสน้อยที่สุด bt ยังสร้าง atop ffn – เป็นไลบารี่ฟังก์ชันด้านไฟแนนซ์สำหรับ Python

Backtrader

แพลตฟอร์มนี้ทำได้ดีเยี่ยมกับเอกสาร โดยมีข้อมูลจาก blog และคอมมูนิตี้ ที่มีการถาม-ตอบ และร้องขอ Feature สม่ำเสมอ Backtrader รองรับจำนวน Data Format ที่หลากหลาย รวมถึง CSV File , Pandas DataFrame , Blaze iterator และ Real time data feed จาก Broker 3 ราย  โดยชุดข้อมูล  Data Deed สามารถเข้าถึงได้พร้อมกัน และสามารถนำมาเป็นชุดข้อมูลในแต่ละ Timeframe ที่แตกต่างกันได้ รองรับ Broker รวมถึง Oanda  สำหรับ FX Trading และ สินทรัพย์อื่นๆผ่าน Interactive Brokers และ Visual Chart

Pysystemtrade

นักพัฒนา Pysystemtrade ชื่อว่า คุณ Rob Carver มีการโพสต์ยอดเยี่ยมในการอธิบายว่าทำไมเขาถึงต้องสร้าง Python Backtesting Framework ตัวใหม่นี้ขึ้นมาอีก และโต้แย้งกับการพัฒนา Framework อื่น โดย Backtest Framework ของ Pysystemtrade  อยู่ในหนังสือของเขาชื่อ “Systematic Trading”

Pysystemtrade มีรายการพัฒนาความสามารถเป็น Roadmap รวมถึง ความครบถ้วนในการ Backtest นั่น รวมถึง Optimization และ calibration technique และ Automate เข้าไปกับ การเทรดอนุพันธ์ Interactive Brokers และสมทบกับ Open Source

Zipline

Zipline เป็นโปรแกรมจำลองการซื้อขายแบบอัลกอริทึม ด้วยแบบความสามารถแบบ Paper และ Live Trade เข้าถึงเบราเซอร์ IPython Notebook interface, Zipline มีทางเลือกที่ง่ายอีกด้วย Command line ทั้งยังสนับสนุนและพัฒนาโดย Quantopian, Zipline สามารถถูกนำมาใช้แบบ standalone backtesting framework หรือ เป็นส่วนหนึ่งของการพัฒนา STS Quantopian / Zipline STS ทดสอบ และนำไป Deploy บน Environment , Zipline ให้ข้อมูลรายนาทีย้อนหลังถึง 10 ปีในตลาดหุ้นสหรัฐ และชุดข้อมูลอื่นๆ

Project Page: zipline.io

QSTrader

QSTrader  เป็น Backtest Framework ด้วยความสามารถในการ Live Trade , QuanStart Founder คุณ Michael Halls-Moore สร้าง QSTrader ด้วยความสนใจสร้างแพลต์ฟอร์มที่แข็งแรง และขยายได้เพียงพอกับความต้องการบริการของสถาบันการเงิน พวก Quant Hedge Fun เช่นเดียวกับ Quant Trader นักลงทุนรายย่อย QSTrader ปัจจุบันรองรับ OHLCV “Bar” ข้อมูลบน Time Scale ที่แตกต่างกัน และอนุญาตให้ใช้ Tick Data ด้วย

กระบวนการ Backtest และ Live Trade สมบูรณ์แบบ ปรับปรุงการเปลี่ยนกลยุทธ์จากการวิจัยเป็นการทดสอบ และการ Live Trade ที่สุด Core strategy/portfolio code เหมือนกันในการปรับใช้ได้ทั้งสอง

ประโยชน์หลักของ QSTrader คือ มีโมดูลอนุญาตให้ใช้ Cutomization Code สำหรับผู้ซึ่งมีความต้องการกำหนด ความต้องการส่วนของ Risk หรือ Portfolio Management

การรอบล้อมไปด้วยการ Backtest

เป็นธรรมชาติของมนุษย์ที่จะโฟกัสกับสิ่งที่เราจะได้ในการพัฒนา STS (ความคาดหวังว่าจะได้กำไร) , การเร่งเติมเงินในบัญชี (ด้วยความคาดหวัง) โดยปราศจากการทุ่มเทเวลา และลงแรงผ่านการ Backtest ทดสอบกลยุทธ์อย่างเพียงพอ  จริงๆแล้วการ Backtest ไม่เป็นเพียงแค่ ตัวปกป้องเราจากกลยุทธ์ที่ไม่สมบูรณ์ และสูญเสียเงินในพอร์ตแล้ว ยังช่วยวินิจฉัยตัวเลขที่เกิดขึ้นจากกระบวนการพัฒนา STS ตัวอย่างเช่น การทดสอบ STS สองอัน ต่าง Timeframe กัน เพื่อให้เข้าใจว่า จะมี Max Drawdown ของกลยุทธ์ สัมพันธ์กันอย่างไร, และสร้าง การทดสอบกลยุทธ์ Backtest ที่มีความฉลาดกว่าเดิมในสินทรัพย์ต่างๆในหลากลายภูมิภาค

ในอนาคต เราจะได้พบ Backtest สำหรับ Environment อื่นๆนอกเหนือจาก Python และเห็นตัวอย่างเทคนิค Sampling ที่หลากหลาย เหมือนกับ Bootstrapping และ Jackknife สำหรับ Backtesting Predictive trading model ต่างๆ

 

ที่มา https://www.quantstart.com/articles/backtesting-systematic-trading-strategies-in-python-considerations-and-open-source-frameworks

 

 

ห้ามพลาด!!

คอร์ส FINANCIAL ENGINEERING BOOTCAMP ที่จบมาสร้างระบบเทรดหุ้นได้จริง
"Boothcamp สำหรับคลาส Financial Engineering ครั้งแรกในเมืองไทย ใครอยากรู้เรื่อง Quant ที่ผู้เรียนจะได้ คำแนะนำวินัยการลงทุนที่เคร่งครัด, ไม่ต้องเฝ้าหน้าจอหลายจอ เพื่อดูหุ้นหลายตัวให้เหมื่อย และ การกระจายความเสี่ยง จากการเลือกลงทุนได้หลายกลยุทธ์

รายละเอียดเพิ่มเติมและสมัครที่นี่

หลักสูตรนี้เรียนกันทั้งหมด 10 ครั้ง รวม 30 ชั่วโมง จบมาทำงานได้จริง!!! สอบถามเพิ่มเติมได้ที่เพจ LEAN upskill