การกำหนดเป้าหมายความผันผวนและการเทรดด้วยการพยากรณ์ GARCH
สามส่วนแรกของซีรีส์นี้สอนคุณให้พยากรณ์ความผันผวน เราสร้าง GARCH(1,1) แบบตัวแปรเดียวใน ส่วนที่ 1 เพิ่มเลเวอเรจและหางหนาด้วย GJR และนวัตกรรมแบบ Student-t ใน ส่วนที่ 2 และจำลองเมทริกซ์ความแปรปรวนร่วมทั้งชุดตลอดช่วงเวลาด้วย DCC-GARCH ใน ส่วนที่ 3 และในตอนท้ายของแต่ละส่วน เราพิมพ์ตัวเลขออกมาหนึ่งค่า นั่นคือความผันผวนที่คาดหวังของวันพรุ่งนี้ และหากพูดกันตามตรง เราก็หยุดอยู่แค่นั้น ราวกับว่าการผลิตค่าพยากรณ์คือจุดมุ่งหมาย
แต่มันไม่ใช่ การพยากรณ์ความผันผวนไม่ใช่กำไรขาดทุน (P&L) ไม่เคยมีใครได้รับเงินจากค่า QLIKE ที่ต่ำ การพยากรณ์จะมีค่าก็ต่อเมื่อถึงจุดที่มันเปลี่ยนแปลงการตัดสินใจที่คุณจะทำเป็นอย่างอื่นไปเลย นั่นคือ ควรซื้อเท่าไร ควรตัดขาดทุนเมื่อไร ควรจัดสรรทุนมากน้อยเพียงใด หากการพยากรณ์ของคุณไม่ขยับตำแหน่งการเทรด ความแม่นยำทางสถิติของมันก็เป็นเพียงงานอดิเรกส่วนตัว
ส่วนสุดท้ายนี้เกี่ยวกับการปิดวงจรดังกล่าว เรานำการพยากรณ์จากส่วนที่ 1-3 มาใช้งานในการตัดสินใจที่สะอาดที่สุดเท่าที่จะเป็นไปได้ นั่นคือ การกำหนดเป้าหมายความผันผวน (volatility targeting) ซึ่งเป็นการปรับขนาดตำแหน่งการเทรดเพื่อให้ความผันผวนที่เกิดขึ้นจริงของพอร์ตแตะเป้าหมายคงที่ จากนั้นเราจะทำสิ่งที่บล็อกนี้ให้ความสำคัญมากกว่าโมเดลเดี่ยว ๆ ใด ๆ นั่นคือ เราประเมินอย่างซื่อตรง เราเทียบ GARCH กับเกณฑ์มาตรฐานที่เรียบง่ายแต่แข็งแกร่ง (realized vol แบบเลื่อนหน้าต่าง, EWMA) เราใช้ฟังก์ชันการสูญเสียที่ทนทานต่อข้อเท็จจริงที่ว่าเราไม่มีทางสังเกตความผันผวนที่แท้จริงได้ เราทำการทดสอบย้อนหลังแบบ walk-forward พร้อมต้นทุนและไม่มองไปข้างหน้า และเราจะกล่าวอย่างตรงไปตรงมาว่าการกำหนดเป้าหมายความผันผวนให้อะไรและไม่ให้อะไรกับคุณ สปอยล์ล่วงหน้า มันช่วยปรับปรุงผลตอบแทนที่ปรับด้วยความเสี่ยงและควบคุมการถดถอย (drawdown) ได้อย่างน่าเชื่อถือกว่าการสร้างอัลฟ่าขึ้นมามาก
ทำไมการกำหนดเป้าหมายความผันผวนจึงเป็นการทดสอบที่ถูกต้อง
มีวิธีที่ซับซ้อนกว่าในการใช้การพยากรณ์ความผันผวน เช่น การตั้งราคาออปชัน ขีดจำกัด VaR การป้องกันความเสี่ยงแบบพลวัต แต่การกำหนดเป้าหมายความผันผวนคือวิธีที่แยกคุณค่าของการพยากรณ์ออกมาโดยมีการปนเปื้อนจากการเดิมพันอื่น ๆ น้อยที่สุด แนวคิดคือสมการเดียว
ถือสินทรัพย์เสี่ยงที่มีทิศทางตามสัญญาณ (ในตอนนี้ให้แค่ "long") แทนที่จะถือตำแหน่งคงที่ ให้ปรับขนาดการเปิดรับความเสี่ยงในทิศทางผกผันกับความผันผวนที่พยากรณ์ได้
โดยที่ คือการพยากรณ์ความผันผวนของช่วงเวลาถัดไป (สร้างขึ้นโดยใช้เฉพาะข้อมูลจนถึงเวลา เท่านั้น) และ คือความผันผวนแบบทั้งปีที่คุณต้องการให้กลยุทธ์ทำงานอยู่ที่ระดับนั้น เช่น 15% หรือ 20% เมื่อโมเดลพยากรณ์ว่าตลาดสงบ คุณจะเพิ่มเลเวอเรจเข้าหา (หรือเกิน) 1.0 เมื่อพยากรณ์ว่าจะมีพายุ คุณก็หดตัวลง ความผันผวนที่เกิดขึ้นจริงของตำแหน่งที่ปรับขนาดแล้ว ในลำดับแรกคือ
เมื่อใดก็ตามที่ ดังนั้นคุณภาพทั้งหมดของแบบฝึกหัดนี้จึงขึ้นอยู่กับสิ่งเดียว นั่นคือ การพยากรณ์ ของคุณใกล้เคียงกับความผันผวนที่เกิดขึ้นจริงในช่วงถัดไป มากเพียงใด การพยากรณ์ที่ดีกว่าจะให้โปรไฟล์ความผันผวนที่เกิดขึ้นจริงที่ราบเรียบกว่า และอย่างที่เราจะได้เห็น มันให้ Sharpe ratio ที่ดีกว่า นี่คือเหตุผลที่มันเป็นการทดสอบที่ถูกต้อง การพยากรณ์ไม่ใช่แค่เครื่องประดับ แต่มันคือตัวส่วน
ทำไมสิ่งนี้จึงเพิ่ม Sharpe และควบคุม drawdown
ข้อเท็จจริงเชิงประจักษ์สองข้อทำหน้าที่นี้
ความผันผวนพยากรณ์ได้ง่ายกว่าผลตอบแทนมาก ทิศทางของผลตอบแทน BTC ในวันพรุ่งนี้เกือบจะเหมือนการโยนเหรียญที่ความถี่รายวัน แต่ขนาดของมันไม่ใช่ ความผันผวนเกาะกลุ่มกัน การเคลื่อนไหวใหญ่ตามมาด้วยการเคลื่อนไหวใหญ่ ซึ่งเป็นเหตุผลทั้งหมดที่ GARCH มีอยู่ (ส่วนที่ 1 ได้อนุมานโครงสร้าง AR(1)-ในความแปรปรวนที่เข้ารหัสสิ่งนี้) ค่า ที่ 0.4-0.6 สำหรับความแปรปรวนล่วงหน้าหนึ่งวันเป็นเรื่องปกติ ตัวเลขเดียวกันสำหรับผลตอบแทนจะเป็นสัญญาณระดับ Renaissance การกำหนดเป้าหมายความผันผวนใช้ประโยชน์จากปริมาณที่พยากรณ์ได้ และยังคงเป็นกลางเกี่ยวกับปริมาณที่พยากรณ์ไม่ได้
Sharpe ratio ไม่คงที่ตลอดช่วงเวลา มันตกลงเมื่อความผันผวนพุ่งขึ้น ระบอบความผันผวนสูงในคริปโต เช่น การถอนเลเวอเรจแบบต่อเนื่อง ความล้มเหลวของ exchange วันที่ทุกอย่างกระโดด 30% มักจะมีผลตอบแทนต่อหน่วยความเสี่ยงที่แย่กว่า ไม่ใช่ดีกว่า โดยการตัดการเปิดรับความเสี่ยงเชิงกลไกในจังหวะที่ความผันผวนที่พยากรณ์ได้อยู่ในระดับสูง คุณจะให้น้ำหนักน้อยลงกับช่วงเวลาที่มีส่วนต่อ drawdown มากที่สุดและต่อผลตอบแทนแบบทบต้นน้อยที่สุด Moreira และ Muir (2017) แสดงให้เห็นสำหรับตราสารทุนว่าพอร์ตที่จัดการความผันผวน ซึ่งเป็นการปรับขนาดแบบ นี้เอง ช่วยเพิ่ม Sharpe ratio และสร้างอัลฟ่าเป็นบวกเมื่อเทียบกับปัจจัยที่ไม่ได้จัดการ กลไกนี้ไม่ใช่เวทมนตร์ แต่คือการปฏิเสธที่จะถือตำแหน่งดอลลาร์คงที่เข้าไปในช่วงเวลาที่คาดการณ์ได้ว่าจะปั่นป่วน
ประโยชน์ด้าน drawdown ยิ่งตรงไปตรงมากว่า drawdown สูงสุดถูกครอบงำโดยหางของการแจกแจงผลตอบแทนตำแหน่ง เนื่องจาก มีความผันผวนตรึงไว้ใกล้ หางซ้ายที่หนาซึ่งกลยุทธ์แบบมูลค่าคงที่ต้องเผชิญระหว่างการระเบิดของความผันผวนจึงถูกบีบอัด คุณมีตำแหน่งเล็กอยู่แล้วตั้งแต่ก่อนเข้า การกำหนดเป้าหมายความผันผวนไม่ได้ทำนายการล่มสลาย แต่มันเปิดรับความเสี่ยงน้อยเกินไปอย่างเป็นระบบเมื่อตลาดปั่นป่วน และความปั่นป่วนคือช่วงที่การล่มสลายเกิดขึ้น
ความสัมพันธ์กับ Kelly และการปรับขนาดแบบเศษส่วน
การกำหนดเป้าหมายความผันผวนเป็นญาติใกล้ชิดของเกณฑ์ Kelly สำหรับสินทรัพย์เดี่ยวที่มีผลตอบแทนส่วนเกินที่คาดหวัง และความแปรปรวน เศษส่วนที่เหมาะสมที่สุดในการเติบโต (full-Kelly) คือ
หากคุณสมมติว่า Sharpe ratio ค่อนข้างคงที่ ซึ่งเป็นสมมติฐานที่แข็งแรง แต่เป็นสมมติฐานที่ซ่อนอยู่ใน "ตลาดจ่ายราคาที่มั่นคงสำหรับความเสี่ยง" ดังนั้น และ ซึ่งก็คือการกำหนดเป้าหมายความผันผวนพอดี โดยที่ กล่าวอีกนัยหนึ่ง การกำหนดเป้าหมายความผันผวนคือการปรับขนาดแบบ Kelly ภายใต้สมมติฐานว่าผลตอบแทนที่คาดหวังปรับขนาดตามความผันผวน เราจะพิจารณา Kelly แบบเต็มและเศษส่วน และเหตุผลที่ไม่มีใครมีสติเทรด Kelly แบบเต็ม ใน เกณฑ์ Kelly และการปรับขนาดกลยุทธ์ บทเรียนเชิงปฏิบัติจากที่นั่นถ่ายทอดมาถึงที่นี่ ใช้เศษส่วนของขนาดตามทฤษฎี เพราะข้อผิดพลาดในการประมาณค่าในตัวส่วน (การพยากรณ์ความผันผวนของคุณ) และโดยเฉพาะอย่างยิ่งในตัวเศษ (ผลตอบแทนที่คาดหวัง) ทำให้การปรับขนาดแบบเต็มก้าวร้าวจนอันตราย
มีอีกสองความเชื่อมโยงที่ควรจดจำไว้ ประการแรก การกำหนดเป้าหมายความผันผวนปรับขนาดตามการกระจายตัวแบบสมมาตรของผลตอบแทน แต่ผลตอบแทนคริปโตไม่สมมาตร ต้นทุนของวันที่ลง 20% ไม่ใช่ภาพสะท้อนของวันที่ขึ้น 20% เมื่อมีเลเวอเรจและการบังคับขายเข้ามาเกี่ยวข้อง เราจัดการกับความไม่สมมาตรนี้โดยตรงใน ความไม่สมมาตรระหว่างขาดทุนกับกำไร และการพยากรณ์แบบ GJR/EGARCH (ส่วนที่ 2) ก็ได้ผสมส่วนหนึ่งของมันเข้าไปใน แล้ว โดยตอบสนองต่อช็อกเชิงลบมากกว่า ประการที่สอง การพยากรณ์ความผันผวนคือการประมาณค่าจุดเดียว มุมมองความเสี่ยงที่สมบูรณ์กว่าจะแนบช่วง (interval) เข้าไปกับมัน การพยากรณ์แบบ conformal สำหรับการเทรด แสดงวิธีเปลี่ยนผลลัพธ์ของโมเดลให้เป็นช่วงที่ไม่ขึ้นกับการแจกแจงซึ่งคุณสามารถปรับขนาดตามได้ ซึ่งเข้าคู่กันได้อย่างเป็นธรรมชาติกับธีมการประเมินอย่างซื่อตรงของบทความนี้
คู่แข่ง สิ่งที่ GARCH ต้องเอาชนะ
นี่คือวินัยที่แยกการประเมินจริงออกจากการสาธิต ก่อนที่คุณจะสวมมงกุฎให้ GARCH คุณต้องมอบคู่แข่งที่ราคาถูก ชัดเจน และเอาชนะได้ยากอย่างน่าประหลาดใจ หากโมเดล GJR-t อันวิจิตรของคุณเอาชนะ EWMA ห้าบรรทัดไม่ได้ คุณก็ได้เรียนรู้บางอย่างที่มีค่าและช่วยตัวเองให้พ้นจากความซับซ้อนในการนำไปใช้จริงมากมาย
เราเทียบเกณฑ์การพยากรณ์ความผันผวนช่วงถัดไปสี่ตัว
(ก) ความผันผวนที่เกิดขึ้นจริงย้อนหลัง (rolling standard deviation)
การพยากรณ์ที่ไร้เดียงสาที่สุด ความผันผวนของวันพรุ่งนี้เท่ากับส่วนเบี่ยงเบนมาตรฐานของตัวอย่างจากผลตอบแทนรายวัน วันล่าสุด
มันมีไฮเปอร์พารามิเตอร์เดียว (หน้าต่าง โดยทั่วไป 20-60 วัน) และไม่มีโมเดล ข้อบกพร่องของมันคือทุกการสังเกตในหน้าต่างได้รับน้ำหนักเท่ากัน แล้วก็ตกหน้าผาลงมาอย่างฉับพลันเมื่อมันออกไป นั่นคือปรากฏการณ์ "ghosting" หรือ "echo" ที่วันล่มสลายวันเดียวเป่าค่าพยากรณ์ให้พองขึ้นเป็นเวลา วันพอดี แล้วก็หายไปในชั่วข้ามคืน ไม่ว่าตลาดจะสงบลงจริงหรือไม่ก็ตาม
(ข) EWMA / RiskMetrics ()
ค่าเฉลี่ยเคลื่อนที่ถ่วงน้ำหนักแบบเอ็กซ์โพเนนเชียลแก้ปัญหา echo โดยให้น้ำหนักที่ลดลงแบบเรขาคณิตแก่ผลตอบแทนกำลังสองที่เก่ากว่า
นี่คือตัวประมาณค่า RiskMetrics (J.P. Morgan, 1996) ด้วยค่าตามหลักการ สำหรับข้อมูลรายวัน หน่วยความจำที่มีประสิทธิผลอยู่ที่ประมาณ วัน แต่การลดลงเป็นไปอย่างราบรื่น ไม่มีหน้าผา สังเกตว่า EWMA คืออะไรกันแน่ มันคือ integrated GARCH(1,1) ที่มี และ กล่าวคือ GARCH ที่ไม่มีการคืนสู่ค่าเฉลี่ยและไม่มีความแปรปรวนระยะยาว มันมีพารามิเตอร์อิสระ ศูนย์ ตัวหากคุณยอมรับ และมันเป็นเกณฑ์มาตรฐานที่แข็งแกร่งที่สุดตัวเดียวในบทความทั้งหมดนี้ งานวิจัยจำนวนมากที่บอกว่า "GARCH เอาชนะ X" เงียบ ๆ กลับล้มเหลวในการเอาชนะ EWMA นอกตัวอย่าง
import numpy as np
import pandas as pd
def ewma_vol(returns: pd.Series, lam: float = 0.94, sigma0: float | None = None) -> pd.Series:
"""RiskMetrics EWMA conditional volatility (returns in decimal, e.g. 0.03).
sigma2_t = lam * sigma2_{t-1} + (1 - lam) * r_t^2
Returns a series aligned to `returns` where value at t uses info up to t.
"""
r2 = np.square(returns.values)
var = np.empty_like(r2)
var[0] = sigma0**2 if sigma0 is not None else r2[0]
for t in range(1, len(r2)):
var[t] = lam * var[t - 1] + (1.0 - lam) * r2[t - 1] # note: r_{t-1}, no look-ahead
return pd.Series(np.sqrt(var), index=returns.index, name="ewma_vol")
รายละเอียดปลีกย่อยหนึ่งเดียวที่ทำให้คนสะดุด การพยากรณ์สำหรับช่วง (ใช้ได้ในการปรับขนาดตำแหน่งที่ถือข้าม ) ต้องสร้างจากผลตอบแทนที่สังเกตได้ก่อน ในการเรียกซ้ำข้างต้น var[t] ใช้ r2[t-1] ดังนั้นชุดข้อมูลจึงเป็นการพยากรณ์ล่วงหน้าหนึ่งขั้นที่แท้จริง การจัดดัชนีนี้ให้ถูกต้องคือความแตกต่างระหว่างการทดสอบย้อนหลังกับจินตนาการ มีรายละเอียดเพิ่มเติมในส่วน walk-forward
(ค) GARCH(1,1) และ GJR-t (ส่วนที่ 1-2)
ตัวเอกของเรา GARCH(1,1) มาตรฐาน
โดยมีความแปรปรวนระยะยาว และการพยากรณ์ล่วงหน้าหนึ่งขั้นที่หลุดออกมาตรง ๆ จากการเรียกซ้ำ (ส่วนที่ 1) ส่วนขยาย GJR-GARCH เพิ่มพจน์เลเวอเรจเพื่อให้ช็อกเชิงลบยกความแปรปรวนขึ้นมากกว่าช็อกเชิงบวก
และเมื่อจับคู่กับนวัตกรรม Student-t เพื่อจัดการกับหางหนาของคริปโต นี่คือ GJR-t ของส่วนที่ 2 เหตุผลที่ GARCH สามารถ เอาชนะ EWMA ได้คือการคืนสู่ค่าเฉลี่ย หลังจากช็อก GARCH จะดึงการพยากรณ์กลับไปหา ในอัตราที่ควบคุมโดย ในขณะที่ EWMA (ซึ่งเป็น integrated) ไม่เคยคืนกลับ เมื่อความผันผวนพุ่งขึ้นแล้วกลับสู่ปกติ ซึ่งเป็นกรณีที่พบบ่อย การพยากรณ์ของ GARCH จะสลายกลับได้เร็วกว่าและแม่นยำกว่า เมื่อความผันผวนคงอยู่อย่างแท้จริง ทั้งสองก็แทบแยกไม่ออก
(ง) HAR-RV บนความแปรปรวนที่เกิดขึ้นจริง (หากคุณมีข้อมูลระหว่างวัน)
หากคุณมีแท่งข้อมูลระหว่างวัน และในตลาดคริปโตที่เปิด 24/7 คุณแทบจะมีเสมอ คุณสามารถสร้างตัวแทน (proxy) ความผันผวนที่มีสัญญาณรบกวนน้อยกว่าผลตอบแทนกำลังสองรายวันมาก นั่นคือ ความแปรปรวนที่เกิดขึ้นจริง (realized variance) ผลรวมของผลตอบแทนกำลังสองระหว่างวันตลอดทั้งวัน
โมเดล Heterogeneous Autoregressive ของ Corsi (2009) พยากรณ์ความแปรปรวนที่เกิดขึ้นจริงของวันพรุ่งนี้จากค่าเฉลี่ยรายวัน รายสัปดาห์ และรายเดือนของ ในอดีต ซึ่งเป็นวิธีที่หยาบแต่มีประสิทธิภาพอย่างน่าทึ่งในการจับความคงอยู่ของหน่วยความจำระยะยาวด้วยตัวถดถอยเพียงสามตัว
โดยที่ และ คือค่าเฉลี่ยย้อนหลัง 5 วันและ 22 วันของ รายวัน มันเป็นการถดถอย OLS ธรรมดา มันใช้ประโยชน์จากตัวแทนระหว่างวันที่มีคุณภาพสูงกว่า และมันมักเป็นตัวพยากรณ์ความผันผวนรายวันที่ดีที่สุดในสี่ตัว โดยมักเอาชนะ GARCH ได้พอดีเพราะ เป็นเป้าหมายที่สะอาดกว่า
import numpy as np
import pandas as pd
def realized_variance(intraday_returns: pd.Series, day_index) -> pd.Series:
"""Daily realized variance = sum of squared intraday (log) returns per day.
`intraday_returns` indexed by timestamp; `day_index` maps to calendar day.
"""
return intraday_returns.pow(2).groupby(day_index).sum()
def har_features(rv: pd.Series) -> pd.DataFrame:
"""Build HAR regressors from a daily realized-variance series."""
df = pd.DataFrame({"rv": rv})
df["rv_d"] = df["rv"].shift(1) # yesterday
df["rv_w"] = df["rv"].shift(1).rolling(5).mean() # trailing week
df["rv_m"] = df["rv"].shift(1).rolling(22).mean() # trailing month
df["target"] = df["rv"] # predict today's RV
return df.dropna()
def fit_har(rv: pd.Series):
"""Fit HAR-RV by OLS. Returns (coef_dict, predict_fn)."""
df = har_features(rv)
X = np.column_stack([np.ones(len(df)), df["rv_d"], df["rv_w"], df["rv_m"]])
y = df["target"].values
beta, *_ = np.linalg.lstsq(X, y, rcond=None)
names = ["const", "rv_d", "rv_w", "rv_m"]
def predict(rv_d, rv_w, rv_m):
return float(beta @ np.array([1.0, rv_d, rv_w, rv_m]))
return dict(zip(names, beta)), predict
ข้อสังเกตเกี่ยวกับ log-HAR เนื่องจาก เบ้ขวาและเป็นบวกเสมอ ผู้ปฏิบัติจำนวนมากถดถอย บนฟีเจอร์ HAR แบบ log ซึ่งช่วยปรับปรุงการฟิตและรับประกันการพยากรณ์ที่เป็นบวก เมื่อคุณยกกำลังกลับ คุณควรเพิ่มการแก้ไข Jensen ครึ่งความแปรปรวน มิฉะนั้นคุณจะพยากรณ์ต่ำเกินไปอย่างเป็นระบบ
เมื่อมีตัวพยากรณ์สี่ตัวในมือ ได้แก่ RV, EWMA, GARCH/GJR-t, HAR คำถามจึงกลายเป็น เราจะตัดสินได้อย่างไรว่าตัวไหนดีที่สุด ในเมื่อเราไม่มีทางเห็นสิ่งที่ทั้งหมดกำลังพยายามทำนาย
การประเมินการพยากรณ์ความผันผวนอย่างซื่อตรง
นี่คือคำสอนหลักของบทความ ดังนั้นให้ช้าลงตรงนี้
คุณต้องการเปรียบเทียบการพยากรณ์ กับความแปรปรวนแบบมีเงื่อนไขที่แท้จริง แต่ เป็นปริมาณ แฝง (latent) มันเป็นพารามิเตอร์ของกระบวนการสร้างข้อมูล ไม่มีทางสังเกตได้โดยตรง สิ่งที่คุณได้รับมีเพียงผลตอบแทนที่เกิดขึ้นจริงหนึ่งค่าต่อวัน ดังนั้นการประเมินความผันผวนทุกครั้งจึงเป็นการเปรียบเทียบการพยากรณ์ของคุณกับ ตัวแทน (proxy) ที่มีสัญญาณรบกวนของความจริงจริง ๆ ตัวแทนมาตรฐานสองตัว
- ผลตอบแทนกำลังสอง ไม่มีความเอนเอียงสำหรับ ภายใต้โมเดลค่าเฉลี่ยศูนย์ () แต่มีสัญญาณรบกวนสูงมาก ผลตอบแทนรายวันหนึ่งค่าเป็นการประมาณส่วนเบี่ยงเบนมาตรฐานจากการสังเกตเดียว ตัวแทน อาจเป็น 0 (วันที่ราบเรียบ) แม้ว่าความผันผวนที่แท้จริงจะสูง หรือมหาศาลในวันหางที่โชคดี
- ความแปรปรวนที่เกิดขึ้นจริง จากข้อมูลระหว่างวัน มีสัญญาณรบกวนน้อยกว่ามาก การสุ่มตัวอย่างระหว่างวันเฉลี่ยสัญญาณรบกวนจากผลตอบแทนเดียวที่เป็นเอกลักษณ์ออกไป ซึ่งเป็นเหตุผลว่าทำไม HAR-RV จึงใช้ได้ผลและทำไมคุณจึงควรใช้ เป็นตัวแทนของคุณหากคุณมีข้อมูลระหว่างวันเลย
รายละเอียดปลีกย่อยที่จับได้เกือบทุกคน เพราะตัวแทนมีสัญญาณรบกวน การเลือกฟังก์ชันการสูญเสียจึงไม่ใช่เรื่องไร้พิษภัย จัดอันดับการพยากรณ์สองตัวด้วยการสูญเสียที่ผิด และตัวแทนที่มีสัญญาณรบกวนสามารถพลิกอันดับได้ บอกคุณว่าการพยากรณ์ที่แย่กว่านั้นดีกว่า Patton (2011) คำนวณอย่างแม่นยำว่าฟังก์ชันการสูญเสียตัวไหน "ทนทาน (robust)" ในแง่ที่ว่าการจัดอันดับการพยากรณ์ด้วยการสูญเสียที่คาดหวังบนตัวแทนที่มีสัญญาณรบกวนให้อันดับ เดียวกัน กับที่คุณจะได้บนความแปรปรวนที่แท้จริง (ที่สังเกตไม่ได้) มีเพียงตระกูลเฉพาะเท่านั้นที่ผ่านเกณฑ์ สองสมาชิกมีความสำคัญในทางปฏิบัติ
MSE เทียบกับ QLIKE
ค่าคลาดเคลื่อนกำลังสองเฉลี่ยบนความแปรปรวน
โดยที่ คือการพยากรณ์ และ ถูกแทนด้วย หรือ MSE ทนทานในแง่ของ Patton (อันดับของมันสอดคล้องกับตัวแทน) แต่มันสมมาตรและขึ้นอยู่กับสเกล มันลงโทษการพยากรณ์เกินและการพยากรณ์ต่ำที่มีขนาดสัมบูรณ์เท่ากันอย่างเท่าเทียม และมันถ่วงน้ำหนักข้อผิดพลาดในช่วงความผันผวนสูงอย่างมหาศาลมากกว่าข้อผิดพลาดในช่วงสงบ โมเดลที่แม่นยำ 95% ของวันที่สงบแต่ทำการพยากรณ์ความแปรปรวนพังในสามวันวิกฤตจะดูแย่มากภายใต้ MSE แม้ว่าพฤติกรรมในวิกฤตของมันจะเป็นสิ่งที่คุณต้องการจริง ๆ
การสูญเสีย QLIKE (quasi-likelihood) คือตัวเก่งงานหนัก
มันคือการสูญเสียที่บ่งชี้โดย Gaussian likelihood บนความแปรปรวน มันก็ทนทานในแง่ของ Patton เช่นกัน และมันมีคุณสมบัติสองประการที่ทำให้มันเป็นตัวเลือกที่นิยมสำหรับความผันผวน ประการแรก มัน ไม่สมมาตรในทิศทางที่ถูกต้อง มันลงโทษการทำนายต่ำของความแปรปรวนมากกว่าการทำนายเกิน สำหรับผู้จัดการความเสี่ยงหรือผู้กำหนดเป้าหมายความผันผวน นั่นคือความไม่สมมาตรที่ถูกต้อง การพยากรณ์ความผันผวนต่ำเกินไปหมายความว่าคุณรับขนาดมากเกินไปก่อนที่มันจะสำคัญ ซึ่งเป็นข้อผิดพลาดที่แพง ประการที่สอง มัน (โดยประมาณ) ไม่ขึ้นกับสเกล เพราะมันขึ้นอยู่กับอัตราส่วน ข้อผิดพลาดการพยากรณ์ 10% จะเสียค่าใช้จ่ายพอ ๆ กันไม่ว่าจะเกิดในวันที่สงบหรือวันวิกฤต ดังนั้นการประเมินจึงไม่ถูกยึดโดยการสังเกตที่ความแปรปรวนสูงเพียงหยิบมือแบบที่ MSE เป็น ความทนทานต่อความไม่สม่ำเสมอของความแปรปรวน (heteroskedasticity) ของตัวแทนนี้คือสิ่งที่คุณต้องการพอดีเมื่อประเด็นทั้งหมดคือความผันผวนแปรผันอย่างรุนแรง
สังเกตว่า โดยเท่ากับศูนย์ก็ต่อเมื่อ ต่ำกว่าดีกว่า เช่นเดียวกับ MSE
import numpy as np
def qlike(proxy: np.ndarray, forecast_var: np.ndarray) -> np.ndarray:
"""Per-observation QLIKE loss. `proxy` is r^2 or RV (a variance proxy),
`forecast_var` is h = sigma_hat^2. Both strictly positive, same units.
"""
ratio = proxy / forecast_var
return ratio - np.log(ratio) - 1.0
def mse_var(proxy: np.ndarray, forecast_var: np.ndarray) -> np.ndarray:
"""Per-observation MSE on the variance scale."""
return np.square(proxy - forecast_var)
คำเตือนเชิงปฏิบัติสองข้อ เก็บตัวแทนและการพยากรณ์ไว้ในหน่วยที่เหมือนกัน (ทั้งคู่เป็นความแปรปรวนรายวัน หรือทั้งคู่เป็นแบบทั้งปี) มิฉะนั้นอัตราส่วนจะไร้ความหมาย และอย่าปล่อยให้ forecast_var แตะศูนย์ ให้ตัดมันไว้ที่พื้นเล็ก ๆ เพราะ จะทำให้ค่าเฉลี่ยทั้งหมดเป็นพิษ
การถดถอย Mincer-Zarnowitz
ตัวเลขการสูญเสียตัวเดียวบอกคุณว่าการพยากรณ์ตัวไหนดีกว่า แต่มันไม่บอกว่าการพยากรณ์ผิดอย่างไร การถดถอย Mincer-Zarnowitz (1969) ทำได้ ถดถอยตัวแทนบนการพยากรณ์
ภายใต้การพยากรณ์ที่เหมาะสมและไม่มีความเอนเอียง และ โดยเฉลี่ยความแปรปรวนที่เกิดขึ้นจริงเท่ากับการพยากรณ์ การเบี่ยงเบนวินิจฉัยพยาธิสภาพ
- พร้อม ลายเซ็นคลาสสิกของการพยากรณ์ที่ผันผวนเกินไป มันตอบสนองมากเกินไป ทำนายค่าสุดขั้วที่ไม่ได้เกิดขึ้นเต็มที่ พบได้บ่อยมากสำหรับโมเดลที่ขับเคลื่อนด้วยผลตอบแทนกำลังสองดิบ
- การพยากรณ์ตอบสนองน้อยเกินไป ปรับขนาดตามความแปรปรวนที่แท้จริงน้อยเกินไป
- ของการถดถอยต่ำ แม้ว่า จะดูดีโดยเฉลี่ย การพยากรณ์ก็ติดตามความแปรปรวนได้แย่จากวันต่อวัน เพราะตัวแทนมีสัญญาณรบกวนมาก อย่าตกใจว่า MZ เทียบกับ มักอยู่ที่แค่ 0.05-0.20 เมื่อเทียบกับ มันจะสูงกว่ามาก ค่า เทียบกับ ถูกจำกัดไว้ต่ำกว่า 1 มากไม่ว่าการพยากรณ์จะดีแค่ไหน ล้วนเพราะสัญญาณรบกวนของตัวแทน
การทดสอบ ร่วมของ ให้การตรวจสอบการปรับเทียบอย่างเป็นทางการ ในทางปฏิบัติ ใช้ MZ เป็นเครื่องมือวินิจฉัยเพื่อทำความเข้าใจการพยากรณ์ และใช้ QLIKE เพื่อจัดอันดับการพยากรณ์
Diebold-Mariano ความแตกต่างนั้นจริงหรือไม่
สมมติว่า QLIKE เฉลี่ยของ GARCH คือ 0.183 และของ EWMA คือ 0.191 GARCH "ชนะ" แต่ 0.008 เป็นความได้เปรียบที่จริงหรือสัญญาณรบกวนจากการสุ่ม การทดสอบ Diebold-Mariano (1995) ตอบคำถามนี้พอดี นิยามค่าส่วนต่างการสูญเสียต่อช่วง
สำหรับการพยากรณ์สองตัว และ (ที่นี่ = QLIKE) สมมติฐานว่างคือความแม่นยำในการทำนายเท่ากัน สถิติคือค่าส่วนต่างเฉลี่ยที่ทำให้เป็นมาตรฐานด้วยค่าคลาดเคลื่อนมาตรฐานระยะยาว (HAC) ของมัน เพราะ มีสหสัมพันธ์เชิงอนุกรม
โดยที่ คือการประมาณความแปรปรวนระยะยาวแบบ Newey-West สถิติ DM ที่เกิน ปฏิเสธความแม่นยำเท่ากันที่ระดับ 5% สิ่งสำคัญคือ DM เป็นการทดสอบเกี่ยวกับการพยากรณ์ ไม่ใช่โมเดลซ้อน และมันจัดการการพึ่งพาเชิงอนุกรมในชุดการสูญเสียที่การทดสอบ แบบไร้เดียงสาบน จะเพิกเฉย
import numpy as np
from scipy import stats
def diebold_mariano(loss_a: np.ndarray, loss_b: np.ndarray, h: int = 1):
"""Diebold-Mariano test of equal predictive accuracy.
loss_a, loss_b: per-period losses (e.g. QLIKE) for forecasts A and B.
h: forecast horizon; Newey-West lag = h - 1 (>=0), plus a small-sample buffer.
Returns (DM_stat, p_value). Negative DM => A has lower loss (A better).
"""
d = np.asarray(loss_a) - np.asarray(loss_b)
T = len(d)
d_bar = d.mean()
lag = max(h - 1, 0)
gamma0 = np.mean((d - d_bar) ** 2)
lrv = gamma0
for k in range(1, lag + 1):
w = 1.0 - k / (lag + 1)
cov = np.mean((d[k:] - d_bar) * (d[:-k] - d_bar))
lrv += 2.0 * w * cov
dm = d_bar / np.sqrt(lrv / T)
adj = np.sqrt((T + 1 - 2 * h + h * (h - 1) / T) / T)
dm *= adj
p = 2.0 * (1.0 - stats.t.cdf(abs(dm), df=T - 1))
return float(dm), float(p)
ผลลัพธ์เชิงอธิบายในคอมเมนต์นั้นคือผลลัพธ์ที่ซื่อตรงและพบบ่อย และมันคือเหตุผลทั้งหมดที่ส่วนนี้มีอยู่ GARCH มักโพสต์การสูญเสียเฉลี่ยที่ต่ำกว่า EWMA เล็กน้อย และพอ ๆ กันบ่อยครั้งที่ความได้เปรียบนั้นผ่านเกณฑ์นัยสำคัญ DM ไม่ได้ หากคุณรายงานเพียง QLIKE เฉลี่ยเสมอ คุณจะโน้มน้าวตัวเองถึงความได้เปรียบที่การทดสอบ DM คงจะยับยั้งไว้ รายงานสถิติ DM นี่คือวินัยเดียวกับที่เราใช้กับผลตอบแทนกลยุทธ์ใน การประเมินอย่างซื่อตรงเมื่อไม่มีความได้เปรียบที่แข็งแกร่ง การประมาณค่าจุดเดียวที่เอาชนะเกณฑ์มาตรฐานยังไม่ใช่ความได้เปรียบจนกว่าคุณจะตัดความเป็นไปได้ว่ามันเป็นสัญญาณรบกวนออกไป
การทดสอบย้อนหลัง กลยุทธ์กำหนดเป้าหมายความผันผวนแบบ walk-forward
ตอนนี้เรารวมสองซีก คือตัวพยากรณ์กับกฎการปรับขนาด เข้าเป็นกลยุทธ์และประเมินมันด้วยวิธีเดียวที่มีความหมาย คือ walk-forward นอกตัวอย่าง พร้อมต้นทุน
กลยุทธ์นี้เรียบง่ายโดยเจตนา เพราะความเรียบง่ายคือสิ่งที่ทำให้เราสามารถระบุที่มาของผลลัพธ์ไปที่การพยากรณ์ความผันผวนแทนที่จะเป็นสัญญาณอันชาญฉลาด BTC แบบ long อย่างเดียว กำหนดเป้าหมายความผันผวน ในแต่ละวัน พยากรณ์ความผันผวนของวันถัดไป ตั้งตำแหน่งเป็น ถือข้ามคืน และทำซ้ำ ตัวแปรแบบ long/flat จะปิดตำแหน่งเมื่อตัวกรองแนวโน้มเป็นลบ ตัวแปรแบบพอร์ตเล็กจะปรับขนาดตามเมทริกซ์ความแปรปรวนร่วม DCC จาก ส่วนที่ 3 แทนความแปรปรวนของสินทรัพย์เดี่ยว เราจะอธิบายกรณี long อย่างเดียวโดยละเอียดและกล่าวถึงส่วนขยาย
กลไก walk-forward และสัญญาไม่มองไปข้างหน้า
คุณสมบัติสำคัญที่สุดของการทดสอบย้อนหลังนี้คือ ทุกปริมาณที่ใช้ปรับขนาดตำแหน่งในวัน คำนวณได้โดยใช้เฉพาะข้อมูลที่มีอยู่ ณ เวลาปิดของวัน เท่านั้น พารามิเตอร์ GARCH ถูกประมาณค่าใหม่บนหน้าต่างเลื่อนที่สิ้นสุดที่ การพยากรณ์คือ ล่วงหน้าหนึ่งขั้นจากการฟิตนั้น ตำแหน่งตั้งจากการพยากรณ์นั้น และผลตอบแทนที่ได้รับคือ โดยที่ คือผลตอบแทนของวันถัดไป ซึ่งโมเดลไม่เคยเห็น การฟิต GARCH ใหม่บนตัวอย่างเต็มแล้ว "พยากรณ์" อดีตคือวิธีที่พบบ่อยที่สุดที่คนบังเอิญปลอมแปลงการทดสอบย้อนหลังที่ยอดเยี่ยม เราจัดการกับกับดักการมองไปข้างหน้านี้และวิธีการโดยรวมใน การเพิ่มประสิทธิภาพแบบ walk-forward
import numpy as np
import pandas as pd
from arch import arch_model
def walk_forward_voltarget(
returns: pd.Series, # daily log returns in decimal (e.g. 0.021)
proxy_var: pd.Series, # variance proxy aligned to returns (RV or r^2)
target_vol_annual: float = 0.20,
window: int = 750, # rolling estimation window (days)
refit_every: int = 5, # refit GARCH weekly, forecast daily (cost saver)
w_max: float = 3.0, # leverage cap
cost_bps: float = 5.0, # per-unit-turnover cost in basis points
ann: int = 365, # crypto trades 365 days/yr
):
"""Long-only vol-targeted BTC, GARCH(1,1)-t forecasts, strictly walk-forward.
Returns a DataFrame with position, forecast vol, net returns, and turnover.
"""
idx = returns.index
target_daily = target_vol_annual / np.sqrt(ann)
fcast_vol = pd.Series(index=idx, dtype=float, name="fcast_vol")
last_res = None
for i in range(window, len(returns) - 1):
if (i - window) % refit_every == 0 or last_res is None:
train = returns.iloc[i - window:i + 1] * 100.0 # scale for the optimizer
am = arch_model(train, mean="Constant", vol="GARCH",
p=1, o=1, q=1, dist="t") # GJR-t, Part 2
last_res = am.fit(disp="off")
f = last_res.forecast(horizon=1, reindex=False)
var_next = f.variance.values[-1, 0] / (100.0 ** 2) # unscale
fcast_vol.iloc[i + 1] = np.sqrt(var_next)
raw_w = (target_daily / fcast_vol).clip(upper=w_max)
position = raw_w.shift(0) # w_{i+1} known at close i
gross_ret = position * returns # earned on day i+1
turnover = position.diff().abs().fillna(0.0)
cost = turnover * (cost_bps / 1e4)
net_ret = (gross_ret - cost).dropna()
out = pd.DataFrame({
"position": position,
"fcast_vol": fcast_vol,
"gross_ret": gross_ret,
"turnover": turnover,
"net_ret": net_ret,
}).dropna()
return out
def performance_stats(net_ret: pd.Series, ann: int = 365) -> dict:
"""Sharpe, realized vol, max drawdown, CAGR, annual turnover."""
mu = net_ret.mean() * ann
sigma = net_ret.std() * np.sqrt(ann)
sharpe = mu / sigma if sigma > 0 else np.nan
equity = (1.0 + net_ret).cumprod()
peak = equity.cummax()
max_dd = (equity / peak - 1.0).min()
cagr = equity.iloc[-1] ** (ann / len(net_ret)) - 1.0
return {
"sharpe": round(sharpe, 2),
"realized_vol": round(sigma, 3),
"max_drawdown": round(max_dd, 3),
"cagr": round(cagr, 3),
}
ข้อสังเกตในการนำไปใช้ไม่กี่ข้อที่สำคัญกว่าที่ตาเห็น
- การปรับสเกลสำหรับ optimizer การฟิตของ
archมีความสุขเชิงตัวเลขมากกว่าเมื่อผลตอบแทนอยู่ในหน่วยเปอร์เซ็นต์ จึงมี* 100และ/ 100**2ที่จับคู่กันเมื่อยกเลิกการปรับสเกลความแปรปรวน ลืมยกเลิกการปรับสเกลแล้วเป้าหมายความผันผวนของคุณจะคลาดเคลื่อนไป 10,000 เท่า - จังหวะการฟิตใหม่ การประมาณค่าพารามิเตอร์ GARCH ใหม่ทุกวันมีราคาแพงและแทบไม่เพิ่มอะไร พารามิเตอร์เสถียรจากสัปดาห์สู่สัปดาห์ การฟิตใหม่รายสัปดาห์ (
refit_every=5) ในขณะที่พยากรณ์รายวัน (การเรียกซ้ำอัปเดต จากผลตอบแทนใหม่แม้ไม่มีการฟิตใหม่) คือการประนีประนอมมาตรฐาน สิ่งนี้สะท้อนคำแนะนำเรื่องการแคชจากไปป์ไลน์ copula ใน โมเดล copula สำหรับความเสี่ยงร่วม - เพดาน ไม่ใช่แค่เครื่องสำอาง เมื่อความผันผวนที่พยากรณ์ยุบตัวในระบอบสงบนิ่ง สามารถระเบิดเป็นเลเวอเรจ 5 เท่า 10 เท่า การกำหนดเป้าหมายความผันผวนที่ไม่มีเพดานจะยินดีมอบเลเวอเรจหายนะให้คุณก่อนการเปลี่ยนระบอบความผันผวน ในจังหวะที่การพยากรณ์กำลังจะผิดมากที่สุด ใส่เพดาน (3 เท่าที่นี่) และตระหนักว่าเพดานจะผูกพันในช่วงที่สงบที่สุดและอันตรายที่สุดในเมื่อมองย้อนกลับพอดี
- ต้นทุนปรับขนาดตาม turnover และการกำหนดเป้าหมายความผันผวนคือเครื่องจักร turnover ทุกการสั่นไหวในการพยากรณ์จะปรับขนาดตำแหน่งใหม่ บนสินทรัพย์ความผันผวนต่ำที่มีการพยากรณ์กระโดดไปมา คุณสามารถหมุนเวียนบัญชีได้รายวัน พจน์
cost_bpsไม่ใช่รายละเอียดปัดเศษ สำหรับการกำหนดเป้าหมายความผันผวนที่มี turnover สูง มันสามารถกินสัดส่วนที่มีนัยสำคัญของการปรับปรุง Sharpe แบบ gross
ผลลัพธ์ที่ออกมาเป็นอย่างไร (เชิงอธิบาย)
การรันสิ่งนี้บนข้อมูล BTC รายวันตลอดหน้าต่างหลายปี โดยเปรียบเทียบตัวพยากรณ์สี่ตัวในฐานะตัวส่วนสำหรับการปรับขนาด มักจะให้ตารางที่มีรูปร่างต่อไปนี้ ตัวเลขด้านล่างเป็นเชิงอธิบาย เลือกด้วยมือเพื่อแสดงรูปแบบทั่วไป ไม่ใช่ผลลัพธ์ของการทดสอบย้อนหลังจริง แต่การจัดลำดับและขนาดเป็นตัวแทนของสิ่งที่ผู้ปฏิบัติรายงาน
| การพยากรณ์เพื่อปรับขนาด | Sharpe | ความผันผวนที่เกิดขึ้นจริง | ความผันผวนเป้าหมาย | Drawdown สูงสุด | Turnover ต่อปี |
|---|---|---|---|---|---|
| มูลค่าคงที่ (ไม่กำหนดเป้าหมาย) | 0.71 | 0.68 | — | -0.78 | 0.1x |
| Rolling RV (60d) | 0.94 | 0.24 | 0.20 | -0.41 | 12x |
| EWMA () | 1.02 | 0.21 | 0.20 | -0.35 | 19x |
| GARCH(1,1)-t | 1.05 | 0.21 | 0.20 | -0.33 | 22x |
| HAR-RV (ตัวแทนระหว่างวัน) | 1.09 | 0.20 | 0.20 | -0.31 | 20x |
สองตัวแปรที่ควรค่าแก่การสร้าง
กรณี long อย่างเดียวแยกการพยากรณ์ออกมา แต่ส่วนขยายสองตัวพบบ่อยพอที่จะแสดงอย่างชัดเจน
Long/flat พร้อมประตูแนวโน้ม (trend gate) การกำหนดเป้าหมายความผันผวนปรับขนาดตำแหน่งแต่ไม่มีมุมมองด้านทิศทาง มัน long เสมอ การปรับปรุงที่ราคาถูกและซื่อตรงคือปิดตำแหน่งเมื่อตัวกรองแนวโน้มช้ากลายเป็นลบ ดังนั้นคุณถือ long ที่กำหนดเป้าหมายความผันผวนเฉพาะในแนวโน้มขาขึ้นและอยู่เฉยในกรณีอื่น สิ่งนี้ทำให้ตรรกะการปรับขนาดเหมือนเดิมและวางตัวกรองระบอบแบบหยาบทับด้านบน มันไม่ได้แสร้งจับจังหวะการเข้า เพียงหลีกเลี่ยงการถือผ่านแนวโน้มขาลงที่ชัดเจน
def apply_trend_gate(position: pd.Series, price: pd.Series, fast: int = 20, slow: int = 100):
"""Zero out the (already vol-targeted) position when the fast SMA is below
the slow SMA. Both SMAs use only past prices, so no look-ahead is introduced.
"""
fast_ma = price.rolling(fast).mean().shift(1) # shift: known at prior close
slow_ma = price.rolling(slow).mean().shift(1)
gate = (fast_ma > slow_ma).astype(float) # 1.0 in uptrend, 0.0 otherwise
return position * gate.reindex(position.index).fillna(0.0)
ประตูแนวโน้มตัด turnover ในด้านขาลง (คุณหยุดหมุนเวียนตำแหน่งที่หดตัวในตลาดหมี) แต่เพิ่มความเสี่ยงด้านระบอบของตัวเอง มัน whipsaw ในตลาดออกข้างที่ปั่นป่วนและล่าช้าที่จุดกลับตัว การที่มันช่วยหรือไม่เป็นคำถามเชิงประจักษ์ที่คุณต้องตอบด้วยความเข้มงวดแบบ walk-forward และผ่านการทดสอบ DM เดียวกันกับกฎการปรับขนาดเอง ตัวกรองแนวโน้มเป็นแอดออนประเภทที่ดูยอดเยี่ยมในตัวอย่างและระเหยไปนอกตัวอย่างพอดี
การกำหนดเป้าหมายความผันผวนของพอร์ตบนความแปรปรวนร่วม DCC สำหรับบัญชีที่มีสินทรัพย์หลายตัว การพยากรณ์สเกลาร์ จะกลายเป็นความผันผวนของพอร์ต โดยที่ คือเมทริกซ์ความแปรปรวนร่วมที่แปรผันตามเวลาจาก DCC-GARCH ของ ส่วนที่ 3 คุณเลือกน้ำหนักฐาน (น้ำหนักเท่ากัน มูลค่าตลาด หรือการเอียงแบบ mean-variance) คำนวณความผันผวนที่พยากรณ์ของพอร์ตภายใต้ และปรับขนาดเวกเตอร์น้ำหนักทั้งหมดเพื่อให้แตะเป้าหมายของพอร์ต
def portfolio_voltarget_weights(base_w, cov_forecast, target_vol_daily, w_gross_max=3.0):
"""Scale a base weight vector so forecast portfolio vol hits the target.
base_w: (n,) base allocation (need not sum to 1).
cov_forecast: (n, n) one-step-ahead covariance from DCC-GARCH (daily units).
"""
base_w = np.asarray(base_w, dtype=float)
port_var = float(base_w @ cov_forecast @ base_w)
port_vol = np.sqrt(max(port_var, 1e-12))
scale = min(target_vol_daily / port_vol, w_gross_max / np.abs(base_w).sum())
return scale * base_w
นี่คือสะพานธรรมชาติสู่วรรณกรรมการสร้างพอร์ต น้ำหนักฐาน สามารถมาจาก Markowitz mean-variance หรือวิธีที่อิงความเสี่ยงอย่าง HRP/CVaR และการกำหนดเป้าหมายความผันผวนก็นั่งอยู่ด้านบนในฐานะโอเวอร์เลย์ที่ปรับความเสี่ยงรวมให้คงที่ เมทริกซ์ DCC สำคัญเพราะสหสัมพันธ์พุ่งขึ้นในช่วงล่มสลาย (ส่วนที่ 3) พอร์ตที่ดูกระจายความเสี่ยงในตลาดสงบสามารถมีความผันผวนที่พยากรณ์สูงกว่าที่ความแปรปรวนร่วมแบบสถิตบ่งชี้มากในจังหวะที่สำคัญพอดี และโอเวอร์เลย์ตัดการเปิดรับความเสี่ยงแบบ gross เพื่อตอบสนอง
การวินิจฉัยที่คุณควรพล็อตเสมอ
อย่าเชื่อตารางสรุปเพียงอย่างเดียว สำหรับการกำหนดเป้าหมายความผันผวนใด ๆ ให้พล็อตสามสิ่งและพิจารณาด้วยตาก่อนที่คุณจะเชื่อค่า Sharpe ใด ๆ ประการแรก ความผันผวนแบบเลื่อนที่เกิดขึ้นจริงของกลยุทธ์เทียบกับเส้นเป้าหมาย มันควรเกาะติดเป้าหมาย การเลื่อนขึ้นเหนือมันอย่างเป็นระบบหมายความว่าการพยากรณ์ของคุณเอนเอียงต่ำ (ทิศทางที่แพง) ประการที่สอง ชุดตำแหน่ง/เลเวอเรจ มองหาเพดานที่ผูกพันและการพุ่งขึ้นของเลเวอเรจก่อน drawdown ซึ่งเป็นลายเซ็นของการพยากรณ์ที่ถูกจับได้โดยการเปลี่ยนระบอบ ประการที่สาม scatter ระหว่างการพยากรณ์กับตัวแทน (ภาพ Mincer-Zarnowitz) กลุ่มเมฆที่มีความชันห่างจาก 1 บอกคุณว่าการพยากรณ์ถูกปรับสเกลผิดในแบบที่ค่าเฉลี่ย QLIKE สามารถซ่อนได้ พล็อตสามภาพนี้จับบั๊กและการหลอกตัวเองได้มากกว่าสถิติตัวเดียวใด ๆ
อ่านตารางนี้ในแบบที่คุณควรอ่านตารางการทดสอบย้อนหลังทุกตาราง มองว่าอะไรแข็งแกร่งและอะไรก้ำกึ่ง ข้อเท็จจริงที่แข็งแกร่งกระโดดออกมา ทุกตัวแปรที่กำหนดเป้าหมายความผันผวนบดขยี้มูลค่าคงที่ในด้าน Sharpe และที่ชัดเจนกว่านั้นในด้าน drawdown และความเสถียรของความผันผวนที่เกิดขึ้นจริง กลยุทธ์มูลค่าคงที่ทำงานที่ความผันผวนแบบทั้งปี 68% พร้อม drawdown 78% ซึ่งลงทุนไม่ได้เลย และทุกวิธีการกำหนดเป้าหมายให้ความผันผวนที่เกิดขึ้นจริงใกล้เป้าหมาย 20% ซึ่งเป็นคำมั่นสัญญาทั้งหมดของกลไกที่ทำงาน ข้อเท็จจริงที่ก้ำกึ่งคือความแตกต่างระหว่างตัวพยากรณ์ HAR เฉือน GARCH เฉือน EWMA เฉือน rolling RV แต่ช่องว่างเล็ก หนึ่งในสิบของจุด Sharpe และเมื่อทดสอบด้วย Diebold-Mariano บนการพยากรณ์หรือ bootstrap บนผลตอบแทน มักจะผ่านนัยสำคัญไม่ได้ ช่องว่างเล็ก เปราะบาง และขึ้นกับระบอบระหว่างตัวพยากรณ์ที่ซับซ้อนกับตัวไร้เดียงสานั้นคือหัวข้อข่าวที่ซื่อตรงของทั้งซีรีส์นี้
ซื่อตรงกับสิ่งที่มันให้คุณจริง ๆ
บล็อกนี้มีคอลเลกชันทั้งหมดเกี่ยวกับการทดสอบย้อนหลังโดยไม่หลอกตัวเอง ดังนั้นให้เรานำมันมาใช้กับผลลัพธ์ของเราเองแทนที่จะแอบหวังว่าคุณจะไม่ทำ
การกำหนดเป้าหมายความผันผวนช่วยปรับปรุงผลตอบแทนที่ปรับด้วยความเสี่ยงและ drawdown มันไม่ได้สร้างอัลฟ่าจากความว่างเปล่า ดูตารางอีกครั้ง การปรับปรุง Sharpe จากการกำหนดเป้าหมายเป็นเรื่องจริงและควรค่าแก่การมี แต่แยกส่วนมันดู แล้วส่วนใหญ่มาจากการไม่ถือตำแหน่งคงที่เข้าไปในระบอบความผันผวนสูง ซึ่งเชิงกลไกหลีกเลี่ยง drawdown ที่แย่ที่สุดและทำให้เส้นทางการทบต้นเสถียร กลยุทธ์ยังคง long BTC มันไม่มีมุมมองที่ตลาดไม่ได้ยื่นให้ หาก BTC มี Sharpe เป็นลบตลอดตัวอย่างของคุณ การกำหนดเป้าหมายความผันผวนจะยื่น Sharpe เป็นลบที่แย่น้อยลงให้คุณ ไม่ใช่เป็นบวก มันปรับรูปการแจกแจงผลตอบแทน หางบางลง ความผันผวนนิ่งขึ้น การทบต้นเชิงเรขาคณิตดีขึ้น แต่ความได้เปรียบด้านทิศทางดิบก็เป็นสิ่งใดก็ตามที่ long พื้นฐานเป็น อย่าปล่อยให้เส้นทุนที่สวยงามหลอกคุณให้เชื่อว่าคุณพบอัลฟ่าในเมื่อคุณพบการจัดการความเสี่ยง Moreira-Muir พบอัลฟ่าที่แท้จริงในปัจจัยตราสารทุนจากการจัดการความผันผวน แต่ผลลัพธ์นั้นเกี่ยวกับ tradeoff ความเสี่ยง-ผลตอบแทนที่แปรผันตามเวลาของปัจจัย และมันไม่ได้ถ่ายทอดโดยอัตโนมัติไปยังสินทรัพย์คริปโตเดี่ยวตลอดตัวอย่างที่ต่างกัน
ความได้เปรียบด้านคุณภาพการพยากรณ์ของ GARCH เหนือ EWMA มักเล็กและขึ้นกับระบอบ นี่คือผลตอบแทนที่น่าอึดอัดของส่วนที่ 1-3 คุณสร้างโมเดลที่ซับซ้อนขึ้นเรื่อย ๆ พจน์เลเวอเรจ หาง Student-t สหสัมพันธ์แบบพลวัต และการมีส่วนร่วมเพิ่มเติมของแต่ละตัวต่อกำไรขาดทุนของการกำหนดเป้าหมายความผันผวน เหนือ EWMA ที่ไร้เดียงสา มักอยู่ในแถบสัญญาณรบกวน ความได้เปรียบของ GARCH (การคืนสู่ค่าเฉลี่ยหลังช็อก) ปรากฏส่วนใหญ่ในระบอบเฉพาะ การพุ่งขึ้นอย่างรุนแรงที่แล้วกลับสู่ปกติ ในแนวโน้มที่บดขยี้หรือระบอบความผันผวนสูงที่คงอยู่ มันแทบไม่ต่างจาก EWMA สิ่งนี้ไม่ทำให้ GARCH ไร้ประโยชน์ โครงสร้างการคืนสู่ค่าเฉลี่ย พารามิเตอร์ที่ตีความได้ ความสามารถในการจำลองเส้นทางไปข้างหน้าและตั้งราคาออปชันเทียบกับการพยากรณ์ ล้วนมีคุณค่าที่ EWMA ขาด แต่หากการใช้งานเดียวของคุณคือการปรับขนาด ให้รันการทดสอบ DM ก่อนที่คุณจะจ่ายต้นทุนความซับซ้อน และรู้ว่า การตรวจจับระบอบ กำลังบอกสิ่งเดียวกันจากอีกมุมหนึ่ง โมเดลที่ชนะขึ้นอยู่กับระบอบ
Sharpe จากการทดสอบย้อนหลังเป็นขอบเขตบนของ Sharpe จริง และการกำหนดเป้าหมายความผันผวนขยายช่องว่าง เพราะกลยุทธ์มี turnover หนักและปรับด้วยเลเวอเรจ มันไวผิดปกติต่อแรงเสียดทานที่การทดสอบย้อนหลังไร้เดียงสาละเว้น การ fill ของคุณแย่กว่าราคาปิดที่คุณปรับขนาดตาม ต้นทุน funding บนตำแหน่ง perp ที่ใช้เลเวอเรจสะสมอย่างต่อเนื่อง และเพดานเลเวอเรจโต้ตอบกับกลไก margin และการบังคับขายที่ w * return ง่าย ๆ เพิกเฉย ทุกอย่างเหล่านี้ทำให้ผลจริงแย่กว่าการทดสอบย้อนหลัง เราจัดการช่องว่างนี้อย่างเป็นระบบใน ความเทียบเท่าระหว่างการทดสอบย้อนหลังกับการเทรดจริง สำหรับการกำหนดเป้าหมายความผันผวนโดยเฉพาะ ให้เผื่องบสำหรับมันโดยใช้ต้นทุนแบบอนุรักษ์นิยม เพดานเลเวอเรจที่สมจริง (ต่ำ) และโดยการดำเนินการที่ราคาเปิดของแท่งถัดไปแทนราคาปิดที่คุณคำนวณสัญญาณจาก
หมายเหตุเสริมเกี่ยวกับพรีเมียมความเสี่ยงความผันผวน ทุกอย่างข้างต้นพยากรณ์ความผันผวนที่เกิดขึ้นจริง มีวัตถุคู่ขนานที่เทรดได้ นั่นคือความผันผวนโดยนัย (implied) ซึ่งตั้งราคาไว้ในออปชัน ซึ่งโดยเฉลี่ยอยู่เหนือความผันผวนที่เกิดขึ้นจริงในเวลาต่อมา คือพรีเมียมความเสี่ยงความผันผวน ค่าตอบแทนสำหรับการแบกรับความเสี่ยงจากการพุ่งขึ้นของความผันผวน ช่องว่างนั้นเป็นแหล่งผลตอบแทนในตัวเอง (การขายความแปรปรวนเก็บเกี่ยวมัน การซื้อมันป้องกันความเสี่ยงหาง) และมันเป็นเกมที่ต่างจากการกำหนดเป้าหมายความผันผวนอย่างแท้จริง มันเป็นการเดิมพันบนราคาของความผันผวนมากกว่าการใช้การพยากรณ์ความผันผวน เราไม่ไล่ตามมันที่นี่ แต่เครื่องจักรเริ่มด้วยโมเดลการตั้งราคาใน การตั้งราคาออปชัน Black-Scholes และการพยากรณ์ความผันผวนที่เกิดขึ้นจริงที่ดี (ส่วนที่ 1-2) คืออินพุตที่คุณต้องการพอดีในการตัดสินว่าความผันผวนโดยนัยแพงหรือถูก การเปรียบเทียบการพยากรณ์ GARCH ของคุณกับความผันผวนโดยนัยของตลาดออปชันคือหนึ่งในการใช้งานที่ซื่อตรงกว่าของทุกสิ่งที่คุณสร้างในซีรีส์นี้
ข้อพิจารณาเชิงปฏิบัติ
รวมเรื่องปลีกย่อยที่แยกการกำหนดเป้าหมายความผันผวนที่ใช้ได้ออกจากที่เปราะบาง
- ประมาณค่าบนขอบเขตเวลาที่ถูกต้อง หากคุณปรับขนาดตำแหน่งที่ถือหนึ่งวัน ให้พยากรณ์ความผันผวนหนึ่งวัน หากคุณ rebalance รายสัปดาห์ ให้พยากรณ์ (และกำหนดเป้าหมาย) ความผันผวนรายสัปดาห์ หรือรวมการพยากรณ์ GARCH รายวันตลอดขอบเขต การพยากรณ์ GARCH หลายขั้นคืนสู่ค่าเฉลี่ยเข้าหา ซึ่งการปรับสเกลแบบไร้เดียงสา "" เพิกเฉย ส่วนที่ 1 ครอบคลุมการพยากรณ์ GARCH หลายขั้น
- การแปลงเป็นรายปีในตลาด 24/7 คริปโตเทรด 365 วันต่อปีโดยไม่มีวันหยุดสุดสัปดาห์หรือวันหยุดนักขัตฤกษ์ ดังนั้นให้แปลงความผันผวนรายวันเป็นรายปีด้วย ไม่ใช่ จากตราสารทุน การทำสิ่งนี้ผิดจะปรับสเกลเป้าหมายของคุณผิดไปเงียบ ๆ ประมาณ 20%
- ตัวส่วนสามารถเป็นเมทริกซ์ความแปรปรวนร่วมได้ สำหรับบัญชีหลายสินทรัพย์ ให้แทนสเกลาร์ ด้วยความผันผวนของพอร์ต จาก DCC-GARCH ของ ส่วนที่ 3 และปรับขนาดเวกเตอร์น้ำหนักทั้งหมดเพื่อแตะความผันผวนเป้าหมายของพอร์ต สิ่งนี้เชื่อมโยงการกำหนดเป้าหมายความผันผวนกับการปรับขนาดแบบ mean-variance (Markowitz สำหรับคริปโต) และการจัดสรรที่อิงความเสี่ยง (ไปป์ไลน์ HRP และ CVaR) การกำหนดเป้าหมายความผันผวนคือกรณีพิเศษของสินทรัพย์เดี่ยวในการปรับขนาดสู่งบความเสี่ยงของพอร์ต
- การกำหนดเป้าหมายความผันผวนเป็น procyclical ในแบบที่แยบยล เมื่อทุกคนรันกฎ เดียวกัน การพุ่งของความผันผวนบังคับการถอนเลเวอเรจแบบพร้อมเพรียง ซึ่งดันราคาลง ซึ่งยกความผันผวนที่เกิดขึ้นจริงขึ้น ซึ่งบังคับการถอนเลเวอเรจมากขึ้น ผลป้อนกลับนี้ (มีเอกสารบันทึกไว้อย่างดีใน "volmageddon" ปี 2018 และการถอนเลเวอเรจคริปโตต่าง ๆ) หมายความว่ากฎใช้ได้ผลน้อยลงพอดีเมื่อผู้เล่นจำนวนมากใช้มัน มันไม่ใช่เหตุผลที่จะละทิ้งมัน แต่เป็นเหตุผลที่จะใส่เพดานเลเวอเรจและไม่สมมติว่าการ fill ของคุณระหว่างการพุ่งของความผันผวนจะคล้ายการ fill ในตลาดสงบ
- ตั้งพื้นและตัดการพยากรณ์ ความผันผวนที่พยากรณ์เป็นศูนย์หรือใกล้ศูนย์ให้เลเวอเรจอนันต์ ให้ตั้งพื้น ที่ค่าต่ำสุดที่สมเหตุสมผลเสมอและใส่เพดานตำแหน่ง และบันทึกว่าแต่ละตัวผูกพันบ่อยแค่ไหน หากเพดานผูกพันเกือบตลอดเวลา เป้าหมายของคุณก้าวร้าวเกินไปสำหรับสินทรัพย์นั้น
สรุป
- การพยากรณ์ความผันผวนไม่มีคุณค่าจนกว่ามันจะเปลี่ยนการตัดสินใจ การกำหนดเป้าหมายความผันผวน ซึ่งปรับขนาดการเปิดรับความเสี่ยงเป็น (พร้อมเพดาน) คือการทดสอบคุณค่าของการพยากรณ์ที่สะอาดที่สุด เพราะคุณภาพการพยากรณ์จับคู่โดยตรงกับโปรไฟล์ความผันผวนที่เกิดขึ้นจริงที่ราบเรียบกว่าและ Sharpe ที่สูงกว่า
- การกำหนดเป้าหมายความผันผวนยกผลตอบแทนที่ปรับด้วยความเสี่ยง และโดยเฉพาะควบคุม drawdown เพราะความผันผวนพยากรณ์ได้ (มันเกาะกลุ่ม) ในขณะที่ทิศทางไม่ได้ และเพราะ Sharpe ratio ตกในระบอบความผันผวนสูงที่กฎให้น้ำหนักน้อยลงโดยอัตโนมัติ มันคือการปรับขนาดแบบ Kelly ภายใต้สมมติฐานว่าผลตอบแทนที่คาดหวังปรับขนาดตามความผันผวน
- เทียบ GARCH อย่างซื่อตรงกับเกณฑ์มาตรฐานที่แข็งแกร่ง realized vol แบบเลื่อน EWMA/RiskMetrics ( ซึ่งเป็น IGARCH ที่มีพารามิเตอร์อิสระศูนย์ตัว) และ HAR-RV บนตัวแทนความแปรปรวนที่เกิดขึ้นจริงระหว่างวัน EWMA และ HAR เอาชนะได้ยาก
- คุณไม่สามารถสังเกตความผันผวนที่แท้จริง ดังนั้นให้ประเมินเทียบกับตัวแทน ( หรือดีกว่ามากคือ ) โดยใช้ ฟังก์ชันการสูญเสียที่ทนทานต่อสัญญาณรบกวนของตัวแทน เลือก QLIKE เหนือ MSE มันลงโทษการพยากรณ์ต่ำมากกว่า (ข้อผิดพลาดที่แพง) และไม่ขึ้นกับสเกล จึงไม่ถูกยึดโดยวันความผันผวนสูงไม่กี่วัน ใช้ Mincer-Zarnowitz เพื่อวินิจฉัยความเอนเอียงและการทดสอบ Diebold-Mariano เพื่อตัดสินว่าความได้เปรียบของการพยากรณ์ตัวหนึ่งจริงหรือเป็นสัญญาณรบกวน
- ในการทดสอบย้อนหลังแบบ walk-forward ที่คำนึงถึงต้นทุน การกำหนดเป้าหมายความผันผวนเอาชนะมูลค่าคงที่ในด้าน Sharpe และ drawdown ได้อย่างน่าเชื่อถือ และตัวพยากรณ์สี่ตัวเกาะกลุ่มกันใกล้ชิด ความได้เปรียบของ GARCH เหนือ EWMA เล็ก ขึ้นกับระบอบ และมักไม่มีนัยสำคัญทางสถิติ รายงานการทดสอบ DM ไม่ใช่แค่การสูญเสียเฉลี่ย
- ซื่อตรง การกำหนดเป้าหมายความผันผวนคือ การจัดการความเสี่ยง ไม่ใช่อัลฟ่า มันปรับรูปการแจกแจงผลตอบแทนของการเดิมพันด้านทิศทางใด ๆ ที่คุณมีอยู่แล้ว มันไม่สร้างความได้เปรียบจากความว่างเปล่า และมันมี turnover หนักและปรับด้วยเลเวอเรจ ดังนั้นผลจริงจึงตามหลังการทดสอบย้อนหลังมากกว่าปกติ
เอกสารอ้างอิง:
- Patton, A. J. (2011). Volatility forecast comparison using imperfect volatility proxies. Journal of Econometrics, 160(1), 246-256. DOI
- Corsi, F. (2009). A simple approximate long-memory model of realized volatility. Journal of Financial Econometrics, 7(2), 174-196. DOI
- Diebold, F. X., & Mariano, R. S. (1995). Comparing predictive accuracy. Journal of Business & Economic Statistics, 13(3), 253-263. DOI
- Mincer, J., & Zarnowitz, V. (1969). The evaluation of economic forecasts. In Economic Forecasts and Expectations, NBER.
- Moreira, A., & Muir, T. (2017). Volatility-managed portfolios. Journal of Finance, 72(4), 1611-1644. DOI
- J.P. Morgan / Reuters (1996). RiskMetrics Technical Document, 4th ed.
- Bollerslev, T. (1986). Generalized autoregressive conditional heteroskedasticity. Journal of Econometrics, 31(3), 307-327. DOI
- Glosten, L. R., Jagannathan, R., & Runkle, D. E. (1993). On the relation between the expected value and the volatility of the nominal excess return on stocks. Journal of Finance, 48(5), 1779-1801. DOI
- Harvey, D., Leybourne, S., & Newbold, P. (1997). Testing the equality of prediction mean squared errors. International Journal of Forecasting, 13(2), 281-291. DOI
MarketMaker.cc Team
การวิจัยและกลยุทธ์เชิงปริมาณ