المخاطر في رقم واحد
التقلب هو الانحراف المعياري للعوائد، يُذكر سنويًا لتتيسر مقارنة الأصول: نحو 15 إلى 20% لمؤشر أسهم و30 إلى 60% لسهم منفرد وقرب 0 للنقد. وهو يحدد أحجام المراكز ويسعّر الخيارات ويضع حدود المخاطر. وأبسط تقدير هو التقلب المحقق على نافذة: الانحراف المعياري العيّني للعوائد مضروبًا في sqrt(الفترات في السنة). وهو يعامل كل يوم في النافذة بالتساوي، وهذه قوته (ثابت) وضعفه (بطيء) معًا.
import math
import numpy as np
# Eight quiet days, one -3% shock, three more days
returns = np.array([0.004, -0.002, 0.001, 0.003, -0.004, 0.002, 0.006, -0.001, -0.030, 0.004, 0.002, -0.003])
print(round(returns[:8].std(ddof=1) * math.sqrt(252), 4)) # 0.0526 before the shock: 5.3% a year
print(round(returns.std(ddof=1) * math.sqrt(252), 4)) # 0.1505 with the shock: 15.1% a yearردّ فعل أسرع: EWMA
التقلب يتجمع: فترات الهدوء وفترات العاصفة تدوم كلٌّ منها حينًا، فصدمة الأمس تقول عن الغد أكثر من يوم هادئ قبل شهر. يحدّث المتوسط المتحرك الأسي (EWMA، الذي اشتهر بـ RiskMetrics) التباين كل يوم: variance_t = lam * variance_(t-1) + (1 - lam) * return_t². ومع lam = 0.94 يحمل أحدث عائد 6% من الوزن وتتلاشى القديمة هندسيًا. فيقفز التقدير عند الصدمة ثم يتناقص تدريجيًا بدل أن يبقى مرتفعًا حتى تغادر الصدمة النافذة ثم يهبط دفعة واحدة.
lam = 0.94
variance = np.empty(len(returns))
variance[0] = returns[0] ** 2
for t in range(1, len(returns)):
variance[t] = lam * variance[t - 1] + (1 - lam) * returns[t] ** 2 # the recursion needs the previous value
ewma = np.sqrt(variance)
print(ewma.round(5).tolist())
# [0.004, 0.00391, 0.0038, 0.00375, 0.00377, 0.00369, 0.00387, 0.00376, 0.0082, 0.00801, 0.00778, 0.00758]
# ^ the shock doubles the estimate, then it fades
print(round(ewma[-1] * math.sqrt(252), 4)) # 0.1204 today's annualised estimateاستخدام المدى واستهداف تقلب
تتجاهل أسعار الإغلاق ما حدث خلال اليوم. أما أعلى سعر وأدنى سعر في اليوم فيحملان معلومات أكثر: مقدّر باركنسون sqrt(mean(ln(high/low)²) / (4 ln 2)) أكفأ بعدة أضعاف من التقدير من إغلاق إلى إغلاق، أي أنه يبلغ الدقة نفسها بأيام أقل بكثير (ويفترض غياب فجوات كبيرة بين الأيام). ومن الاستخدامات العملية لأي تقدير للتقلب استهداف التقلب: إن أردت مخاطر 10% وكان التقلب المحقق 15% فاحتفظ بـ 10 / 15 = 0.67 من المركز. فتنكمش الرافعة في العاصفة وتكبر في الهدوء.
high = np.array([101.5, 102.0, 103.2, 102.8, 104.0])
low = np.array([99.8, 100.9, 101.7, 101.1, 102.4])
parkinson = math.sqrt(np.mean(np.log(high / low) ** 2) / (4 * math.log(2)))
print(round(parkinson, 5)) # 0.00905 per-day volatility from the daily ranges
target = 0.10
realized = returns.std(ddof=1) * math.sqrt(252)
print(round(target / realized, 3)) # 0.664 hold two thirds of the position to run at 10% risk# Close-to-close versus range: the same five days
close = np.array([100.0, 101.2, 102.5, 101.9, 103.4])
print(round(float(np.diff(np.log(close)).std(ddof=1)), 5)) # 0.00955 from the closes only
print(round(parkinson, 5)) # 0.00905 from the high-low ranges of the same days- التقلب المحقق: الانحراف المعياري العيّني في
sqrt(الفترات في السنة)؛ ثابت لكنه بطيء الاستجابة. - EWMA:
variance_t = lam * variance_(t-1) + (1 - lam) * return_t²؛ الصدمات الحديثة أثقل وتتلاشى هندسيًا. - يستخدم باركنسون المدى بين أعلى وأدنى سعر في اليوم؛ ويضبط استهداف التقلب المركز بـ
الهدف / المحقق.
التالي: نسبة شارب، المكافأة لكل وحدة مخاطرة، وإلى أي حد نثق بها.
المختبر: ما الذي يُقيَّم
- قِس التقلب السنوي باستخدام
realized_volatility25 نقطة - اجعل الصدمات الحديثة أثقل باستخدام
ewma_volatility25 نقطة - استخدم المدى اليومي باستخدام
parkinson_volatility25 نقطة - حدّد حجم المركز وفق ميزانية المخاطر باستخدام
volatility_target_leverage25 نقطة