พื้นฐานการจำลองแบบมอนติคาร์โล
ประมาณค่า pi และปริมาณอื่น ๆ ด้วยการสุ่มตัวอย่างซ้ำหลายครั้ง
พื้นฐานการจำลองแบบมอนติคาร์โล เป็นบทเรียน R Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 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ₙ เป็นตัวอย่างสุ่มแบบ iid หากอินทิเกรต 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))คำถามที่พบบ่อย
บทเรียน “พื้นฐานการจำลองแบบมอนติคาร์โล” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “พื้นฐานการจำลองแบบมอนติคาร์โล” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส R Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส R Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “พื้นฐานการจำลองแบบมอนติคาร์โล”
ประมาณค่า pi และปริมาณอื่น ๆ ด้วยการสุ่มตัวอย่างซ้ำหลายครั้ง คุณปฏิบัติ R Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน R Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน R Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน
บทเรียน “พื้นฐานการจำลองแบบมอนติคาร์โล” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน R Academy นี้ได้ไหม
ได้ บทเรียน R Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- set.seed() และการทำซ้ำผลลัพธ์ได้
- การสร้างการแจกแจงแบบสุ่ม
- พื้นฐานการจำลองแบบมอนติคาร์โล
- การสุ่มตัวอย่างแบบบูตสแตรปใน R