Robo Trade Notes · บทที่ 14 · เอกสารตรวจ
Performance Report
EMA20 / EMA200 · daily bars
ราคาจริง SPY รายวันจาก Webull OpenAPI · การซื้อขายและต้นทุนเป็นแบบจำลอง ราคาปรับย้อนหลังแล้วจึงสะท้อนเงินปันผล
2006-09-26 ถึง 2026-09-25 · 5031 วันซื้อขาย · 1 แท่งต่อวัน · EMA 20/200 วัน · เงินเริ่มต้น 100,000 USD · ต้นทุน 0.10% ต่อข้าง · long/cash · สัญญาณเมื่อแท่งปิด ส่งคำสั่งที่ราคาเปิดแท่งถัดไป
ผลตอบแทนและความเสี่ยงจากข้อมูลรายวัน
ผลตอบแทนสะสม: EMA 20/200 เทียบกับซื้อแล้วถือ SPY━ EMA20/EMA200 ━ Buy & Hold SPY
แกนนอน: วันที่ซื้อขาย 2006-09-26 ถึง 2026-09-25
ทั้งสองเส้นเริ่มที่ผลตอบแทนสะสม 0% จากเงินเริ่มต้นเท่ากัน ก่อนหักค่าซื้อครั้งแรก แกนตั้งคำนวณจากมูลค่าพอร์ตในวันนั้น ÷ เงินเริ่มต้น − 1 จึงอ่านได้ว่าเงินเพิ่มหรือลดจากจุดเริ่มต้นกี่เปอร์เซ็นต์ เส้นที่อยู่สูงกว่าให้ผลตอบแทนสะสมสูงกว่า ณ วันนั้น
เมื่อจบช่วงทดสอบ EMA ได้ 367.41% เทียบกับซื้อแล้วถือที่ 737.46% ตัวเลขเป็นผลหลังต้นทุนตามแบบจำลองเดียวกัน ช่วงที่ EMA ถือเงินสด เส้นจะราบเพราะสมมติว่าดอกเบี้ยเงินสดเป็นศูนย์ จึงอาจช่วยหลบการลงบางช่วงและพลาดการขึ้นบางช่วงได้ ต้องอ่านกราฟ Drawdown ประกอบเพื่อดูความเสี่ยงระหว่างทาง
Benchmark คือการถือ SPY ตั้งแต่วันแรกถึงวันสุดท้าย ราคาจาก Webull ปรับย้อนหลังแล้ว จึงสะท้อนเงินปันผลในราคา เส้นนี้เป็นผลตอบแทนสะสมตลอดช่วง ไม่ใช่ CAGR ต่อปี
เงินเริ่มต้นเท่ากัน แต่เส้นทางมูลค่าพอร์ตต่างกัน━ EMA20/EMA200 ━ Buy & Hold SPY
แกนนอน: วันที่ซื้อขาย 2006-09-26 ถึง 2026-09-25
Drawdown รายวันวัดระยะห่างจากจุดสูงสุดของแต่ละพอร์ต━ EMA20/EMA200 ━ Buy & Hold SPY
แกนนอน: วันที่ซื้อขาย 2006-09-26 ถึง 2026-09-25
Maximum Drawdown วัดจากมูลค่าพอร์ตสิ้นวัน จึงไม่เห็นจุดต่ำระหว่างวันทั้งหมด
ช่วงที่ขาดทุนลึกที่สุดใช้เวลาลงและฟื้นนานเท่าไรMaximum Drawdown = -26.67% บอกความลึกของการลดลงจากยอดเดิม ส่วนระยะเวลาทั้งสามบอกว่าเงินอยู่ต่ำกว่ายอดเดิมนานเพียงใด กราฟนี้ขยายเฉพาะรอบที่ขาดทุนลึกที่สุด โดยใช้ยอดเดิมของรอบนี้เป็น 0%
ยอดเดิมวันที่ 2020-02-19 → จุดต่ำสุดวันที่ 2020-03-12 → กลับถึงยอดเดิมวันที่ 2021-02-05: 16 + 228 = 244 วันซื้อขาย ช่วงฟื้นไม่ได้แปลว่าพอร์ตขึ้นทุกวัน เพียงวัดเวลาจากจุดต่ำสุดจนกลับถึงระดับเดิมเป็นครั้งแรก
- Drawdown period: จากยอดเดิมถึงจุดต่ำสุด
- Recovery period: จากจุดต่ำสุดถึงวันที่กลับถึงหรือสูงกว่ายอดเดิมเป็นครั้งแรก
- Underwater period: จากยอดเดิมจนกลับถึงยอดเดิม รวมทั้งช่วงลงและช่วงฟื้น
บทนี้นับระยะเป็นจำนวนช่วงวันซื้อขายระหว่างจุดสองจุด ไม่ได้นับวันหยุด และไม่บวกหนึ่งเพื่อรวมวันต้นทาง ชื่อระยะเวลาอาจต่างกันในซอฟต์แวร์อื่น จึงต้องอ่านนิยามก่อนเปรียบเทียบ รอบที่ลึกที่สุดไม่จำเป็นต้องเป็นรอบที่อยู่ใต้น้ำนานที่สุด
สถิติรายเทรดหลังหักต้นทุน
จำนวนเทรดนับการเปิดจนปิดสถานะครบหนึ่งรอบ ส่วนจำนวนรายการซื้อขายนับการซื้อและขายแยกกัน
กำไร–ขาดทุนส่วนใหญ่กระจุกอยู่ที่ใด และไม้ใหญ่ดึงค่าเฉลี่ยอย่างไรแท่งแสดงจำนวนเทรดในช่วงกำไร–ขาดทุนที่กว้างเท่ากัน ช่วงละ 20,000 USD ส่วนจุดด้านล่างแสดงกำไร–ขาดทุนจริงของแต่ละเทรดรวม 17 ไม้ การเลื่อนจุดขึ้นลงมีไว้แยกจุดที่อยู่ใกล้กัน ไม่ได้แสดงเวลา
ในชุดนี้ 12 จาก 17 ไม้อยู่ตั้งแต่ −20,000 จนถึงน้อยกว่า 20,000 USD ไม้กำไรที่มากที่สุด 2 ไม้คิดเป็น 46.76% ของกำไรสุทธิรวมเฉพาะฝั่งชนะ จึงควรตรวจว่าค่าเฉลี่ยถูกดึงโดยไม้ใหญ่เพียงไม่กี่ไม้หรือไม่
ด้านซ้ายของศูนย์คือเทรดที่ขาดทุน ด้านขวาคือเทรดที่ได้กำไร เส้น −Average Loss ใช้ค่าติดลบเพื่อวางตำแหน่งขาดทุนบนแกนนี้ ส่วนค่า Average Loss ในตารางรายงานเป็นขนาดบวก กราฟใช้ผลสุทธิหลังต้นทุน และนำเทรดที่บังคับปิดท้ายการทดสอบมารวมด้วย
ช่วงแต่ละแท่งรวมขอบซ้าย ไม่รวมขอบขวา ยกเว้นแท่งสุดท้ายที่รวมทั้งสองขอบ รูปทรงเปลี่ยนได้ตามความกว้างช่วง จึงควรอ่านจุดรายเทรดประกอบ และไม่ใช้เพียง 17 ไม้นี้ยืนยันรูปแบบการแจกแจงในอนาคต จำนวนเงินแต่ละไม้ขึ้นกับขนาดพอร์ตขณะเข้าเทรดด้วย
สมมติฐานและวิธีคำนวณที่ทำซ้ำได้
- Daily SPY OHLC from Webull OpenAPI (POST /market-data/stocks/bars/list, US_ETF, RTH); the fetched file and its hash accompany the lesson.
- Evaluate 2006-09-26 through 2026-09-25. The preceding 400 daily closes initialize EMA and are excluded from performance.
- Fractional SPY shares are modeled in USD; these are simulated fills, not realized trading profits.
- EMA20 and EMA200 use daily closes, seeded at the first warmup close. Target 100% long when fast EMA exceeds slow EMA, otherwise cash. Execute changes at the next trading day open.
- At the first evaluation open, act on the last warmup signal; this first entry need not be a new crossover inside the evaluation window.
- Fractional units, no borrowing, no shorting, no deposits or withdrawals. Entry quantity includes buy fees in the cash budget.
- Assumed fee 0.1% per side on notional. Spread, slippage, impact, taxes and cash interest are zero. Webull daily prices are forward-adjusted, so dividends are reflected in the price series; no currency conversion is applied.
- Force any remaining position closed at the final close and mark forced_end, including its sell fee. This is a boundary convention, not an EMA exit signal.
- Benchmark holds SPY from first open to final close with equal initial capital and equal fee rate.
- CAGR uses elapsed calendar days / 365.25. Risk metrics use all daily close-to-close portfolio returns (including cash days), sample SD and sqrt(252). First return is initial open capital to first close.
- Sharpe risk-free and Sortino MAR default to zero as assumptions, not historical Treasury rates. Downside squared deviations divide by all observations.
- Drawdown uses daily closing equity and cannot reveal the complete intraday path. Recovery durations count trading days.
สร้างด้วย lesson_14.py จากการทดสอบเดียวกับ trades.csv, equity-daily.csv และ ema-results.json โดยไม่ใช้เครือข่าย