0Pricing
R Academy · درس

أساسيات محاكاة مونت كارلو

قدّر π وكميات أخرى من خلال أخذ عينات عشوائية متكررة

أساسيات محاكاة مونت كارلو درس مجاني في R Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في R Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة R Academy 4 دروس في المجموع.

ما هي محاكاة مونت كارلو؟

تستخدم محاكاة مونت كارلو أخذ عينات عشوائية متكررة لتقدير كميات يصعب حسابها تحليليًا. وقد سُمّيت بهذا الاسم نسبةً إلى الكازينو في موناكو، وتُستخدم في التمويل والفيزياء والإحصاء والذكاء الاصطناعي للتكامل والتحسين والاستدلال.

# Core idea: approximate deterministic quantities
# using random sampling and the Law of Large Numbers

# Example: estimate probability that sum of two dice > 8
set.seed(42)
n <- 10000
die1 <- sample(1:6, n, replace = TRUE)
die2 <- sample(1:6, n, replace = TRUE)
total <- die1 + die2

# Monte Carlo estimate
mc_estimate <- mean(total > 8)
cat('MC estimate P(sum > 8):', mc_estimate, '\n')

# Exact probability
exact <- sum(outer(1:6, 1:6, '+') > 8) / 36
cat('Exact probability:', exact)

تقدير Pi باستخدام نقاط عشوائية

العرض التقليدي لمونت كارلو: ضع نقاطًا عشوائيًا داخل مربع الوحدة. وتقدّر نسبة النقاط الواقعة داخل دائرة الوحدة قيمة π/4. ومع n → ∞، يقترب التقدير من π.

set.seed(42)
n <- 100000

# Random points in [-1, 1] x [-1, 1] unit square
x <- runif(n, -1, 1)
y <- runif(n, -1, 1)

# Check if inside unit circle: x^2 + y^2 <= 1
inside <- (x^2 + y^2) <= 1

# Pi estimate: fraction inside * area of square
pi_estimate <- 4 * mean(inside)
cat('Pi estimate:', pi_estimate, '\n')
cat('True pi:', pi, '\n')
cat('Error:', abs(pi_estimate - pi))

تقدير القيمة المتوقعة

تكامل مونت كارلو: E[f(X)] ≈ (1/n) Σ f(Xᵢ)، حيث إن X₁,...,Xₙ سحوبات مستقلة ومتطابقة التوزيع. ولتكامل g(x) من a إلى b، اسحب x من Uniform(a,b)، ثم يكون E[g(X)] ≈ (b-a) * mean(g(samples)).

set.seed(42)
# Estimate integral of sin(x) from 0 to pi
# Exact value = 2
n <- 50000
x_samples <- runif(n, min = 0, max = pi)
integrand_vals <- sin(x_samples)

# MC estimate = (b-a) * mean(f(x))
mc_integral <- pi * mean(integrand_vals)  # (pi - 0) * mean
cat('MC estimate of integral:', mc_integral, '\n')
cat('Exact value: 2\n')
cat('Error:', abs(mc_integral - 2), '\n')

# Standard error of the estimate
se <- pi * sd(integrand_vals) / sqrt(n)
cat('Standard error:', se)

replicate() للمحاكاة المتكررة

تُعد replicate(n, expr) دالة مضمّنة في R لتشغيل محاكاة n مرة وتجميع النتائج. وهي أوضح من حلقة for في المحاكاة البسيطة، وتعيد متجهًا أو مصفوفة.

set.seed(42)
# Simulate sample mean of 30 N(0,1) draws
# Repeat 10000 times to study sampling distribution
sample_means <- replicate(10000, {
  x <- rnorm(30)  # sample of 30
  mean(x)          # compute mean
})

# Central Limit Theorem: sample mean ~ N(0, 1/sqrt(30))
mean(sample_means)  # ~0
sd(sample_means)    # ~1/sqrt(30) = 0.183

# 95% CI width
diff(quantile(sample_means, c(0.025, 0.975)))

# Compare to theoretical
2 * 1.96 / sqrt(30)

عرض توضيحي لقانون الأعداد الكبيرة

ينص قانون الأعداد الكبيرة على أن متوسط العينة يقترب من المتوسط الحقيقي مع زيادة n. وتوضّح متابعة هذا التقارب في R سبب نجاح مونت كارلو ومدى سرعة استقرار التقديرات.

set.seed(42)
# Rolling a fair die: true mean = 3.5
n_max <- 10000
rolls <- sample(1:6, n_max, replace = TRUE)
cumulative_means <- cumsum(rolls) / seq_along(rolls)

# Show convergence at different sample sizes
ns <- c(10, 100, 1000, 5000, 10000)
results <- data.frame(
  n = ns,
  mean = cumulative_means[ns],
  error = abs(cumulative_means[ns] - 3.5)
)
print(results)
# Error decreases as n increases

تقليل التباين: المتغيرات المتضادة

استخدم العينات المنتظمة u ومتمماتها (1-u) بوصفها زوجًا متضادًا. ويؤدي ارتباطها السلبي إلى تقليل تباين المقدّر بما يصل إلى 50% مع العدد نفسه من تقييمات الدالة.

set.seed(42)
n <- 1000

# Standard MC: estimate E[exp(U)] where U~Uniform(0,1)
# True value = e - 1 = 1.718282
u <- runif(n)
mc_std <- mean(exp(u))

# Antithetic variates: use u AND 1-u
u_anti <- runif(n/2)
mc_anti <- mean((exp(u_anti) + exp(1 - u_anti)) / 2)

cat('True value:', exp(1) - 1, '\n')
cat('Standard MC:', mc_std, '\n')
cat('Antithetic MC:', mc_anti, '\n')

# Variance comparison
var_std  <- var(exp(runif(10000)))
var_anti <- var((exp(runif(5000)) + exp(1 - runif(5000)))/2)
cat('Variance ratio (anti/std):', var_anti/var_std)

المتغيرات الضابطة

يمثل المتغير الضابط دالةً ذات قيمة متوقعة معلومة ومرتبطة بالكمية المستهدفة. اطرحها بعد تحجيمها لتقليل التباين. ومن الأمثلة التقليدية تقدير E[f(X)] باستخدام g(X) المرتبطة بها والتي يكون متوسطها معلومًا.

set.seed(42)
n <- 5000

# Estimate E[exp(U)] where U~Uniform(0,1)
# True: e - 1 = 1.71828

# Control variate: g(U) = U, E[U] = 0.5
u <- runif(n)
f_vals <- exp(u)  # target
g_vals <- u       # control variate

# Optimal coefficient c = -Cov(f,g)/Var(g)
c_star <- -cov(f_vals, g_vals) / var(g_vals)

# Control variate estimator
mc_cv <- mean(f_vals + c_star * (g_vals - 0.5))

cat('Standard MC:', mean(f_vals), '\n')
cat('Control variate MC:', mc_cv, '\n')
cat('True value:', exp(1) - 1)

# Variance reduction factor
var(f_vals) / var(f_vals + c_star * (g_vals - 0.5))

مونت كارلو لتقدير الاحتمالات

تتميز مونت كارلو بتقدير الاحتمالات المعقدة التي يتعذر حسابها تحليليًا. حاكِ العملية العشوائية مرات عديدة، ثم احسب نسبة المرات التي يقع فيها الحدث.

set.seed(123)
# Birthday problem: P(at least 2 people share birthday)
# in a group of n people

birtday_collision <- function(n_people) {
  birthdays <- sample(1:365, n_people, replace = TRUE)
  length(birthdays) != length(unique(birthdays))
}

# Estimate for groups of size 10, 23, 50
sizes <- c(10, 23, 50)
for (sz in sizes) {
  p <- mean(replicate(5000, birt_day_collision <- {
    bd <- sample(1:365, sz, replace = TRUE)
    length(bd) != length(unique(bd))
  }))
  cat('n =', sz, ': P(collision) ~', round(p, 3), '\n')
}

محاكاة الحركة البراونية الهندسية

غالبًا ما تُنمذج أسعار الأسهم باستخدام الحركة البراونية الهندسية: S(t+dt) = S(t) * exp((μ - σ²/2)dt + σ√dt * Z)، حيث Z~N(0,1). وتولّد مونت كارلو مسارات الأسعار لتسعير الخيارات.

set.seed(42)
S0 <- 100     # initial price
mu <- 0.05    # annual drift
sigma <- 0.2  # annual volatility
T <- 1        # 1 year
n_steps <- 252 # daily steps
dt <- T / n_steps

# Simulate one price path
Z <- rnorm(n_steps)
log_returns <- (mu - 0.5 * sigma^2) * dt + sigma * sqrt(dt) * Z
price_path <- S0 * exp(cumsum(log_returns))

cat('Final price:', round(price_path[n_steps], 2), '\n')
cat('Min price:', round(min(price_path), 2), '\n')
cat('Max price:', round(max(price_path), 2))

تسعير الخيارات بطريقة MC

سعّر خيار شراء أوروبيًا باستخدام مونت كارلو: حاكِ عددًا كبيرًا من أسعار الأسهم النهائية، واحسب العوائد max(S_T - K, 0)، ثم خصم متوسط العائد باستخدام e^(-rT).

set.seed(42)
S0 <- 100; K <- 105; r <- 0.05; sigma <- 0.2; T <- 1
n_sim <- 50000

# Final stock prices under risk-neutral measure
Z <- rnorm(n_sim)
ST <- S0 * exp((r - 0.5 * sigma^2) * T + sigma * sqrt(T) * Z)

# Call option payoff
payoff <- pmax(ST - K, 0)

# Discounted expected payoff
call_price <- exp(-r * T) * mean(payoff)
se <- exp(-r * T) * sd(payoff) / sqrt(n_sim)
cat('Call price:', round(call_price, 4), '\n')
cat('95% CI: [', round(call_price - 1.96*se, 4),
    ',', round(call_price + 1.96*se, 4), ']')

معدل تقارب MC

تتقارب مونت كارلو بمعدل O(1/√n): ويتطلب خفض الخطأ إلى النصف استخدام عينات أكثر بأربع مرات. ويبلغ الخطأ المعياري لتقدير MC مقدار σ/√n، حيث σ هو الانحراف المعياري للدالة المُكاملة.

set.seed(42)
# Demonstrate MC convergence for pi estimation
estimate_pi <- function(n) {
  x <- runif(n, -1, 1)
  y <- runif(n, -1, 1)
  4 * mean(x^2 + y^2 <= 1)
}

# Sample sizes: powers of 10
ns <- 10^(1:5)
estimates <- sapply(ns, function(n) {
  set.seed(42)
  estimate_pi(n)
})

data.frame(
  n = ns,
  pi_estimate = round(estimates, 5),
  error = round(abs(estimates - pi), 5)
)

تحقق سريع

اختبر مدى فهمك لأساسيات محاكاة مونت كارلو.

مراجعة: أساسيات مونت كارلو

أهم النقاط: تقدّر مونت كارلو الكميات بأخذ المتوسط عبر عدد كبير من العينات العشوائية. استخدم replicate() للمحاكاة المتكررة. يضمن قانون الأعداد الكبيرة التقارب. يتناسب الخطأ مع 1/√n؛ لذا ضاعف العينات أربع مرات لخفض الخطأ إلى النصف. تحسّن تقنيات تقليل التباين، مثل المتغيرات المتضادة والمتغيرات الضابطة، الكفاءة من دون زيادة عدد العينات. وتشمل التطبيقات التكامل وتقدير الاحتمالات وتسعير الخيارات والمحاكاة.

set.seed(42)
# Monte Carlo template:
# 1. Define simulation function
simulate_once <- function() {
  x <- runif(1, -1, 1)
  y <- runif(1, -1, 1)
  (x^2 + y^2) <= 1
}

# 2. Replicate many times
n <- 10000
results <- replicate(n, simulate_once())

# 3. Estimate quantity of interest
pi_mc <- 4 * mean(results)

# 4. Quantify uncertainty
se <- 4 * sd(results) / sqrt(n)
cat('Pi:', pi_mc, '+/-', round(1.96*se, 4))

الأسئلة الشائعة

هل درس «أساسيات محاكاة مونت كارلو» مجاني؟

نعم — نص درس «أساسيات محاكاة مونت كارلو» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة R Academy، انتقل إلى CoddyKit PRO. تتضمن دورة R Academy 4 دروس في المجموع.

ماذا ستتعلم في «أساسيات محاكاة مونت كارلو»؟

قدّر π وكميات أخرى من خلال أخذ عينات عشوائية متكررة تتمرن على R Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ R Academy؟

لا تُشترط خبرة سابقة. R Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.

كم من الوقت يستغرق درس «أساسيات محاكاة مونت كارلو»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس R Academy هذا؟

نعم. كل درس في R Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. set.seed() وقابلية إعادة الإنتاج
  2. توليد التوزيعات العشوائية
  3. أساسيات محاكاة مونت كارلو
  4. إعادة أخذ العينات بطريقة Bootstrap في R
← العودة إلى R Academy