صيغة بدل تاريخ
تقرأ القيمة التاريخية الخسارة من العوائد السابقة. أما القيمة المعلمية فتفترض أن العوائد تتبع توزيعًا طبيعيًا ولا تحتاج إلا رقمين، المتوسط والانحراف المعياري. فتكون الخسارة التي تُتجاوز باحتمال 1 - confidence هي z * sigma - mu حيث z كمّي التوزيع الطبيعي المعياري (1.645 عند 95% و2.326 عند 99%). وهي سريعة وملساء وتمتد بسهولة إلى محفظة كاملة، ولذلك كانت المعيار الصناعي لعقود.
from statistics import NormalDist
def normal_var(mu, sigma, confidence):
z = NormalDist().inv_cdf(confidence)
return z * sigma - mu
print(round(NormalDist().inv_cdf(0.95), 4), round(NormalDist().inv_cdf(0.99), 4))
print(round(normal_var(0.0005, 0.012, 0.95), 5)) # a 95% one-day loss limit
print(round(normal_var(0.0005, 0.012, 0.99), 5)) # a higher confidence, a larger limit# The multiplier z for common confidence levels
from statistics import NormalDist
for confidence in (0.90, 0.95, 0.975, 0.99, 0.999):
print(confidence, round(NormalDist().inv_cdf(confidence), 3)) # 1.282, 1.645, 1.96, 2.326, 3.09من أصل إلى محفظة وإلى عشرة أيام
بالنسبة إلى محفظة، المتوسط هو weights @ mu والانحراف المعياري sqrt(weights @ cov @ weights)، وهما كميتا موضوع تباين المحفظة. ويظهر التنويع مباشرة: الارتباطات المنخفضة تقلص الانحراف والقيمة. ولأفق أطول ينمو المتوسط بعدد الأيام والانحراف بجذره، فتكون القيمة لعشرة أيام z * sigma * sqrt(10) - mu * 10.
import numpy as np
from statistics import NormalDist
def normal_var(mu, sigma, confidence):
return NormalDist().inv_cdf(confidence) * sigma - mu
weights = np.array([0.6, 0.4])
mu = np.array([0.0005, 0.0003])
cov = np.array([[0.00016, 0.00004], [0.00004, 0.00009]]) # volatilities 1.26% and 0.95%, correlation 0.33
mean, std = float(weights @ mu), float(np.sqrt(weights @ cov @ weights))
print(round(mean, 5), round(std, 5))
print(round(normal_var(mean, std, 0.99), 5))
print(round(normal_var(mean * 10, std * np.sqrt(10), 0.99), 5)) # the 10-day figureأين يفشل افتراض التوزيع الطبيعي
للعوائد الحقيقية ذيول سميكة: فالأيام المتطرفة أكثر تكرارًا بكثير مما يسمح به التوزيع الطبيعي. فتبدو القيمة المعلمية صغيرة جدًا، خصوصًا عند الثقة العالية. ومقارنتها بالقيمة التاريخية على البيانات نفسها تُظهر الفرق: الموجب يعني أن النموذج الطبيعي يقلل المخاطر. وعند 95% يتقارب الاثنان غالبًا، وعند 99% قد يختلفان كثيرًا.
# Fat-tailed returns: the normal model understates the 99% loss
import numpy as np
from statistics import NormalDist
rng = np.random.default_rng(2)
returns = rng.standard_t(3, size=5000) * 0.008 # a fat-tailed distribution (3 degrees of freedom)
for confidence in (0.95, 0.99):
historical = -np.quantile(returns, 1 - confidence)
parametric = NormalDist().inv_cdf(confidence) * returns.std(ddof=1) - returns.mean()
print(confidence, round(float(historical), 5), round(float(parametric), 5), round(float(historical - parametric), 5))- القيمة المعلمية =
z * sigma - muمعz = NormalDist().inv_cdf(confidence): يكفي المتوسط والانحراف المعياري. - تستخدم المحفظة
weights @ muوsqrt(weights @ cov @ weights)؛ والأفق يضرب المتوسط فيdaysوالتقلب فيsqrt(days). - للعوائد الحقيقية ذيول سميكة: قارن بالقيمة التاريخية؛ والفرق الموجب يعني أن النموذج الطبيعي يقلل المخاطر.
التالي: العجز المتوقع، متوسط الخسارة في الأيام التي تُتجاوز فيها القيمة المعرضة للخطر.
المختبر: ما الذي يُقيَّم
- حوّل رقمين إلى حد باستخدام
normal_var25 نقطة - غطِّ محفظة كاملة باستخدام
portfolio_normal_var25 نقطة - انظر أبعد باستخدام
horizon_var25 نقطة - قِس الذيول السميكة باستخدام
normality_gap25 نقطة