σμimplied vol · KKmax(S−K,0)udβρᵢⱼfat tailsPnL · drawdownyield · TdSₜ = μSₜ dt + σSₜ dWₜC = S·N(d₁) − K·e⁻ʳᵀ·N(d₂)σₚ² = wᵀΣwd₁ = [ln(S/K) + (r + σ²⁄2)T] ⁄ σ√T∂V/∂t + ½σ²S²·∂²V/∂S² + rS·∂V/∂S − rV = 0Sharpe = (Rₚ − R_f) ⁄ σₚVaR₉₉ = μ − 2.33σρ = Cov(X,Y) ⁄ σₓσᵧE[Rₚ] = Σ wᵢ·E[Rᵢ]φ(x) = e^(−x²/2) ⁄ √2πE[Rᵢ] = R_f + βᵢ(E[Rₘ] − R_f)dXₜ = θ(μ − Xₜ)dt + σ dWₜσ²ₜ = ω + α·ε²ₜ₋₁ + β·σ²ₜ₋₁C − P = S − K·e⁻ʳᵀΔ = ∂V/∂S Γ = ∂²V/∂S²p = (e^(rΔt) − d) ⁄ (u − d)rₜ = ln(Pₜ ⁄ Pₜ₋₁)E[Xₜ₊₁ | ℱₜ] = Xₜf* = (bp − q) ⁄ bz = (x − μ) ⁄ σP(N=k) = λᵏe^(−λ) ⁄ k!Θ = −∂V/∂Tν = S·φ(d₁)·√Tmin wᵀΣw s.t. wᵀμ = μ*∫Σ∂∞λ
σμimplied vol · KKmax(S−K,0)udβρᵢⱼfat tailsPnL · drawdownyield · TdSₜ = μSₜ dt + σSₜ dWₜC = S·N(d₁) − K·e⁻ʳᵀ·N(d₂)σₚ² = wᵀΣwd₁ = [ln(S/K) + (r + σ²⁄2)T] ⁄ σ√T∂V/∂t + ½σ²S²·∂²V/∂S² + rS·∂V/∂S − rV = 0Sharpe = (Rₚ − R_f) ⁄ σₚVaR₉₉ = μ − 2.33σρ = Cov(X,Y) ⁄ σₓσᵧE[Rₚ] = Σ wᵢ·E[Rᵢ]φ(x) = e^(−x²/2) ⁄ √2πE[Rᵢ] = R_f + βᵢ(E[Rₘ] − R_f)dXₜ = θ(μ − Xₜ)dt + σ dWₜσ²ₜ = ω + α·ε²ₜ₋₁ + β·σ²ₜ₋₁C − P = S − K·e⁻ʳᵀΔ = ∂V/∂S Γ = ∂²V/∂S²p = (e^(rΔt) − d) ⁄ (u − d)rₜ = ln(Pₜ ⁄ Pₜ₋₁)E[Xₜ₊₁ | ℱₜ] = Xₜf* = (bp − q) ⁄ bz = (x − μ) ⁄ σP(N=k) = λᵏe^(−λ) ⁄ k!Θ = −∂V/∂Tν = S·φ(d₁)·√Tmin wᵀΣw s.t. wᵀμ = μ*∫Σ∂∞λ
uantCraft Academyالمسارات
Ctrl K
AO
+1.2k متعلّم
تسجيل الدخولانضم ↗
المسارات
AO
+1.2k متعلّم
تسجيل الدخول
  • English
  • Français
  • Español
  • العربية
  • Português
  • Deutsch
  • 日本語
  • 中文
مسار Python›الوحدة 3 · الاحتمالات ومحاكاة مونت كارلو›الموضوع 3.12·~50 دمتوسط

خطأ مونت كارلو وتقاربها

الموضع في المسارالوحدة 3 من 11 · الموضوع 12 من 12
3.12 خطأ مونت كارلو وتقاربها
—درجة المختبر— / 100إجمالي XP—التتابع—

كم يمكن أن يخطئ التقدير؟

تقدير مونت كارلو متوسط n سحبة عشوائية، فهو نفسه عشوائي. وخطؤه المعتاد هو الخطأ المعياري: الانحراف المعياري للسحوبات مقسومًا على sqrt(n)، وهي الصيغة نفسها في اختبار t. ونتيجتان مهمتان. الأولى: لا يعتمد الخطأ على صعوبة المسألة الظاهرة بل على تشتت الكمية التي تأخذ متوسطها. الثانية: أنه يتناقص ببطء: لكسب خانة دقة إضافية تحتاج إلى 100 ضعف من السحوبات.

import math
import numpy as np

# Estimate E[exp(Z)] for a standard normal Z; the exact value is exp(0.5) = 1.6487
for n in (100, 10000, 1000000):
    values = np.exp(np.random.default_rng(5).standard_normal(n))
    print(n, round(values.mean(), 4), round(values.std(ddof=1) / math.sqrt(n), 5))
# 100 1.2167 0.14583
# 10000 1.6887 0.0217        the error falls roughly like 1 / sqrt(n)
# 1000000 1.6508 0.00216

أشرطة الخطأ وكلفة الدقة

اذكر العدد المحاكى مع فاصل الثقة المتوسط -/+ 1.96 * الخطأ المعياري: النطاق الذي يحوي القيمة الحقيقية نحو 95% من المرات. وإن أردت الجواب ضمن تفاوت معين فاعكس صيغة الخطأ المعياري: n = (std / الخطأ_المستهدف)² مع التقريب لأعلى. ومع تشتت نحو 2.2 وهدف 0.001 تحتاج إلى قرابة خمسة ملايين سحبة؛ ولهدف 0.01 تكفي 47000. شغّل محاكاة تجريبية صغيرة أولًا لمعرفة std ثم قرّر عدد سحوبات التشغيل الحقيقي.

values = np.exp(np.random.default_rng(5).standard_normal(10000))
mean, std = values.mean(), values.std(ddof=1)
std_error = std / math.sqrt(len(values))

print(round(mean - 1.96 * std_error, 4), round(mean + 1.96 * std_error, 4))   # 1.6462 1.7312   contains the exact 1.6487

print(math.ceil((std / 0.01) ** 2))      # 47111      draws for a standard error of 0.01
print(math.ceil((std / 0.001) ** 2))     # 4710946    10 times the precision, 100 times the draws

دقة أرخص: المتغيرات المتعاكسة

إلى جانب السحب أكثر يمكنك السحب بذكاء أكبر. فبالنسبة لمتغير طبيعي معياري Z تكون الصورة المرآتية -Z سحبة صالحة تمامًا. وإذا كانت f رتيبة تتحرك f(Z) وf(-Z) في اتجاهين متعاكسين فيكون متوسطهما أقل ضجيجًا بكثير من كلٍّ منهما. والمقدّر المتعاكس يأخذ متوسط (f(z) + f(-z)) / 2 على السحوبات. وفي المثال ينخفض الخطأ المعياري من 0.0217 إلى 0.0119 بالعدد نفسه من الأعداد العشوائية، وفي دالة فردية مثل 3z + 1 يختفي الضجيج تمامًا. وهذه إحدى حيل تقليل التباين.

z = np.random.default_rng(5).standard_normal(10000)
plain = np.exp(z)
antithetic = (np.exp(z) + np.exp(-z)) / 2           # each draw is paired with its mirror image

print(round(plain.mean(), 4), round(plain.std(ddof=1) / 100, 5))            # 1.6887 0.0217
print(round(antithetic.mean(), 4), round(antithetic.std(ddof=1) / 100, 5))  # 1.6565 0.01192   half the noise, same 10,000 numbers
print(round(math.exp(0.5), 4))                                              # 1.6487           the exact value
# The running mean of one long simulation settles down as n grows
values = np.exp(np.random.default_rng(5).standard_normal(100000))
running = np.cumsum(values) / np.arange(1, len(values) + 1)
print([round(float(running[k - 1]), 4) for k in (10, 100, 1000, 100000)])   # [1.5522, 1.2167, 1.634, 1.6502]
تحقق من الخطأ لا من الأرقامعرض ستة أرقام عشرية من محاكاة يوحي بدقة ليست فيها: فمع خطأ معياري 0.02 لا يعني شيئًا إلا الرقم الأول أو الأولان. استخدم فاصل الثقة لتقرير عدد الأرقام المذكورة، واختبر التقارب بإعادة التشغيل ببذرة أخرى: إن اختلفت الأجوبة بأكثر من الخطأ المعياري فالمحاكاة خاطئة أو صغيرة جدًا.
  • الخطأ المعياري = std / sqrt(n): 100 ضعف السحوبات يعطي خطأ أقل بعشرة أضعاف؛ اذكر mean -/+ 1.96 * se.
  • السحوبات اللازمة لخطأ مستهدف: ceil((std / target) ** 2)؛ شغّل تجربة صغيرة أولًا لمعرفة std.
  • المتغيرات المتعاكسة: خذ متوسط (f(z) + f(-z)) / 2 لتقليل الضجيج دون أعداد عشوائية إضافية؛ وتحقق دائمًا من التقارب ببذرة أخرى.

التالي: القيمة الحالية والخصم، الخطوة الأولى نحو الدخل الثابت: يورو غدًا يساوي أقل من يورو اليوم.

المختبر: ما الذي يُقيَّم

  • قِس ضجيج التقدير باستخدام standard_error25 نقطة
  • ضع أشرطة خطأ على الجواب باستخدام mc_confidence_interval25 نقطة
  • ضع ميزانية المحاكاة باستخدام samples_needed25 نقطة
  • احصل على الدقة نفسها بكلفة أقل باستخدام antithetic_mean25 نقطة
المستكشف · lab-65-1
▾ lab-65-1
…
bash · داخل المتصفح
learner@quantcraft:~/lab-65-1$
لم يتم تحميل Python بعدPythonLn 1, Col 1Spaces: 4UTF-8

هل تريد إعادة ضبط هذا الموضوع؟

سيعود كل ما في lab-65-1 إلى الملفات الابتدائية وستُمسح الطرفية. ستفقد حلّك الحالي ولا يمكن التراجع عن ذلك.

سيُعاد ضبطه
  • main.py ← الشيفرة الابتدائية
  • سجل الطرفية ومخرجات الاختبارات
  • التغييرات غير المُرسلة
سيُحتفظ به
  • أفضل درجة في المختبر
  • نقاط XP والتتابع
  • تقدّم المحاضرة والملاحظات

سجّل الدخول لتشغيل الكود الخاص بك.

قراءة كل المحاضرات مجانية. أنشئ حسابًا أو سجّل الدخول لتشغيل الكود وتنفيذ الاختبارات وتسليم هذا المختبر.

  • بيئة تطوير داخل المتصفح مع طرفية bash — لا حاجة لتثبيت أي شيء
  • تصحيح فوري ونقاط خبرة ومكانك في المسار
إنشاء حسابتسجيل الدخول
أو
المتابعة عبر GitHub