Welcome to THETAWIKI. If you like to create or edit a page please make sure to login or register an account. All registered users please make sure to provide a valid email address.

Geometric Brownian Motion

From ThetaWiki
Jump to: navigation, search

GBM Model overview

The underlying assumption for Black-Scholes Option Pricing is that stock prices follow a Geometric Brownian motion process. The stochastic differential equation(SDE) for the stock prices take the following function form:

$ d S(t) = \mu S(t) dt \ + \ \sigma S(t) \ dW^P(t), \qquad (1) $

where $ \mu $ is the drift rate, $ \sigma $ the volatility of $ S $ and $ dW^P(t) $ the increment of a standard Wiener process under the physical measure $ P $.

To derive the stock price process under the risk-neutral measure $ Q $, we proceed as follows. Use the bank account $ B(t) $ (defined in Discounting, $ B(t) $ is here short for $ B(0,t) $) as numeraire, the discounted stock price process takes the following form

$ d \frac{S(t)}{B(t)}= S(t)d\frac{1}{B(t)} \ + \ \frac{1}{B(t)}dS(t) \ + \ \left \langle dS(t), d\frac{1}{B(t)} \right \rangle $
$ = S(t)\left [ -\frac{dB(t)}{B(t)^2} \ + \ \frac{1}{B(t)^3}\left \langle dB(t), dB(t) \right \rangle \right ] \ + \ \frac{1}{B(t)} \left [\mu S(t) d t \ + \ \sigma S(t) d W^P(t) \right ] $
$ = S(t)\left [ -\frac{r B(t)dt}{B(t)^2} \right ] \ + \ \frac{1}{B(t)} \left [\mu S(t) d t \ + \ \sigma S(t) d W^P(t) \right ] $
$ = \frac{S(t)}{B(t)}\left [ (\mu \ - \ r)dt \ + \ \sigma d W^P(t) \right ], \qquad (2) $

where in the above equation, we have substitued the bank account process $ dB(t) = r B(t)dt $ for $ B(t) $, and the stock price process in equation (1) for $ dS(t) $. So far, we have derived the discounted stock price process under the physical measure $ P $. To change the underlying probability measure from the physical measure $ P $ to the risk-neutral measure $ Q $, first note that stock price discounted with the numeraire bank account will itself be a Martingale under this numeraire induced probability measure - namely the risk-neutral measure $ Q $. Mathematically, the discounted stock price process in equation (2) re-expressed under the risk-neutral measure $ Q $ is

$ d \frac{S(t)}{B(t)} = \sigma \frac{S(t)}{B(t)} d W^Q(t), \qquad (3) $

where $ d W^Q(t) $ is the increment of a wiener process under the risk-neutral measure $ Q $. Compare equation (2) with equation (3), the Girsanov theorm gives the measure change from $ P $ to $ Q $, i.e.

$ d W^Q(t) = d W^P(t) \ + \ \frac {\mu \ - \ r}{\sigma} dt. \qquad (4) $

Using equations (1) and (4), it is easy to obtain the stock price process under the risk-neutral measure $ Q $:

$ d S(t) = \mu S(t) dt \ + \ \sigma S(t) \ d W^P(t) $
$ = \mu S(t) dt \ + \ \sigma S(t) \left [ d W^Q(t) \ - \ \frac {\mu - r}{\sigma} dt \right ] $
$ = r S(t) dt \ + \ \sigma S(t) \ d W^Q(t), \qquad (5) $

namely, under the risk-neutral pricing measure $ Q $, stock prices grow at the risk-free rate $ r $.

Having derived the stochastic differential equation for stock prices under the risk-neutral measure $ Q $, we show, in the following, some code examples in Theta Suite for simulating stock price process and for analytical call and put option prices.

GBM Process simulation

Implementation in ThetaML

The following is an ThetaML implementation for the stock price process (5).

model GBM
 %This model computes future stock prices 'S'; the stock prices 'S' follow
%a Geometric Brownian motion process under the risk-neutral measure;
%the stock prices 'S' is a process variable, 'S' implicitly incorporate
%scenario and time indexes
  import S0     "Initial stock price"
  import r      "Risk-free interest rate"
  import sigma  "Volatility of stock"
  export S      "GBM stock prices"
 
  %initialize the stock prices at 'S0'
  S = S0
  %'loop ... inf' is an infinite loop; this infinite loop computes a stock
  %price process of an arbitrary length; the lifetime of the infinite loop is
  %automatically extended to the desired length depending on a specific pricing
  %application
  loop inf
    %the ThetaML command 'theta' passes time by '@dt' units
    %the ThetaML parameter '@dt' denotes an arbitrary time unit; its specific
    %value depends on a specific pricing application
    theta @dt
    %update the stock prices for the time interval '@dt'
    S = S * exp( (r - 0.5*sigma^2)*@dt + sigma*sqrt(@dt)*randn() )
  end
end


The following code examples are Theta.m implementations for the stock price process (5) under the risk-neutral measure $ Q $.

Implementation as a simple Matlab stepping function Theta.m

1-Dimensional

function state = Theta(dt, state)
%This function returns a struct object 'state'; the struct 'state' has subfields
%'S' for the stock price, 'sigma' for the stock price volatility, and 'r' for the
%risk-free rate.
  if nargin == 0        %if no function arguments
    state.S.comment     = 'Stock price';
    state.sigma.comment = 'Volatility';
    state.r.comment     = 'Risk-free rate';
  else
    % risk-free rate
    r = state.r(1);
    % volatility of stock
    sigma = state.sigma(1);
    % update the stock price process
    state.S   = state.S .* exp( (r - 0.5*sigma^2)*dt + sqrt(dt)*sigma*randn(size(state.S)));
  end
 
end


N-Dimensional

function state = Theta(dt, state)
%This function returns a struct object 'state'; the struct 'state' has subfields
%'S' for stock prices, 'rho' for the correlation among the stock prices,
%'sigma' for stock price volatilities
  if nargin == 0
    state.S.comment     = 'Stock prices';
    state.rho.comment   = 'Correlation';
    state.sigma.comment = 'Volatilities';
  else
    r = 0.05;
    rho = mean(state.rho);
    sigma = ones(1,size(state.S,2)) * mean(state.sigma);
    Z = zeros(length(sigma), length(sigma));
    %construct the variance-covariance matrix
    for i = 1 : length(sigma)
      for k = 1 : length(sigma)
        if i == k          %matrix diagonal
          Z(i,i) = sigma(i)^2;
        else               %upper and lower matrix
          Z(i,k) = rho*sigma(i) * sigma(k);
        end
      end
    end
    %do the Cholesky decomposition of the variance-covariance matrice 'Z'
    A = (chol(Z))';
    %sample standard normal variates
    B = randn(size(state.S'));
    %update the N-dimensional stock price processes
    for i = 1 : length(sigma)
      state.S(:,i)  = state.S(:,i) .* exp( (r - 0.5*sigma(i)^2)*dt + sqrt(dt)*(A(i,:)*B)');
    end
  end
 
end


Analytic Black-Scholes option pricing in Matlab

The price of European puts and calls can be obtained by calling the Matlab function theta_bls().

function result = theta_bls(S, K, sigma, r, T, call, greek)
%This function returns option prices as well as analytic option 'delta' and 'gamma'
%respectively for European Call and Put options
%function parameters:
% S : asset price
% K : option strike price
% sigma: volatility of asset price
% r : risk-free rate
% T : option maturity time
% call: true for call, otherwise put
% greek: a string for 'value' that returns the option value,
%       'delta' that returns the option delta,
%       or 'gamma' that returns the option gamma
 
  if T <= 0
    if call
      V = max(S - K, 0);
    else
      V = max(K - S, 0);
    end
    return
  end
 
  d1 = ( log(S./K) + (r + (sigma.^2)/2)*T ) ./ (sigma * sqrt(T));
  d2 = d1 - sigma * sqrt(T);
 
  switch call
    case true
      switch greek
        case 'value'
          result = S.*normcdf(d1,0,1) - K .* exp(-r.*T).*normcdf(d2);
        case 'delta'
          result = normcdf(d1,0,1)';
        case 'gamma'
          result = (normpdf(d1,0,1)./(S.*sigma.*sqrt(T)))';
      end
    otherwise
      switch greek
        case 'value'
          result = -S.*normcdf(-d1,0,1) + K .* exp(-r.*T).*normcdf(-d2);
        case 'delta'
          result = normcdf(d1,0,1)'-1;
        case 'gamma'
          result = (normpdf(d1,0,1)./(S.*sigma.*sqrt(T)))';
      end
  end
end