Volatilite Hedefleme ve GARCH Tahminleriyle İşlem Yapma
Bu serinin ilk üç bölümü size volatiliteyi tahmin etmeyi öğretti. Bölüm 1'de tek değişkenli bir GARCH(1,1) kurduk, Bölüm 2'de GJR ve Student-t yenilikleriyle kaldıraç ve kalın kuyruklar ekledik ve Bölüm 3'te DCC-GARCH ile zaman içinde tüm bir kovaryans matrisini modelledik. Her birinin sonunda bir sayı yazdırdık: yarının beklenen volatilitesi. Ve sonra, dürüst olursak, durduk — sanki tahmini üretmek asıl amaçmış gibi.
Öyle değil. Volatilite tahmini bir kâr/zarar (P&L) değildir. Düşük bir QLIKE skoru için kimseye para ödenmemiştir. Bir tahmin ancak aksi halde farklı vereceğiniz bir kararı değiştirdiği tam anda değer kazanır — ne kadar alacağınız, ne zaman keseceğiniz, ne kadar sermaye tahsis edeceğiniz. Tahmininiz bir pozisyonu hareket ettirmiyorsa, istatistiksel doğruluğu özel bir hobiden ibarettir.
Bu son bölüm o döngüyü kapatmakla ilgili. Bölüm 1-3'teki tahminleri alıp mümkün olan en temiz kararda iş başına koyuyoruz: volatilite hedefleme (volatility targeting) — portföyün gerçekleşen volatilitesinin sabit bir hedefe ulaşması için bir pozisyonu boyutlandırma. Ardından bu blogun herhangi bir tekil modelden daha çok önem verdiği şeyi yapıyoruz: dürüstçe değerlendiriyoruz. GARCH'ı aptalca-ama-güçlü temel çizgilerle (kayan gerçekleşen vol, EWMA) kıyaslıyoruz, gerçek volatiliteyi asla gözlemleyemeyeceğimiz gerçeğine dayanıklı kayıp fonksiyonları kullanıyoruz, maliyetli ve ileriye bakmayan bir walk-forward geriye dönük test çalıştırıyoruz ve volatilite hedeflemenin size ne kazandırıp ne kazandırmadığını açıkça belirtiyoruz. Spoiler: risk-ayarlı getirileri iyileştirir ve düşüşleri (drawdown) alfa üretmekten çok daha güvenilir biçimde ehlileştirir.
Volatilite Hedefleme Neden Doğru Testtir
Bir volatilite tahminini kullanmanın daha süslü yolları vardır — opsiyon fiyatlaması, VaR limitleri, dinamik hedging — ama volatilite hedefleme, tahminin değerini diğer bahislerden en az kirlenmeyle izole edenidir. Fikir tek bir denklemdir.
Sinyalin ima ettiği bir yön ile riskli bir varlık tutun (şimdilik sadece "long"). Sabit bir pozisyon yerine, maruziyeti tahmini volatiliteyle ters orantılı olarak ölçekleyin:
burada bir sonraki dönemin volatilitesine dair tahmininizdir (yalnızca 'ye kadarki veriler kullanılarak yapılır) ve stratejinin çalışmasını istediğiniz yıllıklandırılmış volatilitedir — diyelim %15 veya %20. Model sakin bir piyasa öngördüğünde 1.0'a doğru (veya ötesine) kaldıraç arttırırsınız; bir fırtına öngördüğünde küçültürsünüz. Ölçeklenmiş pozisyonun gerçekleşen volatilitesi, birinci mertebeden,
her ne zaman olursa. Yani bu alıştırmanın tüm kalitesi tek bir şeye dayanır: tahmininiz 'nin bir sonraki dönemin gerçek volatilitesi 'e ne kadar yakın olduğu. Daha iyi bir tahmin daha düz bir gerçekleşen-volatilite profili ve — göreceğimiz gibi — daha iyi bir Sharpe oranı üretir. İşte bu yüzden doğru testtir. Tahmin bir süsleme değildir; paydadır.
Bu neden Sharpe'ı yükseltir ve düşüşleri kontrol eder
İki ampirik gerçek burada işi yapar.
Volatilite getirilerden çok daha tahmin edilebilirdir. Yarınki BTC getirisinin yönü günlük frekansta yazı-turaya yakındır; büyüklüğü değildir. Volatilite kümelenir — büyük hareketler büyük hareketleri izler — ki bu GARCH'ın var olmasının tüm nedenidir (Bölüm 1 bunu kodlayan varyanstaki AR(1) yapısını türetti). Bir gün ileri varyans için 0.4-0.6 arası bir rutindir; getiriler için aynı sayı Renaissance düzeyinde bir sinyal olurdu. Volatilite hedefleme tahmin edilebilir niceliği sömürür ve tahmin edilemeyen konusunda agnostik kalır.
Sharpe oranları zaman içinde sabit değildir; volatilite yükseldiğinde düşerler. Kriptodaki yüksek volatilite rejimleri — kaldıraç azaltma zincirleri, borsa çöküşleri, her şeyin %30 boşluk verdiği günler — birim risk başına daha kötü getiriye eğilimlidir, daha iyiye değil. Tahmini vol yüksek olduğunda tam olarak maruziyeti mekanik biçimde keserek, düşüşlere en çok, bileşik getiriye en az katkıda bulunan dönemlere daha az ağırlık verirsiniz. Moreira ve Muir (2017), hisse senetleri için volatilite yönetilen portföylerin — bu tam ölçeklemesinin — Sharpe oranlarını yükselttiğini ve yönetilmeyen faktöre karşı pozitif alfalar ürettiğini gösterdi. Mekanizma sihir değildir; öngörülebilir çalkantılı pencerelere sabit dolar pozisyonu tutmayı reddetmektir.
Düşüş faydası daha da doğrudandır. Maksimum düşüş, pozisyon-getiri dağılımının kuyruğu tarafından domine edilir. 'in volatilitesi 'a yakın sabitlendiği için, sabit-nominal bir stratejinin bir volatilite patlaması sırasında yaşadığı kalın sol kuyruk sıkıştırılır: girerken zaten küçüktünüz. Volatilite hedefleme çöküşleri öngörmez, ama piyasa çalkantılıyken sistematik olarak az maruzdur ve çalkantı, çöküşlerin olduğu zamandır.
Kelly ve kesirli boyutlandırmayla ilişkisi
Volatilite hedefleme, Kelly kriterinin yakın bir kuzenidir. Beklenen fazla getiri ve varyans olan tek bir varlık için, büyüme-optimal (tam-Kelly) kesir
Sharpe oranı 'nun kabaca sabit olduğunu varsayarsanız — güçlü bir varsayım, ama "piyasa risk için istikrarlı bir fiyat öder" ifadesinde örtük olan — o zaman ve olur ki bu tam olarak ile volatilite hedeflemedir. Başka bir deyişle, volatilite hedefleme, beklenen getirinin volatiliteyle ölçeklendiği varsayımı altında Kelly boyutlandırmasıdır. Tam ve kesirli Kelly'yi ve neden aklı başında hiç kimsenin tam Kelly ile işlem yapmadığını Kelly kriteri ve strateji boyutlandırma yazısında ele alıyoruz. Oradaki pratik ders buraya taşınır: teorik boyutun bir kesrini kullanın, çünkü paydadaki (vol tahmininiz) ve özellikle paydaki (beklenen getiri) tahmin hatası tam boyutlandırmayı tehlikeli derecede agresif kılar.
Akılda tutulmaya değer iki bağlantı daha. Birincisi, volatilite hedefleme getirilerin simetrik dağılımına göre boyutlandırır, ama kripto getirileri simetrik değildir — %20'lik bir düşüş gününün maliyeti, kaldıraç ve tasfiye devreye girdiğinde %20'lik bir yükseliş gününün aynası değildir. Bu asimetriyi doğrudan zarar-kâr asimetrisi yazısında ele alıyoruz ve bir GJR/EGARCH tahmini (Bölüm 2) negatif şoklara daha fazla tepki vererek bunun bir kısmını zaten 'ye katmaktadır. İkincisi, bir vol tahmini bir nokta tahminidir; daha eksiksiz bir risk görüşü ona bir aralık ekler. İşlem için konformal tahmin, model çıktılarını boyutlandırabileceğiniz dağılımdan bağımsız aralıklara dönüştürmeyi gösterir ki bu, bu yazının dürüst-değerlendirme temasıyla doğal olarak eşleşir.
Rakipler: GARCH'ın Yenmesi Gerekenler
İşte gerçek bir değerlendirmeyi bir demodan ayıran disiplin. GARCH'ı taçlandırmadan önce ona ucuz, bariz ve şaşırtıcı derecede yenilmesi zor rakipler vermelisiniz. Ayrıntılı GJR-t modeliniz beş satırlık bir EWMA'yı geçemiyorsa, değerli bir şey öğrenmiş ve kendinizi çok fazla üretim karmaşıklığından kurtarmışsınızdır.
Bir sonraki dönemin volatilitesine dair dört tahminciyi kıyaslıyoruz.
(a) Gecikmeli gerçekleşen volatilite (kayan standart sapma)
En naif tahmin: yarının volatilitesi, son günlük getirinin örneklem standart sapmasına eşittir.
Bir hiperparametresi (pencere , tipik olarak 20-60 gün) vardır ve modeli yoktur. Kusuru, penceredeki her gözlemin eşit ağırlık alması ve pencereden çıktığında aniden bir uçurumdan düşmesidir — "hayaletlenme" veya "yankı" etkisi, burada tek bir çöküş günü tahmini tam gün boyunca şişirir ve sonra bir gecede yok olur, piyasa gerçekten sakinleşmiş olsun ya da olmasın.
(b) EWMA / RiskMetrics ()
Üstel ağırlıklı hareketli ortalama, daha eski karesel getirilere geometrik olarak azalan ağırlık vererek yankı sorununu düzeltir:
Bu RiskMetrics (J.P. Morgan, 1996) tahmincisidir. Günlük veriler için kanonik ile etkin hafıza kabaca gündür, ama azalma pürüzsüzdür — uçurum yok. EWMA'nın gerçekte ne olduğuna dikkat edin: bu, ve olan bütünleşik (integrated) bir GARCH(1,1)'dir, yani ortalamaya dönüşü ve uzun dönem varyansı olmayan GARCH. 'ü kabul ederseniz sıfır serbest parametresi vardır ve bu yazının tamamındaki tek en zorlu temel çizgidir. "GARCH X'i yener" makalelerinin büyük bir kısmı sessizce örneklem dışında EWMA'yı yenmeyi başaramaz.
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")
İnsanları tökezleten tek incelik: dönemi için olan tahmin ( boyunca tutulan bir pozisyonu boyutlandırmak için kullanılabilir) 'den önce gözlemlenen getirilerden inşa edilmelidir. Yukarıdaki özyinelemede var[t], r2[t-1] kullanır, dolayısıyla seri gerçek bir tek-adım-ileri tahmindir. Bu indeksi doğru yapmak, bir geriye dönük test ile bir fantezi arasındaki farktır — buna dair daha fazlası walk-forward bölümünde.
(c) GARCH(1,1) ve GJR-t (Bölüm 1-2)
Baş kahramanlarımız. Standart GARCH(1,1):
uzun dönem varyansı ile ve tek-adım tahmin doğrudan özyinelemeden çıkar (Bölüm 1). GJR-GARCH uzantısı, negatif şokların varyansı pozitiflerden daha fazla yükseltmesi için bir kaldıraç terimi ekler:
ve kriptonun kalın kuyruklarını ele almak için Student-t yenilikleriyle eşleştirildiğinde, bu Bölüm 2'nin GJR-t'sidir. GARCH'ın EWMA'yı yenebilmesinin nedeni ortalamaya dönüştür: bir şoktan sonra GARCH, tahmini tarafından yönetilen bir hızda 'ye doğru geri çeker, oysa EWMA (bütünleşik olduğundan) asla dönmez. Volatilite yükselip sonra normalleştiğinde — yaygın durum — GARCH'ın tahmini daha hızlı ve daha doğru geri çürür. Volatilite gerçekten kalıcı olduğunda, ikisi neredeyse ayırt edilemez.
(d) Gerçekleşen varyans üzerinde HAR-RV (gün içi verileriniz varsa)
Gün içi çubuklarınız varsa — ve 7/24 kripto piyasalarında neredeyse her zaman vardır — günlük karesel getirilerden çok daha az gürültülü bir volatilite vekili (proxy) oluşturabilirsiniz: gerçekleşen varyans, gün boyunca gün içi getirilerin karelerinin toplamı.
Corsi'nin (2009) Heterogeneous Autoregressive modeli, yarının gerçekleşen varyansını geçmiş 'nin günlük, haftalık ve aylık ortalamalarından tahmin eder — üç regresörle uzun-hafıza kalıcılığını yakalamanın kaba ama dikkate değer ölçüde etkili bir yolu:
burada ve günlük 'nin gecikmeli 5 günlük ve 22 günlük ortalamalarıdır. Sade bir OLS regresyonudur, daha yüksek kaliteli gün içi vekilini sömürür ve sıklıkla dördün en iyi günlük-vol tahmincisidir — çoğu zaman GARCH'ı tam olarak 'nin 'den daha temiz bir hedef olması nedeniyle yener.
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 hakkında bir not: sağa çarpık ve kesinlikle pozitif olduğundan, birçok uygulayıcı 'i log HAR özellikleri üzerinde regres eder ki bu uyumu iyileştirir ve pozitif tahminleri garanti eder. Geri üsteldiğinizde yarım-varyans Jensen düzeltmesi eklemelisiniz, , aksi halde sistematik olarak eksik tahmin edersiniz.
Elimizde dört tahminci varken — RV, EWMA, GARCH/GJR-t, HAR — soru şuna dönüşür: hepsinin tahmin etmeye çalıştığı şeyi asla göremezken, hangisinin en iyi olduğuna nasıl karar veririz?
Bir Volatilite Tahminini Dürüstçe Değerlendirmek
Bu, yazının çekirdek öğretisidir, o yüzden burada yavaşlayın.
tahminlerini gerçek koşullu varyans ile karşılaştırmak istersiniz. Ama gizli (latent) bir niceliktir — veri üreten sürecin bir parametresidir, asla doğrudan gözlemlenmez. Elde ettiğiniz tek şey günde bir gerçekleşen getiridir. Dolayısıyla her volatilite değerlendirmesi aslında tahmininizin, gerçeğin gürültülü bir vekili (proxy) ile karşılaştırılmasıdır. İki standart vekil:
- Karesel getiriler . Sıfır-ortalamalı bir model altında için yansız (), ama son derece gürültülü: tek bir günlük getiri, bir standart sapmanın tek gözlemli bir tahminidir. vekili gerçek vol yüksekken bile 0 olabilir (düz bir gün) veya şanslı bir kuyruk gününde devasa olabilir.
- Gerçekleşen varyans gün içi verilerinden. Çok daha az gürültülü — gün içi örnekleme, idiyosinkratik tek-getiri gürültüsünü ortalar — ki bu tam olarak HAR-RV'nin neden işe yaradığı ve herhangi bir gün içi veriniz varsa neden 'yi vekiliniz olarak kullanmanız gerektiğidir.
Neredeyse herkesi yakalayan incelik: vekil gürültülü olduğundan, kayıp fonksiyonu seçimi masum değildir. İki tahmini yanlış kayıpla sıralayın ve gürültülü vekil sıralamayı ters çevirebilir, daha kötü tahminin daha iyi olduğunu söyleyebilir. Patton (2011), tam olarak hangi kayıp fonksiyonlarının, gürültülü vekildeki beklenen kayba göre tahminleri sıralamanın gerçek (gözlemlenemeyen) varyansta elde edeceğiniz aynı sıralamayı vermesi anlamında "dayanıklı" olduğunu çözdü. Yalnızca belirli bir aile nitelik kazanır. Pratikte iki üye önemlidir.
MSE'ye karşı QLIKE
Varyanstaki ortalama karesel hata:
burada tahmindir ve , veya ile vekillenir. MSE, Patton anlamında dayanıklıdır (sıralaması vekil-tutarlıdır), ama simetrik ve ölçek-bağımlıdır: aynı mutlak boyuttaki bir fazla-tahmini ve bir eksik-tahmini eşit cezalandırır ve yüksek volatilite dönemlerindeki hataları sakin dönemlerdeki hatalardan muazzam ölçüde daha fazla ağırlıklandırır. Sakin günlerin %95'ini tutturan ama üç kriz gününde varyans tahminlerini patlatan bir model, kriz davranışı tam da istediğiniz şey olsa bile MSE altında berbat görünür.
QLIKE (quasi-likelihood) kaybı beygirdir:
Varyans üzerinde bir Gauss olabilirliğinin ima ettiği kayıptır, o da Patton anlamında dayanıklıdır ve onu volatilite için tercih edilen seçim yapan iki özelliği vardır. Birincisi, doğru yönde asimetriktir: varyansın eksik-tahminini fazla-tahminden daha çok cezalandırır. Bir risk yöneticisi veya vol-hedefleyici için doğru asimetri budur — volu eksik tahmin etmek, önemli hale gelmeden hemen önce çok fazla boyut aldığınız anlamına gelir ki bu pahalı hatadır. İkincisi, (kabaca) ölçekten bağımsızdır: oranına bağlı olduğundan, %10'luk bir tahmin hatası sakin bir günde de kriz gününde de aşağı yukarı aynı maliyeti taşır, dolayısıyla değerlendirme MSE'nin olduğu gibi bir avuç yüksek-varyans gözlemi tarafından kaçırılmaz. Vekilin değişen varyanslılığına (heteroskedastisite) karşı o dayanıklılık, işin tüm noktası volatilitenin çılgınca değişmesi olduğunda tam olarak istediğiniz şeydir.
olduğuna dikkat edin, eşitlik ancak ve ancak ise. Düşük daha iyidir, MSE ile aynı.
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)
İki işlevsel uyarı. Vekili ve tahmini aynı birimlerde tutun (ikisi de günlük varyans ya da ikisi de yıllıklandırılmış) yoksa oran anlamsızdır. Ve forecast_var'ın asla sıfıra ulaşmasına izin vermeyin — küçük bir tabana kırpın, çünkü tüm ortalamayı zehirler.
Mincer-Zarnowitz regresyonu
Tek bir kayıp sayısı size hangi tahminin daha iyi olduğunu söyler; bir tahminin nasıl yanlış olduğunu söylemez. Mincer-Zarnowitz (1969) regresyonu bunu yapar. Vekili tahmin üzerinde regres edin:
Optimal, yansız bir tahmin altında ve : ortalamada gerçekleşen varyans tahmine eşittir. Sapmalar patolojiyi teşhis eder:
- ile : çok oynak bir tahminin klasik imzası — aşırı tepki verir, tam gerçekleşmeyen aşırılıkları öngörür. Ham karesel-getiri-güdümlü modeller için çok yaygındır.
- : tahmin yetersiz tepki verir, gerçek varyansla çok az ölçeklenir.
- Düşük regresyon 'si: ortalamada iyi görünse bile, tahmin varyansı günden güne kötü izler. Vekil çok gürültülü olduğundan, 'ye karşı MZ 'sinin çoğu zaman yalnızca 0.05-0.20 olmasından telaşlanmayın; 'ye karşı çok daha yüksek olacaktır. 'ye karşı , tahmin ne kadar iyi olursa olsun, salt vekil gürültüsü nedeniyle 1'in epey altında sınırlıdır.
için ortak bir -testi resmi bir kalibrasyon kontrolü verir. Pratikte, MZ'yi bir tahmini anlamak için bir teşhis olarak, QLIKE'ı ise tahminleri sıralamak için kullanın.
Diebold-Mariano: fark gerçek mi?
Diyelim GARCH'ın ortalama QLIKE'ı 0.183 ve EWMA'nınki 0.191. GARCH "kazanır." Ama 0.008 gerçek bir üstünlük mü yoksa örnekleme gürültüsü mü? Diebold-Mariano (1995) testi tam olarak bunu yanıtlar. Dönem başına kayıp farkını tanımlayın
iki tahmin ve için (burada = QLIKE). Sıfır hipotezi eşit tahmin doğruluğudur, . İstatistik, seri korelasyonlu olduğundan uzun dönem (HAC) standart hatasıyla standartlaştırılmış ortalama farktır:
burada bir Newey-West tipi uzun dönem varyans tahminidir. 'yı aşan bir DM istatistiği eşit doğruluğu %5'te reddeder. Kritik olarak, DM tahminler hakkında bir testtir, iç içe modeller hakkında değil ve üzerinde naif bir -testinin göz ardı edeceği kayıp serisindeki seri bağımlılığı ele alır.
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)
O yorumdaki açıklayıcı sonuç, dürüst ve yaygın sonuçtur ve bu bölümün var olmasının tüm nedenidir: GARCH sıklıkla EWMA'dan biraz daha düşük bir ortalama kayıp kaydeder ve aynı sıklıkla bu üstünlük DM anlamlılık çıtasını geçmeyi başaramaz. Yalnızca ortalama QLIKE'ı rapor ederseniz, bir DM testinin veto edeceği üstünlüklere kendinizi ikna edersiniz. DM istatistiğini rapor edin. Bu, dayanıklı üstünlük olmadan dürüst değerlendirme yazısında strateji getirilerine uyguladığımız aynı disiplindir — bir kıyaslamayı yenen bir nokta tahmini, gürültü olduğunu dışlayana kadar bir üstünlük değildir.
Geriye Dönük Test: Walk-Forward Vol-Hedefli Bir Strateji
Şimdi iki yarıyı — bir tahminci ve bir boyutlandırma kuralı — bir stratejide birleştiriyor ve anlamı olan tek şekilde değerlendiriyoruz: walk-forward, örneklem dışı, maliyetlerle.
Strateji kasıtlı olarak basittir, çünkü basitlik sonucu akıllı bir sinyale değil vol tahminine atfetmemizi sağlayan şeydir. Yalnızca-long, vol-hedefli BTC. Her gün, ertesi günün volatilitesini tahmin edin, pozisyonu 'e ayarlayın, gece boyunca tutun ve tekrarlayın. Bir long/flat varyantı, bir trend filtresi negatif olduğunda pozisyonu kapatır; küçük-portföy varyantı, tek bir varlığın varyansı yerine Bölüm 3'ten gelen DCC kovaryans matrisi üzerinde boyutlandırır. Yalnızca-long durumunu tam olarak açıklıyor ve uzantıları not ediyoruz.
Walk-forward mekaniği ve ileriye-bakmama sözleşmesi
Bu geriye dönük testin tek en önemli özelliği şudur: günündeki pozisyonu boyutlandırmak için kullanılan her nicelik, yalnızca gününün kapanışında mevcut olan verilerle hesaplanabilir. GARCH parametreleri 'de biten kayan bir pencerede yeniden tahmin edilir; tahmin, o uyumdan gelen tek-adım-ileri 'dir; pozisyon o tahminden ayarlanır; ve kazanılan getiri 'dir, burada modelin hiç görmediği bir sonraki günün getirisidir. GARCH'ı tam örneklemde yeniden uyumlayıp sonra geçmişi "tahmin etmek", insanların kazara harika bir geriye dönük test uydurmasının en yaygın yoludur. Bu ileriye-bakma tuzağını ve genel metodolojiyi walk-forward optimizasyonu yazısında ele alıyoruz.
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),
}
Göründüğünden daha önemli birkaç uygulama notu:
- Optimizasyon için ölçekleme.
archuyumları getiriler yüzde olduğunda sayısal olarak daha mutludur, dolayısıyla* 100ve varyansı ölçekten çıkarırken eşleşen/ 100**2. Ölçekten çıkarmayı unutun ve vol hedefiniz 10.000 kat şaşar. - Yeniden uyum kadansı. GARCH parametrelerini her gün yeniden tahmin etmek pahalıdır ve neredeyse hiçbir şey katmaz — parametreler haftadan haftaya kararlıdır. Günlük tahmin ederken (özyineleme, yeniden uyum olmadan bile yeni getirilerden 'yi günceller) haftalık yeniden uyum (
refit_every=5) standart uzlaşmadır. Bu, ortak risk için kopula modelleri yazısındaki kopula boru hattının önbellekleme tavsiyesini yansıtır. - üst sınırı kozmetik değildir. Tahmini vol ölü-sakin bir rejimde çöktüğünde, 5x, 10x kaldıraça patlayabilir. Sınırsız vol hedefleme, tam olarak tahminin en yanlış olacağı ana — bir volatilite rejim değişikliğinden hemen önce — size seve seve felaket kaldıraç verir. Sınırlayın (burada 3x) ve sınırın tam olarak en sakin, geriye bakıldığında-en-tehlikeli dönemlerde bağlayacağını kabul edin.
- Maliyetler devir hızıyla ölçeklenir ve vol hedefleme bir devir hızı makinesidir. Tahmindeki her sallantı pozisyonu yeniden boyutlandırır. Zıplayan bir tahmine sahip düşük-vol bir varlıkta defteri her gün çevirebilirsiniz.
cost_bpsterimi bir yuvarlama detayı değildir; yüksek-devirli bir vol-hedefi için brüt Sharpe iyileşmesinin anlamlı bir kısmını yiyebilir.
Çıktı neye benzer (açıklayıcı)
Bunu çok yıllık bir pencerede BTC günlük verileri üzerinde çalıştırmak, dört tahminciyi boyutlandırma paydası olarak karşılaştırmak, aşağıdaki şekle sahip bir tablo üretmeye eğilimlidir. Aşağıdaki sayılar açıklayıcıdır — tipik deseni göstermek için elle seçilmiştir, gerçek bir geriye dönük testin çıktısı değildir — ama sıralama ve büyüklükler uygulayıcıların bildirdiklerini temsil eder.
| Boyutlandırma tahmini | Sharpe | Gerçekleşen vol | Hedef vol | Maks düşüş | Yıllık devir |
|---|---|---|---|---|---|
| Sabit nominal (hedefleme yok) | 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 (gün içi vekil) | 1.09 | 0.20 | 0.20 | -0.31 | 20x |
İnşa etmeye değer iki varyant
Yalnızca-long durumu tahmini izole eder, ama iki uzantı açıkça göstermeye yetecek kadar yaygındır.
Trend kapısıyla long/flat. Vol hedefleme pozisyonu boyutlandırır ama yönsel bir görüş almaz — her zaman long'dur. Ucuz, dürüst bir iyileştirme, yavaş bir trend filtresi negatife döndüğünde pozisyonu kapatmaktır, böylece vol-hedefli long'u yalnızca yükseliş trendlerinde tutar ve aksi halde flat oturursunuz. Bu, boyutlandırma mantığını aynı tutar ve üstüne kaba bir rejim filtresi katmanlar; girişleri zamanlıyormuş gibi yapmaz, yalnızca bariz düşüş trendleri boyunca tutmaktan kaçınır.
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)
Trend kapısı düşüş tarafında devir hızını keser (ayı piyasasında küçülen bir pozisyonu çevirmeyi bırakırsınız) ama kendi rejim riskini ekler — çalkantılı yatay piyasalarda testere-dişi yapar ve dönüşlerde gecikir. Yardımcı olup olmadığı, boyutlandırma kuralının kendisiyle aynı walk-forward, DM-testli titizlikle yanıtlamanız gereken ampirik bir sorudur; bir trend filtresi tam olarak örneklem içinde harika görünen ve örneklem dışında buharlaşan türden bir eklentidir.
DCC kovaryansı üzerinde portföy vol hedefleme. Birkaç varlıklı bir defter için, skaler tahmin , portföy volatilitesi olur, burada Bölüm 3'ün DCC-GARCH'ından gelen zaman-değişken kovaryans matrisidir. Taban ağırlıkları seçersiniz (eşit ağırlık, piyasa değeri veya bir ortalama-varyans eğimi), portföyün tahmini volünü altında hesaplarsınız ve portföy hedefine ulaşmak için tüm ağırlık vektörünü ölçeklersiniz.
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
Bu, portföy-inşa literatürüne doğal köprüdür: taban ağırlıkları , Markowitz ortalama-varyans veya HRP/CVaR gibi risk-tabanlı bir yöntemden gelebilir ve vol hedefleme sonra toplam riski sabite ölçekleyen bir katman olarak üstte oturur. DCC matrisi önemlidir çünkü korelasyonlar çöküşlerde yükselir (Bölüm 3) — sakin piyasalarda çeşitlendirilmiş görünen bir portföy, statik bir kovaryansın ima ettiğinden çok daha yüksek tahmini vole tam da önemli olduğunda sahip olabilir ve katman buna tepki olarak brüt maruziyeti keser.
Her zaman çizmeniz gereken teşhisler
Asla yalnızca özet tabloya güvenmeyin. Herhangi bir vol-hedefi için üç şeyi çizin ve herhangi bir Sharpe sayısına inanmadan önce gözle inceleyin. Birincisi, stratejinin gerçekleşen kayan volünü hedef çizgisine karşı — hedefe sarılmalıdır; onun üzerinde sistematik kayma, tahmininizin düşük yanlı olduğu anlamına gelir (pahalı yön). İkincisi, pozisyon/kaldıraç serisi — sınırın bağlanmasını ve düşüşlerden hemen önce kaldıraç sıçramalarını arayın, bir rejim değişikliğine yakalanmış bir tahminin imzası. Üçüncüsü, tahmin-karşı-vekil saçılımı (Mincer-Zarnowitz resmi) — 1'den çok uzak eğimli bir bulut, tahminin QLIKE ortalamasının gizleyebileceği bir şekilde yanlış-ölçeklendiğini söyler. Bu üç grafik, herhangi bir tekil istatistikten daha fazla hata ve daha fazla öz-aldatmaca yakalar.
Bu tabloyu her geriye dönük test tablosunu okumanız gerektiği gibi okuyun: neyin dayanıklı, neyin marjinal olduğuna bakın. Dayanıklı gerçekler göze çarpar. Her vol-hedefli varyant, Sharpe'ta ve daha dramatik olarak düşüşte ve gerçekleşen-vol istikrarında sabit nominali ezer — sabit-nominal strateji %68 yıllık vol ve %78 düşüşle çalışır ki bu basitçe yatırım-yapılamazdır. Ve her hedefleme yöntemi %20 hedefe yakın gerçekleşen vol sunar ki bu mekaniğin işlemesinin tüm vaadidir. Marjinal gerçekler tahminciler arasındaki farklardır: HAR, GARCH'ı, GARCH EWMA'yı, EWMA rolling RV'yi kıl payı geçer, ama aralar küçüktür — Sharpe'ın onda biri kadar — ve tahminler üzerinde Diebold-Mariano veya getiriler üzerinde bir bootstrap ile test edildiğinde sıklıkla anlamlılığı geçmeyi başaramaz. Sofistike ve naif tahminci arasındaki o küçük, kırılgan, rejime-bağlı boşluk, tüm bu serinin dürüst manşetidir.
Bunun Size Ne Kazandırdığı Konusunda Dürüst Olmak
Bu blogun kendinizi kandırmadan geriye dönük test etme konusunda bütün bir koleksiyonu var, o yüzden onu sessizce sizin yapmamanızı ummak yerine kendi sonucumuza uygulayalım.
Volatilite hedefleme risk-ayarlı getiriyi ve düşüşleri iyileştirir. Hiçlikten alfa üretmez. Tabloya tekrar bakın. Hedeflemeden gelen Sharpe iyileşmesi gerçektir ve sahip olmaya değer — ama onu ayrıştırın ve çoğu yüksek-vol rejimlerine sabit bir pozisyon tutmamaktan gelir ki bu mekanik olarak en kötü düşüşlerden kaçınır ve bileşiklenme yolunu istikrarlı kılar. Strateji hâlâ long BTC'dir; piyasanın vermediği bir görüşü yoktur. BTC örnekleminizde negatif bir Sharpe'a sahipse, vol hedefleme size daha az kötü bir negatif Sharpe verir, pozitif değil. Getiri dağılımını yeniden şekillendirir — daha ince kuyruklar, daha istikrarlı vol, daha iyi geometrik bileşiklenme — ama ham yönsel üstünlük, altta yatan long her neyse odur. Güzel bir öz sermaye eğrisinin sizi risk yönetimi bulmuşken alfa bulduğunuza inandırmasına izin vermeyin. Moreira-Muir, vol yönetiminden hisse senedi faktörlerinde gerçek alfa buldu, ama o sonuç faktörün zaman-değişken risk-getiri takasıyla ilgilidir ve farklı bir örneklem üzerinde tek bir kripto varlığına otomatik olarak aktarılmaz.
GARCH'ın EWMA üzerindeki tahmin-kalitesi üstünlüğü sıklıkla küçüktür ve rejime bağlıdır. Bu, Bölüm 1-3'ün rahatsız edici karşılığıdır. Giderek daha sofistike modeller inşa ettiniz — kaldıraç terimleri, Student-t kuyruklar, dinamik korelasyonlar — ve her birinin vol-hedefleme P&L'sine, naif bir EWMA'ya kıyasla marjinal katkısı sıklıkla gürültü bandı içindedir. GARCH'ın avantajı (şoklardan sonra ortalamaya dönüş) esas olarak belirli rejimlerde ortaya çıkar: sonra normalleşen keskin sıçramalar. Öğütücü trendlerde veya kalıcı yüksek-vol rejimlerinde EWMA'dan neredeyse hiç farklı değildir. Bu GARCH'ı işe yaramaz kılmaz — ortalamaya dönüş yapısı, yorumlanabilir parametreler, ileri yollar simüle etme ve tahmine karşı opsiyon fiyatlama yeteneği hepsi EWMA'nın sahip olmadığı değere sahiptir — ama tek kullanımınız boyutlandırmaysa, karmaşıklık maliyetini ödemeden önce DM testini çalıştırın ve rejim tespiti yazısının size aynı şeyi farklı bir açıdan söylediğini bilin: kazanan model rejime bağlıdır.
Geriye dönük test Sharpe'ı canlı Sharpe için bir üst sınırdır ve vol hedefleme boşluğu genişletir. Strateji devir-yoğun ve kaldıraç-ölçekli olduğundan, naif bir geriye dönük testin atladığı sürtünmelere alışılmadık derecede duyarlıdır: gerçekleşmeleriniz boyutlandırdığınız kapanıştan daha kötüdür, kaldıraçlı perp pozisyonlarındaki fonlama maliyetleri sürekli birikir ve kaldıraç sınırı basit bir w * return'ün göz ardı ettiği marj ve tasfiye mekaniğiyle etkileşir. Bunların her biri canlıyı geriye dönük testten daha kötü yapar. Bu boşluğu geriye dönük test-canlı paritesi yazısında sistematik olarak ele alıyoruz; özellikle vol hedefleme için, muhafazakâr maliyetler, gerçekçi (düşük) bir kaldıraç sınırı kullanarak ve sinyali hesapladığınız kapanış yerine bir sonraki çubuğun açılışında işlem yaparak bunun için bütçe ayırın.
Volatilite risk primi üzerine bir kenar notu. Yukarıdaki her şey gerçekleşen volatiliteyi tahmin eder. Paralel, işlem yapılabilir bir nesne vardır: opsiyonlara fiyatlanan örtük volatilite ki bu ortalamada sonraki gerçekleşen volün üzerinde durur — volatilite risk primi, bir vol sıçramasının riskini taşımanın karşılığı. O boşluk kendi başına bir getiri kaynağıdır (varyans satmak onu hasat eder, satın almak kuyruk riskini hedge eder) ve gerçekten vol hedeflemeden farklı bir oyundur: volatilitenin bir tahminini kullanmak yerine volatilitenin fiyatı üzerine bir bahistir. Burada peşine düşmüyoruz, ama makine Black-Scholes opsiyon fiyatlaması yazısındaki fiyatlama modeliyle başlar ve iyi bir gerçekleşen-vol tahmini (Bölüm 1-2), örtük volün pahalı mı ucuz mu olduğuna karar vermek için ihtiyacınız olan tam girdidir. GARCH tahmininizi opsiyon piyasasının örtük voluyle karşılaştırmak, bu seride inşa ettiğiniz her şeyin daha dürüst kullanımlarından biridir.
Pratik Değerlendirmeler
Çalışan bir vol-hedefini kırılgan olandan ayıran şeylerin bir karışımı.
- Doğru ufukta tahmin edin. Bir gün tutulan bir pozisyonu boyutlandırırsanız, bir günlük vol tahmin edin. Haftalık yeniden dengelerseniz, haftalık vol tahmin edin (ve hedefleyin) veya günlük GARCH tahminini ufuk boyunca toplulaştırın — çok-adımlı GARCH tahmini 'ye doğru ortalamaya döner ki naif "" ölçeklemesi bunu göz ardı eder. Bölüm 1 çok-adımlı GARCH tahminini kapsar.
- 7/24 piyasalarda yıllıklandırma. Kripto hafta sonu veya tatil olmadan yılda 365 gün işlem görür, dolayısıyla günlük volü hisse senetlerinden gelen ile değil ile yıllıklandırın. Bunu yanlış yapmak hedefinizi sessizce ~%20 yanlış ölçekler.
- Payda bir kovaryans matrisi olabilir. Çok-varlıklı bir defter için, skaler 'yi Bölüm 3'ün DCC-GARCH'ından gelen portföy volü ile değiştirin ve portföy hedef voluna ulaşmak için tüm ağırlık vektörünü ölçekleyin. Bu, vol hedeflemeyi ortalama-varyans boyutlandırmaya (kripto için Markowitz) ve risk-tabanlı tahsise (HRP ve CVaR boru hatları) bağlar — vol hedefleme, bir portföy risk bütçesine ölçeklemenin tek-varlık özel durumudur.
- Vol hedefleme incelikli bir şekilde döngüsel-yandaştır (procyclical). Herkes aynı kuralını çalıştırdığında, bir vol sıçraması senkronize kaldıraç azaltmayı zorlar ki bu fiyatları aşağı iter, ki bu gerçekleşen volü yükseltir, ki bu daha fazla kaldıraç azaltmayı zorlar. Bu geri besleme (2018 "volmageddon"unda ve çeşitli kripto kaldıraç azaltma zincirlerinde iyi belgelenmiş), kuralın tam olarak birçok oyuncu onu kullandığında daha az iyi çalıştığı anlamına gelir. Onu terk etmek için bir neden değildir, ama kaldıracı sınırlamak ve bir vol sıçraması sırasındaki gerçekleşmelerinizin sakin-piyasa gerçekleşmelerine benzeyeceğini varsaymamak için bir nedendir.
- Tahmini tabanlayın ve kırpın. Sıfır veya sıfıra yakın bir tahmini vol sonsuz kaldıraç üretir. 'yi her zaman mantıklı bir minimumda tabanlayın ve pozisyonu sınırlayın ve her birinin ne sıklıkta bağladığını kaydedin — sınır çoğu zaman bağlıyorsa, hedefiniz o varlık için fazla agresiftir.
Özet
- Bir volatilite tahmini, bir kararı değiştirene kadar değeri yoktur. Volatilite hedefleme — maruziyeti (sınırlı) olarak boyutlandırma — bir tahminin değerinin en temiz testidir, çünkü tahmin kalitesi doğrudan daha düz bir gerçekleşen-vol profiline ve daha yüksek bir Sharpe'a haritalanır.
- Vol hedefleme risk-ayarlı getiriyi yükseltir ve özellikle düşüşleri kontrol eder, çünkü volatilite tahmin edilebilirdir (kümelenir) oysa yön değildir ve çünkü Sharpe oranları kuralın otomatik olarak az ağırlıklandırdığı yüksek-vol rejimlerinde düşer. Bu, beklenen getirinin volatiliteyle ölçeklendiği varsayımı altında Kelly boyutlandırmasıdır.
- GARCH'ı güçlü temel çizgilere karşı dürüstçe kıyaslayın: rolling realized vol, EWMA/RiskMetrics (, sıfır serbest parametreli bir IGARCH) ve gün içi gerçekleşen-varyans vekili üzerinde HAR-RV. EWMA ve HAR yenilmesi zordur.
- Gerçek volatiliteyi gözlemleyemezsiniz, o yüzden bir vekile karşı ( veya çok daha iyisi ) vekil gürültüsüne dayanıklı kayıp fonksiyonları kullanarak değerlendirin. QLIKE'ı MSE'ye tercih edin: eksik-tahmini daha çok cezalandırır (pahalı hata) ve ölçekten bağımsızdır, dolayısıyla birkaç yüksek-vol günü tarafından kaçırılmaz. Yanlılığı teşhis etmek için Mincer-Zarnowitz ve bir tahminin üstünlüğünün gerçek mi gürültü mü olduğuna karar vermek için Diebold-Mariano testini kullanın.
- Maliyet-farkında bir walk-forward geriye dönük testte, vol hedefleme Sharpe ve düşüşte sabit nominali güvenilir biçimde yener ve dört tahminci birbirine yakın kümelenir — GARCH'ın EWMA üzerindeki üstünlüğü küçüktür, rejime bağlıdır ve sıklıkla istatistiksel olarak anlamlı değildir. Yalnızca ortalama kaybı değil, DM testini rapor edin.
- Dürüst olun: vol hedefleme risk yönetimidir, alfa değil. Zaten sahip olduğunuz yönsel bahsin getiri dağılımını yeniden şekillendirir; hiçlikten üstünlük yaratmaz. Ve devir-yoğun ve kaldıraç-ölçeklidir, dolayısıyla canlı sonuçlar geriye dönük testin normalden daha fazla gerisinde kalır.
Kaynaklar:
- 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
Kantitatif Araştırma & Strateji