Derivative Pricing Using Parallel Monte Carlo Simulations B97902052 楊朝富 B97902114 邱榮斌 Introduction Nowadays, using mathematical analytical methods such as PDEs or some other techniques to compute the valuation of derivatives seems to be developed to an extreme. However, there’re many derivatives cannot have a closed-form or analytical solutions. Therefore, Monte Carlo simulations play more and more important roles in today’s derivative pricing. But Monte Carlo simulations needs large and heavy computations, and thus are too slow in sequential environment. With the advent of lots of parallel structures and parallel APIs, we are able to push the Monte Carlo methods to a parallel age now. Method The derivative's value equals to the expected cash flow it generates on the maturity date. The cash flow it generates depending on the underlying stock price on the maturity date. We assume that the stock price St follows Wiener process: where Wt is a standard normal distribution In Monte Carlo method, we sample the possible outcomes of the stock price, and use them to calculate the value of the derivative. The Procedure • Simulate p paths, and average the value of options in each paths. • For each path, divide time interval T to n part, one with T/n=dt. Simulate the stock price S step by step. • For each step, generate a random number in uniform distribution on [0,1] and then map it to normal distribution. • The Simulation Formula • 會有誤差,觀察到dWt數期望值為0時S期望值會越來越小( S + 0.8*1.2 = S*0.96 < S) 跑出來股價會很小 轉成指數形式,直接算下一個時間點的S比較準 S(t+dt)=S(t)*exp( R + SD*dWt) Problem with random variable Should actually be uniform distribution on [0,1] If its expected value doesn’t match, the stock price tends to increase or decrease through time If its variance value doesn’t match, the options’ price will be wrong since the options’ value includes hedging value which is highly correlated with variance 每階動差都要對才能模擬我們要的股價波動 Test on Random Variable Rand() in <stdlib.h> Should use properly or the expected value might be too small. The quality of this random number is not so good, the answer converge slower thus result in bigger error with limited trails. Halton It can generate tuples of low correlation number, but unfortunately, the variance of the number seems to be too small. That will result in a very low option price. Linear Congruential Generator • LCG(m,a,c,X0) • X0=1 • Xn=(a*Xn-1 + c) mod m LCG(2^31-1,16807,0,1) works fairly well Result We verify our result with a program using the same method, provide by []. For European call, there is also mathematical formula to compute the result. Compare with it to make sure our program is working well. Parallelization • Generate the seed on first thread • Each thread simulate sum paths using a subset of random number Why the speedup is only like this? 1. All random number generates on CPU before simulating the paths parallel 2.