브라운 운동과 확률 미분 방정식의 수치 모델링
브라운 운동, 위너 과정, 이토 보조정리와 확률 미분 방정식의 해석 및 수치 시뮬레이션 방법을 정리한다.
2026-08-14 · 최초 발행 2024-04-29
연속시간의 불확실성을 표현하는 출발점
브라운 운동(Brownian Motion), 위너 과정(Wiener Process), 이토 보조정리(Ito's Lemma), 확률 미분 방정식(Stochastic Differential Equations)은 연속시간 무작위 현상을 다루는 표준적인 틀이다. 금융공학과 물리, 신호처리, 베이지안 필터링처럼 시간에 따라 불확실성이 누적되는 문제에서 이 구조가 쓰인다.
위너 과정 (W_t)는 (W_0 = 0)이며, (s < t)일 때 증가량이 (W_t − W_s \sim N(0, t − s))를 따른다. 증가량은 서로 독립이고, 경로는 연속적이다. 다만 거의 어디에서도 미분할 수 없으며, 이변동은 ([W]_t = t)로 누적된다.
확률 미분 방정식은 보통 다음과 같이 쓴다.
[ dX_t = \mu(X_t, t) dt + \sigma(X_t, t) dW_t ]
여기서 (\mu)는 표류, (\sigma)는 확산을 뜻한다. 연속시간 동역학을 두 성분으로 나누어 모델링할 수 있지만, 해석적 해를 구할 수 없는 경우가 일반적이므로 수치 적분이 필요하다.
이토 적분 (\int \sigma(X_s, s) dW_s)는 적절한 적분 조건에서 마팅게일 성질을 가진다. 이토 보조정리는 (g(X_t, t))처럼 확률 과정에 변환을 적용할 때의 미분 규칙을 제공한다. 일반 미적분의 사슬법칙과 달리 (0.5 \sigma^2 g_{xx}) 항이 추가되며, 이는 이변동의 기여를 반영한다.
해석 방식과 수렴 목표를 먼저 정한다
브라운 운동의 증가량은 평균 0, 분산 (t)의 정규 구조를 가지며 시간 균질성을 보인다. 이 성질은 모델을 세우는 출발점이지만, 구현 단계에서는 어떤 해석과 수렴 기준을 택할지까지 정해야 한다.
이토 해석과 스트래토노비치(Stratonovich) 해석은 같은 형태의 식을 다르게 읽는다. 수치 구현과 금융 평가에서는 이토 해석이 쓰이는 경향이 있고, 물리적 불변량 보존이 필요한 모델에서는 스트래토노비치 해석을 고려한다.
수치 근사에서는 Euler–Maruyama, Milstein, 고차 강·약 수렴 기법 가운데 목적에 맞는 방법을 골라야 한다. 경로 자체의 오차가 중요하면 강수렴을, 분포나 기댓값 오차가 관심사면 약수렴을 기준으로 시간 스텝을 설계한다.
표류 (\mu), 확산 (\sigma), 변동성 표면과 상태 의존성도 식별·추정 대상이다. 양수 영역 유지, 반사 경계, 흡수 경계처럼 물리·금융 모델의 제약 역시 식에 함께 반영해야 한다.
시뮬레이션은 생성·적분·검증의 순서로 진행된다
시간 격자를 만든 뒤 정규 증가량 (dW)를 생성하고, 이를 누적해 브라운 운동 경로를 구성한다. 그 다음 Euler–Maruyama 또는 Milstein으로 식을 적분한다. 결과에서는 NaN/Inf, 경계 위반, 양수 제약 위반을 확인해야 하며, 문제가 생기면 스텝 축소나 변수 변환, 반사·흡수 처리를 검토한다.
금융과 제어 문제에서의 사용 방식
금융 파생상품에서는 기하 브라운 운동(GBM)을 주가와 FX 모델에 적용해 블랙-숄즈 가격과 그릭스를 산출한다. Heston, SABR 같은 확장형 모델은 다중 브라운 운동을 구동 노이즈로 사용한다.
리스크 관리에서는 포트폴리오 몬테카를로 경로를 만들고 VaR/ES를 추정하거나 스트레스 시나리오를 평가한다. 경로 민감도 추정에는 파스와이즈 방식과 우도비 기법을 결합할 수 있다.
연속시간 칼만–부시 필터에서는 프로세스 노이즈를 표현하는 데 쓰이며, 센서 퓨전에서는 확정 동역학에 브라운 운동 잡음을 결합한다. 물리·네트워크·에너지 영역에서는 확산과 열 방정식 근사, 무작위 수요·발전 변동 모델, 큐잉과 트래픽의 확률 유동 근사로 이어진다.
GBM을 Euler–Maruyama와 Milstein으로 적분하기
아래 예제는 위너 과정과 GBM 경로를 생성하고, Euler–Maruyama와 GBM 특화 Milstein 결과를 말기 기댓값과 비교한다.
전제조건: Python 3.10+, numpy 1.26+, matplotlib 3.8+ (플롯은 선택)
import numpy as np
# 설정
T = 1.0 # 연간 기준 기간
N = 252 # 시간 분할(거래일)
M = 10000 # 경로 수
dt = T / N
rng = np.random.default_rng(42)
def simulate_wiener(T, N, M, rng):
dt = T / N
dW = rng.normal(0.0, np.sqrt(dt), size=(M, N))
W = np.c_[np.zeros(M), np.cumsum(dW, axis=1)]
return W # shape (M, N+1)
# 예: GBM dS = mu*S*dt + sigma*S*dW
def euler_maruyama_gbm(S0, mu, sigma, T, N, M, rng):
dt = T / N
dW = rng.normal(0.0, np.sqrt(dt), size=(M, N))
S = np.empty((M, N+1))
S[:, 0] = S0
for n in range(N):
S[:, n+1] = S[:, n] + mu * S[:, n] * dt + sigma * S[:, n] * dW[:, n]
# 양수 제약 보정(선택): 음수 발생 시 작은 양수로 클리핑
S[:, n+1] = np.maximum(S[:, n+1], 1e-12)
return S
# Milstein(GBM 특화): dS = mu*S*dt + sigma*S*dW, sigma'(S)=sigma
def milstein_gbm(S0, mu, sigma, T, N, M, rng):
dt = T / N
dW = rng.normal(0.0, np.sqrt(dt), size=(M, N))
S = np.empty((M, N+1))
S[:, 0] = S0
for n in range(N):
S_n = S[:, n]
S[:, n+1] = S_n + mu*S_n*dt + sigma*S_n*dW[:, n] \
+ 0.5*(sigma**2)*S_n*((dW[:, n]**2) - dt)
S[:, n+1] = np.maximum(S[:, n+1], 1e-12)
return S
# 실행
S0, mu, sigma = 100.0, 0.05, 0.2
S_em = euler_maruyama_gbm(S0, mu, sigma, T, N, M, rng)
S_mi = milstein_gbm(S0, mu, sigma, T, N, M, rng)
# 말기 분포 검증: 이론 E[S_T] = S0 * exp(mu*T)
theory_mean = S0 * np.exp(mu*T)
em_mean = S_em[:, -1].mean()
mi_mean = S_mi[:, -1].mean()
print(f"Theory E[S_T] : {theory_mean:.4f}")
print(f"Euler-Maruyama : {em_mean:.4f}")
print(f"Milstein : {mi_mean:.4f}")
재현성을 위해 seed를 고정하고 난수 생성기를 np.random.Generator로 일원화할 수 있다. (dt)를 줄일 때는 강오차 근사 비율을 확인하면서 경로 수 (M)과의 균형을 맞춘다. 양수 제약과 수치 안정성을 위해서는 (\log S) 변수화도 고려할 수 있다.
근사 기법이 달라지는 지점
| 기법 | 강수렴 차수 | 안정성 | 계산 복잡도 | 바이어스 | 권장 용도 |
|---|---|---|---|---|---|
| Euler–Maruyama | 0.5 | 보통, 작은 dt 필요 | 낮음 | 상대적 큼 | 프로토타입, 약수렴 중심 MC |
| Milstein | 1.0(스칼라) | 개선, 잡음 도함수 필요 | 중간 | 감소 | 경로 정확도 요구, 스칼라 SDE |
| 해석/정확(가능 시) | 정확 | 매우 높음 | 낮음 | 없음 | GBM 등 폐형 해 존재 케이스 |
Milstein은 잡음 도함수 계산 비용이 늘어나지만 병렬화로 상쇄할 수 있다. 두 근사법은 (dt \to 0)에서 해에 수렴하며, 강·약 수렴 차수로 그 특성을 정량화한다. 양수 제약과 경계 조건을 위반할 수 있는 모델이라면 수렴성만이 아니라 보정 방식도 함께 비교해야 한다.
난수와 경계 조건까지 검증 대상에 넣는다
시간 스텝을 다룰 때 강수렴 0.5 기준으로 (dt)를 절반으로 줄이면 경로 RMSE는 약 (2^(-0.5)) 배 감소할 것으로 기대할 수 있다. 기댓값이나 가격처럼 약수렴이 목적이면 더 큰 (dt)를 허용할 수 있지만, 바이어스를 추정하고 외삽하는 절차가 필요하다.
분산 감소에는 대칭 난수(antithetic), 제어변수(control variates), QMC(할턴/소볼)를 적용할 수 있다. 난수 스트림 관리와 시드 정책은 재현 가능한 실행을 위해 문서화한다.
양수 과정은 로그 변환, 반사·흡수 경계 조건, tamed/implicit 방법을 검토한다. NaN/Inf처럼 폭주가 발생하면 스텝 축소와 파라미터 스케일링, 경고 로깅을 함께 적용한다. 검증 단계에서는 GBM처럼 알려진 폐형 해와 통계량을 비교하고, 단위 테스트를 구성한다. (M) 증분과 (dt) 스윕으로 수렴 곡선을 만들고 회귀 테스트로 자동화할 수 있다.
동일 정확도 기준에서 Milstein으로 전환하면 경로 수를 3050% 절감할 가능성이 있으며, 이는 문제 구조에 의존한다. 분산 감소를 적용하면 표준 오차가 √23 배 축소되어 동일 계산 예산에서 신뢰구간을 줄일 수 있다. 모델 제약을 일관되게 반영하고 재현 가능한 시뮬레이션 파이프라인을 갖추면 컴플라이언스와 감사 대응에도 도움이 된다.