Dasar-Dasar Simulasi Monte Carlo
Perkirakan pi dan besaran lainnya melalui pengambilan sampel acak berulang.
Dasar-Dasar Simulasi Monte Carlo adalah pelajaran R Academy gratis di CoddyKit. Ini adalah pelajaran 3 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar R Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus R Academy mencakup 4 pelajaran total.
Apa Itu Monte Carlo?
Simulasi Monte Carlo menggunakan pengambilan sampel acak berulang untuk memperkirakan besaran yang sulit dihitung secara analitis. Namanya diambil dari kasino di Monako; metode ini digunakan dalam keuangan, fisika, statistika, dan AI untuk integrasi, optimisasi, serta inferensi.
# 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)Mengestimasi Pi dengan Titik Acak
Demo Monte Carlo klasik: tempatkan titik secara acak di dalam persegi satuan. Fraksi titik yang jatuh di dalam lingkaran satuan mengestimasi π/4. Saat n → ∞, estimasi tersebut mendekati π.
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))Mengestimasi Nilai Harapan
Integrasi Monte Carlo: E[f(X)] ≈ (1/n) Σ f(Xᵢ), dengan X₁,...,Xₙ sebagai pengambilan iid. Untuk mengintegralkan g(x) dari a hingga b: ambil sampel x dari Uniform(a,b), lalu 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() untuk Simulasi Berulang
replicate(n, expr) adalah fungsi bawaan R untuk menjalankan simulasi sebanyak n kali dan mengumpulkan hasilnya. Fungsi ini lebih rapi daripada perulangan for untuk simulasi sederhana dan mengembalikan vektor atau matriks.
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)Demo Hukum Bilangan Besar
Hukum Bilangan Besar menyatakan bahwa rata-rata sampel mendekati rata-rata sebenarnya ketika n bertambah. Mengamati konvergensi ini di R menunjukkan alasan Monte Carlo berhasil dan seberapa cepat estimasi menjadi stabil.
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 increasesPengurangan Varians: Variat Antitetik
Gunakan sampel seragam u dan komplemennya (1-u) sebagai pasangan antitetik. Korelasi negatifnya mengurangi varians estimator hingga 50% dengan jumlah evaluasi fungsi yang sama.
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)Variat Kendali
Variat kendali adalah fungsi dengan nilai harapan yang diketahui dan berkorelasi dengan besaran sasaran. Kurangkan variat tersebut (setelah diskalakan) untuk mengurangi varians. Contoh klasik: estimasikan E[f(X)] menggunakan g(X) yang berkorelasi dan rata-ratanya diketahui.
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 untuk Estimasi Probabilitas
Monte Carlo sangat baik untuk mengestimasi probabilitas kompleks yang sulit ditangani secara analitis. Simulasikan proses acak tersebut berkali-kali, lalu hitung fraksi kemunculan peristiwa.
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')
}Menyimulasikan Gerak Brown Geometris
Harga saham sering dimodelkan sebagai Gerak Brown Geometris: S(t+dt) = S(t) * exp((μ - σ²/2)dt + σ√dt * Z), dengan Z~N(0,1). Monte Carlo menghasilkan lintasan harga untuk penentuan harga opsi.
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))Penentuan Harga Opsi MC
Tentukan harga opsi beli Eropa menggunakan Monte Carlo: simulasikan banyak harga saham akhir, hitung imbal hasil max(S_T - K, 0), lalu diskontokan rata-rata imbal hasil tersebut dengan 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), ']')Laju Konvergensi MC
Monte Carlo berkonvergensi dengan laju O(1/√n): untuk membagi dua galat, diperlukan sampel 4× lebih banyak. Galat standar estimasi MC adalah σ/√n, dengan σ sebagai simpangan baku integran.
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)
)Pemeriksaan Singkat
Uji pemahaman Anda tentang dasar-dasar simulasi Monte Carlo.
Ringkasan: Dasar-Dasar Monte Carlo
Hal-hal penting: Monte Carlo mengestimasi besaran dengan merata-ratakan banyak sampel acak. Gunakan replicate() untuk simulasi berulang. Hukum Bilangan Besar menjamin konvergensi. Galat berskala 1/√n—gunakan sampel empat kali lebih banyak untuk membagi dua galat. Teknik pengurangan varians (variat antitetik dan variat kendali) meningkatkan efisiensi tanpa menambah jumlah sampel. Penerapan: integrasi, estimasi probabilitas, penentuan harga opsi, dan simulasi.
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))Pertanyaan yang Sering Diajukan
Apakah pelajaran “Dasar-Dasar Simulasi Monte Carlo” gratis?
Ya — teks lengkap “Dasar-Dasar Simulasi Monte Carlo” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus R Academy, upgrade ke CoddyKit PRO. Kursus R Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Dasar-Dasar Simulasi Monte Carlo”?
Perkirakan pi dan besaran lainnya melalui pengambilan sampel acak berulang. Kamu berlatih R Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai R Academy?
Tidak diperlukan pengalaman sebelumnya. R Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 4.
Berapa lama pelajaran “Dasar-Dasar Simulasi Monte Carlo” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran R Academy ini?
Ya. Setiap pelajaran R Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- set.seed() dan Reproduksibilitas
- Membangkitkan Distribusi Acak
- Dasar-Dasar Simulasi Monte Carlo
- Pengambilan Sampel Ulang Bootstrap di R