NumPy: مشروع — محاكاة مونت كارلو

آخر تحديث: 2026-08-26

1. مشروع: محاكاة مونت كارلو

(1) السيناريو

Alice تحتاج إلى تقييم مخاطر المحفظة — القيمة المعرضة للخطر (VaR) ليس لها صيغة مغلقة. طرق التباين-التباين التقليدية تفترض التوزيعات الطبيعية، مما يقلل بشدة من تقدير مخاطر الذيل. تستخدم محاكاة مونت كارلو لنمذجة 100,000 مسار سعري.

(1) طريقة مونت كارلو

الفكرة الأساسية: استخدام العديد من العينات العشوائية لتقريب القيم الحقيقية. عندما تكون المشكلات معقدة جدًا للحلول التحليلية، تكون المحاكاة هي الطريقة الوحيدة.

PYTHON
import numpy as np

rng = np.random.default_rng(42)

N = 100_000
x = rng.random(N)
y = rng.random(N)
inside = (x**2 + y**2) <= 1.0
pi_est = 4 * inside.mean()

print(f"Pi estimate: {pi_est:.6f}")
print(f"Actual pi:   {np.pi:.6f}")
print(f"Error:       {abs(pi_est - np.pi):.6f}")

(2) تقدير Pi

PYTHON
print("=== Monte Carlo Estimation of Pi ===\n")

for N in [1_000, 10_000, 100_000, 1_000_000]:
    x = rng.random(N)
    y = rng.random(N)
    inside = (x**2 + y**2) <= 1.0
    pi_est = 4 * inside.mean()
    error = abs(pi_est - np.pi)
    print(f"N={N:>9,d}  Pi≈{pi_est:.6f}  Error={error:.6f}")

(3) المشي العشوائي

PYTHON
N = 1000
n_sim = 10_000

steps = rng.choice([-1, 1], size=(n_sim, N))
final_pos = steps.sum(axis=1)

print(f"Final position statistics ({n_sim} simulations):")
print(f"  Mean: {final_pos.mean():.2f}  (theory: 0)")
print(f"  Std:  {final_pos.std():.2f}  (theory: {np.sqrt(N):.2f})")
print(f"  Min:  {final_pos.min()}")
print(f"  Max:  {final_pos.max()}")

(4) تسعير الخيارات

PYTHON
S0 = 100
K = 105
r = 0.05
sigma = 0.20
T = 1.0

for n_sim in [10_000, 100_000, 1_000_000]:
    z = rng.standard_normal(n_sim)
    ST = S0 * np.exp((r - 0.5 * sigma**2) * T + sigma * np.sqrt(T) * z)

    call_payoff = np.maximum(ST - K, 0)
    put_payoff = np.maximum(K - ST, 0)

    call_price = np.exp(-r * T) * call_payoff.mean()
    put_price = np.exp(-r * T) * put_payoff.mean()
    call_se = np.exp(-r * T) * call_payoff.std() / np.sqrt(n_sim)

    print(f"N={n_sim:>9,d}")
    print(f"  Call: {call_price:.4f} ± {1.96*call_se:.4f}")
    print(f"  Put:  {put_price:.4f}")

(5) فترات الثقة بطريقة Bootstrap

PYTHON
data = rng.exponential(scale=2.0, size=50)
n = len(data)
B = 10_000

idx = rng.integers(0, n, size=(B, n))
boot_samples = data[idx]
boot_means = boot_samples.mean(axis=1)

ci = np.percentile(boot_means, [2.5, 97.5])
print(f"Bootstrap 95% CI for mean: [{ci[0]:.3f}, {ci[1]:.3f}]")
print(f"Sample mean: {data.mean():.3f}")

▶ مثال: تقدير Pi باستخدام مونت كارلو (الصعوبة ⭐⭐)

PYTHON
import numpy as np

rng = np.random.default_rng(42)
N = 100_000
x = rng.random(N)
y = rng.random(N)
inside = (x**2 + y**2) <= 1.0
pi_est = 4 * inside.mean()
print(f"Estimated Pi: {pi_est:.6f}")
print(f"Actual Pi:    {np.pi:.6f}")
print(f"Error:        {abs(pi_est - np.pi):.6f}")

المخرجات:

TEXT 📖 للعرض فقط
# تم التنفيذ بنجاح

المخرجات:

TEXT 📖 للعرض فقط
Estimated Pi: 3.141920
Actual Pi:    3.141593
Error:        0.000327

▶ مثال: محاكاة المشي العشوائي (الصعوبة ⭐⭐)

PYTHON
import numpy as np

rng = np.random.default_rng(42)
n_steps = 1000
n_simulations = 100

# جميع المسارات مرة واحدة باستخدام التوجيه
steps = rng.choice([-1, 1], size=(n_simulations, n_steps))
positions = np.cumsum(steps, axis=1)

final = positions[:, -1]
print(f"Mean final position: {final.mean():.2f}")
print(f"Std final position:  {final.std():.2f}")
print(f"Min: {final.min()}, Max: {final.max()}")

المخرجات:

TEXT 📖 للعرض فقط
# تم التنفيذ بنجاح

المخرجات:

TEXT 📖 للعرض فقط
Mean final position: -0.80
Std final position:  31.72
Min: -78, Max: 72

▶ مثال: فترات الثقة بطريقة Bootstrap (الصعوبة ⭐⭐⭐)

PYTHON
import numpy as np

rng = np.random.default_rng(42)
data = rng.exponential(scale=2.0, size=50)

n = len(data)
B = 10_000
indices = rng.integers(0, n, size=(B, n))
boot_means = data[indices].mean(axis=1)

ci = np.percentile(boot_means, [2.5, 97.5])
print(f"Sample mean: {data.mean():.3f}")
print(f"95% CI: [{ci[0]:.3f}, {ci[1]:.3f}]")
print(f"CI width: {ci[1] - ci[0]:.3f}")

المخرجات:

TEXT 📖 للعرض فقط
# تم التنفيذ بنجاح

المخرجات:

TEXT 📖 للعرض فقط
Sample mean: 2.165
95% CI: [1.738, 2.644]
CI width: 0.906



❓ أسئلة شائعة

س كم عدد محاكيات مونت كارلو التي أحتاجها؟
ج الخطأ ∝ 1/√N. 10,000 تعطي خطأ ~1%، 1,000,000 تعطي ~0.1%. التسعير المالي عادة يستخدم 1M، والتحقق السريع 10K. قم بتشغيل عينة صغيرة أولاً لتقدير الخطأ المعياري، ثم قم بتوسيع النطاق.
س ما الفرق بين VaR و CVaR؟
ج VaR (القيمة المعرضة للخطر) هي عتبة الخسارة عند المئين α — "أسوأ 5% تبدأ من هنا." CVaR (VaR المشروط) هو متوسط الخسارة في أسوأ 5% — "عندما تسوء الأمور، ما مدى سوئها في المتوسط؟" CVaR دائمًا ≥ VaR.
س هل نتائج مونت كارلو موثوقة؟
ج تحذيران: (1) الأرقام شبه العشوائية حتمية — البذور المختلفة تعطي نتائج مختلفة، دائمًا أبلغ عن فترات الثقة؛ (2) افتراضات النموذج مهمة — إذا كان افتراض GBM خاطئًا، فلن تنقذك مليون محاكاة.

📖 ملخص

في هذا المشروع طبقت:


📝 تمارين

  1. مبتدئ (الصعوبة ⭐): عدّل تقدير Pi لاستخدام 1,000,000 نقطة. كيف يتغير الخطأ مقارنة بـ 100,000؟

  2. متوسط (الصعوبة ⭐⭐): نفذ مشيًا عشوائيًا ثنائي الأبعاد. كل خطوة تتحرك في واحد من 4 اتجاهات (أعلى/أسفل/يسار/يمين). محاكاة 10,000 مسار من 1000 خطوة واحسب متوسط المسافة النهائية من نقطة الأصل.

  3. متقدم (الصعوبة ⭐⭐⭐): قم بتسعير خيار آسيوي (العائد يعتمد على متوسط السعر على طول المسار) باستخدام مونت كارلو. قارن السعر بخيار أوروبي بنفس المعايير. اشرح لماذا الخيار الآسيوي أرخص.

Web-Tutorial.com

فريق Web-Tutorial التقني

منصة دروس برمجية يديرها عدة مطورين. كل درس يتم كتابته ومراجعته بواسطة مطورين متخصصين في المجال. نعمل على ضمان دقة وموثوقية المحتوى — إذا لاحظت أي مشكلة، فيرجى إخبارنا.

100%