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)

Оценка числа π по случайным точкам

Классическая демонстрация метода Монте-Карло: случайным образом разместите точки в единичном квадрате. Доля точек, попавших внутрь единичной окружности, оценивает π/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): чтобы вдвое уменьшить ошибку, нужно в 4 раза больше выборочных значений. Стандартная ошибка оценки 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 включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. set.seed() и воспроизводимость
  2. Генерация случайных распределений
  3. Основы метода Монте-Карло
  4. Бутстреп-ресэмплинг в R
← Назад к R Academy