← กลับไปยังบทความ
July 13, 2026
อ่าน 5 นาที

การกำหนดเป้าหมายความผันผวนและการเทรดด้วยการพยากรณ์ GARCH

#volatility
#GARCH
#volatility-targeting
#backtesting
#risk
#crypto
#algorithmic-trading

สามส่วนแรกของซีรีส์นี้สอนคุณให้พยากรณ์ความผันผวน เราสร้าง 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") แทนที่จะถือตำแหน่งคงที่ ให้ปรับขนาดการเปิดรับความเสี่ยงในทิศทางผกผันกับความผันผวนที่พยากรณ์ได้

wt=σtargetσ^t(then capped)w_t = \frac{\sigma_{\text{target}}}{\hat{\sigma}_{t}} \quad \text{(then capped)}

โดยที่ σ^t\hat{\sigma}_t คือการพยากรณ์ความผันผวนของช่วงเวลาถัดไป (สร้างขึ้นโดยใช้เฉพาะข้อมูลจนถึงเวลา tt เท่านั้น) และ σtarget\sigma_{\text{target}} คือความผันผวนแบบทั้งปีที่คุณต้องการให้กลยุทธ์ทำงานอยู่ที่ระดับนั้น เช่น 15% หรือ 20% เมื่อโมเดลพยากรณ์ว่าตลาดสงบ คุณจะเพิ่มเลเวอเรจเข้าหา (หรือเกิน) 1.0 เมื่อพยากรณ์ว่าจะมีพายุ คุณก็หดตัวลง ความผันผวนที่เกิดขึ้นจริงของตำแหน่งที่ปรับขนาดแล้ว ในลำดับแรกคือ

Vol(wtrt+1)=wtσt+1=σtargetσ^tσt+1σtarget\text{Vol}(w_t r_{t+1}) = w_t \, \sigma_{t+1} = \frac{\sigma_{\text{target}}}{\hat\sigma_t}\, \sigma_{t+1} \approx \sigma_{\text{target}}

เมื่อใดก็ตามที่ σ^tσt+1\hat\sigma_t \approx \sigma_{t+1} ดังนั้นคุณภาพทั้งหมดของแบบฝึกหัดนี้จึงขึ้นอยู่กับสิ่งเดียว นั่นคือ การพยากรณ์ σ^t\hat\sigma_t ของคุณใกล้เคียงกับความผันผวนที่เกิดขึ้นจริงในช่วงถัดไป σt+1\sigma_{t+1} มากเพียงใด การพยากรณ์ที่ดีกว่าจะให้โปรไฟล์ความผันผวนที่เกิดขึ้นจริงที่ราบเรียบกว่า และอย่างที่เราจะได้เห็น มันให้ Sharpe ratio ที่ดีกว่า นี่คือเหตุผลที่มันเป็นการทดสอบที่ถูกต้อง การพยากรณ์ไม่ใช่แค่เครื่องประดับ แต่มันคือตัวส่วน

ทำไมสิ่งนี้จึงเพิ่ม Sharpe และควบคุม drawdown

ข้อเท็จจริงเชิงประจักษ์สองข้อทำหน้าที่นี้

ความผันผวนพยากรณ์ได้ง่ายกว่าผลตอบแทนมาก ทิศทางของผลตอบแทน BTC ในวันพรุ่งนี้เกือบจะเหมือนการโยนเหรียญที่ความถี่รายวัน แต่ขนาดของมันไม่ใช่ ความผันผวนเกาะกลุ่มกัน การเคลื่อนไหวใหญ่ตามมาด้วยการเคลื่อนไหวใหญ่ ซึ่งเป็นเหตุผลทั้งหมดที่ GARCH มีอยู่ (ส่วนที่ 1 ได้อนุมานโครงสร้าง AR(1)-ในความแปรปรวนที่เข้ารหัสสิ่งนี้) ค่า R2R^2 ที่ 0.4-0.6 สำหรับความแปรปรวนล่วงหน้าหนึ่งวันเป็นเรื่องปกติ ตัวเลขเดียวกันสำหรับผลตอบแทนจะเป็นสัญญาณระดับ Renaissance การกำหนดเป้าหมายความผันผวนใช้ประโยชน์จากปริมาณที่พยากรณ์ได้ และยังคงเป็นกลางเกี่ยวกับปริมาณที่พยากรณ์ไม่ได้

Sharpe ratio ไม่คงที่ตลอดช่วงเวลา มันตกลงเมื่อความผันผวนพุ่งขึ้น ระบอบความผันผวนสูงในคริปโต เช่น การถอนเลเวอเรจแบบต่อเนื่อง ความล้มเหลวของ exchange วันที่ทุกอย่างกระโดด 30% มักจะมีผลตอบแทนต่อหน่วยความเสี่ยงที่แย่กว่า ไม่ใช่ดีกว่า โดยการตัดการเปิดรับความเสี่ยงเชิงกลไกในจังหวะที่ความผันผวนที่พยากรณ์ได้อยู่ในระดับสูง คุณจะให้น้ำหนักน้อยลงกับช่วงเวลาที่มีส่วนต่อ drawdown มากที่สุดและต่อผลตอบแทนแบบทบต้นน้อยที่สุด Moreira และ Muir (2017) แสดงให้เห็นสำหรับตราสารทุนว่าพอร์ตที่จัดการความผันผวน ซึ่งเป็นการปรับขนาดแบบ 1/σ21/\sigma^2 นี้เอง ช่วยเพิ่ม Sharpe ratio และสร้างอัลฟ่าเป็นบวกเมื่อเทียบกับปัจจัยที่ไม่ได้จัดการ กลไกนี้ไม่ใช่เวทมนตร์ แต่คือการปฏิเสธที่จะถือตำแหน่งดอลลาร์คงที่เข้าไปในช่วงเวลาที่คาดการณ์ได้ว่าจะปั่นป่วน

ประโยชน์ด้าน drawdown ยิ่งตรงไปตรงม​ากว่า drawdown สูงสุดถูกครอบงำโดยหางของการแจกแจงผลตอบแทนตำแหน่ง เนื่องจาก wtrt+1w_t r_{t+1} มีความผันผวนตรึงไว้ใกล้ σtarget\sigma_{\text{target}} หางซ้ายที่หนาซึ่งกลยุทธ์แบบมูลค่าคงที่ต้องเผชิญระหว่างการระเบิดของความผันผวนจึงถูกบีบอัด คุณมีตำแหน่งเล็กอยู่แล้วตั้งแต่ก่อนเข้า การกำหนดเป้าหมายความผันผวนไม่ได้ทำนายการล่มสลาย แต่มันเปิดรับความเสี่ยงน้อยเกินไปอย่างเป็นระบบเมื่อตลาดปั่นป่วน และความปั่นป่วนคือช่วงที่การล่มสลายเกิดขึ้น

ความสัมพันธ์กับ Kelly และการปรับขนาดแบบเศษส่วน

การกำหนดเป้าหมายความผันผวนเป็นญาติใกล้ชิดของเกณฑ์ Kelly สำหรับสินทรัพย์เดี่ยวที่มีผลตอบแทนส่วนเกินที่คาดหวัง μ\mu และความแปรปรวน σ2\sigma^2 เศษส่วนที่เหมาะสมที่สุดในการเติบโต (full-Kelly) คือ

f=μσ2.f^\star = \frac{\mu}{\sigma^2}.

หากคุณสมมติว่า Sharpe ratio μ/σ\mu/\sigma ค่อนข้างคงที่ ซึ่งเป็นสมมติฐานที่แข็งแรง แต่เป็นสมมติฐานที่ซ่อนอยู่ใน "ตลาดจ่ายราคาที่มั่นคงสำหรับความเสี่ยง" ดังนั้น μ=Sσ\mu = S\sigma และ f=S/σf^\star = S/\sigma ซึ่งก็คือการกำหนดเป้าหมายความผันผวนพอดี โดยที่ σtarget=S(Kelly fraction)\sigma_{\text{target}} = S \cdot (\text{Kelly fraction}) กล่าวอีกนัยหนึ่ง การกำหนดเป้าหมายความผันผวนคือการปรับขนาดแบบ Kelly ภายใต้สมมติฐานว่าผลตอบแทนที่คาดหวังปรับขนาดตามความผันผวน เราจะพิจารณา Kelly แบบเต็มและเศษส่วน และเหตุผลที่ไม่มีใครมีสติเทรด Kelly แบบเต็ม ใน เกณฑ์ Kelly และการปรับขนาดกลยุทธ์ บทเรียนเชิงปฏิบัติจากที่นั่นถ่ายทอดมาถึงที่นี่ ใช้เศษส่วนของขนาดตามทฤษฎี เพราะข้อผิดพลาดในการประมาณค่าในตัวส่วน (การพยากรณ์ความผันผวนของคุณ) และโดยเฉพาะอย่างยิ่งในตัวเศษ (ผลตอบแทนที่คาดหวัง) ทำให้การปรับขนาดแบบเต็มก้าวร้าวจนอันตราย

มีอีกสองความเชื่อมโยงที่ควรจดจำไว้ ประการแรก การกำหนดเป้าหมายความผันผวนปรับขนาดตามการกระจายตัวแบบสมมาตรของผลตอบแทน แต่ผลตอบแทนคริปโตไม่สมมาตร ต้นทุนของวันที่ลง 20% ไม่ใช่ภาพสะท้อนของวันที่ขึ้น 20% เมื่อมีเลเวอเรจและการบังคับขายเข้ามาเกี่ยวข้อง เราจัดการกับความไม่สมมาตรนี้โดยตรงใน ความไม่สมมาตรระหว่างขาดทุนกับกำไร และการพยากรณ์แบบ GJR/EGARCH (ส่วนที่ 2) ก็ได้ผสมส่วนหนึ่งของมันเข้าไปใน σ^t\hat\sigma_t แล้ว โดยตอบสนองต่อช็อกเชิงลบมากกว่า ประการที่สอง การพยากรณ์ความผันผวนคือการประมาณค่าจุดเดียว มุมมองความเสี่ยงที่สมบูรณ์กว่าจะแนบช่วง (interval) เข้าไปกับมัน การพยากรณ์แบบ conformal สำหรับการเทรด แสดงวิธีเปลี่ยนผลลัพธ์ของโมเดลให้เป็นช่วงที่ไม่ขึ้นกับการแจกแจงซึ่งคุณสามารถปรับขนาดตามได้ ซึ่งเข้าคู่กันได้อย่างเป็นธรรมชาติกับธีมการประเมินอย่างซื่อตรงของบทความนี้

คู่แข่ง สิ่งที่ GARCH ต้องเอาชนะ

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

เราเทียบเกณฑ์การพยากรณ์ความผันผวนช่วงถัดไปสี่ตัว

(ก) ความผันผวนที่เกิดขึ้นจริงย้อนหลัง (rolling standard deviation)

การพยากรณ์ที่ไร้เดียงสาที่สุด ความผันผวนของวันพรุ่งนี้เท่ากับส่วนเบี่ยงเบนมาตรฐานของตัวอย่างจากผลตอบแทนรายวัน nn วันล่าสุด

σ^tRV=1n1i=1n(rti+1rˉ)2\hat\sigma_{t}^{\text{RV}} = \sqrt{\frac{1}{n-1}\sum_{i=1}^{n}\bigl(r_{t-i+1}-\bar r\bigr)^2}

มันมีไฮเปอร์พารามิเตอร์เดียว (หน้าต่าง nn โดยทั่วไป 20-60 วัน) และไม่มีโมเดล ข้อบกพร่องของมันคือทุกการสังเกตในหน้าต่างได้รับน้ำหนักเท่ากัน แล้วก็ตกหน้าผาลงมาอย่างฉับพลันเมื่อมันออกไป นั่นคือปรากฏการณ์ "ghosting" หรือ "echo" ที่วันล่มสลายวันเดียวเป่าค่าพยากรณ์ให้พองขึ้นเป็นเวลา nn วันพอดี แล้วก็หายไปในชั่วข้ามคืน ไม่ว่าตลาดจะสงบลงจริงหรือไม่ก็ตาม

(ข) EWMA / RiskMetrics (λ=0.94\lambda = 0.94)

ค่าเฉลี่ยเคลื่อนที่ถ่วงน้ำหนักแบบเอ็กซ์โพเนนเชียลแก้ปัญหา echo โดยให้น้ำหนักที่ลดลงแบบเรขาคณิตแก่ผลตอบแทนกำลังสองที่เก่ากว่า

σ^t2=λσ^t12+(1λ)rt2\hat\sigma_{t}^{2} = \lambda\,\hat\sigma_{t-1}^{2} + (1-\lambda)\,r_{t}^{2}

นี่คือตัวประมาณค่า RiskMetrics (J.P. Morgan, 1996) ด้วยค่าตามหลักการ λ=0.94\lambda = 0.94 สำหรับข้อมูลรายวัน หน่วยความจำที่มีประสิทธิผลอยู่ที่ประมาณ 1/(1λ)171/(1-\lambda) \approx 17 วัน แต่การลดลงเป็นไปอย่างราบรื่น ไม่มีหน้าผา สังเกตว่า EWMA คืออะไรกันแน่ มันคือ integrated GARCH(1,1) ที่มี ω=0\omega = 0 และ α+β=1\alpha + \beta = 1 กล่าวคือ GARCH ที่ไม่มีการคืนสู่ค่าเฉลี่ยและไม่มีความแปรปรวนระยะยาว มันมีพารามิเตอร์อิสระ ศูนย์ ตัวหากคุณยอมรับ λ=0.94\lambda = 0.94 และมันเป็นเกณฑ์มาตรฐานที่แข็งแกร่งที่สุดตัวเดียวในบทความทั้งหมดนี้ งานวิจัยจำนวนมากที่บอกว่า "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")

รายละเอียดปลีกย่อยหนึ่งเดียวที่ทำให้คนสะดุด การพยากรณ์สำหรับช่วง tt (ใช้ได้ในการปรับขนาดตำแหน่งที่ถือข้าม tt) ต้องสร้างจากผลตอบแทนที่สังเกตได้ก่อน tt ในการเรียกซ้ำข้างต้น var[t] ใช้ r2[t-1] ดังนั้นชุดข้อมูลจึงเป็นการพยากรณ์ล่วงหน้าหนึ่งขั้นที่แท้จริง การจัดดัชนีนี้ให้ถูกต้องคือความแตกต่างระหว่างการทดสอบย้อนหลังกับจินตนาการ มีรายละเอียดเพิ่มเติมในส่วน walk-forward

(ค) GARCH(1,1) และ GJR-t (ส่วนที่ 1-2)

ตัวเอกของเรา GARCH(1,1) มาตรฐาน

σt2=ω+αϵt12+βσt12,ω>0, α,β0, α+β<1\sigma_t^2 = \omega + \alpha\, \epsilon_{t-1}^2 + \beta\,\sigma_{t-1}^2, \qquad \omega>0,\ \alpha,\beta\ge0,\ \alpha+\beta<1

โดยมีความแปรปรวนระยะยาว σˉ2=ω/(1αβ)\bar\sigma^2 = \omega/(1-\alpha-\beta) และการพยากรณ์ล่วงหน้าหนึ่งขั้นที่หลุดออกมาตรง ๆ จากการเรียกซ้ำ (ส่วนที่ 1) ส่วนขยาย GJR-GARCH เพิ่มพจน์เลเวอเรจเพื่อให้ช็อกเชิงลบยกความแปรปรวนขึ้นมากกว่าช็อกเชิงบวก

σt2=ω+(α+γ1[ϵt1<0])ϵt12+βσt12\sigma_t^2 = \omega + (\alpha + \gamma\, \mathbb{1}[\epsilon_{t-1}<0])\,\epsilon_{t-1}^2 + \beta\,\sigma_{t-1}^2

และเมื่อจับคู่กับนวัตกรรม Student-t เพื่อจัดการกับหางหนาของคริปโต นี่คือ GJR-t ของส่วนที่ 2 เหตุผลที่ GARCH สามารถ เอาชนะ EWMA ได้คือการคืนสู่ค่าเฉลี่ย หลังจากช็อก GARCH จะดึงการพยากรณ์กลับไปหา σˉ2\bar\sigma^2 ในอัตราที่ควบคุมโดย α+β\alpha+\beta ในขณะที่ EWMA (ซึ่งเป็น integrated) ไม่เคยคืนกลับ เมื่อความผันผวนพุ่งขึ้นแล้วกลับสู่ปกติ ซึ่งเป็นกรณีที่พบบ่อย การพยากรณ์ของ GARCH จะสลายกลับได้เร็วกว่าและแม่นยำกว่า เมื่อความผันผวนคงอยู่อย่างแท้จริง ทั้งสองก็แทบแยกไม่ออก

(ง) HAR-RV บนความแปรปรวนที่เกิดขึ้นจริง (หากคุณมีข้อมูลระหว่างวัน)

หากคุณมีแท่งข้อมูลระหว่างวัน และในตลาดคริปโตที่เปิด 24/7 คุณแทบจะมีเสมอ คุณสามารถสร้างตัวแทน (proxy) ความผันผวนที่มีสัญญาณรบกวนน้อยกว่าผลตอบแทนกำลังสองรายวันมาก นั่นคือ ความแปรปรวนที่เกิดขึ้นจริง (realized variance) ผลรวมของผลตอบแทนกำลังสองระหว่างวันตลอดทั้งวัน

RVt=i=1Mrt,i2(e.g. M=288 five-minute bars)RV_t = \sum_{i=1}^{M} r_{t,i}^2 \qquad (\text{e.g. } M = 288 \text{ five-minute bars})

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

RVt+1=β0+βdRVt+βwRVt(5)+βmRVt(22)+ut+1RV_{t+1} = \beta_0 + \beta_d\, RV_t + \beta_w\, \overline{RV}_t^{(5)} + \beta_m\, \overline{RV}_t^{(22)} + u_{t+1}

โดยที่ RVt(5)\overline{RV}_t^{(5)} และ RVt(22)\overline{RV}_t^{(22)} คือค่าเฉลี่ยย้อนหลัง 5 วันและ 22 วันของ RVRV รายวัน มันเป็นการถดถอย OLS ธรรมดา มันใช้ประโยชน์จากตัวแทนระหว่างวันที่มีคุณภาพสูงกว่า และมันมักเป็นตัวพยากรณ์ความผันผวนรายวันที่ดีที่สุดในสี่ตัว โดยมักเอาชนะ GARCH ได้พอดีเพราะ RVRV เป็นเป้าหมายที่สะอาดกว่า r2r^2

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 เนื่องจาก RVRV เบ้ขวาและเป็นบวกเสมอ ผู้ปฏิบัติจำนวนมากถดถอย logRVt+1\log RV_{t+1} บนฟีเจอร์ HAR แบบ log ซึ่งช่วยปรับปรุงการฟิตและรับประกันการพยากรณ์ที่เป็นบวก เมื่อคุณยกกำลังกลับ คุณควรเพิ่มการแก้ไข Jensen ครึ่งความแปรปรวน RV^=exp(y^+12σ^u2)\widehat{RV} = \exp(\hat{y} + \tfrac{1}{2}\hat\sigma_u^2) มิฉะนั้นคุณจะพยากรณ์ต่ำเกินไปอย่างเป็นระบบ

เมื่อมีตัวพยากรณ์สี่ตัวในมือ ได้แก่ RV, EWMA, GARCH/GJR-t, HAR คำถามจึงกลายเป็น เราจะตัดสินได้อย่างไรว่าตัวไหนดีที่สุด ในเมื่อเราไม่มีทางเห็นสิ่งที่ทั้งหมดกำลังพยายามทำนาย

การประเมินการพยากรณ์ความผันผวนอย่างซื่อตรง

นี่คือคำสอนหลักของบทความ ดังนั้นให้ช้าลงตรงนี้

คุณต้องการเปรียบเทียบการพยากรณ์ σ^t2\hat\sigma_t^2 กับความแปรปรวนแบบมีเงื่อนไขที่แท้จริง σt2\sigma_t^2 แต่ σt2\sigma_t^2 เป็นปริมาณ แฝง (latent) มันเป็นพารามิเตอร์ของกระบวนการสร้างข้อมูล ไม่มีทางสังเกตได้โดยตรง สิ่งที่คุณได้รับมีเพียงผลตอบแทนที่เกิดขึ้นจริงหนึ่งค่าต่อวัน ดังนั้นการประเมินความผันผวนทุกครั้งจึงเป็นการเปรียบเทียบการพยากรณ์ของคุณกับ ตัวแทน (proxy) ที่มีสัญญาณรบกวนของความจริงจริง ๆ ตัวแทนมาตรฐานสองตัว

  • ผลตอบแทนกำลังสอง rt2r_t^2 ไม่มีความเอนเอียงสำหรับ σt2\sigma_t^2 ภายใต้โมเดลค่าเฉลี่ยศูนย์ (E[rt2Ft1]=σt2\mathbb{E}[r_t^2 \mid \mathcal{F}_{t-1}] = \sigma_t^2) แต่มีสัญญาณรบกวนสูงมาก ผลตอบแทนรายวันหนึ่งค่าเป็นการประมาณส่วนเบี่ยงเบนมาตรฐานจากการสังเกตเดียว ตัวแทน rt2r_t^2 อาจเป็น 0 (วันที่ราบเรียบ) แม้ว่าความผันผวนที่แท้จริงจะสูง หรือมหาศาลในวันหางที่โชคดี
  • ความแปรปรวนที่เกิดขึ้นจริง RVtRV_t จากข้อมูลระหว่างวัน มีสัญญาณรบกวนน้อยกว่ามาก การสุ่มตัวอย่างระหว่างวันเฉลี่ยสัญญาณรบกวนจากผลตอบแทนเดียวที่เป็นเอกลักษณ์ออกไป ซึ่งเป็นเหตุผลว่าทำไม HAR-RV จึงใช้ได้ผลและทำไมคุณจึงควรใช้ RVRV เป็นตัวแทนของคุณหากคุณมีข้อมูลระหว่างวันเลย

รายละเอียดปลีกย่อยที่จับได้เกือบทุกคน เพราะตัวแทนมีสัญญาณรบกวน การเลือกฟังก์ชันการสูญเสียจึงไม่ใช่เรื่องไร้พิษภัย จัดอันดับการพยากรณ์สองตัวด้วยการสูญเสียที่ผิด และตัวแทนที่มีสัญญาณรบกวนสามารถพลิกอันดับได้ บอกคุณว่าการพยากรณ์ที่แย่กว่านั้นดีกว่า Patton (2011) คำนวณอย่างแม่นยำว่าฟังก์ชันการสูญเสียตัวไหน "ทนทาน (robust)" ในแง่ที่ว่าการจัดอันดับการพยากรณ์ด้วยการสูญเสียที่คาดหวังบนตัวแทนที่มีสัญญาณรบกวนให้อันดับ เดียวกัน กับที่คุณจะได้บนความแปรปรวนที่แท้จริง (ที่สังเกตไม่ได้) มีเพียงตระกูลเฉพาะเท่านั้นที่ผ่านเกณฑ์ สองสมาชิกมีความสำคัญในทางปฏิบัติ

MSE เทียบกับ QLIKE

ค่าคลาดเคลื่อนกำลังสองเฉลี่ยบนความแปรปรวน

LMSE(σ2,h)=(σ2h)2L_{\text{MSE}}(\sigma^2, h) = (\sigma^2 - h)^2

โดยที่ h=σ^2h = \hat\sigma^2 คือการพยากรณ์ และ σ2\sigma^2 ถูกแทนด้วย r2r^2 หรือ RVRV MSE ทนทานในแง่ของ Patton (อันดับของมันสอดคล้องกับตัวแทน) แต่มันสมมาตรและขึ้นอยู่กับสเกล มันลงโทษการพยากรณ์เกินและการพยากรณ์ต่ำที่มีขนาดสัมบูรณ์เท่ากันอย่างเท่าเทียม และมันถ่วงน้ำหนักข้อผิดพลาดในช่วงความผันผวนสูงอย่างมหาศาลมากกว่าข้อผิดพลาดในช่วงสงบ โมเดลที่แม่นยำ 95% ของวันที่สงบแต่ทำการพยากรณ์ความแปรปรวนพังในสามวันวิกฤตจะดูแย่มากภายใต้ MSE แม้ว่าพฤติกรรมในวิกฤตของมันจะเป็นสิ่งที่คุณต้องการจริง ๆ

การสูญเสีย QLIKE (quasi-likelihood) คือตัวเก่งงานหนัก

LQLIKE(σ2,h)=σ2hlogσ2h1L_{\text{QLIKE}}(\sigma^2, h) = \frac{\sigma^2}{h} - \log\frac{\sigma^2}{h} - 1

มันคือการสูญเสียที่บ่งชี้โดย Gaussian likelihood บนความแปรปรวน มันก็ทนทานในแง่ของ Patton เช่นกัน และมันมีคุณสมบัติสองประการที่ทำให้มันเป็นตัวเลือกที่นิยมสำหรับความผันผวน ประการแรก มัน ไม่สมมาตรในทิศทางที่ถูกต้อง มันลงโทษการทำนายต่ำของความแปรปรวนมากกว่าการทำนายเกิน สำหรับผู้จัดการความเสี่ยงหรือผู้กำหนดเป้าหมายความผันผวน นั่นคือความไม่สมมาตรที่ถูกต้อง การพยากรณ์ความผันผวนต่ำเกินไปหมายความว่าคุณรับขนาดมากเกินไปก่อนที่มันจะสำคัญ ซึ่งเป็นข้อผิดพลาดที่แพง ประการที่สอง มัน (โดยประมาณ) ไม่ขึ้นกับสเกล เพราะมันขึ้นอยู่กับอัตราส่วน σ2/h\sigma^2/h ข้อผิดพลาดการพยากรณ์ 10% จะเสียค่าใช้จ่ายพอ ๆ กันไม่ว่าจะเกิดในวันที่สงบหรือวันวิกฤต ดังนั้นการประเมินจึงไม่ถูกยึดโดยการสังเกตที่ความแปรปรวนสูงเพียงหยิบมือแบบที่ MSE เป็น ความทนทานต่อความไม่สม่ำเสมอของความแปรปรวน (heteroskedasticity) ของตัวแทนนี้คือสิ่งที่คุณต้องการพอดีเมื่อประเด็นทั้งหมดคือความผันผวนแปรผันอย่างรุนแรง

สังเกตว่า LQLIKE0L_{\text{QLIKE}} \ge 0 โดยเท่ากับศูนย์ก็ต่อเมื่อ h=σ2h = \sigma^2 ต่ำกว่าดีกว่า เช่นเดียวกับ 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 แตะศูนย์ ให้ตัดมันไว้ที่พื้นเล็ก ๆ เพราะ log0\log 0 จะทำให้ค่าเฉลี่ยทั้งหมดเป็นพิษ

การถดถอย Mincer-Zarnowitz

ตัวเลขการสูญเสียตัวเดียวบอกคุณว่าการพยากรณ์ตัวไหนดีกว่า แต่มันไม่บอกว่าการพยากรณ์ผิดอย่างไร การถดถอย Mincer-Zarnowitz (1969) ทำได้ ถดถอยตัวแทนบนการพยากรณ์

rt2  =  a+bσ^t2+ut.r_t^2 \;=\; a + b\,\hat\sigma_t^2 + u_t.

ภายใต้การพยากรณ์ที่เหมาะสมและไม่มีความเอนเอียง a=0a = 0 และ b=1b = 1 โดยเฉลี่ยความแปรปรวนที่เกิดขึ้นจริงเท่ากับการพยากรณ์ การเบี่ยงเบนวินิจฉัยพยาธิสภาพ

  • b<1b < 1 พร้อม a>0a > 0 ลายเซ็นคลาสสิกของการพยากรณ์ที่ผันผวนเกินไป มันตอบสนองมากเกินไป ทำนายค่าสุดขั้วที่ไม่ได้เกิดขึ้นเต็มที่ พบได้บ่อยมากสำหรับโมเดลที่ขับเคลื่อนด้วยผลตอบแทนกำลังสองดิบ
  • b>1b > 1 การพยากรณ์ตอบสนองน้อยเกินไป ปรับขนาดตามความแปรปรวนที่แท้จริงน้อยเกินไป
  • R2R^2 ของการถดถอยต่ำ แม้ว่า a,ba,b จะดูดีโดยเฉลี่ย การพยากรณ์ก็ติดตามความแปรปรวนได้แย่จากวันต่อวัน เพราะตัวแทนมีสัญญาณรบกวนมาก อย่าตกใจว่า MZ R2R^2 เทียบกับ r2r^2 มักอยู่ที่แค่ 0.05-0.20 เมื่อเทียบกับ RVRV มันจะสูงกว่ามาก ค่า R2R^2 เทียบกับ r2r^2 ถูกจำกัดไว้ต่ำกว่า 1 มากไม่ว่าการพยากรณ์จะดีแค่ไหน ล้วนเพราะสัญญาณรบกวนของตัวแทน

การทดสอบ FF ร่วมของ H0:(a,b)=(0,1)H_0: (a,b) = (0,1) ให้การตรวจสอบการปรับเทียบอย่างเป็นทางการ ในทางปฏิบัติ ใช้ MZ เป็นเครื่องมือวินิจฉัยเพื่อทำความเข้าใจการพยากรณ์ และใช้ QLIKE เพื่อจัดอันดับการพยากรณ์

Diebold-Mariano ความแตกต่างนั้นจริงหรือไม่

สมมติว่า QLIKE เฉลี่ยของ GARCH คือ 0.183 และของ EWMA คือ 0.191 GARCH "ชนะ" แต่ 0.008 เป็นความได้เปรียบที่จริงหรือสัญญาณรบกวนจากการสุ่ม การทดสอบ Diebold-Mariano (1995) ตอบคำถามนี้พอดี นิยามค่าส่วนต่างการสูญเสียต่อช่วง

dt=L(proxyt,htA)L(proxyt,htB)d_t = L(\text{proxy}_t, h^A_t) - L(\text{proxy}_t, h^B_t)

สำหรับการพยากรณ์สองตัว AA และ BB (ที่นี่ LL = QLIKE) สมมติฐานว่างคือความแม่นยำในการทำนายเท่ากัน H0:E[dt]=0H_0: \mathbb{E}[d_t] = 0 สถิติคือค่าส่วนต่างเฉลี่ยที่ทำให้เป็นมาตรฐานด้วยค่าคลาดเคลื่อนมาตรฐานระยะยาว (HAC) ของมัน เพราะ dtd_t มีสหสัมพันธ์เชิงอนุกรม

DM=dˉLRV^(dt)/T  d  N(0,1)\text{DM} = \frac{\bar d}{\sqrt{\widehat{\mathrm{LRV}}(d_t)/T}} \;\xrightarrow{d}\; \mathcal{N}(0,1)

โดยที่ LRV^\widehat{\mathrm{LRV}} คือการประมาณความแปรปรวนระยะยาวแบบ Newey-West สถิติ DM ที่เกิน ±1.96\pm 1.96 ปฏิเสธความแม่นยำเท่ากันที่ระดับ 5% สิ่งสำคัญคือ DM เป็นการทดสอบเกี่ยวกับการพยากรณ์ ไม่ใช่โมเดลซ้อน และมันจัดการการพึ่งพาเชิงอนุกรมในชุดการสูญเสียที่การทดสอบ tt แบบไร้เดียงสาบน dtd_t จะเพิกเฉย

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 อย่างเดียว กำหนดเป้าหมายความผันผวน ในแต่ละวัน พยากรณ์ความผันผวนของวันถัดไป ตั้งตำแหน่งเป็น wt=min(σtarget/σ^t, wmax)w_t = \min(\sigma_{\text{target}}/\hat\sigma_t,\ w_{\max}) ถือข้ามคืน และทำซ้ำ ตัวแปรแบบ long/flat จะปิดตำแหน่งเมื่อตัวกรองแนวโน้มเป็นลบ ตัวแปรแบบพอร์ตเล็กจะปรับขนาดตามเมทริกซ์ความแปรปรวนร่วม DCC จาก ส่วนที่ 3 แทนความแปรปรวนของสินทรัพย์เดี่ยว เราจะอธิบายกรณี long อย่างเดียวโดยละเอียดและกล่าวถึงส่วนขยาย

กลไก walk-forward และสัญญาไม่มองไปข้างหน้า

คุณสมบัติสำคัญที่สุดของการทดสอบย้อนหลังนี้คือ ทุกปริมาณที่ใช้ปรับขนาดตำแหน่งในวัน t+1t+1 คำนวณได้โดยใช้เฉพาะข้อมูลที่มีอยู่ ณ เวลาปิดของวัน tt เท่านั้น พารามิเตอร์ GARCH ถูกประมาณค่าใหม่บนหน้าต่างเลื่อนที่สิ้นสุดที่ tt การพยากรณ์คือ σ^t+1\hat\sigma_{t+1} ล่วงหน้าหนึ่งขั้นจากการฟิตนั้น ตำแหน่งตั้งจากการพยากรณ์นั้น และผลตอบแทนที่ได้รับคือ wt+1rt+1w_{t+1} r_{t+1} โดยที่ rt+1r_{t+1} คือผลตอบแทนของวันถัดไป ซึ่งโมเดลไม่เคยเห็น การฟิต 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) ในขณะที่พยากรณ์รายวัน (การเรียกซ้ำอัปเดต σt2\sigma_t^2 จากผลตอบแทนใหม่แม้ไม่มีการฟิตใหม่) คือการประนีประนอมมาตรฐาน สิ่งนี้สะท้อนคำแนะนำเรื่องการแคชจากไปป์ไลน์ copula ใน โมเดล copula สำหรับความเสี่ยงร่วม
  • เพดาน wmaxw_{\max} ไม่ใช่แค่เครื่องสำอาง เมื่อความผันผวนที่พยากรณ์ยุบตัวในระบอบสงบนิ่ง σtarget/σ^t\sigma_{\text{target}}/\hat\sigma_t สามารถระเบิดเป็นเลเวอเรจ 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 (λ=0.94\lambda=0.94) 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 สำหรับบัญชีที่มีสินทรัพย์หลายตัว การพยากรณ์สเกลาร์ σ^t\hat\sigma_t จะกลายเป็นความผันผวนของพอร์ต wΣtw\sqrt{w^\top \Sigma_t w} โดยที่ Σt\Sigma_t คือเมทริกซ์ความแปรปรวนร่วมที่แปรผันตามเวลาจาก DCC-GARCH ของ ส่วนที่ 3 คุณเลือกน้ำหนักฐาน w0w_0 (น้ำหนักเท่ากัน มูลค่าตลาด หรือการเอียงแบบ mean-variance) คำนวณความผันผวนที่พยากรณ์ของพอร์ตภายใต้ Σt\Sigma_t และปรับขนาดเวกเตอร์น้ำหนักทั้งหมดเพื่อให้แตะเป้าหมายของพอร์ต

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

นี่คือสะพานธรรมชาติสู่วรรณกรรมการสร้างพอร์ต น้ำหนักฐาน w0w_0 สามารถมาจาก 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 หลายขั้นคืนสู่ค่าเฉลี่ยเข้าหา σˉ2\bar\sigma^2 ซึ่งการปรับสเกลแบบไร้เดียงสา "hdaily\sqrt{h}\cdot\text{daily}" เพิกเฉย ส่วนที่ 1 ครอบคลุมการพยากรณ์ GARCH หลายขั้น
  • การแปลงเป็นรายปีในตลาด 24/7 คริปโตเทรด 365 วันต่อปีโดยไม่มีวันหยุดสุดสัปดาห์หรือวันหยุดนักขัตฤกษ์ ดังนั้นให้แปลงความผันผวนรายวันเป็นรายปีด้วย 365\sqrt{365} ไม่ใช่ 252\sqrt{252} จากตราสารทุน การทำสิ่งนี้ผิดจะปรับสเกลเป้าหมายของคุณผิดไปเงียบ ๆ ประมาณ 20%
  • ตัวส่วนสามารถเป็นเมทริกซ์ความแปรปรวนร่วมได้ สำหรับบัญชีหลายสินทรัพย์ ให้แทนสเกลาร์ σ^t\hat\sigma_t ด้วยความผันผวนของพอร์ต wΣtw\sqrt{w^\top \Sigma_t w} จาก DCC-GARCH ของ ส่วนที่ 3 และปรับขนาดเวกเตอร์น้ำหนักทั้งหมดเพื่อแตะความผันผวนเป้าหมายของพอร์ต สิ่งนี้เชื่อมโยงการกำหนดเป้าหมายความผันผวนกับการปรับขนาดแบบ mean-variance (Markowitz สำหรับคริปโต) และการจัดสรรที่อิงความเสี่ยง (ไปป์ไลน์ HRP และ CVaR) การกำหนดเป้าหมายความผันผวนคือกรณีพิเศษของสินทรัพย์เดี่ยวในการปรับขนาดสู่งบความเสี่ยงของพอร์ต
  • การกำหนดเป้าหมายความผันผวนเป็น procyclical ในแบบที่แยบยล เมื่อทุกคนรันกฎ 1/σ1/\sigma เดียวกัน การพุ่งของความผันผวนบังคับการถอนเลเวอเรจแบบพร้อมเพรียง ซึ่งดันราคาลง ซึ่งยกความผันผวนที่เกิดขึ้นจริงขึ้น ซึ่งบังคับการถอนเลเวอเรจมากขึ้น ผลป้อนกลับนี้ (มีเอกสารบันทึกไว้อย่างดีใน "volmageddon" ปี 2018 และการถอนเลเวอเรจคริปโตต่าง ๆ) หมายความว่ากฎใช้ได้ผลน้อยลงพอดีเมื่อผู้เล่นจำนวนมากใช้มัน มันไม่ใช่เหตุผลที่จะละทิ้งมัน แต่เป็นเหตุผลที่จะใส่เพดานเลเวอเรจและไม่สมมติว่าการ fill ของคุณระหว่างการพุ่งของความผันผวนจะคล้ายการ fill ในตลาดสงบ
  • ตั้งพื้นและตัดการพยากรณ์ ความผันผวนที่พยากรณ์เป็นศูนย์หรือใกล้ศูนย์ให้เลเวอเรจอนันต์ ให้ตั้งพื้น σ^t\hat\sigma_t ที่ค่าต่ำสุดที่สมเหตุสมผลเสมอและใส่เพดานตำแหน่ง และบันทึกว่าแต่ละตัวผูกพันบ่อยแค่ไหน หากเพดานผูกพันเกือบตลอดเวลา เป้าหมายของคุณก้าวร้าวเกินไปสำหรับสินทรัพย์นั้น

สรุป

  • การพยากรณ์ความผันผวนไม่มีคุณค่าจนกว่ามันจะเปลี่ยนการตัดสินใจ การกำหนดเป้าหมายความผันผวน ซึ่งปรับขนาดการเปิดรับความเสี่ยงเป็น wt=σtarget/σ^tw_t = \sigma_{\text{target}}/\hat\sigma_t (พร้อมเพดาน) คือการทดสอบคุณค่าของการพยากรณ์ที่สะอาดที่สุด เพราะคุณภาพการพยากรณ์จับคู่โดยตรงกับโปรไฟล์ความผันผวนที่เกิดขึ้นจริงที่ราบเรียบกว่าและ Sharpe ที่สูงกว่า
  • การกำหนดเป้าหมายความผันผวนยกผลตอบแทนที่ปรับด้วยความเสี่ยง และโดยเฉพาะควบคุม drawdown เพราะความผันผวนพยากรณ์ได้ (มันเกาะกลุ่ม) ในขณะที่ทิศทางไม่ได้ และเพราะ Sharpe ratio ตกในระบอบความผันผวนสูงที่กฎให้น้ำหนักน้อยลงโดยอัตโนมัติ มันคือการปรับขนาดแบบ Kelly ภายใต้สมมติฐานว่าผลตอบแทนที่คาดหวังปรับขนาดตามความผันผวน
  • เทียบ GARCH อย่างซื่อตรงกับเกณฑ์มาตรฐานที่แข็งแกร่ง realized vol แบบเลื่อน EWMA/RiskMetrics (λ=0.94\lambda=0.94 ซึ่งเป็น IGARCH ที่มีพารามิเตอร์อิสระศูนย์ตัว) และ HAR-RV บนตัวแทนความแปรปรวนที่เกิดขึ้นจริงระหว่างวัน EWMA และ HAR เอาชนะได้ยาก
  • คุณไม่สามารถสังเกตความผันผวนที่แท้จริง ดังนั้นให้ประเมินเทียบกับตัวแทน (r2r^2 หรือดีกว่ามากคือ RVRV) โดยใช้ ฟังก์ชันการสูญเสียที่ทนทานต่อสัญญาณรบกวนของตัวแทน เลือก 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

การวิจัยและกลยุทธ์เชิงปริมาณ

พูดคุยใน Telegram
Newsletter

ก้าวนำหน้าตลาด

สมัครรับจดหมายข่าวของเราเพื่อรับข้อมูลเชิงลึกการเทรดด้วย AI เฉพาะ การวิเคราะห์ตลาด และการอัปเดตแพลตฟอร์ม

เราเคารพความเป็นส่วนตัวของคุณ ยกเลิกการสมัครได้ทุกเมื่อ