Python สำหรับ Backtesting Forex — สแตก วงจรวิจัย และข้อสงวนที่ซื่อตรง

ตรวจสอบล่าสุด: · เนื้อหาระยะยาวที่ยังคงทันสมัย
คำเตือนความเสี่ยง · YMYL บทความนี้จัดทำขึ้นเพื่อการศึกษาเท่านั้น และไม่ถือเป็นคำแนะนำการลงทุน การซื้อขายในตลาด Forex มีความเสี่ยงสูงที่อาจสูญเสียเงินทุน — ESMA รายงานว่าบัญชีรายย่อย 74–89% ขาดทุน

Strategy Tester ของ MT5 ทำงานได้ดีตราบใดที่กลยุทธ์ของคุณอยู่ในกรอบข้อสมมติของมัน — กฎการเข้าออกที่เรียบง่าย เครื่องมือเดียว ไม่มีการประมวลผลข้อมูลซับซ้อน แต่เมื่อต้องการอะไรที่ละเอียดกว่านั้น เครื่องมือนี้ก็รู้สึกคับแคบ นั่นคือเหตุผลที่นักเทรดเชิงระบบใช้ Python สำหรับการทดสอบย้อนหลัง (backtesting) มาหลายปีแล้ว — ควบคุมกฎได้เต็มที่ ใช้ไลบรารีระดับวิทยาศาสตร์ รวมแหล่งข้อมูลใดก็ได้ในสคริปต์เดียว และระยะเวลาจากแนวคิดไปสู่กราฟเส้นทุนสั้นลงเหลือเพียงไม่กี่นาที

เหตุใดนักเทรดจึงก้าวพ้น Strategy Tester

Strategy Tester เหมาะกับการปรับแต่ง Expert Advisor บนคู่เดียวและไทม์เฟรมเดียว — และนั่นคือขีดจำกัดของมัน เมื่อต้องการนำข้อมูลจากภายนอกโบรกเกอร์มาใช้ รวมหลายคู่เข้าเป็นสัญญาณเดียว หรือคำนวณอัตราส่วน Sharpe ควบคู่กับการลดลงของเงินทุน (drawdown) คุณก็ต้องใช้วิธีปะเพิ่มข้อมูล CSV ใน Excel แทน Python รวบรวมงานเหล่านี้ไว้ในสคริปต์เดียว: ราคาจากโบรกเกอร์ไหลเข้า `pandas` ข้อมูลมหภาคเข้ามาผ่าน `merge` เดียวกัน และตัวชี้วัดความเสี่ยงมาจากไลบรารีสายวิชาการ รายละเอียดการเทรดเชิงอัลกอริทึมครบครันอยู่ในแนวทางการฝึกปฏิบัติสำหรับนักเทรดที่ต้องการนำระบบไปใช้งานจริง

สแตกที่ใช้งานจริง

สแตกนั้นกระชับ การจัดการข้อมูลอยู่ใน `pandas` และ `numpy` — อันแรกดูแลอนุกรมเวลาและการรีแซมปลิงจาก M1 ถึง H1 อันหลังทำการคำนวณเวกเตอร์ใต้ตัวชี้วัด เครื่องมือสำหรับ backtesting มักเป็น `backtrader` โดย Daniel Rodriguez ในสไตล์ event-driven ผ่านคลาส Strategy และ Cerebro หรือ `vectorbt` โดย Oleg Polakov เมื่อต้องการสแกนพารามิเตอร์หลายร้อยชุดภายในไม่กี่สิบวินาที กราฟมาจาก `matplotlib` สำหรับรายงานแบบสถิต และ `plotly` สำหรับการตรวจสอบแบบโต้ตอบ ข้อมูลประวัติราคาไหลผ่าน `yfinance` สำหรับราคาปิดรายวัน `ccxt` สำหรับ crypto และแพ็กเกจทางการ `MetaTrader5` สำหรับราคาของโบรกเกอร์ สแตกทั้งหมดนี้ฟรีและเปิดให้ใช้งาน

วงจรการวิจัย — จากกฎถึงการตรวจสอบ

โปรเจกต์ดำเนินผ่านสี่ขั้นตอนที่ควรแยกกันไว้ชัดเจน ขั้นแรก เขียนกฎการเข้าและออกด้วยภาษาธรรมดาก่อน — หากพูดไม่ได้ว่า "ซื้อ EUR/USD / สถานะ Long เมื่อแนวโน้มของ EMA-50 เป็นบวกและราคาปิดอยู่เหนือจุดสูงสุด 20 วัน" ก็ยังไม่ถึงเวลาเปิด editor ขั้นที่สอง แปลกฎเหล่านั้นเป็นนิพจน์ `pandas` แบบเวกเตอร์: เงื่อนไขเดียวครอบทั้งคอลัมน์ ไม่ใช้ลูปทีละบาร์ นั่นคือเหตุผลที่ข้อมูล H1 สิบปีทดสอบได้ในไม่กี่วินาที ขั้นที่สาม รันเครื่องมือบนประวัติราคาเต็มพร้อมค่าคอมมิชชัน สเปรด (spread) ส่วนต่างราคาที่เกิดขึ้น (slippage) จุดตัดขาดทุน (Stop Loss) และจุดทำกำไร (Take Profit) แล้วอ่านกราฟเส้นทุนและรายการเทรด ขั้นที่สี่ — ที่ผู้เริ่มต้นมักข้ามเงียบๆ — ตรวจสอบนอกช่วงข้อมูล (out-of-sample): กันสองปีล่าสุดออกไว้ ปรับแต่งเฉพาะบนช่วงก่อนหน้า แล้วอ่านผลลัพธ์จากข้อมูลที่ไม่ได้แตะต้อง กระบวนการ walk-forward มีรายละเอียดในส่วนกลยุทธ์การเทรด Forex สำหรับผู้ที่ต้องการต่อยอดไปถึงการตรวจสอบหลายช่วงเวลา

สิ่งที่ Python ไม่ทำให้คุณเอง

ผู้ใช้ใหม่อ่านเอกสาร `backtrader` แล้วคิดว่าไลบรารีจัดการทุกอย่าง แต่ไม่ใช่ เครื่องมือมาตรฐานไม่รู้อะไรเกี่ยวกับสเปรดของโบรกเกอร์คุณ ไม่รู้ว่าราคาแกว่งห่างออกไปห้า pip รอบการประกาศข่าว และไม่รู้ว่าบัญชี ECN คิดค่าคอมมิชชันเจ็ดดอลลาร์ต่อล็อตทั้งสองฝั่ง คุณต้องใส่ข้อมูลเหล่านั้นเองด้วยมือ ไม่ว่าจะเป็น `commission`, `slippage_perc` หรือโมเดลสเปรดที่เปลี่ยนแปลงตามชั่วโมง กับดักที่สองที่ไม่ส่งเสียงเตือนคือคุณภาพข้อมูล: อนุกรม `yfinance` ฟรีมีช่องว่างช่วงสุดสัปดาห์ และข้อมูล tick ของ Dukascopy อาจไม่สมบูรณ์สำหรับคู่เงินรอง ความผิดพลาดที่สามคือความหลงใหลในเส้นโค้งเรียบ: backtest ในช่วงข้อมูล (in-sample) ที่มีห้าพารามิเตอร์ปรับแต่งไว้เกือบจะแสดงผลตอบแทน 200% ต่อปีเสมอ จนกว่าคุณจะตัดตัวแปรหนึ่งออกและดูเส้นโค้งบนข้อมูลที่ผู้ปรับแต่งไม่เคยแตะต้อง เวอร์ชันที่สมจริงมักแสดงผลน้อยกว่าที่คาดไว้ 30 ถึง 50%

ตัวอย่างเพื่อประกอบความเข้าใจ — โปรเจกต์ EUR/USD สมมติ

สมมติกลยุทธ์ช่วง London Open บน EUR/USD ใช้บาร์ M15: ซื้อ EUR/USD / สถานะ Long เมื่อราคาทะลุเหนือจุดสูงสุดของห้าบาร์หลัง 15:00 น. (เวลาประเทศไทย / ICT) ขาย EUR/USD / สถานะ Short เมื่อราคาทะลุต่ำกว่าจุดต่ำสุด; จุดตัดขาดทุนอยู่ที่ 1.5 เท่าของ ATR รอบ 20 คาบ จุดทำกำไรที่สองเท่าของ Stop Loss คุณดึงข้อมูลช่วงปี 2018 ถึง 2024 ด้วยแพ็กเกจ `MetaTrader5` โหลดเข้า `pandas` และรีแซมปลิงเป็น M15 การทดสอบย้อนหลังพร้อมค่าคอมมิชชัน 6 ดอลลาร์ต่อล็อต สเปรดคงที่ 0.8 pip นอกช่วงข่าว และ slippage แบบสุ่ม 1 pip ให้ผลชนะ 51% profit factor 1.28 drawdown สูงสุด 14% และ Sharpe 0.9 การแบ่งประวัติราคาเป็นช่วงสี่ปี in-sample และสองปี out-of-sample ทำให้ค่าเฉลี่ย out-of-sample ลดลงประมาณหนึ่งในสาม — ยังอยู่บนพื้นฐานที่สมเหตุสมผลสำหรับการตัดสินใจนำไปใช้งาน ตัวเลขทั้งหมดข้างต้นเป็นตัวอย่างเพื่อประกอบความเข้าใจ ไม่ใช่คำสัญญาถึงผลลัพธ์จริง

"Python กลายเป็นภาษาโปรแกรมและระบบนิเวศที่ทรงพลังสำหรับอุตสาหกรรมการเงิน — ตั้งแต่การวิเคราะห์ข้อมูลทางการเงิน การเทรดเชิงอัลกอริทึม ไปจนถึงการบริหารความเสี่ยง" — Yves Hilpisch, 2018

ข้อสงวนที่ควรแนบมากับทุกรายงาน

เมื่อ backtest เสร็จสิ้น ให้แนบกล่องข้อสงวนสั้นๆ ไว้ด้วย ข้อแรก: สเปรดที่คุณสมมติและขยายออกรอบการประกาศมหภาคหรือไม่ — ช่องว่างระหว่างสเปรดคงที่ 0.8 pip กับสเปรดจริง 2.5 pip ช่วง NFP มักเท่ากับความได้เปรียบทั้งหมด ข้อที่สอง: ข้อมูลปราศจาก look-ahead bias หรือไม่ กล่าวคือคุณคำนวณตัวชี้วัดจากราคาปิดบาร์ปัจจุบันซึ่งในเวลาจริงยังไม่รู้หรือเปล่า ข้อที่สาม: คุณปรับแต่งพารามิเตอร์กี่ตัวพร้อมกัน — ห้าตัวคือขีดที่แม้แต่ walk-forward ก็หยุดป้องกันคุณไม่ได้ ข้อที่สี่: ผลลัพธ์ผ่านการทดสอบ out-of-sample หรือมีเพียงบนประวัติราคาทั้งหมด โดยไม่มีสี่ประโยคนี้รายงานก็ไม่ต่างจากสื่อการตลาด ไม่ใช่การตรวจสอบที่แท้จริง คู่มือการวิจัยที่ครอบคลุมกว่ามีอยู่ใน workshop ของนักเทรด บน ForexMechanics

เนื้อหานี้เป็นเพียงข้อมูลการศึกษา ไม่ใช่คำแนะนำการลงทุน การซื้อขาย Forex/CFD มีความเสี่ยงสูง รายได้จากการเทรดในประเทศไทยอยู่ในประเภทเงินได้พึงประเมินตามประมวลรัษฎากร ควรปรึกษาผู้เชี่ยวชาญด้านภาษีหรือสำนักงานสรรพากรในพื้นที่สำหรับข้อมูลที่ถูกต้อง

ขั้นตอนถัดไปสำหรับคุณ

  1. ติดตั้ง Python 3.11 หรือใหม่กว่าพร้อม `pandas`, `numpy`, `backtrader`, `matplotlib` และแพ็กเกจทางการ `MetaTrader5` — คำสั่ง `pip install` เดียวได้สแตกทั้งหมด — จากนั้นดาวน์โหลดข้อมูล H1 สองปีของคู่เงินที่คุณเทรดจริงและบันทึกเป็น CSV เพื่อให้การทดสอบครั้งต่อไปใช้แหล่งข้อมูลท้องถิ่นที่เสถียร ไม่ต้องดึงใหม่ทุกครั้ง
  2. เขียนกฎกลยุทธ์ด้วยภาษาธรรมดาก่อน — หนึ่งประโยคสำหรับการเข้าสถานะ การออกสถานะ จุดตัดขาดทุน และจุดทำกำไร — แล้วค่อยแปลเป็นนิพจน์ `pandas` แบบเวกเตอร์ มุ่งเป้าให้การทดสอบทั้งหมดอยู่ในสามสิบบรรทัดโดยไม่มีลูปทีละบาร์ และอย่าปรับแต่งพารามิเตอร์ในขั้นนี้
  3. รัน backtest พร้อมค่าคอมมิชชันจริง สเปรดคงที่ และ slippage สุ่ม 1 pip แล้วเปรียบเทียบกับเวอร์ชันไม่มีต้นทุน ช่องว่างบอกคุณว่าความได้เปรียบที่สมมติมากแค่ไหนที่เป็นผลจากการรันที่ราคากลาง — หากต้นทุนกินกำไรขั้นต้นเกินครึ่ง กลยุทธ์นั้นบางเกินไปสำหรับการใช้งานจริง
  4. แบ่งประวัติราคาเป็นช่วงสี่ปี in-sample และหนึ่งปี out-of-sample ปรับแต่งไม่เกินสองพารามิเตอร์บนช่วง in-sample ล็อกชุดค่าที่ดีที่สุดและรันการทดสอบ out-of-sample ครั้งเดียว หากอัตราชนะลดลงเกินหนึ่งในสาม ให้ลดความซับซ้อนของกฎแทนที่จะมองหาการปรับแต่งที่ดีกว่า
  5. เก็บบันทึกการเทรดอย่างง่าย — ไฟล์ Markdown ในรีโพสิทอรีเดียวกัน — และหลัง backtest แต่ละครั้งเขียนสี่ประโยค: สเปรดที่ใช้ ตัวชี้วัดหลีกเลี่ยง look-ahead หรือไม่ ปรับแต่งกี่พารามิเตอร์ และเส้นทุน out-of-sample ยังอยู่เหนือครึ่งหนึ่งของ in-sample หรือเปล่า หากไม่มีบันทึกนี้ ภายในสามเดือนคุณจะจำไม่ได้ว่ารายงานไหนน่าเชื่อถือ คู่มือแนวทางทักษะการบริหารความเสี่ยงเพิ่มเติมอยู่ในการบริหารความเสี่ยงใน Forex
Jarosław Wasiński
เกี่ยวกับผู้เขียน

Jarosław Wasiński

บรรณาธิการบริหาร MyBank.pl · นักวิเคราะห์การเงินและตลาด

นักวิเคราะห์และผู้ปฏิบัติงานอิสระที่มีประสบการณ์กว่า 20 ปีในภาคการเงิน ผู้ก่อตั้งและบรรณาธิการบริหารของ MyBank.pl ที่ดำเนินงานมาตั้งแต่ปี 2004 วิเคราะห์ปัจจัยพื้นฐานตลาดอัตราแลกเปลี่ยนและมหภาคตั้งแต่ปี 2007 เขียนจากมุมมองตลาดโลก การเทรด Forex แบบ leverage มีความเสี่ยงสูง อยู่ภายใต้การกำกับดูแลของ ก.ล.ต. ในประเทศไทย

แหล่งอ้างอิงและบรรณานุกรม

  1. Backtrader Backtrader documentation — Introduction · oficjalna dokumentacja open-source'owej biblioteki Daniela Rodrigueza: model event-driven, klasy Strategy i Cerebro, integracja danych www.backtrader.com ↗
  2. vectorbt vectorbt usage documentation · oficjalny przewodnik po wektorowym backtestowaniu w numpy/pandas — przykłady i sweep parametrów vectorbt.dev ↗
  3. O'Reilly Media Yves Hilpisch — Python for Finance, 2nd Edition (2018) · kanoniczna pozycja o zastosowaniach Pythona w analityce finansowej, algorytmice i zarządzaniu ryzykiem www.oreilly.com ↗
  4. MQL5 MetaTrader 5 Python Integration — official reference · oficjalne API pakietu MetaTrader5: pobieranie historycznych OHLC i tików, dostęp do konta i składanie zleceń z Pythona www.mql5.com ↗
  5. pandas pandas — Time series / date functionality · referencja czasu w pandas: konwersje, resampling, indeksowanie i przesunięcia używane w każdym backteście pandas.pydata.org ↗

คำถามที่พบบ่อย

ต้องรู้ Python ระดับสูงก่อนเริ่มต้นหรือไม่?

ความรู้พื้นฐาน Python เพียงพอแล้ว — ลูป ลิสต์ ฟังก์ชัน การนำเข้าไลบรารี และการอ่านไฟล์ CSV ส่วนที่เหลือคือ pandas ซึ่งคุณจะเรียนรู้ระหว่างทำงาน เพราะทุกโปรเจกต์การทดสอบย้อนหลังใช้การดำเนินการไม่กี่อย่างเหมือนกัน: โหลดข้อมูล รีแซมปลิง คำนวณตัวชี้วัด กำหนดเงื่อนไขเข้าสถานะ รวบรวมผลลัพธ์ กลยุทธ์แรกมักใส่ได้ในสามสิบบรรทัดของโค้ด จึงไม่มีประโยชน์รอจนกว่าจะ "เชี่ยวชาญ Python อย่างสมบูรณ์" จังหวะที่เหมาะกว่าคือดำเนินสองเส้นทางพร้อมกัน: คอร์สสั้นพื้นฐาน (สี่ถึงหกสัปดาห์ชั่วโมงละครั้งต่อวัน) และโปรเจกต์จริงที่กำลังฝึกอยู่ หากคุณสร้างตาราง Excel ด้วยสูตรได้และเข้าใจว่าฟังก์ชันคืออะไร คุณมีขั้นต่ำที่จำเป็น — pandas แทนที่ spreadsheet ได้เกือบสมบูรณ์ ทำงานเร็วกว่า และช่วยให้ตรวจสอบผลงานได้อย่างเหมาะสมนอกช่วงข้อมูล

เลือก backtrader แทน vectorbt — หรือในทางกลับกัน เพราะเหตุใด?

ไลบรารีทั้งสองมีปรัชญาต่างกัน Backtrader ทำงานแบบ event-driven: เครื่องมือเดินทีละบาร์ เรียกเมธอด next() บนคลาส Strategy ของคุณ และจำลองการไหลของการเทรดจริง — ดังนั้นการเพิ่มตรรกะการจัดการสถานะ trailing stop หรือการออกบางส่วนทำได้โดยตรง ราคาที่จ่ายคือความเร็ว: ข้อมูล M5 สิบปีบนคู่เดียวอาจใช้เวลาหลายนาที Vectorbt ไปในทิศทางตรงข้าม — คุณแสดงกลยุทธ์ทั้งหมดเป็นการดำเนินการเวกเตอร์บนคอลัมน์ pandas เครื่องมือคำนวณทุกอย่างแบบขนานผ่าน numpy และการสแกนพารามิเตอร์หนึ่งร้อยชุดเสร็จในไม่กี่สิบวินาที ราคาคือช่วงการแสดงออก: ตรรกะการเข้าสถานะที่ซับซ้อนซึ่งขึ้นอยู่กับสถานะของพอร์ตยากที่จะเขียนโค้ดในที่นี้ ในทางปฏิบัตินักเทรดเก็บทั้งสองไว้ — vectorbt สำหรับการสำรวจเร็วและการสแกนพารามิเตอร์ backtrader สำหรับการตรวจสอบขั้นสุดท้ายของตัวเลือกที่ดีที่สุดพร้อมโมเดลค่าคอมมิชชันและ slippage ที่สมจริง

จะหาข้อมูลประวัติราคาที่น่าเชื่อถือได้จากที่ไหน?

สามแหล่ง เรียงตามลำดับความสมเหตุสมผล แหล่งแรก แพ็กเกจทางการ MetaTrader5 — คุณได้รับประวัติราคาโดยตรงจากโบรกเกอร์ของคุณเอง ดังนั้นสเปรด ค่าธรรมเนียมข้ามคืน (swap) และค่าคอมมิชชันในการทดสอบย้อนหลังตรงกับสิ่งที่คุณจะเห็นในบัญชีจริง นี่คือตัวเลือกที่ซื่อตรงที่สุดสำหรับกลยุทธ์ที่คุณตั้งใจจะนำไปใช้งาน แหล่งที่สอง Dukascopy เผยแพร่ข้อมูล tick และ M1 สำหรับคู่หลักย้อนหลังถึงปี 2003 — คุณภาพระดับสถาบัน แต่สเปรดมาจากแพลตฟอร์ม Dukascopy ไม่ใช่โบรกเกอร์ของคุณ แหล่งที่สาม yfinance สำหรับราคาปิดรายวันและ ccxt สำหรับตลาด crypto — ทั้งสองดีพอสำหรับการสร้างต้นแบบ แต่ช่องว่างช่วงสุดสัปดาห์และนาทีที่หายเป็นครั้งคราวทำให้ไม่เหมาะกับการตรวจสอบกลยุทธ์ intraday จงบันทึกแหล่งข้อมูลในส่วนหัวของสคริปต์ทุกครั้ง เพื่อให้หกเดือนต่อมาคุณยังรู้ว่ารายงานอ้างอิงจากอะไร — รายละเอียดเล็กน้อยที่ช่วยเซฟงานได้ทุกครั้งที่มีการตรวจสอบ

จะรู้ได้อย่างไรว่า backtest ดีเกินจริง?

สี่สัญญาณเพียงพอแล้ว สัญญาณแรก: อัตราชนะสูงกว่า 75% ในกว่าสองร้อยการเทรด — แทบไม่สามารถทำได้นอกจากการ scalping ในตลาดที่แคบมาก ดังนั้นผลลัพธ์นั้นชี้ไปที่ look-ahead bias หรือข้อผิดพลาดในข้อมูล สัญญาณที่สอง: กราฟเส้นทุนไม่มีการดึงกลับที่มีนัยสำคัญ — กลยุทธ์จริงมีการลดลงของเงินทุน (drawdown) สองหลัก ดังนั้นเส้นขึ้นที่เรียบเป็นคำเตือนของ curve-fit สัญญาณที่สาม: profit factor สูงกว่า 3.5 — หายากมากใน Forex ที่สเปรด ECN เพียงอย่างเดียวกินความได้เปรียบสองหลักเปอร์เซ็นต์ สัญญาณที่สี่: ความไวต่อพารามิเตอร์อย่างรุนแรง — เมื่อการเปลี่ยนคาบของค่าเฉลี่ยเคลื่อนที่จาก 14 เป็น 12 ทำให้ผลลัพธ์ล่มสลาย แสดงว่ากลยุทธ์เรียนรู้ noise ไม่ใช่โครงสร้าง เมื่อสองในสี่สัญญาณส่องพร้อมกัน รายงานนั้นน่าสงสัยไม่ว่าตัวชี้วัดหลักจะเป็นอย่างไร ให้ทำให้ตรรกะเรียบง่ายขึ้น ลดพารามิเตอร์หนึ่งหรือสองตัว และรันการทดสอบอีกครั้งบนข้อมูลนอกช่วง

เจาะลึกเพิ่มเติม · คู่มือฉบับสมบูรณ์