สร้างระบบ Backtesting ด้วย Python

Mastering Algorithmic trading with Python

NUTHDANAI WANGPRATHAM
QUANT I LOVE U
2 min readDec 19, 2022

--

Backtesting มีความสำคัญมากในกระบวนการพัฒนาและประเมิน กลยุทธ์การลงทุนเพื่อให้เราเข้าใจถึงผลตอบแทนและความเสี่ยงสำหรับการเพิ่มประสิทธิภาพและสามารถปรับปรุงความแม่นยำของกลยุทธ์หรือแบบจำลองได้โดยการระบุจุดอ่อนหรืออคติที่อาจส่งผลให้ประสิทธิภาพไม่ดีในอดีต

การสร้างระบบเทรดอาจเป็นเรื่องที่ซับซ้อนและต้องอาศัยความคิดสร้างสรรค์ที่ขั้นตอนที่สำคัญไม่แพ้กันคือการทดสอบว่าไอเดียต่าง ๆ ที่เราคิดค้นมานั้นมันเวิร์คหรือไม่ดังนั้นตอนนี้เราจะมาพูดถึงการเขียนระบบ Backtesting ด้วย Python กัน

รู้จักกับ Numpy และ Pandas กันก่อน

Vectorization (array ใน Numpy และ data frame ใน pandas) นั้นทำให้การคำนวณของคอมพิวเตอร์ค่อนข้างรวดเร็ว

Pandas

Pandas ถูกพัฒนามาเพื่อจัดการกับ Panel Data (คือข้อมูลตารางแบบ excel) โดย Wes McKinney ซึ่งขณะนั้นทำงานเป็นนักวิเคราห์เศรษฐกิจอยู่ที่ hedge fund อย่าง AQR Capital Manament แน่นอนว่าวัตถุประสงค์แรกของ Pandas คือการจัดการข้อมูลทางการเงินโดยเฉพาะดังนั้นหากใครต้องการทำระบบเทรดด้วย Python Pandas ก็เป็นเครื่องมือที่ดี

Numpy

Numpy เป็นเครื่องมือในการช่วยใน การคำนวณต่างๆ มาให้ใช้งาน โดยทั่วไปจะ เกี่ยวกับการจัดการข้อมูลชุด (Array) แม้การใช้งานในด้านการเงินจะยากกว่า Pandas แต่ข้อมูลในรูปแบบ Array ของ Numpy ก็ใช้ทั้งพลังและเวลาในการคำนวณผลที่น้อยกว่า Pandas ค่อนข้างมาก ดังนั้นเมื่อข้อมูลใหญ่ขึ้นความสามารถในการใช้ Numpy ก็มีความจำเป็น

Basic Backtesting

Backtesting เป็นขั้นตอนสำคัญในกระบวนการพัฒนาและประเมินกลยุทธ์หรือรูปแบบการซื้อขาย ช่วยให้เทรดเดอร์เห็นว่ากลยุทธ์หรือโมเดลจะดำเนินไปอย่างไรในอดีต และรับทราบถึงศักยภาพในการประสบความสำเร็จในอนาคต ในบทความนี้ เราจะดูพื้นฐานของการทดสอบย้อนหลังด้วย Python รวมถึงวิธีรับและเตรียมข้อมูลย้อนหลัง วิธีนำกลยุทธ์หรือโมเดลการซื้อขายไปใช้ และวิธีวิเคราะห์ผลลัพธ์ของการทดสอบย้อนหลัง

การรับและเตรียมข้อมูลย้อนหลัง

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

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

การใช้กลยุทธ์หรือแบบจำลองการซื้อขาย

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

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

การวิเคราะห์ผลลัพธ์ของ Backtest

เมื่อคุณนำกลยุทธ์หรือโมเดลการซื้อขายไปใช้และทำการทดสอบย้อนกลับแล้ว ก็ถึงเวลาวิเคราะห์ผลลัพธ์ ซึ่งจะเกี่ยวข้องกับการคำนวณเมตริกหลัก เช่น กำไรและขาดทุน (P&L) ของการซื้อขาย อัตราส่วน Sharpe และการเบิกถอนสูงสุด คุณจะต้องการแสดงภาพผลลัพธ์ด้วย โดยอาจสร้างแผนภูมิของ P&L ในช่วงเวลาหนึ่งหรือฮิสโตแกรมของผลตอบแทน

สิ่งสำคัญคือต้องวิเคราะห์ผลลัพธ์ของ backtest อย่างรอบคอบเพื่อระบุจุดอ่อนหรืออคติในกลยุทธ์หรือแบบจำลองของคุณ คุณอาจต้องปรับเปลี่ยนกลยุทธ์หรือโมเดลของคุณตามผลการทดสอบย้อนหลังเพื่อปรับปรุงประสิทธิภาพในอนาคต

ตัวแปรที่เราใช้ประเมินกลยุทธ์เทรด

Win rate

Win rate คือเปอร์เซ็นต์ของการเทรดที่ชนะค่าที่กำหนด เป็นเมตริกที่ใช้กันทั่วไปในการประเมินประสิทธิภาพของกลยุทธ์การซื้อขาย

ตัวอย่างเช่น หากกลยุทธ์การซื้อขายสร้างการซื้อขาย 100 รายการและ 50 รายการทำกำไรชนะตลาดได้ Win rate คือ 50% อัตราการชนะที่สูงขึ้นอาจบ่งบอกถึงกลยุทธ์การซื้อขายที่ประสบความสำเร็จมากกว่า แต่สิ่งสำคัญคือต้องพิจารณาเมตริกอื่นๆ เช่น กำไรและขาดทุน (P&L) และอัตราส่วน Sharpe ด้วย

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

avg win / avg loss

avg win / avg loss คือตัวชี้วัดที่ใช้วัดขนาดของการซื้อขายที่ทำกำไรและไม่ได้ผลกำไรในกลยุทธ์การซื้อขาย สามารถคำนวณได้โดยการหารกำไรหรือขาดทุนทั้งหมดด้วยจำนวนการซื้อขายที่ชนะหรือแพ้ตามลำดับ
ตัวอย่างเช่น หากกลยุทธ์การซื้อขายสร้างการซื้อขาย 100 ครั้งและมีกำไรรวม $5,000 โดยมีการซื้อขายที่ชนะ 50 ครั้งและการซื้อขายที่แพ้ 50 ครั้ง การชนะโดยเฉลี่ยคือ 5,000 / 50 = 100 และการสูญเสียโดยเฉลี่ยคือ 0 / 50 = 0

avg win และ avg loss เป็นเมตริกที่วัดขนาดของการเทรดที่ได้กำไรและไม่ได้กำไรในกลยุทธ์การเทรด สามารถคำนวณได้โดยการหารกำไรหรือขาดทุนทั้งหมดด้วยจำนวนการเทรดที่ชนะหรือแพ้ตามลำดับ
ตัวอย่างเช่น หากกลยุทธ์การเทรดสร้างการเทรด 100 รายการและมีกำไรรวม 5,000 ดอลลาร์ โดยมีการเทรดที่ชนะ 50 รายการ และเทรดที่แพ้ 50 รายการ การชนะโดยเฉลี่ยคือ 5,000 / 50 = 100 และการสูญเสียโดยเฉลี่ยคือ 0 / 50 = $0

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

ปัญหาในการทำสอบย้อนหลัง

look ahead bias หรือที่เรียกว่าอคติแบบแอบดูหรือแอบดู เป็นความเอนเอียงประเภทหนึ่งที่เกิดขึ้นเมื่อกลยุทธ์หรือแบบจำลองการซื้อขายใช้ข้อมูลที่ไม่มีอยู่ในขณะที่ทำการซื้อขาย สิ่งนี้สามารถนำไปสู่ผลลัพธ์ที่มองโลกในแง่ดีเกินไปเมื่อทดสอบกลยุทธ์หรือแบบจำลองย้อนหลัง เนื่องจากไม่ได้สะท้อนถึงเงื่อนไขที่การซื้อขายเกิดขึ้นจริงอย่างถูกต้อง มีหลายวิธีที่look ahead bias สามารถเกิดขึ้นได้ในการซื้อขายแบบอัลกอริทึม:

  1. การใช้ข้อมูลในอนาคต: หากกลยุทธ์หรือโมเดลการซื้อขายใช้ข้อมูลที่ไม่มีอยู่ในเวลาที่ซื้อขาย มันมีแนวโน้มที่จะให้ผลลัพธ์ที่มองโลกในแง่ดีเกินไปเมื่อทดสอบย้อนหลัง กรณีนี้อาจเกิดขึ้นได้หากกลยุทธ์หรือแบบจำลองใช้ข้อมูลจากอนาคตในการตัดสินใจซื้อขาย เช่น โดยดูที่ราคาในอนาคตหรือตัวบ่งชี้ทางเศรษฐกิจ
  2. การปรับปรุงกลยุทธ์หรือแบบจำลองตามข้อมูลในอนาคต: หากกลยุทธ์หรือแบบจำลองได้รับการปรับปรุงหรือปรับปรุงตามข้อมูลที่ไม่มีอยู่ในเวลาที่ซื้อขาย ก็อาจสร้างผลลัพธ์ในแง่ดีมากเกินไปเมื่อทดสอบย้อนกลับ สิ่งนี้สามารถเกิดขึ้นได้หากกลยุทธ์หรือโมเดลได้รับการปรับให้เหมาะสมโดยใช้ข้อมูลจากอนาคต หรือหากมีการอัปเดตตามการเปลี่ยนแปลงของสภาวะตลาดที่ไม่ทราบในขณะที่ทำการซื้อขาย
  3. Data snooping: การสอดแนมข้อมูลเกิดขึ้นเมื่อกลยุทธ์หรือรูปแบบการซื้อขายได้รับการพัฒนาโดยใช้ข้อมูลที่เลือกตามผลลัพธ์ที่ต้องการ ตัวอย่างเช่น หากกลยุทธ์หรือแบบจำลองได้รับการพัฒนาโดยใช้เฉพาะข้อมูลจากช่วงเวลาที่ทำงานได้ดี ก็มีแนวโน้มที่จะให้ผลลัพธ์ที่มองโลกในแง่ดีเกินไปเมื่อทดสอบย้อนกลับ

เพื่อหลีกเลี่ยงlook ahead bias สิ่งสำคัญคือต้องใช้เฉพาะข้อมูลที่มีอยู่ในขณะที่ทำการซื้อขายเมื่อทำการทดสอบกลยุทธ์หรือแบบจำลองการซื้อขายย้อนหลัง ซึ่งอาจเกี่ยวข้องกับการใช้ข้อมูลนอกกลุ่มตัวอย่างหรือเทคนิคการตรวจสอบข้ามเพื่อตรวจสอบความถูกต้องของผลลัพธ์ สิ่งสำคัญคือต้องตระหนักถึงการเปลี่ยนแปลงหรืออัปเดตกลยุทธ์หรือโมเดลที่อาจอิงตามข้อมูลที่ไม่มีอยู่ในขณะที่ทำการซื้อขาย

simplification

Simplification problem เป็นปัญหาทั่วไปในการทดสอบกลยุทธ์การซื้อขายแบบอัลกอริทึมย้อนหลัง มันหมายถึงข้อเท็จจริงที่ว่าการทดสอบย้อนกลับนั้นจำเป็นต้องเกี่ยวข้องกับการทำให้ง่ายขึ้นและการตั้งสมมติฐานเกี่ยวกับแง่มุมบางประการของกระบวนการซื้อขาย เช่น ต้นทุนการทำธุรกรรมหรือการคลาดเคลื่อน การทำให้เข้าใจง่ายเหล่านี้อาจส่งผลต่อความแม่นยำของผลลัพธ์ และอาจนำไปสู่ผลลัพธ์ที่มองโลกในแง่ดีหรือมองโลกในแง่ดีเกินไป การลดความซับซ้อนทั่วไปบางอย่างที่อาจนำไปสู่ปัญหาการลดความซับซ้อนในการทดสอบย้อนหลัง ได้แก่:

  1. ต้นทุนการทำธุรกรรม: การซื้อขายเกี่ยวข้องกับค่าใช้จ่าย เช่น ค่าคอมมิชชั่น ค่าธรรมเนียม และสเปรด ซึ่งอาจส่งผลต่อความสามารถในการทำกำไรของการซื้อขาย เมื่อทดสอบกลยุทธ์หรือโมเดลการซื้อขายย้อนหลัง มักจำเป็นต้องลดความซับซ้อนของต้นทุนเหล่านี้และตั้งสมมติฐานเกี่ยวกับผลกระทบที่มีต่อการค้า สิ่งนี้สามารถนำไปสู่การประเมินความสามารถในการทำกำไรของการเทรดสูงหรือต่ำเกินไป
  2. Slippage: Slippage เกิดขึ้นเมื่อราคาที่ดำเนินการซื้อขายแตกต่างจากราคาที่ตั้งใจจะดำเนินการ ซึ่งอาจเกิดจากปัจจัยต่างๆ เช่น ความผันผวนของตลาดหรือขนาดของการซื้อขาย เมื่อทดสอบกลยุทธ์หรือแบบจำลองการซื้อขายย้อนหลัง มักจำเป็นต้องตั้งสมมติฐานเกี่ยวกับการเลื่อนหลุดและผลกระทบต่อการซื้อขาย สิ่งนี้สามารถนำไปสู่การประเมินความสามารถในการทำกำไรของการเทรดสูงหรือต่ำเกินไป
  3. ผลกระทบต่อตลาด: ขนาดและลักษณะของการซื้อขายอาจส่งผลต่อราคาตลาดของสินทรัพย์ เมื่อทดสอบกลยุทธ์หรือโมเดลการซื้อขายย้อนหลัง มักจำเป็นต้องตั้งสมมติฐานเกี่ยวกับผลกระทบต่อตลาดของการค้าและผลกระทบต่อความสามารถในการทำกำไรของการค้า สิ่งนี้สามารถนำไปสู่การประเมินความสามารถในการทำกำไรของการเทรดสูงหรือต่ำเกินไป

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

split window back test

split window back test คือการเเบ่งข้อมูลเป็นสองชุดตามเวลาการเเบ่งแบบนี้จะทำให้เรามีชุดข้อมูลที่มากขึ้นในการสร้างแบบจำลอง

เราฝึกโมเดลโดยใช้ข้อมูล Train และใช้ ข้อมูล Test ที่อยู่ติดกันในการทดสอบ ด้วยเทคนิคนี้ เราสามารถคำนวณตัวชี้วัดประสิทธิภาพโดยเฉลี่ยทั่วทั้งชุดข้อมูล ตัวชี้วัดประสิทธิภาพที่ได้จากวิธีนี้ โดยทั่วไปจะมีประสิทธิภาพมากกว่าเทคนิคการตรวจสอบแยกที่เราได้พูดคุยกันก่อนหน้านี้ สังเกตว่าหน้าต่างการฝึกหรือหน้าต่างการทดสอบย้ายไปมารวมกันในข้อมูลอนุกรมเวลาทั้งหมดอย่างไร วิธีนี้ทำให้กลยุทธ์ของคุณสามารถสร้างแบบจำลองและทดสอบกับชุดข้อมูลเกือบทั้งหมด แทนที่จะเป็นเพียงครึ่งเดียว

ปัญหาอื่นๆใน Backtesting

  • optimization Bias
  • Survivorship Bias

ส่งท้าย

การทดสอบย้อนหลังเป็นขั้นตอนสำคัญในกระบวนการพัฒนาและประเมินกลยุทธ์หรือรูปแบบการซื้อขาย ด้วยการใช้กลยุทธ์หรือแบบจำลองกับข้อมูลในอดีตและการวิเคราะห์ผลลัพธ์ ผู้ค้าสามารถเข้าใจความเสี่ยงและผลตอบแทนที่อาจเกิดขึ้นจากการใช้กลยุทธ์หรือแบบจำลองเฉพาะได้ดีขึ้น ในบทความนี้ เราดูที่พื้นฐานของ backtesting ด้วย Python รวมถึงวิธีรับและเตรียมข้อมูลย้อนหลัง วิธีนำกลยุทธ์หรือโมเดลการซื้อขายไปใช้ และวิธีวิเคราะห์ผลลัพธ์ของ backtest

แม้ระบบ Backtesting จะสำคัญแต่อย่าลืมว่า ผลลัพธ์จากการทำ Backtesting เป็นเพียงการทดสอบสมมติฐานในชุดข้อมูลหนึ่งเท่านั้น เราไม่ควรที่จะสร้างกลยุทธ์การลงทุนจากการทดสอบย้อนหลังอย่างเดี่ยวโดยไม่มีทฤษฏีกลยุทธ์ที่ดีควรอธิบายได้และบอกเราได้ว่ากลยุทธ์นี้จะเหมาะกับสถานการณ์ใดและสถานการณ์ใดไม่ควรใช้

--

--

NUTHDANAI WANGPRATHAM
QUANT I LOVE U

I am a learner and have a multipotential life. You can contact me at nutdnuy@gmail.com