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

GARCH แบบไม่สมมาตรและหางหนา: EGARCH, GJR และ Student-t

#volatility
#GARCH
#EGARCH
#risk
#VaR
#crypto
#algorithmic-trading

ใน ตอนที่ 1 ของซีรีส์นี้ เราสร้าง GARCH(1,1) ขึ้นมาตั้งแต่พื้นฐาน: สัญชาตญาณเรื่อง volatility clustering, สมการวนซ้ำของ conditional variance, การประมาณค่าด้วย maximum likelihood, การพยากรณ์ และการวินิจฉัยเรซิดวลมาตรฐานด้วยไลบรารี arch หากยังไม่ได้อ่าน ให้เริ่มจากบทความนั้นก่อน — บทความนี้สมมติว่าคุณสามารถ fit และตีความ GARCH(1,1) ธรรมดาได้แล้ว และจะไม่อธิบายพื้นฐานซ้ำ

GARCH(1,1) ธรรมดาเป็น baseline ที่ดี แต่เป็นคำตอบสุดท้ายที่ไม่ดี มันมีข้อบกพร่องเชิงโครงสร้างสองอย่างที่มองข้ามได้ง่ายในการทำ backtest แต่มีราคาแพงเมื่อใช้เงินทุนจริง อย่างแรกคือมัน สมมาตร: โมเดลตอบสนองต่อวันที่ +5%+5\% เหมือนกับวันที่ 5%-5\% ทุกประการ เพราะช็อกเข้าสู่สมการวนซ้ำของ variance ผ่านค่ากำลังสองเท่านั้น คือ εt12\varepsilon_{t-1}^2 การยกกำลังสองทำให้เครื่องหมายหายไป อย่างที่สองคือมันสมมติว่ามี Gaussian innovations: แม้หลังจาก GARCH ดูดซับ volatility clustering ไปแล้ว standardized residuals ของ BTC และ ETH ก็ยังแสดงหางหนาให้เห็นชัดเจน และ likelihood แบบเกาส์เซียนตีราคาหางต่ำกว่าความเป็นจริงอย่างเป็นระบบ VaR 99% แบบ GARCH(1,1)-Normal จะถูกทะลุบ่อยกว่า 1% ของเวลามาก

บทความนี้แก้ไขข้อบกพร่องทั้งสองอย่าง เราจะเพิ่ม ความไม่สมมาตร ด้วย GJR-GARCH และ EGARCH และเพิ่ม หางหนา ด้วย innovations แบบ Student-tt และ skewed-tt ของ Hansen จากนั้นเราจะทำสิ่งที่จ่ายค่าเช่าได้จริง: แปลง conditional distribution ที่ fit แล้วให้เป็นการพยากรณ์ Value-at-Risk และ Expected Shortfall แบบ one-step และทำการ backtest การพยากรณ์นั้นอย่างตรงไปตรงมาด้วย Kupiec test และ Christoffersen test โมเดล volatility ที่ไม่เคยผ่านการทดสอบความเสี่ยงก็เป็นแค่ของประดับ

Leverage Effect และเหตุผลที่คริปโตยุ่งเหยิงกว่า

ในตลาดหุ้น ความไม่สมมาตรนี้มีชื่อและมีเรื่องราวของมัน leverage effect (Black, 1976): เมื่อราคาหุ้นของบริษัทตก อัตราส่วนหนี้สินต่อทุนจะเพิ่มขึ้น ทำให้ equity มีความเสี่ยงสูงขึ้นเชิงกลไก และ volatility ก็เพิ่มขึ้นตาม ข่าวร้ายทำให้ volatility ในอนาคตเพิ่มขึ้นมากกว่าข่าวดีขนาดเท่ากัน ในเชิงประจักษ์นี่คือหนึ่งใน stylized facts ที่แข็งแกร่งที่สุดในวรรณกรรมเรื่อง volatility ของตลาดหุ้น

คริปโตไม่มี equity และไม่มี leverage ในงบดุลแบบบริษัท แต่ความไม่สมมาตรคล้าย leverage effect ก็ยังปรากฏให้เห็นในส่วนใหญ่ — ขับเคลื่อนโดยการ deleverage แบบบังคับมากกว่าเรื่องบัญชี เมื่อ BTC ร่วงแรง สินเชื่อที่ over-collateralized จะถูก liquidate โพซิชัน long ของ perpetual futures ถูกบังคับปิด funding พลิกกลับ และปรากฏการณ์ลูกโซ่นี้ก็ป้อน volatility เข้าไปอีก ดังนั้นกลไกจึงต่างกัน แต่เครื่องหมายมักจะสอดคล้องกับตลาดหุ้น: การเคลื่อนไหวขาลงมักทำให้ volatility พุ่งมากกว่า

ข้อควรระวังที่สำคัญ: คริปโต ยุ่งเหยิงกว่า และคุณควรมองความไม่สมมาตรเป็นคำถามเชิงประจักษ์มากกว่ากฎตายตัว การเคลื่อนไหว ขาขึ้น ที่รุนแรง — short squeeze, การพุ่งขึ้นจาก leverage, ช่องว่างราคาจากการอนุมัติ ETF — ก็สามารถทำให้ realized volatility พุ่งได้เช่นกัน ขึ้นอยู่กับสินทรัพย์และช่วงเวลาตัวอย่าง ความไม่สมมาตรที่ประมาณได้อาจแข็งแกร่ง อ่อนแอ หรือบางครั้งมีเครื่องหมาย "ผิด" ก็ได้ วินัยที่บทความนี้ยืนกรานคือ: fit โมเดลไม่สมมาตร ดูว่าพารามิเตอร์ความไม่สมมาตรมีนัยสำคัญทางสถิติและมีทิศทางตามที่คาดหรือไม่ และเก็บพารามิเตอร์เพิ่มนั้นไว้ก็ต่อเมื่อมันคุ้มค่าจริงเท่านั้น อย่าสมมติว่าเรื่องราวจากตลาดหุ้นจะถ่ายโอนมาได้เอง ต้องทดสอบ

ทดสอบความไม่สมมาตรก่อนสร้างโมเดล

ข้อสรุปข้างต้นบอกว่า "มองความไม่สมมาตรเป็นเรื่องเชิงประจักษ์" — ดังนั้นก่อน fit โมเดลไม่สมมาตร ควรรันการทดสอบเชิงรูปนัยที่ต้นทุนต่ำเพื่อดูว่ามีความไม่สมมาตรอยู่จริงหรือไม่ Engle-Ng sign-bias tests (1993) ทำสิ่งนี้ได้พอดี ให้ fit GARCH(1,1) แบบสมมาตรก่อน นำ squared standardized residuals zt2z_t^2 มา regress กับตัวบ่งชี้เครื่องหมายและขนาดของช็อกก่อนหน้า:

zt2=a0+a1St1+a2St1εt1+a3St1+εt1+utz_t^2 = a_0 + a_1 S_{t-1}^- + a_2 S_{t-1}^- \varepsilon_{t-1} + a_3 S_{t-1}^+ \varepsilon_{t-1} + u_t

โดยที่ St1=1{εt1<0}S_{t-1}^- = \mathbf{1}\{\varepsilon_{t-1} < 0\} และ St1+=1St1S_{t-1}^+ = 1 - S_{t-1}^- ตรรกะคือ: ถ้าโมเดลสมมาตรจับทุกอย่างได้หมดแล้ว เครื่องหมายและขนาดของช็อกเมื่อวานไม่ควรทำนาย squared residual ของวันนี้ได้ ดังนั้น a1=a2=a3=0a_1 = a_2 = a_3 = 0 การทดสอบ tt แบบรายตัวคือ sign-bias (a1a_1), negative-size-bias (a2a_2) และ positive-size-bias (a3a_3) ส่วนการทดสอบ FF ร่วมกันทั้งสามตัวคือ omnibus test ค่า a1a_1 หรือ a2a_2 ที่มีนัยสำคัญบ่งบอกว่าช็อกเชิงลบถูกโมเดลสมมาตรตีราคาผิดอย่างเป็นระบบ — เป็นสัญญาณว่า GJR หรือ EGARCH จะช่วยได้

import statsmodels.api as sm

def sign_bias_test(symmetric_res):
    """Engle-Ng sign-bias tests on a fitted symmetric GARCH result."""
    z = symmetric_res.std_resid.dropna()
    z2 = (z ** 2).values[1:]
    eps_lag = z.values[:-1]                      # standardized shock proxy
    neg = (eps_lag < 0).astype(float)
    X = np.column_stack([
        np.ones_like(eps_lag),                   # intercept
        neg,                                     # sign bias
        neg * eps_lag,                           # negative size bias
        (1 - neg) * eps_lag,                     # positive size bias
    ])
    ols = sm.OLS(z2, X).fit()
    names = ["const", "sign_bias", "neg_size_bias", "pos_size_bias"]
    for nm, coef, t, p in zip(names, ols.params, ols.tvalues, ols.pvalues):
        print(f"{nm:16s} coef={coef:+.4f}  t={t:+.2f}  p={p:.3f}")
    print(f"Joint F p-value: {ols.f_pvalue:.4f}")
    return ols

sign_bias_test(models["GARCH-N"])

ถ้าการทดสอบ FF ร่วมไม่มีนัยสำคัญ คุณมีสิทธิ์เชิงประจักษ์ที่จะคงความสมมาตรไว้และประหยัดพารามิเตอร์สองตัว แต่ถ้ามีนัยสำคัญ — ซึ่งเป็นผลลัพธ์ทั่วไปสำหรับ BTC/ETH — ก็ไปต่อที่ GJR/EGARCH ได้อย่างสบายใจ เพราะรู้ว่ากำลังโมเดลคุณลักษณะที่มีอยู่จริง ไม่ใช่ไล่ตาม noise นี่คือวินัยเชิงประจักษ์ที่กล่าวไว้ข้างต้น: อย่าสมมติเรื่องราว leverage จากตลาดหุ้น ต้องทดสอบมัน

GJR-GARCH: ความไม่สมมาตรผ่านเทอมเกณฑ์ขีดแบ่ง (Threshold)

โมเดล Glosten-Jagannathan-Runkle (1993) — บางครั้งเรียก TGARCH หรือ threshold GARCH — เป็นการปรับแก้ที่เล็กที่สุดเท่าที่จะเป็นไปได้จาก GARCH(1,1) ที่ทำให้ข่าวร้ายและข่าวดีมีผลต่างกัน ทบทวนสมการวนซ้ำของ conditional variance แบบสมมาตรจากตอนที่ 1:

σt2=ω+αεt12+βσt12\sigma_t^2 = \omega + \alpha\,\varepsilon_{t-1}^2 + \beta\,\sigma_{t-1}^2

GJR เพิ่มเทอมเกณฑ์ขีดแบ่งหนึ่งตัว: variance ส่วนเพิ่มที่เปิดใช้งานเฉพาะหลังช็อกเชิงลบ

σt2=ω+αεt12+γIt1εt12+βσt12\sigma_t^2 = \omega + \alpha\,\varepsilon_{t-1}^2 + \gamma\,I_{t-1}\,\varepsilon_{t-1}^2 + \beta\,\sigma_{t-1}^2

โดยที่ It1I_{t-1} คือตัวบ่งชี้

It1={1if εt1<00if εt10I_{t-1} = \begin{cases} 1 & \text{if } \varepsilon_{t-1} < 0 \\ 0 & \text{if } \varepsilon_{t-1} \geq 0 \end{cases}

อ่านสมการวนซ้ำนี้ตามกรณี หลังจากช็อก บวก (εt10\varepsilon_{t-1} \geq 0) ตัวบ่งชี้เป็นศูนย์ ผลกระทบของ squared shock ต่อ variance งวดถัดไปจึงเป็นแค่ α\alpha หลังจากช็อก ลบ ตัวบ่งชี้เป็นหนึ่ง และผลกระทบคือ α+γ\alpha + \gamma พารามิเตอร์ γ\gamma คือเรื่องราวความไม่สมมาตรทั้งหมดในตัวเลขเดียว:

  • γ>0\gamma > 0: ช็อกเชิงลบทำให้ volatility เพิ่มขึ้นมากกว่าช็อกเชิงบวกที่ขนาดเท่ากัน นี่คือ leverage effect และเป็นสิ่งที่คุณคาดว่าจะพบใน BTC/ETH ในส่วนใหญ่
  • γ=0\gamma = 0: โมเดลยุบกลับเป็น GARCH(1,1) แบบสมมาตร การทดสอบ likelihood-ratio หรือ tt-test บน γ\gamma จึงเป็นการทดสอบโดยตรงว่า ความไม่สมมาตรมีอยู่จริงหรือไม่
  • γ<0\gamma < 0: ช็อกเชิงบวกทำให้ volatility เพิ่มขึ้นมากกว่า — ภาวะ melt-up ของคริปโตที่เกิดขึ้นเป็นครั้งคราว หายาก แต่อย่าตัดทิ้งไปก่อนล่วงหน้า

เงื่อนไขความไม่ติดลบและ Stationarity

เนื่องจาก σt2\sigma_t^2 ยังคงถูกสร้างแบบบวกรวมกัน เราจึงต้องให้แต่ละเทอมไม่ติดลบ เงื่อนไขความไม่ติดลบที่เพียงพอคือ

ω>0,α0,α+γ0,β0.\omega > 0, \quad \alpha \geq 0, \quad \alpha + \gamma \geq 0, \quad \beta \geq 0.

สังเกตว่า γ\gamma เองสามารถติดลบได้ตราบใดที่ α+γ0\alpha + \gamma \geq 0 ดังนั้นผลกระทบหลังข่าวร้ายจะไม่มีวันติดลบ

สำหรับ covariance stationarity ให้สมมติว่า innovations zt=εt/σtz_t = \varepsilon_t/\sigma_t ถูกทำให้เป็นมาตรฐานด้วยการแจกแจงแบบสมมาตรรอบศูนย์ ดังนั้น P(εt1<0)=1/2P(\varepsilon_{t-1} < 0) = 1/2 และตัวบ่งชี้มีส่วนสนับสนุนเฉลี่ยเท่ากับ γ/2\gamma/2 เงื่อนไข stationarity จึงกลายเป็น

α+β+12γ<1.\alpha + \beta + \tfrac{1}{2}\gamma < 1.

variance ระยะยาว (unconditional) คือ

σˉ2=ω1αβ12γ.\bar{\sigma}^2 = \frac{\omega}{1 - \alpha - \beta - \tfrac{1}{2}\gamma}.

นี่คือรูปแบบ GJR ที่เทียบเท่ากับผลลัพธ์ในตอนที่ 1 คือ σˉ2=ω/(1αβ)\bar{\sigma}^2 = \omega/(1-\alpha-\beta) โดยมีเทอม 12γ\tfrac{1}{2}\gamma เพิ่มเข้ามาเพื่ออธิบายส่วนสนับสนุนเฉลี่ยของ leverage half-life ถ้าการแจกแจงของ innovation มีความเบ้ (skew-tt ของ Hansen ด้านล่าง) ค่า 1/21/2 จะถูกแทนที่ด้วยความน่าจะเป็นจริงที่ zt<0z_t < 0 แต่ 1/21/2 เป็นค่าอ้างอิงมาตรฐานที่ใช้รายงาน persistence

EGARCH: โมเดล log-Variance ไม่มีข้อจำกัดเรื่องความไม่ติดลบ

GJR ยังคงบังคับให้คุณอยู่ในกรอบข้อจำกัดความไม่ติดลบของ variance: ทุกชุดค่าพารามิเตอร์ต้องถูกตรวจสอบกับ inequality constraints ซึ่งน่ารำคาญระหว่างการ optimize และแย่กว่านั้นระหว่างการ re-estimate แบบ rolling เมื่อ window บางครั้งหลุดเข้าไปในพื้นที่ที่ไม่เป็นไปได้ Exponential GARCH ของ Nelson (1991) หลีกเลี่ยงปัญหานี้ทั้งหมดด้วยการโมเดล ลอการิทึม ของ conditional variance เนื่องจาก logσt2\log \sigma_t^2 เป็นจำนวนจริงใดก็ได้ ค่า σt2=exp(logσt2)\sigma_t^2 = \exp(\log \sigma_t^2) จึงเป็นบวกโดยอัตโนมัติไม่ว่าพารามิเตอร์จะเป็นอย่างไร ไม่มีข้อจำกัดที่ต้องกำหนด

เขียนสมการวนซ้ำในรูปของ standardized innovation zt1=εt1/σt1z_{t-1} = \varepsilon_{t-1}/\sigma_{t-1}:

logσt2=ω+βlogσt12+α(zt1Ezt1)+γzt1\log \sigma_t^2 = \omega + \beta \log \sigma_{t-1}^2 + \alpha\bigl(|z_{t-1}| - \mathbb{E}|z_{t-1}|\bigr) + \gamma\, z_{t-1}

มีสองเทอมที่รับผิดชอบเรื่องช็อก และการแยกทั้งสองนี้คือแนวคิดหลัก:

  • เทอม ขนาด α(zt1Ezt1)\alpha(|z_{t-1}| - \mathbb{E}|z_{t-1}|) ตอบสนองต่อ ขนาด ของช็อก โดยตัดเครื่องหมายทิ้ง การลบ Ezt1\mathbb{E}|z_{t-1}| ออกทำให้เทอมนี้อยู่ตรงกลาง ดังนั้นช็อกที่มีขนาดเฉลี่ยจะไม่มีส่วนสนับสนุนเลย สำหรับการแจกแจงปกติมาตรฐาน Ez=2/π0.7979\mathbb{E}|z| = \sqrt{2/\pi} \approx 0.7979; สำหรับ standardized Student-tt ค่าคาดหวังของค่าสัมบูรณ์จะเล็กกว่าและขึ้นกับ ν\nu แต่ arch จัดการเรื่องนี้ให้ภายในตัว
  • เทอม เครื่องหมาย γzt1\gamma\, z_{t-1} คือความไม่สมมาตร มันเป็นฟังก์ชันเชิงเส้นของ signed innovation ดังนั้น zt1z_{t-1} ที่เป็นลบจะผลัก logσt2\log\sigma_t^2 ไปในทิศทางตรงข้ามกับที่เป็นบวก

ข้อตกลงเรื่องเครื่องหมายสำคัญมากและทำให้คนสับสนได้ง่าย ใน parameterization นี้ leverage effect (ข่าวร้ายเพิ่ม volatility) สอดคล้องกับ γ<0\gamma < 0: ช็อกเชิงลบ zt1<0z_{t-1} < 0 จะทำให้ γzt1>0\gamma z_{t-1} > 0 ซึ่งเพิ่ม log-variance นี่เป็นเครื่องหมายตรงข้ามกับ γ>0\gamma > 0 ของ GJR ต้องอ่านเอกสารของโมเดลเองเพื่อดูข้อตกลงเสมอ อย่าสมมติเอาเอง arch รายงาน EGARCH ตามเครื่องหมายของตัวมันเอง และเราจะตรวจสอบมันกับ news impact curve ด้านล่างแทนที่จะเชื่อความจำของเรา

เนื่องจากทุกอย่างเป็นการบวกรวมกันในสเกล log persistence ของ EGARCH(1,1) จึงถูกกำหนดโดยสัมประสิทธิ์ autoregressive ตัวเดียวคือ β\beta บน logσt12\log\sigma_{t-1}^2; stationarity ต้องการเพียง β<1|\beta| < 1 นี่เป็นเงื่อนไขที่สะอาดกว่า inequality ของ GJR มาก และเป็นข้อได้เปรียบเชิงปฏิบัติจริงเมื่อคุณ refit บน rolling windows

ข้อสังเกตที่ควรกล่าวถึง: การตอบสนองต่อช็อกของ EGARCH เป็นแบบ เอกซ์โพเนนเชียล ในตัวแปร innovation (คุณ exponentiate ในขั้นตอนสุดท้าย) ในขณะที่ GJR เป็นแบบกำลังสอง EGARCH จึงตอบสนองต่อช็อกขนาดใหญ่รุนแรงกว่า — เป็นข้อดีในคริปโตที่เหตุการณ์หางคือสิ่งที่สำคัญ แต่ก็เป็นเหตุผลที่ EGARCH บางครั้งอาจให้การพยากรณ์ variance ที่ใหญ่เกินจริงหลังวันที่มี outlier ไม่มีโมเดลไหนดีกว่าอีกอันเสมอไป คุณต้องเลือกโดยดูจาก out-of-sample fit และ risk backtest ซึ่งเป็นประเด็นหลักของซีรีส์นี้ทั้งหมด

News Impact Curve

วิธีที่ชัดเจนที่สุดในการ เห็น ความแตกต่างระหว่าง GARCH สมมาตร, GJR และ EGARCH คือ news impact curve (Engle and Ng, 1993): ตรึง σt1\sigma_{t-1} ไว้ที่ระดับระยะยาว แล้ว plot conditional variance งวดถัดไป σt2\sigma_t^2 เป็นฟังก์ชันของช็อกล่าสุด εt1\varepsilon_{t-1} มันตอบคำถามว่า "เมื่อได้รับช็อกขนาดและเครื่องหมายแบบนี้ โมเดลจะเพิ่ม volatility ของวันพรุ่งนี้มากแค่ไหน"

  • GARCH สมมาตร ให้ พาราโบลาสมมาตร ที่มีจุดศูนย์กลางอยู่ที่ศูนย์ ช็อก 5%-5\% และ +5%+5\% ตกอยู่ที่ความสูงเดียวกัน นี่คือข้อบกพร่องที่เรากำลังแก้ไขพอดี
  • GJR ให้ พาราโบลาที่มีจุดหักที่ศูนย์ — ชันกว่าทางด้านซ้าย (ช็อกเชิงลบ) มากกว่าทางขวาเมื่อ γ>0\gamma > 0 ครึ่งสองข้างมีความโค้งเป็น α+γ\alpha+\gamma และ α\alpha ตามลำดับ
  • EGARCH ให้ รูปตัว V แบบไม่สมมาตรและเอกซ์โพเนนเชียล: สองแขนมีความชันต่างกันเพราะเทอม γz\gamma z และทั้งหมดโค้งขึ้นเร็วกว่าพาราโบลาเพราะการ exponentiate ในขั้นสุดท้าย

เราจะ plot ทั้งสามแบบจากพารามิเตอร์ที่ fit แล้วในภายหลัง ในส่วนการทำงานจริง — เป็นการวินิจฉัยที่มีประโยชน์ที่สุดในการสื่อสารว่าความไม่สมมาตรให้อะไรกับคุณ

หางหนา: Innovations แบบ Student-t และ Skewed-t

ความไม่สมมาตรแก้ปัญหาการตอบสนองของโมเดลต่อ เครื่องหมาย ของช็อก แต่ไม่ได้แก้อะไรเกี่ยวกับ การแจกแจง ของช็อกเอง GARCH ธรรมดาสมมติว่า ztN(0,1)z_t \sim \mathcal{N}(0,1) และสมมติฐานนั้นแทบจะผิดเสมอสำหรับคริปโต แม้หลังจาก GARCH ขจัด volatility clustering ออกไปแล้ว standardized residuals zt=εt/σtz_t = \varepsilon_t / \sigma_t ก็ยังคงมี excess kurtosis เหลืออยู่ — มันเป็นหางหนา likelihood แบบเกาส์เซียนซึ่ง fit ตรงไหล่ของการแจกแจง จะประเมินความถี่ของวันที่มีค่า standardized สูงถึง 44, 55 หรือ 66 sigma ต่ำกว่าความเป็นจริง

ผลกระทบต่อความเสี่ยงเป็นเรื่องตรงไปตรงมา VaR 99% แบบเกาส์เซียนใช้ควอนไทล์ Φ1(0.01)2.326\Phi^{-1}(0.01) \approx -2.326 จึงพยากรณ์ VaR0.992.326σt\text{VaR}_{0.99} \approx 2.326\,\sigma_t ถ้าการแจกแจง standardized ที่แท้จริงเป็น Student-tt ที่มี ν=5\nu = 5 องศาอิสระ ควอนไทล์ 1% ที่แท้จริงจะอยู่ใกล้ 3.36-3.36 — VaR แบบเกาส์เซียนมองโลกในแง่ดีเกินไปประมาณ 44%44\% ที่ระดับความเชื่อมั่นนั้น คุณจะถูกทะลุบ่อยกว่า 1% ของเวลามาก และจะประหลาดใจอย่างเป็นระบบกับวันที่ "เป็นไปไม่ได้" นี่ไม่ใช่ความแปลกประหลาดเฉพาะของคริปโต Bollerslev (1987) นำเสนอ tt-GARCH ก็เพราะเรซิดวลของหุ้นและ FX แสดงหางหนาแบบเดียวกัน คริปโตเป็นเพียงเวอร์ชันที่รุนแรงกว่าของปัญหาเดียวกัน

Standardized Student-t

การแจกแจง Student-tt มีพารามิเตอร์องศาอิสระ ν>2\nu > 2 ที่ควบคุมความหนาของหาง: ν\nu เล็กหมายถึงหางหนา และเมื่อ ν\nu \to \infty การแจกแจง tt จะลู่เข้าสู่เกาส์เซียน ปัญหาคือการแจกแจง tνt_\nu ดิบมี variance เท่ากับ ν/(ν2)1\nu/(\nu-2) \neq 1 ดังนั้นเราต้อง ทำให้เป็นมาตรฐาน (standardize) ให้มี unit variance ก่อนนำไปใช้เป็น innovation — ไม่เช่นนั้น "σt\sigma_t" ในสมการวนซ้ำของ GARCH จะไม่ใช่ conditional standard deviation จริงๆ

ความหนาแน่นของ standardized Student-tt innovation ที่มี unit variance คือ

f(z;ν)=Γ ⁣(ν+12)π(ν2)  Γ ⁣(ν2)(1+z2ν2)ν+12,ν>2.f(z;\nu) = \frac{\Gamma\!\left(\frac{\nu+1}{2}\right)}{\sqrt{\pi(\nu-2)}\;\Gamma\!\left(\frac{\nu}{2}\right)}\left(1 + \frac{z^2}{\nu-2}\right)^{-\frac{\nu+1}{2}}, \qquad \nu > 2.

สังเกตค่า (ν2)(\nu-2) ด้านใน — นั่นคือการ standardize ที่ปรับสเกลให้ Var(z)=1\mathrm{Var}(z)=1 ส่วนสนับสนุนต่อ log-likelihood ของการสังเกตหนึ่งตัว เมื่อกำหนด conditional variance ของ GARCH คือ σt2\sigma_t^2 และ zt=εt/σtz_t = \varepsilon_t/\sigma_t คือ

t=logΓ ⁣(ν+12)logΓ ⁣(ν2)12log(π(ν2))12logσt2ν+12log ⁣(1+zt2ν2).\ell_t = \log\Gamma\!\left(\tfrac{\nu+1}{2}\right) - \log\Gamma\!\left(\tfrac{\nu}{2}\right) - \tfrac{1}{2}\log\bigl(\pi(\nu-2)\bigr) - \tfrac{1}{2}\log\sigma_t^2 - \frac{\nu+1}{2}\log\!\left(1 + \frac{z_t^2}{\nu-2}\right).

เทอม 12logσt2-\tfrac{1}{2}\log\sigma_t^2 คือ Jacobian ของการแปลงจาก εt\varepsilon_t เป็น ztz_t — เทอมเดียวกับที่คุณเห็นใน Gaussian GARCH likelihood ในตอนที่ 1 มีเพียงรูปทรงเท่านั้นที่เปลี่ยน การ maximize tt\sum_t \ell_t พร้อมกันทั้งพารามิเตอร์ GARCH และ ν\nu คือสิ่งที่ arch ทำเมื่อคุณส่ง dist='t'

ค่า ν\nu ที่ประมาณได้ให้ข้อมูลในตัวมันเอง สำหรับผลตอบแทนรายวันของ BTC/ETH โดยทั่วไปจะได้ค่าอยู่ในช่วง ν36\nu \approx 3\text{–}6 — หางหนา แต่ยังมี variance จำกัด (ต้องการ ν>2\nu > 2) และมักมี kurtosis จำกัด (ต้องการ ν>4\nu > 4) ถ้า ν\nu ที่ fit ได้ต่ำกว่า 4 พึงระวังว่า sample kurtosis จะไม่จำกัดในทางเทคนิคภายในโมเดล และตัวประมาณค่าบางตัวอาจไม่เสถียร เป็นสัญญาณให้ตรวจสอบ outlier และคุณภาพข้อมูลอย่างจริงจัง

Skewed-t ของ Hansen

Student-tt เป็นหางหนาแต่ยัง สมมาตร — หางซ้ายและขวาหนาเท่ากัน เรซิดวลผลตอบแทนของคริปโตมักจะ เบ้ ด้วยเช่นกัน: หางซ้าย (การล่ม) หนากว่าหางขวา skewed-tt ของ Hansen (1994) ขยายความจาก standardized tt ด้วยพารามิเตอร์ความเบ้ λ(1,1)\lambda \in (-1, 1) ควบคู่กับ ν\nu:

f(z;ν,λ)={bc(1+1ν2(bz+a1λ)2)ν+12z<a/bbc(1+1ν2(bz+a1+λ)2)ν+12za/bf(z;\nu,\lambda) = \begin{cases} b\,c\left(1 + \dfrac{1}{\nu-2}\left(\dfrac{bz+a}{1-\lambda}\right)^2\right)^{-\frac{\nu+1}{2}} & z < -a/b \\[2mm] b\,c\left(1 + \dfrac{1}{\nu-2}\left(\dfrac{bz+a}{1+\lambda}\right)^2\right)^{-\frac{\nu+1}{2}} & z \geq -a/b \end{cases}

โดยที่ค่าคงที่ a=4λcν2ν1a = 4\lambda c\,\frac{\nu-2}{\nu-1}, b2=1+3λ2a2b^2 = 1 + 3\lambda^2 - a^2 และ c=Γ(ν+12)π(ν2)Γ(ν2)c = \frac{\Gamma(\frac{\nu+1}{2})}{\sqrt{\pi(\nu-2)}\,\Gamma(\frac{\nu}{2})} ถูกเลือกให้ zz มีค่าเฉลี่ยเป็นศูนย์และ unit variance สำหรับทุกคู่ (ν,λ)(\nu,\lambda) ที่ถูกต้อง การแจกแจงนี้แยกที่ z=a/bz = -a/b โดยใช้สเกลต่างกันในแต่ละส่วนเพื่อดันมวลความน่าจะเป็นเข้าหาหางข้างใดข้างหนึ่งมากขึ้น

การตีความ: λ<0\lambda < 0 ให้การแจกแจงเบ้ซ้าย (ขาลงหนักกว่า) ซึ่งเป็นผลลัพธ์ปกติสำหรับคริปโตและเป็นสิ่งที่คาดว่าจะจับคู่กับ leverage effect λ=0\lambda = 0 คือการกลับไปเป็น Student-tt แบบสมมาตร ดังนั้นการทดสอบ λ=0\lambda = 0 บอกว่าเทอมความเบ้กำลังให้ผลอะไรหรือไม่ ใน arch นี้คือ dist='skewt' ซึ่งประมาณค่าทั้ง ν\nu และ λ\lambda ผลตอบแทนคือ VaR ที่ควอนไทล์หางซ้ายหนักกว่าหางขวาอย่างตรงความเป็นจริง — พอดีกับสิ่งที่คุณต้องการเมื่อความสูญเสียที่คุณพยายามรอดพ้นเป็นแบบไม่สมมาตร เรื่องนี้เชื่อมโยงโดยตรงกับ ความไม่สมมาตรของความสูญเสียเทียบกับกำไร ในผลลัพธ์ของโพซิชัน: การขาดทุน x%x\% ต้องการมากกว่า x%x\% ในการฟื้นตัว ดังนั้นการโมเดลหางซ้ายผิดพลาดจึงมีต้นทุนสูงกว่าการโมเดลหางขวาผิดพลาด

การทำงานจริงด้วย Python

ตอนนี้เราจะ fit ทั้งหมดนี้ด้วยไลบรารี arch การตั้งค่าสะท้อนตอนที่ 1: ดึงผลตอบแทนรายวัน สเกลด้วย 100 เพื่อความเสถียรเชิงตัวเลข (ตัว optimizer ของ GARCH ทำงานได้แย่เมื่อผลตอบแทนอยู่ในระดับ O(0.01)O(0.01)) และ fit ด้วย constant mean ถ้าต้องการข้อมูลรายชั่วโมงหรือ mean model แบบอื่น กลไกก็เหมือนกันทุกประการ

การตั้งค่าและข้อมูล

import numpy as np
import pandas as pd
from arch import arch_model
from arch.univariate import GARCH, EGARCH, ConstantMean, StudentsT, SkewStudent
from scipy import stats

def fetch_returns(symbol="BTC-USD", start="2019-01-01", end="2025-12-31"):
    """Daily log returns, in percent (scaled x100 for the optimizer)."""
    import yfinance as yf
    px = yf.download(symbol, start=start, end=end)["Close"].dropna()
    ret = 100.0 * np.log(px / px.shift(1)).dropna()
    ret.name = symbol
    return ret

r = fetch_returns("BTC-USD")
print(f"{len(r)} daily observations, "
      f"annualized vol ~ {r.std() * np.sqrt(365):.0f}%")

คริปโตเทรด 24/7 ดังนั้นเราจึง annualize ด้วย 365 ไม่ใช่ 252 — แหล่งความสับสนเล็กๆ แต่เกิดขึ้นซ้ำๆ เมื่อคุณเทียบ Sharpe หรือ vol ของคริปโตกับตัวเลขของฝั่งหุ้น

การ Fit สี่โมเดล

รูปแบบใน arch: vol='Garch' พร้อม p=1, q=1 คือ GARCH สมมาตร; การเพิ่ม o=1 เปิดใช้เทอมเกณฑ์ขีดแบ่งของ GJR; vol='EGARCH' สลับไปใช้โมเดล log-variance การแจกแจงของ innovation กำหนดด้วย dist: 'normal', 't', 'skewt'

def fit(returns, vol="Garch", p=1, o=0, q=1, dist="normal"):
    am = arch_model(returns, mean="Constant",
                    vol=vol, p=p, o=o, q=q, dist=dist)
    res = am.fit(disp="off")
    return res

models = {
    "GARCH-N":    fit(r, vol="Garch",  o=0, dist="normal"),  # Part 1 baseline
    "GJR-t":      fit(r, vol="Garch",  o=1, dist="t"),        # asymmetry + fat tails
    "EGARCH-t":   fit(r, vol="EGARCH", o=1, dist="t"),        # log-variance asymmetry
    "GJR-skewt":  fit(r, vol="Garch",  o=1, dist="skewt"),    # + skew
}

for name, res in models.items():
    print(f"\n===== {name} =====")
    print(res.summary().tables[1])   # parameter table

สำหรับ vol='EGARCH' อาร์กิวเมนต์ o ควบคุมเทอมความไม่สมมาตร (γz\gamma z) และ p/q ควบคุมเทอมขนาดและ lag; o=1, p=1, q=1 คือ EGARCH(1,1) มาตรฐาน ข้อควรระวังหนึ่งอย่าง: ชื่อพารามิเตอร์ของ EGARCH ใน arch ใช้ตัวอักษรเดียวกัน แต่ ข้อตกลงเรื่องเครื่องหมาย บนเทอมความไม่สมมาตรเป็นของ Nelson ดังนั้นค่าประมาณที่เป็นลบคือ leverage effect เราตรวจสอบสิ่งนี้จาก news impact curve แทนที่จะอาศัยความจำ

การอ่านผล Fit ของ GJR

ตารางพารามิเตอร์ของ GJR-tt มีลักษณะประมาณนี้ (ค่าตัวอย่างเพื่ออธิบาย ไม่ใช่การทดลองที่รายงานจริง — ให้ refit บนข้อมูลของคุณเอง):

                  coef    std err       t      P>|t|
omega           0.0480     0.017     2.82     0.005
alpha[1]        0.0620     0.018     3.44     0.001
gamma[1]        0.0910     0.028     3.25     0.001
beta[1]         0.8850     0.021    42.1      0.000
nu              4.30       0.55      7.82     0.000

วิธีอ่าน:

  • gamma[1] = 0.091 ที่มีค่า tt-stat เกิน 3 คือ leverage effect ที่มีนัยสำคัญทางสถิติ หลังช็อกเชิงลบ ผลกระทบของ squared-shock คือ α+γ=0.062+0.091=0.153\alpha + \gamma = 0.062 + 0.091 = 0.153; หลังช็อกเชิงบวกคือแค่ α=0.062\alpha = 0.062 ข่าวร้ายขยับ volatility ของโมเดลนี้ประมาณ 2.5×2.5\times มากกว่าข่าวดีที่ขนาดเท่ากัน
  • nu = 4.3 ยืนยันหางหนา — ห่างไกลจากเกาส์เซียน (ν\nu \to \infty) และต่ำพอที่ moment ลำดับที่สี่แทบจะไม่จำกัด VaR แบบเกาส์เซียนบนอนุกรมนี้จะมองโลกในแง่ดีเกินจริงอย่างมาก
  • Persistence คือ α+β+12γ=0.062+0.885+0.04550.993\alpha + \beta + \tfrac{1}{2}\gamma = 0.062 + 0.885 + 0.0455 \approx 0.993 — สูงมาก ตามปกติของคริปโตรายวัน: ช็อกสลายตัวช้าและ volatility รวมกลุ่มอย่างเข้มข้น

บรรทัดที่สำคัญที่สุดที่ต้องตรวจสอบคือแถว γ\gamma ถ้า pp-value ของมันมีค่าสูง เทอมความไม่สมมาตรก็ยังไม่คุ้มค่าที่จะอยู่ในโมเดลบนสินทรัพย์และช่วงเวลานี้ และคุณควรเลือกโมเดลสมมาตรที่ง่ายกว่า นี่คือวินัยในการเลือกโมเดล ไม่ใช่ของประดับ — จะกล่าวถึงเพิ่มเติมด้านล่าง

การเปรียบเทียบโมเดลด้วย Information Criteria

Log-likelihood จะดีขึ้นเสมอเมื่อคุณเพิ่มพารามิเตอร์ ดังนั้นคุณไม่สามารถเลือกโดยดูจาก log-likelihood อย่างเดียวได้ ให้ใช้ AIC/BIC ซึ่งลงโทษจำนวนพารามิเตอร์ (BIC ลงโทษหนักกว่า):

def compare(models: dict) -> pd.DataFrame:
    rows = []
    for name, res in models.items():
        rows.append({
            "model": name,
            "n_params": len(res.params),
            "loglik": res.loglikelihood,
            "AIC": res.aic,
            "BIC": res.bic,
        })
    df = pd.DataFrame(rows).set_index("model")
    return df.sort_values("BIC")

print(compare(models))

หลักการตีความคร่าวๆ: การปรับปรุง BIC มากกว่าประมาณ 6 เทียบกับ baseline คือหลักฐานหนักแน่นว่าโครงสร้างเพิ่มเติมนั้นเป็นของจริง ส่วนความต่าง 1-2 คือ noise ถ้า GJR-t ดีกว่า GARCH-N ด้วย BIC เกิน 30 คะแนน แต่ GJR-skewt ดีกว่า GJR-t แค่ 1 คะแนน ให้เก็บ tt ไว้และตัดความเบ้ทิ้ง — พารามิเตอร์ความเบ้ยังไม่คุ้มทุนบนข้อมูลนี้ อย่าอ่าน AIC/BIC เป็นตัวแทนของการตรวจสอบ out-of-sample พวกมันให้รางวัลกับความพอดีแบบ in-sample ที่ปรับด้วยความซับซ้อน ซึ่งจำเป็นแต่ไม่เพียงพอ การทดสอบที่แท้จริงคือ VaR backtest และสุดท้ายคือ walk-forward evaluation

การ Plot News Impact Curve

นี่คือกราฟที่ให้ผลตอบแทนคุ้มค่า — ทำให้ความไม่สมมาตรมองเห็นได้และยืนยันข้อตกลงเรื่องเครื่องหมายของ EGARCH

import matplotlib.pyplot as plt

def news_impact_curve(res, shock_grid):
    """
    Next-period conditional variance as a function of the last shock,
    holding sigma_{t-1} at the model's unconditional level.
    Works for symmetric GARCH, GJR (o=1), and EGARCH.
    """
    p = res.params
    vol_name = res.model.volatility.__class__.__name__
    sigma2_bar = np.mean(res.conditional_volatility ** 2)

    omega = p["omega"]
    alpha = p.get("alpha[1]", 0.0)
    gamma = p.get("gamma[1]", 0.0)
    beta  = p.get("beta[1]", 0.0)

    if vol_name == "EGARCH":
        sig_prev = np.sqrt(sigma2_bar)
        z = shock_grid / sig_prev
        E_abs = np.sqrt(2 / np.pi)   # approx; arch uses the fitted dist's E|z|
        log_s2 = (omega + beta * np.log(sigma2_bar)
                  + alpha * (np.abs(z) - E_abs) + gamma * z)
        return np.exp(log_s2)
    else:
        ind = (shock_grid < 0).astype(float)
        return omega + (alpha + gamma * ind) * shock_grid**2 + beta * sigma2_bar

shocks = np.linspace(-8, 8, 401)   # daily % shocks
plt.figure(figsize=(8, 5))
for name in ["GARCH-N", "GJR-t", "EGARCH-t"]:
    nic = news_impact_curve(models[name], shocks)
    plt.plot(shocks, nic, label=name, lw=2)
plt.axvline(0, color="gray", lw=0.8, ls="--")
plt.xlabel("Last shock  $\\varepsilon_{t-1}$  (daily %)")
plt.ylabel("Next-period conditional variance  $\\sigma_t^2$")
plt.title("News impact curve: symmetric vs GJR vs EGARCH (BTC)")
plt.legend()
plt.tight_layout()

เมื่อคุณรันสิ่งนี้ กราฟ GARCH-N แบบสมมาตรจะเป็นพาราโบลาที่สะอาดมีจุดศูนย์กลางที่ศูนย์ — ช็อก 6%-6\% และ +6%+6\% ให้ variance เท่ากัน GJR-t เป็นพาราโบลาที่มีจุดหักที่จุดกำเนิด สูงกว่าบนแขนซ้าย EGARCH-t เป็นรูปตัว V แบบเอกซ์โพเนนเชียล และถ้าแขนซ้ายของมันอยู่สูงกว่าแขนขวา แสดงว่าคุณได้ยืนยัน leverage effect และข้อตกลงเรื่องเครื่องหมายในคราวเดียว ถ้าแขนซ้ายของ EGARCH อยู่ ต่ำกว่า แขนขวา แสดงว่า γ\gamma ประมาณได้เป็นบวก (ภาวะ up-vol) หรือคุณมีเครื่องหมายกลับด้าน — กราฟจะบอกคุณได้โดยไม่ต้องเดา

การเปรียบเทียบสี่โมเดลแบบเคียงข้างกัน

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

คุณสมบัติ GARCH-N GJR-t EGARCH-t GJR-skewt
ความไม่สมมาตร (เครื่องหมายของช็อก) ไม่มี เกณฑ์ขีดแบ่ง γIε2\gamma I\varepsilon^2 สัญญาณ γz\gamma z เกณฑ์ขีดแบ่ง γIε2\gamma I\varepsilon^2
รูปทรงหางของ innovation เกาส์เซียน Student-tt Student-tt skewed-tt
ความเบ้ใน innovation ไม่มี ไม่มี ไม่มี มี (λ\lambda)
ข้อจำกัดความไม่ติดลบ มี มี (α+γ0\alpha+\gamma\ge0) ไม่มี (รูปแบบ log) มี
เงื่อนไข Stationarity α+β<1\alpha+\beta<1 α+β+12γ<1\alpha+\beta+\tfrac12\gamma<1 β<1\lvert\beta\rvert<1 α+β+P(z<0)γ<1\alpha+\beta+P(z<0)\gamma<1
พารามิเตอร์เพิ่มเทียบ baseline 0 γ,ν\gamma,\nu γ,ν\gamma,\nu γ,ν,λ\gamma,\nu,\lambda
ผลลัพธ์ทั่วไปในคริปโต ล้มเหลวใน VaR backtest แข็งแกร่ง มั่นคง แข็งแกร่ง มั่นคง เหนือกว่า GJR-t เพียงเล็กน้อย

รูปแบบที่ควรจดจำ: การก้าวจากคอลัมน์ 1 ไปคอลัมน์ 2 — การเพิ่มทั้งความไม่สมมาตรและหางหนาพร้อมกัน — คือจุดที่การปรับปรุงเรื่อง risk-calibration เกือบทั้งหมดอยู่ การปรับปรุงในขั้นต่อไป (รูปแบบฟังก์ชันของ EGARCH เทอมความเบ้) เป็นของจริงแต่เป็นลำดับรอง และในหลายอนุกรมคริปโตมันอยู่ในระดับ noise ใช้งบประมาณการสร้างโมเดลไปกับการก้าวแรก และตั้งข้อสงสัยกับส่วนที่เหลือ

การประยุกต์ใช้กับความเสี่ยง: VaR และ Expected Shortfall

การ fit โมเดล volatility ที่ซับซ้อนขึ้นจะคุ้มค่าก็ต่อเมื่อมันช่วยปรับปรุงการตัดสินใจ การตัดสินใจที่ชัดเจนที่สุดที่ควรปรับปรุงคือการพยากรณ์ความเสี่ยงหางแบบ one-step: พรุ่งนี้อาจแย่แค่ไหน เราสร้างการพยากรณ์ Value-at-Risk และ Expected Shortfall แบบ one-day-ahead (หรือเรียกว่า Conditional VaR ซึ่ง pipeline พอร์ตโฟลิโอแบบ HRP/CVaR ใช้เป็น objective) โดยตรงจากการพยากรณ์ GARCH-tt/skew-tt ที่ fit แล้ว

จาก Conditional Distribution สู่ VaR

กลไกของ GARCH ให้การพยากรณ์ one-step ของ conditional mean μt+1\mu_{t+1} และ conditional standard deviation σt+1\sigma_{t+1} ผลตอบแทนถูกโมเดลเป็น rt+1=μt+1+σt+1zt+1r_{t+1} = \mu_{t+1} + \sigma_{t+1} z_{t+1} โดย zt+1z_{t+1} สุ่มจากการแจกแจง standardized ที่ fit แล้ว (เกาส์เซียน, tt หรือ skew-tt) ดังนั้นควอนไทล์ α\alpha ของ ผลตอบแทน จึงเป็นเพียงการแปลงเชิงเส้นของควอนไทล์ α\alpha ของ การแจกแจง standardized:

VaRα(t+1)=(μt+1+σt+1Fz1(1α))\text{VaR}_{\alpha}(t+1) = -\Bigl(\mu_{t+1} + \sigma_{t+1}\, F_z^{-1}(1-\alpha)\Bigr)

โดยที่ Fz1F_z^{-1} คือควอนไทล์ (inverse CDF) ของ standardized innovation และเครื่องหมายลบด้านหน้าเป็นไปตามข้อตกลงที่ VaR เป็นตัวเลขความสูญเสียแบบบวก สำหรับ VaR 99% นั้น α=0.99\alpha = 0.99 และคุณแทนค่า Fz1(0.01)F_z^{-1}(0.01) ประโยชน์ทั้งหมดของ tt/skew-tt ปรากฏตรงนี้: Fz1(0.01)F_z^{-1}(0.01) ติดลบมากกว่าค่าเกาส์เซียน 2.326-2.326 ดังนั้น VaR จึงใหญ่กว่าอย่างตรงความเป็นจริง

Expected Shortfall

VaR บอกเกณฑ์ขีดแบ่ง แต่ไม่บอกว่าเมื่อทะลุแล้วจะแย่แค่ไหน Expected Shortfall — ความสูญเสียเฉลี่ย ภายใต้เงื่อนไข ที่เกิน VaR — บอกได้ และมันเป็น coherent (subadditive) ซึ่งเป็นเหตุผลที่มันเป็น risk measure เบื้องหลัง CVaR optimization และเหตุผลที่ Basel เปลี่ยนมาใช้มัน สำหรับโมเดล location-scale

ESα(t+1)=(μt+1+σt+1E ⁣[zzFz1(1α)]).\text{ES}_{\alpha}(t+1) = -\Bigl(\mu_{t+1} + \sigma_{t+1}\, \mathbb{E}\!\left[z \mid z \leq F_z^{-1}(1-\alpha)\right]\Bigr).

เทอม conditional-tail-expectation E[zzq]\mathbb{E}[z \mid z \le q] มีสูตรปิดสำหรับการแจกแจงมาตรฐาน สำหรับ เกาส์เซียน โดยมี q=Φ1(1α)q = \Phi^{-1}(1-\alpha)

E[zzq]=ϕ(q)1α,\mathbb{E}[z \mid z \le q] = -\frac{\phi(q)}{1-\alpha},

โดยที่ ϕ\phi คือ pdf ของการแจกแจงปกติมาตรฐาน สำหรับ standardized Student-tt ที่มี ν\nu องศาอิสระและ q=tν1(1α)q = t_\nu^{-1}(1-\alpha) (บนสเกล standardized) tail expectation คือ

E[zzq]=ν+q2ν1gν(q)1α,\mathbb{E}[z \mid z \le q] = -\frac{\nu + q^2}{\nu - 1}\cdot\frac{g_\nu(q)}{1-\alpha},

โดยที่ gνg_\nu คือ pdf ของ standardized-tt Expected Shortfall ของ tt เกินกว่าค่าของเกาส์เซียนมากกว่าที่ VaR เกินกว่ากัน เพราะหางของ tt ไม่ได้แค่อยู่ไกลออกไปเท่านั้น — มัน หนากว่า ด้วย ดังนั้นความสูญเสียเฉลี่ยเกินเกณฑ์ขีดแบ่งจึงใหญ่อย่างไม่ได้สัดส่วน ช่องว่างเพิ่มเติมนั้นคือตัวเลขที่โมเดลเกาส์เซียนซ่อนไว้จากคุณ

การคำนวณ VaR และ ES จากโมเดล arch ที่ Fit แล้ว

การแจกแจงใน arch มีเมท็อด ppf (ควอนไทล์) ให้ใช้ เราจึงได้ควอนไทล์ standardized โดยตรงและไม่ต้องอนุพันธ์อะไรใหม่ สำหรับ ES เราหาปริพันธ์เชิงตัวเลข ซึ่งทนทานและใช้ได้อย่างสม่ำเสมอกับ normal/t/skewt

from scipy import integrate

def var_es_forecast(res, alpha=0.99):
    """
    One-step-ahead VaR and ES at level alpha, on the same (x100) scale
    as the returns fed to the model. Divide by 100 for fractional units.
    """
    fc = res.forecast(horizon=1, reindex=False)
    mu = fc.mean.iloc[-1, 0]
    sigma = np.sqrt(fc.variance.iloc[-1, 0])

    dist = res.model.distribution          # StudentsT / SkewStudent / Normal
    dp = [res.params[k] for k in res.params.index
          if k in ("nu", "eta", "lambda", "lam")]

    z_q = dist.ppf(1 - alpha, dp) if dp else dist.ppf(1 - alpha)
    z_q = float(np.atleast_1d(z_q)[0])

    def pdf(z):
        arr = np.atleast_1d(z).astype(float)
        lp = dist.loglikelihood(dp, arr, np.ones_like(arr), individual=True) \
             if dp else dist.loglikelihood([], arr, np.ones_like(arr),
                                           individual=True)
        return np.exp(lp)

    num, _ = integrate.quad(lambda z: z * pdf(z), -30, z_q, limit=200)
    es_z = num / (1 - alpha)               # E[z | z <= z_q]

    var = -(mu + sigma * z_q)
    es  = -(mu + sigma * es_z)
    return {"mu": mu, "sigma": sigma, "z_q": z_q,
            "VaR": var, "ES": es}

for name in ["GARCH-N", "GJR-t", "GJR-skewt"]:
    out = var_es_forecast(models[name], alpha=0.99)
    print(f"{name:11s}  sigma={out['sigma']:.2f}%  "
          f"z_q={out['z_q']:+.2f}  "
          f"VaR99={out['VaR']:.2f}%  ES99={out['ES']:.2f}%")

คอลัมน์ z_q คือเรื่องราวทั้งหมดในตัวเลขเดียว โมเดลเกาส์เซียนใช้ zq2.33z_q \approx -2.33; tt ที่มี ν4.3\nu \approx 4.3 ใช้ค่าใกล้ 3.3-3.3; skew-tt ดันควอนไทล์ ซ้าย ออกไปไกลกว่าเดิม ในขณะที่ดึงควอนไทล์ขวาเข้ามา ค่า σt+1\sigma_{t+1} เท่ากัน แต่ VaR ใหญ่กว่าอย่างมีนัยสำคัญ ถ้าคุณเคยรัน VaR แบบเกาส์เซียนบนคริปโต นี่คือช่องว่างที่คุณกำลังดูดซับไว้เงียบๆ

One Step เทียบกับ Multi-Step: ข้อควรระวัง

ทุกอย่างข้างต้นเป็นการพยากรณ์ one-day-ahead และนั่นคือจุดที่ GARCH VaR สะอาดที่สุด มีสองเรื่องที่ทำให้ horizon ที่ยาวขึ้นซับซ้อนขึ้น และคุณควรรู้ก่อนที่จะขยายไปใช้

อย่างแรก การพยากรณ์ variance จะ mean-revert ค่า conditional variance ที่ hh ก้าวข้างหน้าจาก GARCH ที่ stationary จะลู่เข้าสู่ระดับ unconditional σˉ2\bar\sigma^2 เมื่อ hh เพิ่มขึ้น และ variance สะสม hh วันคือผลรวมของการพยากรณ์แต่ละก้าว — มัน ไม่ใช่ h×σt+12h\times\sigma_{t+1}^2 เว้นแต่ volatility อยู่ที่ค่าเฉลี่ยระยะยาวพอดี การสเกลแบบ "square-root-of-time" อย่างไร้เดียงสา VaR(h)=hVaR(1)\text{VaR}(h) = \sqrt{h}\,\text{VaR}(1) ละเลย mean reversion นี้ และผิดพลาดพอดีหลังเกิดช็อก ซึ่งเป็นช่วงที่คุณต้องการตัวเลขนี้มากที่สุด ให้ใช้เส้นทาง variance หลายก้าวของโมเดลเอง

อย่างที่สอง การแจกแจง ของผลตอบแทนหลายวันไม่ได้มีรูปทรงเหมือนกับ innovation รายวัน การรวมช็อกรายวันที่มีการแจกแจงแบบ tt หลายตัว (ผ่านสมการวนซ้ำของ GARCH ที่ไม่เป็นเชิงเส้น) ไม่ได้ให้การแจกแจง tt ที่ horizon hh วัน ไม่มีสูตรปิดที่สะอาด สำหรับ VaR หลายวัน วิธีที่ตรงไปตรงมาคือ การจำลอง (simulation): สุ่มเส้นทาง innovation จากการแจกแจง standardized ที่ fit แล้ว ป้อนผ่านสมการวนซ้ำของ GARCH เพื่อได้เส้นทางผลตอบแทนจำลอง รวมเป็นผลตอบแทน hh วัน แล้วอ่านควอนไทล์เชิงประจักษ์ วิธีนี้ยังจัดการกรณี skew-tt ได้โดยธรรมชาติ ซึ่งไม่มีควอนไทล์เชิงวิเคราะห์แบบ multi-horizon เลย สูตรวิเคราะห์แบบ one-step ในบทความนี้เป็นสูตรที่แม่นยำ ให้มองทางลัดแบบ multi-step ใดๆ เป็นเพียงการประมาณที่ต้องตรวจสอบ

การ Backtest VaR: Kupiec และ Christoffersen

การพยากรณ์ VaR คือข้อกล่าวอ้างเชิงความน่าจะเป็น: "ความสูญเสียจะเกินเกณฑ์ขีดแบ่งนี้เพียง (1α)(1-\alpha) ของวันเท่านั้น" คุณทดสอบมันโดยนับ การละเมิด (violations) (วันที่ความสูญเสียจริงเกิน VaR ที่พยากรณ์ไว้) ตลอดการประเมินแบบ walk-forward และตรวจสอบสองเรื่อง อย่างแรก อัตรา การละเมิดถูกต้องหรือไม่ อย่างที่สอง การละเมิด เป็นอิสระจากกัน หรือรวมกลุ่มกัน (ซึ่งหมายความว่าโมเดลล้มเหลวพอดีในช่วงที่สำคัญที่สุด คือช่วง volatility พุ่งสูง)

ให้ It=1{losst>VaRt}I_t = \mathbf{1}\{\text{loss}_t > \text{VaR}_t\} เป็นลำดับการละเมิด N=ItN = \sum I_t คือจำนวนการละเมิดตลอด TT วัน และ π^=N/T\hat{\pi} = N/T คืออัตราที่สังเกตได้ อัตราเป้าหมาย p=1αp = 1-\alpha

Kupiec's unconditional coverage test (1995) ตรวจสอบ π^p\hat\pi \approx p ผ่าน likelihood ratio:

LRuc=2log ⁣[pN(1p)TNπ^N(1π^)TN]    χ12.LR_{uc} = -2\log\!\left[\frac{p^{N}(1-p)^{T-N}}{\hat\pi^{N}(1-\hat\pi)^{T-N}}\right] \;\sim\; \chi^2_1.

Christoffersen's independence test (1998) ตรวจสอบว่าการละเมิดวันนี้ไม่ได้ถูกทำนายได้จากการละเมิดเมื่อวาน ให้ nijn_{ij} นับการเปลี่ยนสถานะจาก ii ไป jj ในลำดับการละเมิด π01=n01/(n00+n01)\pi_{01} = n_{01}/(n_{00}+n_{01}), π11=n11/(n10+n11)\pi_{11} = n_{11}/(n_{10}+n_{11}) และ π=(n01+n11)/T\pi = (n_{01}+n_{11})/T ดังนั้น

LRind=2log ⁣[(1π)n00+n10πn01+n11(1π01)n00π01n01(1π11)n10π11n11]    χ12.LR_{ind} = -2\log\!\left[\frac{(1-\pi)^{n_{00}+n_{10}}\,\pi^{\,n_{01}+n_{11}}}{(1-\pi_{01})^{n_{00}}\pi_{01}^{n_{01}}(1-\pi_{11})^{n_{10}}\pi_{11}^{n_{11}}}\right] \;\sim\; \chi^2_1.

ทั้งสองรวมกันเป็นการทดสอบ conditional coverage LRcc=LRuc+LRindχ22LR_{cc} = LR_{uc} + LR_{ind} \sim \chi^2_2 ซึ่งตรวจสอบทั้งอัตราที่ถูกต้อง และ ความเป็นอิสระพร้อมกัน โมเดลอาจผ่าน Kupiec (จำนวนการละเมิดถูกต้อง) แต่ไม่ผ่าน Christoffersen (การละเมิดทั้งหมดรวมกลุ่มอยู่ในสัปดาห์วิกฤตสัปดาห์เดียว) — นั่นคือรูปแบบความล้มเหลวที่คุณต้องการจับให้ได้มากที่สุด เพราะการละเมิดที่รวมกลุ่มคือสิ่งที่ทำให้บัญชีระเบิด

from scipy.stats import chi2

def var_backtest(losses, var, p):
    """
    losses, var: 1D arrays, same length; loss>0 is a loss, var>0 threshold.
    p = 1 - alpha (target violation rate, e.g. 0.01 for 99% VaR).
    Returns Kupiec, Christoffersen-independence, and conditional-coverage LR.
    """
    losses = np.asarray(losses)
    var = np.asarray(var)
    I = (losses > var).astype(int)          # violation indicators
    T = len(I)
    N = int(I.sum())
    pi_hat = N / T

    eps = 1e-12
    ll_null = N * np.log(p + eps) + (T - N) * np.log(1 - p + eps)
    ll_alt  = N * np.log(pi_hat + eps) + (T - N) * np.log(1 - pi_hat + eps)
    LR_uc = -2 * (ll_null - ll_alt)
    p_uc = 1 - chi2.cdf(LR_uc, df=1)

    n00 = np.sum((I[:-1] == 0) & (I[1:] == 0))
    n01 = np.sum((I[:-1] == 0) & (I[1:] == 1))
    n10 = np.sum((I[:-1] == 1) & (I[1:] == 0))
    n11 = np.sum((I[:-1] == 1) & (I[1:] == 1))
    pi01 = n01 / (n00 + n01) if (n00 + n01) else 0.0
    pi11 = n11 / (n10 + n11) if (n10 + n11) else 0.0
    pi   = (n01 + n11) / (n00 + n01 + n10 + n11)

    def _ll(pi01, pi11, pi_pooled, use_pooled):
        if use_pooled:
            a = (n00 + n10) * np.log(1 - pi_pooled + eps)
            b = (n01 + n11) * np.log(pi_pooled + eps)
            return a + b
        return (n00 * np.log(1 - pi01 + eps) + n01 * np.log(pi01 + eps)
                + n10 * np.log(1 - pi11 + eps) + n11 * np.log(pi11 + eps))

    LR_ind = -2 * (_ll(pi01, pi11, pi, True) - _ll(pi01, pi11, pi, False))
    p_ind = 1 - chi2.cdf(LR_ind, df=1)

    LR_cc = LR_uc + LR_ind
    p_cc = 1 - chi2.cdf(LR_cc, df=2)

    return {
        "T": T, "violations": N,
        "obs_rate": pi_hat, "target_rate": p,
        "LR_uc": LR_uc, "p_uc": p_uc,
        "LR_ind": LR_ind, "p_ind": p_ind,
        "LR_cc": LR_cc, "p_cc": p_cc,
    }

เพื่อสร้างข้อมูลนำเข้า losses/var อย่างตรงไปตรงมา คุณต้อง refit (หรืออย่างน้อยพยากรณ์ใหม่) บน window แบบขยายหรือแบบ rolling และบันทึก VaR แบบ one-step-ahead สำหรับแต่ละวัน out-of-sample จากนั้นเทียบกับความสูญเสียจริงของวันนั้น อย่า backtest VaR แบบ in-sample เด็ดขาด — โมเดลที่ fit บนวิกฤตเดียวกับที่ถูกขอให้พยากรณ์จะดูดีกว่าความเป็นจริงมาก นี่เป็นวินัยเดียวกันกับ backtest-live parity: การประเมินต้องใช้เฉพาะข้อมูลที่มีอยู่ ณ เวลาตัดสินใจเท่านั้น

def walk_forward_var(returns, alpha=0.99, start=750, refit_every=25,
                     vol="Garch", o=1, dist="t"):
    """
    Expanding-window one-step VaR. Refit every `refit_every` days
    (refitting daily is correct but slow; every ~25 days is a common
    compromise -- validate the shortcut on your data).
    """
    losses, vars_ = [], []
    res = None
    for t in range(start, len(returns)):
        if res is None or (t - start) % refit_every == 0:
            am = arch_model(returns.iloc[:t], mean="Constant",
                            vol=vol, p=1, o=o, q=1, dist=dist)
            res = am.fit(disp="off")
        fc = res.forecast(horizon=1, reindex=False)
        mu = fc.mean.iloc[-1, 0]
        sig = np.sqrt(fc.variance.iloc[-1, 0])
        dp = [res.params[k] for k in res.params.index
              if k in ("nu", "eta", "lambda", "lam")]
        z_q = float(np.atleast_1d(
            res.model.distribution.ppf(1 - alpha, dp) if dp
            else res.model.distribution.ppf(1 - alpha))[0])
        var_t = -(mu + sig * z_q)
        vars_.append(var_t)
        losses.append(-returns.iloc[t])     # realized loss for that day
    return np.array(losses), np.array(vars_)

losses, vars_ = walk_forward_var(r, alpha=0.99, dist="t")
print(var_backtest(losses, vars_, p=0.01))

การอ่านผล: VaR 99% ที่ผ่านการปรับเทียบดีจะแสดงอัตราที่สังเกตได้ใกล้เคียง 1%, Kupiec ที่ไม่มีนัยสำคัญ (p_uc มีค่ามาก) และ Christoffersen ที่ไม่มีนัยสำคัญ (p_ind มีค่ามาก) — ไม่มีการรวมกลุ่ม ในทางปฏิบัติ ผลลัพธ์ที่ตรงไปตรงมาบนคริปโตคือ GARCH-Normal ไม่ผ่าน Kupiec (การละเมิดมากเกินไป p_uc มีค่าน้อยมาก) ในขณะที่ GJR-tt หรือ EGARCH-tt ผ่านหรือใกล้ผ่าน ความต่างนั้นคือข้อโต้แย้งทั้งหมดของบทความนี้ในรูปแบบการทดสอบสมมติฐาน ถ้าแม้แต่โมเดล tt ก็ยังแสดงการละเมิดที่รวมกลุ่ม (p_ind มีค่าน้อย) แสดงว่า volatility dynamics ของคุณยังถูกระบุผิด — มักเป็นสัญญาณว่าคุณต้องการหน่วยความจำที่ยาวขึ้น (component/FIGARCH) หรือชั้น regime เพิ่มเติม ซึ่งเชื่อมโยงกับ การตรวจจับ regime ด้วย HMM

การจัดอันดับโมเดลด้วยความสูญเสียหาง ไม่ใช่แค่ผ่าน/ไม่ผ่าน

Kupiec และ Christoffersen ให้คำตัดสินแบบสองทาง — โมเดลถูกปฏิเสธหรือไม่ถูกปฏิเสธ นั่นจำเป็นแต่หยาบเกินไป: สองโมเดลอาจ "ผ่าน" ทั้งคู่ในขณะที่อันหนึ่งคมชัดกว่าอย่างมีนัยสำคัญ เพื่อ จัดอันดับ การพยากรณ์ VaR ที่แข่งขันกัน ให้ให้คะแนนด้วยฟังก์ชันความสูญเสียที่ consistent อย่างเคร่งครัดสำหรับควอนไทล์ คือ pinball (quantile) loss:

Lτ(r,q)=(τ1{r<q})(rq),τ=1α,L_\tau(r, q) = \bigl(\tau - \mathbf{1}\{r < q\}\bigr)\,(r - q), \qquad \tau = 1-\alpha,

โดยที่ qq คือควอนไทล์ VaR (แบบมีเครื่องหมาย) และ rr คือผลตอบแทนจริง เมื่อเฉลี่ยตลอดวัน out-of-sample ค่าเฉลี่ย pinball loss ที่ต่ำกว่าหมายถึงควอนไทล์ที่ปรับเทียบดีกว่า และ คมชัดกว่า เนื่องจาก loss นี้ consistent สำหรับควอนไทล์ τ\tau การ minimize มันจึงไม่ให้รางวัลกับโมเดลที่กว้างเกินไปอย่างเกียจคร้าน ในการเปรียบเทียบสองโมเดลอย่างเป็นทางการ ให้ป้อนความต่างของ loss รายวันของทั้งสองเข้าสู่ Diebold-Mariano test

def pinball_loss(returns, var, alpha=0.99):
    tau = 1 - alpha
    q = -np.asarray(var)               # VaR is a positive loss; quantile is negative
    r = np.asarray(returns)
    hit = (r < q).astype(float)
    return np.mean((tau - hit) * (r - q))

สำหรับ Expected Shortfall โดยเฉพาะ พึงสังเกตว่า ES ไม่ elicitable ด้วยตัวมันเอง (ไม่มีฟังก์ชันความสูญเสียใดที่ตัว minimizer คือ ES เพียงอย่างเดียว) ซึ่งเป็นข้อยุ่งยากเชิงทฤษฎีที่แท้จริง: คุณต้องประเมิน ES ร่วมกับ VaR โดยใช้ scoring rule ของ Fissler-Ziggel หรือใช้วิธีปฏิบัติที่ง่ายกว่าคือตรวจสอบว่าขนาดการทะลุเฉลี่ยตรงกับ ES ที่โมเดลพยากรณ์ไว้หรือไม่ วิธีตรวจสอบ ES แบบหยาบแต่มีประโยชน์: ในบรรดาวันที่ VaR ถูกละเมิด ให้เปรียบเทียบความสูญเสียจริงเฉลี่ยกับ ES ที่พยากรณ์ไว้เฉลี่ยในวันเหล่านั้น — ควรใกล้เคียงกัน

กรอบเชิงกำกับดูแลคือแนวทาง Basel traffic-light: ตลอด 250 วันเทรด การละเมิด VaR 99% จำนวน 0-4 ครั้งคือ "เขียว" (ยอมรับได้) 5-9 ครั้งคือ "เหลือง" (ต้องตรวจสอบเพิ่ม) 10 ครั้งขึ้นไปคือ "แดง" (โมเดลถูกปฏิเสธและตัวคูณเงินทุนเพิ่มขึ้น) มันเป็นญาติที่หยาบกว่าของ Kupiec แต่เป็นภาษาที่คณะกรรมการความเสี่ยงใช้พูดกันจริง และควรรายงานควบคู่ไปกับสถิติ LR

ข้อพิจารณาเชิงปฏิบัติ

เมื่อพารามิเตอร์เพิ่มเติมไม่คุ้มค่า

ค่าเริ่มต้นที่ตรงไปตรงมาคือการตั้งข้อสงสัยต่อความซับซ้อน พารามิเตอร์ทุกตัวที่คุณเพิ่มคือปุ่มที่ optimizer สามารถ overfit ได้ และ asymmetric fat-tailed GARCH ก็มีหลายตัว คำแนะนำที่เป็นรูปธรรม:

  • ตัวอย่างที่สภาพคล่องต่ำหรือสั้น ด้วยข้อมูลรายวันเพียงไม่กี่ร้อยตัว standard error ของ γ\gamma และ λ\lambda จะใหญ่ และคุณจะ "ตรวจพบ" ความไม่สมมาตรที่เป็นแค่ sampling noise บน altcoin ใหม่หรือบางเบา GARCH-tt แบบสมมาตรมักเป็นโมเดลที่ซับซ้อนที่สุดที่ข้อมูลรองรับได้ การ fit skew-tt EGARCH บนข้อมูล 200 วันคือการหลอกตัวเอง
  • เทอมความเบ้มักไม่คุ้มต้นทุน ในทางปฏิบัติ การย้ายจาก Normal ไป tt เป็นการปรับปรุงที่ใหญ่และเชื่อถือได้ (หางหนาเป็นของจริงและแข็งแกร่ง) การย้ายจาก tt ไป skew-tt มักจะเป็นแค่ marginal — BIC ดีขึ้น 1 หรือ 2 บางครั้งติดลบ ให้เพิ่มความเบ้เฉพาะเมื่อข้อมูลเรียกร้องชัดเจนเท่านั้น
  • EGARCH เทียบกับ GJR มักจะพอๆ กันบนข้อมูลรายวัน ทั้งสองเข้ารหัสเรื่องราวเชิงคุณภาพเดียวกันด้วยรูปแบบฟังก์ชันต่างกัน เลือกโดยดูจาก out-of-sample VaR backtest ไม่ใช่ดูว่าอันไหน log-likelihood in-sample สวยกว่า
  • ความถี่ที่สูงขึ้นเปลี่ยนคำตอบ บนแท่งรายชั่วโมงหรือรายนาที ฤดูกาลภายในวันและ microstructure มีอิทธิพลเหนือกว่า และ GARCH แบบรายวันธรรมดาจะระบุผิดไม่ว่าจะมีความไม่สมมาตรหรือไม่ก็ตาม ปัญหาต่างกัน เครื่องมือก็ต้องต่างกัน

นี่คือบทเรียนเดียวกันกับ การประเมินอย่างตรงไปตรงมาเมื่อไม่มี edge ที่แข็งแกร่ง: โมเดลที่ซับซ้อนกว่าซึ่งไม่รอดจากการทดสอบ out-of-sample แย่กว่าโมเดลง่ายที่มันแทนที่ เพราะมันพกพาภาพลวงตาของความแม่นยำ รายงานผลลัพธ์เชิงลบ — "ความเบ้ไม่ช่วยอะไรบน ETH" — เป็นข้อค้นพบที่แท้จริง และใช้ walk-forward optimization เป็นผู้ตัดสิน ไม่ใช่ AIC แบบ in-sample

นี่คือ Marginals ที่ทุกอย่างอื่นสร้างต่อยอด

โมเดลในบทความนี้ไม่ใช่จุดสิ้นสุด พวกมันคือ building block แบบตัวแปรเดี่ยวสำหรับกลไกความเสี่ยงร่วม บทความ copula models สำหรับความเสี่ยงร่วมของคริปโต ใช้ EGARCH/GJR-tt เป๊ะๆ เป็น marginals แบบ GARCH-EVT ก่อนที่จะ fit vine copula — คุณ fit asymmetric fat-tailed GARCH ต่อสินทรัพย์หนึ่ง สกัด standardized residuals ออกมา แล้วจึงค่อยโมเดลความสัมพันธ์ข้ามสินทรัพย์ ถ้า marginal ของคุณเป็น Gaussian GARCH แบบสมมาตร copula ก็จะสืบทอดความผิดพลาดของหางไปด้วย ไม่ว่าโมเดลความสัมพันธ์จะดีแค่ไหนก็ตาม Marginal ขยะ ก็ได้ joint VaR ขยะ

สำหรับปัญหา volatility แบบหลายตัวแปร — correlations ที่แปรผันตามเวลา แทนที่จะเป็น variance ต่อสินทรัพย์ — ดู ตอนที่ 3, DCC-GARCH ซึ่งเพิ่มโมเดล dynamic-correlation ทับบนการ fit แบบตัวแปรเดี่ยวเหล่านี้ และสำหรับการแปลงการพยากรณ์ volatility ให้เป็นการกำหนดขนาดโพซิชันและ backtest การเทรด ตอนที่ 4 เรื่อง volatility targeting ใช้การพยากรณ์ σt+1\sigma_{t+1} จากโมเดลเหล่านี้เป๊ะๆ เพื่อปรับขนาดการเปิดโพซิชันแปรผกผันกับความเสี่ยงที่พยากรณ์ไว้

ทางเลือกแบบ Distribution-Free

ทุกอย่างในส่วนความเสี่ยงตั้งอยู่บนสมมติฐานเชิงพารามิเตอร์: ว่า standardized residuals เป็นไปตาม tt หรือ skew-tt สมมติฐานนั้นทดสอบได้และมักสมเหตุสมผล แต่ก็อาจล้มเหลวได้ ถ้าคุณไม่อยากผูกมัดกับรูปทรงหางใดๆ เลย conformal prediction ให้ prediction intervals แบบ distribution-free พร้อมการรับประกัน coverage แบบ finite-sample — เป็นปรัชญาที่ต่างออกไปอย่างแท้จริงซึ่งไม่ตั้งข้อกล่าวอ้างใดๆ เกี่ยวกับการแจกแจงของ innovation ทั้งสองวิธีเสริมกัน: GARCH-tt เชิงพารามิเตอร์ให้ conditional density แบบเต็ม (จึงได้ ES ซึ่ง conformal intervals ให้โดยตรงไม่ได้) ในขณะที่ conformal ให้ coverage ที่ยังคงอยู่แม้ density ของคุณจะผิด ในการใช้งานจริง การใช้ทั้งสองเป็น cross-check เป็นการประกันที่มีต้นทุนต่ำ

สุขอนามัยเชิงตัวเลขและ Workflow

  • สเกลผลตอบแทนด้วย 100 ตัว optimizer ของ GARCH ลู่เข้าได้เชื่อถือได้กว่ามากบนผลตอบแทนแบบเปอร์เซ็นต์ เทียบกับผลตอบแทนแบบเศษส่วนดิบ อย่าลืม unscale VaR/ES ถ้าคุณรายงานในหน่วยเศษส่วน
  • จับตา persistence ถ้า α+β+12γ\alpha + \beta + \tfrac12\gamma ประมาณได้เกินประมาณ 0.999 โมเดลใกล้เคียง near-integrated (คล้าย IGARCH); การพยากรณ์ mean-revert ช้ามาก และการพยากรณ์ variance ระยะยาวจะไม่น่าเชื่อถือ ไม่จำเป็นต้องผิด แต่ควรตั้งข้อสังเกต
  • ความล้มเหลวในการลู่เข้าบน rolling windows รูปแบบ log ของ EGARCH หลีกเลี่ยงข้อจำกัดความไม่ติดลบได้ แต่ก็ยังอาจลู่เข้าไม่ได้บน window ที่ผิดปกติ ให้ครอบ fit() ด้วย try/except และย้อนกลับไปใช้พารามิเตอร์ของ window ก่อนหน้า แทนที่จะทำให้ live backtest ล่ม
  • Mean model เราใช้ constant mean ตลอดทั้งบทความ สำหรับคริปโตรายวันส่วนใหญ่ conditional mean ใกล้ศูนย์และถูกกลบด้วย volatility อย่าเสียความซับซ้อนของโมเดลไปกับการพยากรณ์มัน เว้นแต่คุณจะมีเหตุผลจริงจัง

สรุป

  • GARCH(1,1) ธรรมดามีข้อบกพร่องเชิงโครงสร้างสองอย่าง: มันสมมาตร (ตอบสนองต่อ +x%+x\% และ x%-x\% เหมือนกันเพราะช็อกเข้าเป็น ε2\varepsilon^2) และมันสมมติ Gaussian innovations (ตีราคาหางหนาของคริปโตต่ำกว่าจริง) ทั้งสองอย่างมีต้นทุนเป็นเงินจริงผ่าน VaR ที่มองโลกในแง่ดีเกินไป
  • GJR-GARCH เพิ่มเทอมเกณฑ์ขีดแบ่ง γI(εt1<0)εt12\gamma\,I(\varepsilon_{t-1}<0)\,\varepsilon_{t-1}^2 ค่า γ>0\gamma > 0 ที่มีนัยสำคัญคือ leverage effect: ข่าวร้ายเพิ่ม volatility มากกว่า เงื่อนไขไม่ติดลบต้องการ α+γ0\alpha+\gamma\ge0; persistence คือ α+β+12γ\alpha+\beta+\tfrac12\gamma
  • EGARCH โมเดล logσt2\log\sigma_t^2 ดังนั้นจึงไม่มีข้อจำกัดความไม่ติดลบ และ stationarity คือแค่ β<1|\beta|<1 ความไม่สมมาตรเข้ามาผ่านเทอมมีเครื่องหมาย γzt1\gamma z_{t-1} (leverage คือ γ<0\gamma<0 ในข้อตกลงนี้) แยกจากเทอมขนาด zt1|z_{t-1}|
  • News impact curve — variance งวดถัดไปเทียบกับช็อกล่าสุด — ทำให้ความไม่สมมาตรมองเห็นได้และยืนยันข้อตกลงเรื่องเครื่องหมายของ EGARCH ได้ในทันที
  • Innovations แบบ Student-tt (dist='t') แก้ปัญหาหางผ่านองศาอิสระ ν\nu (โดยทั่วไป 3-6 สำหรับคริปโต); skew-tt ของ Hansen (dist='skewt') เพิ่มความเบ้ λ\lambda สำหรับหางซ้ายที่หนักกว่า การย้ายจาก Normal ไป tt เป็นผลได้ที่ใหญ่และเชื่อถือได้; tt ไป skew-tt มักเป็นแค่ marginal
  • VaR และ ES มาจาก conditional distribution ที่ fit แล้ว: VaRα=(μt+1+σt+1Fz1(1α))\text{VaR}_\alpha = -(\mu_{t+1} + \sigma_{t+1}F_z^{-1}(1-\alpha)) โดยควอนไทล์แบบหางหนาทำให้ความเสี่ยงใหญ่กว่าเกาส์เซียนอย่างตรงความจริง ES (coherent, \approx CVaR) จับความสูญเสียเฉลี่ยที่เกิน VaR
  • Backtest ด้วย Kupiec และ Christoffersen Kupiec ตรวจสอบอัตราการละเมิด; Christoffersen ตรวจสอบว่าการละเมิดไม่ได้รวมกลุ่มกัน โมเดลอาจผ่านอันหนึ่งแต่ไม่ผ่านอีกอันได้ — การละเมิดที่รวมกลุ่มคือรูปแบบความล้มเหลวที่อันตราย ให้ backtest แบบ out-of-sample อย่างเคร่งครัด
  • วินัยเหนือความซับซ้อน เพิ่มความไม่สมมาตร/ความเบ้เฉพาะเมื่อมันรอดผ่าน BIC และ VaR backtest แบบ out-of-sample บนอนุกรมที่สั้นหรือสภาพคล่องต่ำ โมเดลที่ง่ายกว่ามักชนะ

References:

  • Nelson, D. B. (1991). Conditional heteroskedasticity in asset returns: A new approach. Econometrica, 59(2), 347-370. 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
  • Bollerslev, T. (1987). A conditionally heteroskedastic time series model for speculative prices and rates of return. Review of Economics and Statistics, 69(3), 542-547. DOI
  • Hansen, B. E. (1994). Autoregressive conditional density estimation. International Economic Review, 35(3), 705-730. DOI
  • Engle, R. F., & Ng, V. K. (1993). Measuring and testing the impact of news on volatility. Journal of Finance, 48(5), 1749-1778. DOI
  • Christoffersen, P. F. (1998). Evaluating interval forecasts. International Economic Review, 39(4), 841-862. DOI
  • Kupiec, P. H. (1995). Techniques for verifying the accuracy of risk measurement models. Journal of Derivatives, 3(2), 73-84. DOI
  • Black, F. (1976). Studies of stock price volatility changes. Proceedings of the American Statistical Association, Business and Economic Statistics Section, 177-181.
  • McNeil, A. J., Frey, R., & Embrechts, P. (2015). Quantitative Risk Management: Concepts, Techniques and Tools (2nd ed.). Princeton University Press.
  • Sheppard, K. (2023). arch: Autoregressive conditional heteroskedasticity models in Python. GitHub.
ข้อจำกัดความรับผิดชอบ: ข้อมูลที่ให้ไว้ในบทความนี้มีไว้เพื่อการศึกษาและให้ข้อมูลเท่านั้น และไม่ถือเป็นคำแนะนำทางการเงิน การลงทุน หรือการเทรด การเทรดสกุลเงินดิจิทัลมีความเสี่ยงสูงที่จะขาดทุน

MarketMaker.cc Team

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

พูดคุยใน Telegram
Newsletter

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

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

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