حد للخسارة بمستوى ثقة
تجيب القيمة المعرضة للخطر عن: كم قد أخسر في يوم سيئ، لا في الأسوأ؟ ومعنى قيمة معرضة للخطر ليوم واحد بثقة 95% قدرها 2% أن الخسارة لا ينبغي أن تتجاوز 2% في 95 يومًا من كل 100. والطريقة التاريخية لا تحتاج نموذجًا. نأخذ العوائد السابقة ونرتبها ونقرأ الخسارة عند المئين الخامس: القيمة هي سالب ذلك الكمّي. وتستخدمها الجهات الرقابية وحدود المخاطر في كل مكان لأنها رقم واحد يقارنه المدير بحد.
import numpy as np
rng = np.random.default_rng(3)
returns = rng.normal(0.0004, 0.012, size=500) # two years of daily returns
var_95 = -np.quantile(returns, 0.05) # minus the 5th percentile
var_99 = -np.quantile(returns, 0.01)
print(round(float(var_95), 5), round(float(var_99), 5)) # 0.01928 0.027 the 99% loss limit is largerاختبار القيمة المعرضة للخطر: التجاوزات
القيمة المعرضة للخطر تنبؤ، لذا يمكن فحصها. والتجاوز هو يوم تجاوزت فيه الخسارة القيمة، return < -VaR. ومع ثقة 95% يُتوقع أن يكون نحو 5% من الأيام تجاوزات: أكثر بكثير يعني أن النموذج يقلل المخاطر، وأقل بكثير يعني أنه حذر جدًا. وتعدّ الجهات الرقابية التجاوزات على 250 يومًا لهذا السبب بالذات. لاحظ المتراجحة الصارمة: الخسارة المساوية للقيمة ليست تجاوزًا.
import numpy as np
rng = np.random.default_rng(3)
returns = rng.normal(0.0004, 0.012, size=500)
var_95 = -np.quantile(returns, 0.05)
exceptions = int(np.sum(returns < -var_95))
print(exceptions, "exceptions in", len(returns), "days; expected about", int(0.05 * len(returns))) # 25 25آفاق أطول، وكما حدث
كثيرًا ما يُطلب ما يقيس 10 أيام. ومع عوائد يومية مستقلة يزداد التقلب بجذر الزمن، فتحجِّم قاعدة جذر الزمن: VaR_T = VaR_1 * sqrt(T). وهي تقريب أضعف مع الذيول السميكة والعوائد المترابطة ذاتيًا. وتحترم الاختبارات الأمينة الزمن أيضًا: فالقيمة المستخدمة في اليوم t لا تستخدم إلا عوائد ما قبل اليوم t، وهو الانضباط نفسه لتجنب النظر إلى المستقبل. والقيمة المتحركة تفعل ذلك بنافذة من آخر n يوم.
# The square-root-of-time rule for several horizons
import math
one_day = 0.0186
for days in (1, 5, 10, 20):
print(days, round(one_day * math.sqrt(days), 4)) # 1: 0.0186, 5: 0.0416, 10: 0.0588, 20: 0.0832import numpy as np
def historical_var(returns, confidence):
return float(-np.quantile(returns, 1 - confidence))
def rolling_var(returns, window, confidence):
out = np.full(len(returns), np.nan)
for t in range(window, len(returns)):
out[t] = historical_var(returns[t - window:t], confidence) # the days BEFORE day t
return out
rng = np.random.default_rng(3)
returns = rng.normal(0.0004, 0.012, size=500)
rolling = rolling_var(returns, 250, 0.99)
print(np.isnan(rolling[:250]).all(), round(float(rolling[250]), 5), round(float(rolling[-1]), 5))
exceptions = int(np.sum(returns[250:] < -rolling[250:]))
print(exceptions, "exceptions in", len(returns) - 250, "days (about 2 expected at 99%)")
print(round(historical_var(returns, 0.99) * np.sqrt(10), 5)) # a 10-day figure by the square-root rule- القيمة المعرضة التاريخية هي سالب الكمّي
(1 - confidence)من العوائد السابقة (np.quantile): نسبة خسارة موجبة بلا نموذج. - اختبر بعدّ التجاوزات (
return < -VaR): نحو1 - confidenceمن الأيام؛ والأكثر يعني أن القيمة أدنى من اللازم. - حجِّم إلى أفق بـ
var * sqrt(days)؛ والنافذة المتحركة لا تستخدم إلا الأيام السابقة؛ والقيمة تعطي عتبة لا حجم الخسائر بعدها.
التالي: القيمة المعرضة المعلمية، حساب العتبة نفسها من توزيع طبيعي بدل التاريخ الخام.
المختبر: ما الذي يُقيَّم
- اقرأ الخسارة من التاريخ باستخدام
historical_var25 نقطة - عُد حالات التجاوز باستخدام
var_exceptions25 نقطة - مدّد الأفق باستخدام
scale_var25 نقطة - قدّرها كما حدثت باستخدام
rolling_var25 نقطة