0Pricing
R Academy · Pelajaran

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 increases

Pengurangan 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

  1. set.seed() dan Reproduksibilitas
  2. Membangkitkan Distribusi Acak
  3. Dasar-Dasar Simulasi Monte Carlo
  4. Pengambilan Sampel Ulang Bootstrap di R
← Kembali ke R Academy