ข้ามไปยังเนื้อหา
กลยุทธ์ทั้งหมด

กลยุทธ์

BTC การต่อเนื่องของโมเมนตัมข้ามช่วงตลาด — Long-Short, ตราสารเดียว OHLCV: ทิศทางการเคลื่อนไหวช่วงตลาด ASIA ทำนายการเคลื่อนไหวช่วงตลาด US; เทรดช่วงตลาด US ไปในทิศทางนั้น ONLY เมื่อการเคลื่อนไหวของเอเชียมีขนาดใหญ่ ถือสถานะว่างข้ามคืน (BINANCE BTCUSDT USD-M, แท่ง 1H, ภายในวัน, พารามิเตอร์ 2 ตัว)

ผลลัพธ์: ยกเลิก

BtcAsiaToUsSessionCarryoverLS

วัดผลได้ดี: 594 เทรดตลอดประวัติ 2020-2026 1H ที่ครบถ้วน สมดุลระหว่างสถานะซื้อ/ขาย (293/301) ดำเนินการคำสั่งได้เรียบร้อย (594 สัญญาณ, ส่งคำสั่ง 594 ครั้ง, ไม่มีคำสั่งตกหล่น)

สมมติฐาน

กลยุทธ์ INTRADAY แบบ LONG-SHORT, SINGLE-INSTRUMENT, pure-OHLCV บน BTCUSDT.BINANCE USD-M perpetual ซึ่งอยู่ในตระกูลที่แตกต่างอย่างแท้จริงจากทุกอย่างที่ค้างอยู่หรือตายไปแล้วที่นี่ — มัน NOT เป็น trend/breakout (dual-TF momentum, SuperTrend, Donchian, ORB), NOT เป็น mean-reversion/fade (ซึ่งตายไปแล้วทั้งคู่), และ NOT เป็นสัญญาณ supplementary-feed (ซึ่งเป็น net losers ทั้งหมด) มันใช้ประโยชน์จาก SESSION LEAD-LAG ระหว่างวัน: ทิศทางที่กำหนดในช่วง session ASIA ที่มีการเข้าร่วมต่ำ (00:00-08:00 UTC) มีแนวโน้มที่จะ PERSIST……แสดงเพิ่มเติมแสดงน้อยลง

กลยุทธ์ INTRADAY แบบ LONG-SHORT, SINGLE-INSTRUMENT, pure-OHLCV บน BTCUSDT.BINANCE USD-M perpetual ซึ่งอยู่ในตระกูลที่แตกต่างอย่างแท้จริงจากทุกอย่างที่ค้างอยู่หรือตายไปแล้วที่นี่ — มัน NOT เป็น trend/breakout (dual-TF momentum, SuperTrend, Donchian, ORB), NOT เป็น mean-reversion/fade (ซึ่งตายไปแล้วทั้งคู่), และ NOT เป็นสัญญาณ supplementary-feed (ซึ่งเป็น net losers ทั้งหมด) มันใช้ประโยชน์จาก SESSION LEAD-LAG ระหว่างวัน: ทิศทางที่กำหนดในช่วง session ASIA ที่มีการเข้าร่วมต่ำ (00:00-08:00 UTC) มีแนวโน้มที่จะ PERSIST ต่อไปยัง session US ที่มีสภาพคล่องสูงกว่า (13:00-21:00 UTC) เนื่องจาก flow ของ US/สถาบันดำเนินต่อการเคลื่อนไหวแทนที่จะกลับตัว ในแต่ละวัน UTC จะวัดเครื่องหมายและขนาดของผลตอบแทนช่วง Asia-session; เมื่อการเคลื่อนไหวของ Asia มีขนาด LARGE (สัญญาณทิศทางจริง ไม่ใช่ noise) กลยุทธ์จะเข้าเทรดช่วง US session ในทิศทาง SAME และถือไว้เฉพาะช่วง session นั้นเท่านั้น โดยจะ FLAT ในชั่วข้ามคืน (ไม่มี funding exposure, ไม่มี overnight gap, ไม่มีความเสี่ยง trend หลายวัน) สิ่งนี้แตกต่างจาก BTC opening-range breakout ที่ค้างอยู่ (ซึ่งเทรด range BREAKOUT ของชั่วโมงแรก) — ที่นี่ไม่มี breakout; แต่เป็น CARRYOVER ตามทิศทางของการเคลื่อนไหวของ session ที่ก่อตัวแล้วไปสู่ session ถัดไปที่แยกจากกัน มันคงไว้ซึ่ง invariants ที่เอาตัวรอดได้ (single-instrument, pure OHLCV พร้อมประวัติ 2020-2026 1H เต็ม, long-short, ไม่มี supplementary feed ตามบทเรียน net-loser, ไม่มี second leg ตาม L69) และถูกสร้างมาเพื่อผ่าน statistical gates: cadence เกือบรายวันให้จำนวนเทรด LARGE (>100/ปี) ซึ่งผ่าน measurability tripwire และทำให้การประมาณ deflated-Sharpe แน่นขึ้น และมีเพียง 2 FREE parameters (Asia-move entry threshold, ATR stop multiple) เพื่อลด best-of-225-trial deflation penalty นอกจากนี้ยังเติมเต็ม bucket ระยะสั้นที่มีอยู่น้อย (8.6% เทียบกับ 10%)

Iteration 2 แก้ความล้มเหลวของ Layer-2 ตามที่เกิดขึ้นตรงๆ: ทั้งหกสถานการณ์สังเคราะห์แสดงข้อผิดพลาด 'TypeError: _day_of() takes 1 positional argument but 2 were given' harness ของ Layer-2 ผูก callable attribute ทุกตัวบน proxy ใหม่เป็นเมธอด BOUND ทำให้ helper @staticmethod _day_of/_hour_of ได้รับ instance เป็นอาร์กิวเมนต์แรกและแท่งราคาเป็นอาร์กิวเมนต์ที่สอง วิธีแก้: ทั้งคู่เป็นเมธอด instance ปกติแล้ว (self, bar) — จุดเรียกใช้เดิมใช้ self._day_of(bar)/self._hour_of(bar) อยู่แล้ว จึงไม่มีส่วนอื่นเปลี่ยน……แสดงเพิ่มเติมแสดงน้อยลง

Iteration 2 แก้ความล้มเหลวของ Layer-2 ตามที่เกิดขึ้นตรงๆ: ทั้งหกสถานการณ์สังเคราะห์แสดงข้อผิดพลาด 'TypeError: _day_of() takes 1 positional argument but 2 were given' harness ของ Layer-2 ผูก callable attribute ทุกตัวบน proxy ใหม่เป็นเมธอด BOUND ทำให้ helper @staticmethod _day_of/_hour_of ได้รับ instance เป็นอาร์กิวเมนต์แรกและแท่งราคาเป็นอาร์กิวเมนต์ที่สอง วิธีแก้: ทั้งคู่เป็นเมธอด instance ปกติแล้ว (self, bar) — จุดเรียกใช้เดิมใช้ self._day_of(bar)/self._hour_of(bar) อยู่แล้ว จึงไม่มีส่วนอื่นเปลี่ยน และพฤติกรรมภายใต้ engine เหมือนเดิม ประการที่สอง มีการแก้เชิงป้องกันในเส้นทาง helper เดียวกัน: timestamp ที่ harness รายงาน (1735690980000) อยู่ในหน่วย MILLISECONDS ขณะที่ engine ส่งค่าเป็นนาโนวินาที; โค้ดเดิมหารด้วย 1e9 โดยไม่มีเงื่อนไข ซึ่งภายใต้ harness จะทำให้แท่งสังเคราะห์ทั้งหมดกลายเป็นชั่วโมง/วันเดียวกันและตรึงตรรกะช่วงตลาดไว้ (เป็นความล้มเหลวแฝงครั้งที่สองของ Layer-2 หลังแก้ TypeError) _epoch_secs() ใหม่ปรับหน่วยตามขนาด (ns/us/ms/s) และไม่เปลี่ยนค่าเมื่อรับแท่งจริงที่เป็นนาโนวินาที จึงไม่มีผลต่อ Layer-3 และ backtest จริง รูปแบบสัญญาณ กฎเข้า/ออกสถานะ, ATR, การกำหนดขนาดสถานะ, imports และโครงสร้างคลาสยังเหมือนกับโค้ดที่ผ่าน Layer 1 ทุกประการ

สมมติฐานที่มีค่าคาดหวังติดลบ (negative-expectancy) บนตัวอย่าง full-history ที่วัดผลมาอย่างดี จำนวนกว่า 594 เทรดตลอด 2020-2026 กลยุทธ์ session-carryover จาก Asia->US ขาดทุน: profit_factor 0.937 (<1), total_return -9.81%, expectancy -$17.34/เทรด, Sharpe -0.15 พร้อม CI [-0.760, 0.458] ที่คร่อมศูนย์, information_ratio -0.76 ปีที่เป็นบวกเพียงปีเดียวคือ 2020 (+15.3%); ทุกปีหลังจากนั้นติดลบหรือทรงตัว (2021 -8.1, 2022 -5.8, 2025 -10.8) โดย rolling Sharpe มีแนวโน้มไปสู่ -8.3 ภายใน 2026 — สมมติฐานที่ว่า 'การเคลื่อนไหวครั้งใหญ่ของ Asia ทำนายการเคลื่อนไหวของ US' ไม่ได้รับการยืนยันแต่อย่างใด นอกจากนี้ยังอยู่ในระดับ marginal เมื่อเทียบกับค่าธรรมเนียม: avg_trade_return_pct 0.110% ต่ำกว่า floor ของ 0.15% Binance USD-M (L22) ด้วย 2 พารามิเตอร์อิสระและ directional edge สุทธิที่เป็นลบ การปรับจูนไม่สามารถพลิกเครื่องหมายของ edge ที่ไม่มีอยู่จริงได้ นี่คือลักษณะ net-loser แบบ fee_edge/no_edge — ไม่คุ้มค่ากับการ optimization 2 ชั่วโมง

การนำไปใช้

BTCUSDT.BINANCE USD-M เพอร์เพชวล, แท่งราคา 1H, กลยุทธ์นำ-ตามระหว่างช่วงซื้อขายระหว่างวันแบบลอง-ชอร์ต ผลตอบแทนของช่วงเอเชียในแต่ละวัน UTC (เปิดถึงปิด 00:00-08:00 UTC) จะสะสมเพิ่มขึ้นทีละน้อยและปรับมาตรฐานด้วยส่วนเบี่ยงเบนมาตรฐานของผลตอบแทนเอเชีย 30 ครั้งล่าสุด (ใช้การกระจายตัวที่อิง ATR เป็นค่าทดแทนขณะที่ข้อมูลย้อนหลังยังสะสมไม่ครบ) ทำให้ได้ค่า z-score ที่ต่อเนื่อง ไม่ขึ้นกับสเกล และส่งคืนทุกแท่งราคา ในชั่วโมงเปิดของเซสชัน US (13:00 UTC) กลยุทธ์จะเข้าโพซิชันตามทิศทาง SAME ของการเคลื่อนไหวในเอเชียเมื่อ |z| >= entry_z โดยเข้าได้ไม่เกินหนึ่งครั้งต่อวันตามปฏิทิน ออกจากโพซิชันในชั่วโมงปิดของเซสชัน US (20:00 UTC) เพื่อให้ไม่มีสถานะค้างคืน (FLAT ไม่มีต้นทุน funding และไม่มีความเสี่ยงจากช่องว่างราคา) หรือออกก่อนหน้านั้นเมื่อถึงจุดหยุดขาดทุนที่อิง ATR (stop_atr_mult x ATR โดยมีค่าต่ำสุดที่ min_stop_pct) การกำหนดขนาดสถานะเสี่ยง risk_frac ของส่วนทุนตลอดระยะห่างถึงจุดหยุดขาดทุน โดยจำกัดมูลค่ารวมไว้ที่ max_notional_frac x ส่วนทุน สถานะภายในทั้งหมด (ATR, ผลตอบแทนของเซสชัน และคิวเก็บค่าการกระจายตัว) ใช้เวลา O(1) ต่อแท่งราคา; การเปลี่ยนวันยึดตามเวลาประจำแท่ง ไม่ใช่ตัวนับจำนวนแท่ง

ผลการตรวจสอบ

CLEAN RESTART 2026-09-04 — ประวัติผลตัดสินและบันทึกการเรียนรู้ของรอบนี้ถูกลบออก และเริ่มใหม่จากขั้นตอนตรวจสอบ การยุติก่อนหน้านี้เกิดจากไปป์ไลน์ ไม่ใช่ตลาด: harness ของ Layer-2 ผูก helper ของ @staticmethod ผิด (แก้แล้ว), QA ออกผลตัดสินประสิทธิภาพขั้นสุดท้ายจากการทดสอบ smoke test ที่ยังไม่ได้ปรับแต่ง (นำออกแล้ว — ตอนนี้ QA ใช้ตัดสินความถูกต้องเท่านั้น) และการหมดเวลาของ sandbox เกิดจากช่อง backtest ไม่พอใช้งาน (แก้แล้ว) สมมติฐานและโค้ดกลยุทธ์ไม่มีการเปลี่ยนแปลง ตรวจสอบโค้ดตามเนื้อหาของมัน ส่วนประสิทธิภาพจะตัดสินภายหลังด้วย backtest ฉบับเต็มและ optimizer

เพิ่ม _param_bounds = {entry_z: [...], stop_atr_mult: [...]} ให้ตรงกับขอบเขตที่โค้ดบังคับใช้; ไม่นำค่าคงที่ของชั่วโมงช่วงตลาด/ATR/ความเสี่ยงมาใส่ในนั้น

Config ประกาศ NO _param_bounds ทั้งที่สมมติฐานอ้างว่า 'มีเพียง 2 FREE parameters' เพื่อลด best-of-225-trial deflation penalty หากไม่มีสิ่งนี้ optimizer จะไม่มี surface ที่ชัดเจนซึ่งผูกมันไว้กับ {entry_z, stop_atr_mult} ซึ่งบั่นทอนวินัยแบบ 2-parameter ไม่ใช่ข้อบกพร่องด้าน correctness

กำหนด us_exit_hour=21 สำหรับช่วงเวลาทั้งหมด หรือบันทึกว่า 20:00 เป็นสิ่งที่ตั้งใจไว้

สมมติฐานระบุช่วง US ที่ 13:00-21:00 UTC แต่ us_exit_hour คือ 20 ทำให้เข้าสู่สถานะว่างก่อนเวลาหนึ่งชั่วโมง เป็นจุดเล็กน้อย ไม่เปลี่ยนกลไกหรือเงื่อนไขที่ต้องไม่มีสถานะข้ามคืน

ทบทวนผลทดสอบย้อนหลัง

Sharpe
-0.15
ผลตอบแทนรวม
-9.81%
การถอยของทุนสูงสุด
23.40%
จำนวนเทรดทั้งหมด
594
อัตราชนะ
44.8%
ตัวคูณกำไร
0.94

วัดผลได้ดี: 594 เทรดตลอดประวัติ 2020-2026 1H ที่ครบถ้วน สมดุลระหว่างสถานะซื้อ/ขาย (293/301) ดำเนินการคำสั่งได้เรียบร้อย (594 สัญญาณ, ส่งคำสั่ง 594 ครั้ง, ไม่มีคำสั่งตกหล่น)

ตระกูลกลยุทธ์นำ-ตามระหว่างช่วงตลาดภายในวันที่แตกต่างอย่างแท้จริง; ถือสถานะว่างข้ามคืน, สหสัมพันธ์กับ benchmark ต่ำ (0.025), ไม่พึ่งพาฟีดเสริม

ขาดทุนสุทธิ: profit_factor 0.937 (<1), total_return -9.81%, ค่าคาดหวัง -$17.34/เทรด, Sharpe -0.15 (CI คร่อมศูนย์), information_ratio -0.76

avg_trade_return_pct 0.110% ต่ำกว่าระดับขั้นต่ำของค่าธรรมเนียม 0.15% Binance USD-M — มีส่วนต่างเหนือค่าธรรมเนียมน้อย แม้ไม่นับค่าคาดหวังที่ติดลบ

เฉพาะ 2020 (+15.3%) เท่านั้นที่เป็นบวกอย่างมีนัยสำคัญ; ทุกปีหลังจากนั้นติดลบหรือทรงตัว (2025 -10.8%), rolling Sharpe มีแนวโน้มไปสู่ -8.3 ภายใน 2026 — สมมติฐาน session-carryover ไม่มี edge ที่ยั่งยืน

return_kurtosis 78.6 — แท่งราคาเคลื่อนไหวเป็นช่วงๆ (เช่น วันที่ -6.07% บน 2023-08-29) แทนที่จะเป็น edge ที่ราบรื่น

ประวัติรอบทดสอบ

การตรวจสอบไม่ผ่าน (Layer 2 — สถานการณ์สังเคราะห์): พารามิเตอร์ที่ใช้: ['entry_z', 'min_bars', 'risk_frac', 'atr_period', 'min_notional', 'min_stop_pct', 'min_vol_days', 'us_exit_hour', 'asia_end_hour', 'stop_atr_mult', 'us_entry_hour', 'asia_start_hour', 'max_notional_frac', 'vol_lookback_days'] ตรวจสอบว่า __init__ กำหนด attribute ทั้งหมดจาก self.parameters.get() หรือไม่ - steady_uptrend: TypeError: BtcAsiaToUsSessionCarryoverLS._day_of() takes 1 positional argument but 2 were given (bar timestamp: 1735690980000)……แสดงเพิ่มเติมแสดงน้อยลง

การตรวจสอบไม่ผ่าน (Layer 2 — สถานการณ์สังเคราะห์): พารามิเตอร์ที่ใช้: ['entry_z', 'min_bars', 'risk_frac', 'atr_period', 'min_notional', 'min_stop_pct', 'min_vol_days', 'us_exit_hour', 'asia_end_hour', 'stop_atr_mult', 'us_entry_hour', 'asia_start_hour', 'max_notional_frac', 'vol_lookback_days'] ตรวจสอบว่า __init__ กำหนด attribute ทั้งหมดจาก self.parameters.get() หรือไม่ - steady_uptrend: TypeError: BtcAsiaToUsSessionCarryoverLS._day_of() takes 1 positional argument but 2 were given (bar timestamp: 1735690980000) - steady_downtrend: TypeError: BtcAsiaToUsSessionCarryoverLS._day_of() takes 1 positional argument but 2 were given (bar timestamp: 1735690980000) - flat_ranging: TypeError: BtcAsiaToUsSessionCarryoverLS._day_of() takes 1 positional argument but 2 were given (bar timestamp: 1735690980000) - volatility_spike: TypeError: BtcAsiaToUsSessionCarryoverLS._day_of() takes 1 positional argument but 2 were given (bar timestamp: 1735690980000) - zero_volume: TypeError: BtcAsiaToUsSessionCarryoverLS._day_of() takes 1 positional argument but 2 were given (bar timestamp: 1735690980000) - price_gap: TypeError: BtcAsiaToUsSessionCarryoverLS._day_of() takes 1 positional argument but 2 were given (bar timestamp: 1735690980000)

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