"매 closed-form 의 unattainable 의 distribution 의 sampling 의 estimate". 매 Monte Carlo / discrete-event / agent-based 의 3 family — 매 risk pricing, capacity planning, A/B effect 의 forecast 의 backbone. 매 2026 의 PyMC 5, NumPyro, SimPy 4, Mesa 3 의 standard.
매 핵심
매 simulation 3 family
Monte Carlo: 매 random sampling → integral/expectation 의 estimate. (option pricing, risk VaR.)
Discrete-event (DES): 매 event timeline 의 advance — queue, server, arrival. (call center, factory.)
importnumpyasnpS0,K,r,sigma,T,N=100,105,0.05,0.2,1.0,200_000Z=np.random.standard_normal(N)ST=S0*np.exp((r-0.5*sigma**2)*T+sigma*np.sqrt(T)*Z)payoff=np.maximum(ST-K,0)price=np.exp(-r*T)*payoff.mean()se=np.exp(-r*T)*payoff.std()/np.sqrt(N)# standard error
Variance reduction — antithetic
half=N//2Z=np.random.standard_normal(half)Z_anti=np.concatenate([Z,-Z])ST=S0*np.exp((r-0.5*sigma**2)*T+sigma*np.sqrt(T)*Z_anti)# 매 same N, lower variance
Discrete-event (SimPy)
importsimpy,randomdefcustomer(env,server):arrive=env.nowwithserver.request()asreq:yieldreqwait=env.now-arriveyieldenv.timeout(random.expovariate(1/3))# service ~Exp(mean=3)results.append(wait)env=simpy.Environment()server=simpy.Resource(env,capacity=2)results=[]defarrivals(env):whileTrue:yieldenv.timeout(random.expovariate(1/2))# arrival ~Exp(mean=2)env.process(customer(env,server))env.process(arrivals(env))env.run(until=1000)print('avg wait',sum(results)/len(results))
Agent-based (Mesa 3, sketch)
frommesaimportAgent,Modelfrommesa.timeimportRandomActivationclassTrader(Agent):defstep(self):# simple momentum ruleifself.model.price>self.last_price:self.buy()else:self.sell()self.last_price=self.model.priceclassMarket(Model):def__init__(self,n):self.schedule=RandomActivation(self)self.price=100foriinrange(n):self.schedule.add(Trader(i,self))defstep(self):self.schedule.step()# update price by net demand ...
Bayesian forecasting (PyMC 5)
importpymcaspmwithpm.Model()asm:mu=pm.Normal('mu',0,10)sigma=pm.HalfNormal('sigma',5)y=pm.Normal('y',mu=mu,sigma=sigma,observed=data)trace=pm.sample(2000,tune=1000,chains=4)withm:ppc=pm.sample_posterior_predictive(trace,var_names=['y'])# 매 forecast distribution + uncertainty
fromSALib.sampleimportsaltellifromSALib.analyzeimportsobolproblem={'num_vars':3,'names':['x1','x2','x3'],'bounds':[[0,1]]*3}X=saltelli.sample(problem,1024)Y=np.array([model(*x)forxinX])Si=sobol.analyze(problem,Y)print(Si['ST'])# total-order indices
매 결정 기준
문제
Approach
Integral / expectation
Monte Carlo
Queue / capacity
Discrete-event (SimPy)
Heterogeneous actors + interaction
Agent-based (Mesa)
Forecasting + uncertainty
Bayesian (PyMC / NumPyro)
Calibration / quantification
bootstrap / Sobol
매 large N + GPU
NumPyro (JAX)
기본값: 매 simple expectation → MC 의 NumPy, 매 queue → SimPy, 매 forecast w/ uncertainty → PyMC 5.
언제: model assumption 의 review, variance reduction 의 propose, sensitivity result 의 interpret.
언제 X: large-scale agent simulation 의 direct execution — specialized engine 의 use.
❌ 안티패턴
N 의 too small: 매 standard error 의 estimate 의 누락 — running mean check.
PRNG 의 fixed seed forever: 매 single-path bias — multiple seeds 의 ensemble.
Closed-form available 의 simulate: 매 unnecessary — analytical solution 의 prefer.
Calibration 누락: 매 forecast 의 overconfident — Brier/reliability 의 add.
🧪 검증 / 중복
Verified (Glasserman "Monte Carlo Methods in Financial Engineering", Law "Simulation Modeling and Analysis", PyMC 5 / SimPy 4 docs).