استخدام ما تعرفه أصلًا
عند محاكاة كول تحاكي أيضًا سعر السهم عند الانتهاء S_T الذي تعرف متوسطه الحقيقي S0 * exp(r * T) تمامًا. وفي عينتك خرج متوسط S_T منحرفًا قليلًا، لنقل مرتفعًا جدًا. ولأن مدفوع الكول وS_T يتحركان معًا فمتوسط عينة الكول مرتفع على الأرجح أيضًا. والمتغير الضابط يستغل ذلك: يطرح من تقدير المطلوب مضاعفًا للخطأ المرصود في الكمية المعروفة.
import numpy as np
rng = np.random.default_rng(1)
z = rng.standard_normal(2000)
s_t = 100.0 * np.exp((0.05 - 0.5 * 0.2 ** 2) + 0.2 * z) # terminal prices
call = np.maximum(s_t - 100.0, 0.0) # the payoff we want
known = 100.0 * np.exp(0.05) # E[S_T], exactly
print(round(float(s_t.mean()), 3), round(known, 3)) # the sample mean of S_T vs its true mean
print(round(float(s_t.mean() - known), 3)) # the observed error of the controlأفضل مضاعف
كم من خطأ الضابط ينبغي أن تطرح؟ المضاعف b الذي يصغّر تباين payoff - b * control هو b = cov(payoff, control) / var(control)، وهو بالضبط ميل انحدار المدفوع على الضابط (المجاميع نفسها في بيتا موضوع CAPM). والتقدير المضبوط هو mean(payoff) - b * (mean(control) - known_mean). وهو غير متحيز لأن الحد المطروح توقعه صفر.
import numpy as np
def control_coefficient(payoff, control):
dev = control - control.mean()
return float(np.sum(dev * (payoff - payoff.mean())) / np.sum(dev ** 2))
rng = np.random.default_rng(1)
z = rng.standard_normal(2000)
s_t = 100.0 * np.exp((0.05 - 0.5 * 0.2 ** 2) + 0.2 * z)
call = np.maximum(s_t - 100.0, 0.0)
known = 100.0 * np.exp(0.05)
b = control_coefficient(call, s_t)
controlled = call.mean() - b * (s_t.mean() - known)
print(round(b, 4), round(float(call.mean()), 4), round(float(controlled), 4)) # the plain mean and the corrected one# A payoff that is exactly proportional to the control is estimated without any error
import numpy as np
x = np.random.default_rng(2).standard_normal(50) + 5.0 # the control, known mean 5.0
y = 2.0 * x # the payoff
dev = x - x.mean()
b = np.sum(dev * (y - y.mean())) / np.sum(dev ** 2)
print(round(float(b), 6), round(float(y.mean() - b * (x.mean() - 5.0)), 6)) # 2.0 and exactly 10.0كم من الخطأ يُوفَّر
العينات المعدلة payoff - b * control هي التي تحمل الضجيج، فالخطأ المعياري للتقدير المضبوط هو انحرافها المعياري (ddof=1) على sqrt(n). ومع ارتباط rho بين المدفوع والضابط ينخفض التباين بعامل 1 - rho^2: ارتباط 0.9 يزيل 81% منه و0.99 يزيل 98%. ولا يكلف الضابط محاكاة إضافية بل بضعة أسطر.
import numpy as np
def control_variate_error(payoff, control):
dev = control - control.mean()
b = np.sum(dev * (payoff - payoff.mean())) / np.sum(dev ** 2)
return float((payoff - b * control).std(ddof=1) / np.sqrt(len(payoff)))
rng = np.random.default_rng(1)
z = rng.standard_normal(20000)
s_t = 100.0 * np.exp((0.05 - 0.5 * 0.2 ** 2) + 0.2 * z)
for strike in (80.0, 100.0, 120.0):
call = np.maximum(s_t - strike, 0.0)
plain = float(call.std(ddof=1) / np.sqrt(len(call)))
print(strike, round(plain, 4), round(control_variate_error(call, s_t), 4), round(plain / control_variate_error(call, s_t), 2))b قرب 0 ولا مكسب) وأن يكون متوسطه الدقيق معروفًا (وإلا كان التصحيح تخمينًا). ومن الضوابط الجيدة للمتوسط الحسابي في الخيار الآسيوي المتوسط الهندسي الذي لسعره صيغة، أو سعر الانتهاء نفسه. ويمكن استخدام عدة ضوابط معًا وتأتي المعاملات حينئذ من انحدار متعدد.- المتغير الضابط كمية محاكاة معروف متوسطها؛ يُطرح من التقدير مضاعف لخطئه المرصود:
mean(Y) - b * (mean(X) - E[X]). - أفضل مضاعف هو ميل الانحدار
b = cov(Y, X) / var(X)؛ والخطأ هو الانحراف المعياري لـY - b * Xعلىsqrt(n). - ينخفض التباين بـ
1 - rho^2؛ والضابط الجيد شديد الارتباط بالمدفوع ومتوسطه معروف تمامًا ولا يكلف محاكاة إضافية.
التالي: خطوط scikit-learn للعوائد، ملاءمة النماذج التنبؤية وتقييمها على بيانات العوائد.
المختبر: ما الذي يُقيَّم
- اختر المضاعف الصحيح باستخدام
control_coefficient25 نقطة - صحّح التقدير باستخدام
control_variate_estimate25 نقطة - قلّص هامش الخطأ باستخدام
control_variate_error25 نقطة - احسب المكسب باستخدام
error_reduction25 نقطة