Bases de la simulation de Monte-Carlo
Estimez pi et d’autres quantités par échantillonnage aléatoire répété.
Bases de la simulation de Monte-Carlo est une leçon R Academy gratuite sur CoddyKit. Ceci est la leçon 3 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage R Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours R Academy comprend 4 leçons au total.
Qu'est-ce que Monte-Carlo ?
La simulation de Monte-Carlo utilise des échantillonnages aléatoires répétés pour estimer des quantités difficiles à calculer analytiquement. Nommée d'après le casino de Monaco, elle est utilisée en finance, en physique, en statistique et en IA pour l'intégration, l'optimisation et l'inférence.
# 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)Estimer Pi avec des points aléatoires
La démonstration classique de Monte-Carlo consiste à placer aléatoirement des points dans un carré unité. La fraction située à l'intérieur du cercle unité estime π/4. Lorsque n → ∞, l'estimation converge vers π.
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))Estimer une espérance
Intégration de Monte-Carlo : E[f(X)] ≈ (1/n) Σ f(Xᵢ), où X₁,...,Xₙ sont des tirages iid. Pour intégrer g(x) de a à b, échantillonnez x selon Uniform(a,b) ; alors 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() pour les simulations répétées
replicate(n, expr) est la fonction intégrée de R qui exécute une simulation n fois et rassemble les résultats. Elle est plus claire qu'une boucle for pour les simulations simples et renvoie un vecteur ou une matrice.
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)Démonstration de la loi des grands nombres
La loi des grands nombres indique que la moyenne de l'échantillon converge vers la moyenne vraie lorsque n augmente. Observer cette convergence dans R montre pourquoi Monte-Carlo fonctionne et à quelle vitesse les estimations se stabilisent.
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 increasesRéduction de variance : variables antithétiques
Utilisez des échantillons uniformes u et leurs complémentaires (1-u) comme paire antithétique. Leur corrélation négative réduit la variance de l'estimateur jusqu'à 50 %, avec le même nombre d'évaluations de la fonction.
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)Variables de contrôle
Une variable de contrôle est une fonction dont l'espérance est connue et qui est corrélée à la quantité cible. Soustrayez-la après mise à l'échelle pour réduire la variance. Exemple classique : estimer E[f(X)] à l'aide de g(X), qui lui est corrélée et dont la moyenne est connue.
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))Monte-Carlo pour l'estimation de probabilités
Monte-Carlo est particulièrement efficace pour estimer des probabilités complexes impossibles à traiter analytiquement. Simulez le processus aléatoire de nombreuses fois, puis calculez la fraction de fois où l'événement se produit.
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')
}Simuler un mouvement brownien géométrique
Les cours des actions sont souvent modélisés par un mouvement brownien géométrique : S(t+dt) = S(t) * exp((μ - σ²/2)dt + σ√dt * Z), où Z~N(0,1). Monte-Carlo génère des trajectoires de prix pour évaluer les options.
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))Évaluation d'options par MC
Évaluez une option d'achat européenne avec Monte-Carlo : simulez de nombreux cours finaux, calculez les gains max(S_T - K, 0), puis actualisez le gain moyen par 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), ']')Vitesse de convergence de MC
Monte-Carlo converge à la vitesse O(1/√n) : diviser l'erreur par deux nécessite quatre fois plus d'échantillons. L'erreur type de l'estimation MC vaut σ/√n, où σ est l'écart type de la fonction intégrée.
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)
)Vérification rapide
Vérifiez votre compréhension des principes fondamentaux de la simulation de Monte-Carlo.
Récapitulatif : bases de Monte-Carlo
Points clés : Monte-Carlo estime des quantités en faisant la moyenne de nombreux échantillons aléatoires. Utilisez replicate() pour les simulations répétées. La loi des grands nombres garantit la convergence. L'erreur évolue comme 1/√n : quadruplez le nombre d'échantillons pour diviser l'erreur par deux. Les techniques de réduction de variance, comme les variables antithétiques et les variables de contrôle, améliorent l'efficacité sans augmenter le nombre d'échantillons. Applications : intégration, estimation de probabilités, évaluation d'options et simulation.
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))Questions Fréquemment Posées
La leçon « Bases de la simulation de Monte-Carlo » est-elle gratuite ?
Oui — le texte complet de « Bases de la simulation de Monte-Carlo » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours R Academy, passe à CoddyKit PRO. Le cours R Academy comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « Bases de la simulation de Monte-Carlo » ?
Estimez pi et d’autres quantités par échantillonnage aléatoire répété. Tu pratiques R Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.
Dois-je avoir de l'expérience pour commencer R Academy ?
Aucune expérience préalable n'est requise. R Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 3 sur 4.
Combien de temps prend la leçon « Bases de la simulation de Monte-Carlo » ?
La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.
Peux-tu écrire et exécuter du code dans cette leçon R Academy ?
Oui. Chaque leçon R Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.
Toutes les leçons de ce cours
- set.seed() et reproductibilité
- Générer des distributions aléatoires
- Bases de la simulation de Monte-Carlo
- Rééchantillonnage bootstrap dans R