Difference between revisions of "Programming/Kdb/Labs/Option pricing"

From Thalesians Wiki
< Programming‎ | Kdb‎ | Labs
Line 68: Line 68:
</pre>
</pre>


=Task 2: Implement the Black-Scholes formula for the European call=
=Task 2: Implement the Black-Scholes formula for the European call and put=


Equipped with our implementation of <tt>normal_cdf</tt>, can you implement the Black-Scholes formula for the European call?
Equipped with our implementation of <tt>normal_cdf</tt>, can you implement the Black-Scholes formula for the European call?
Line 74: Line 74:
First, we need
First, we need
<pre>
<pre>
compute_d1:{[S;K;r;q;sigma;T](log[S%K]+((r-q)+.5*sigma*sigma)*T)%sigma*sqrt[T]};
compute_d1:{[S;K;r;q;sigma;tau](log[S%K]+((r-q)+.5*sigma*sigma)*tau)%sigma*sqrt tau};
</pre>
</pre>


Then,
Then,
<pre>
<pre>
call_price:{[S;K;r;q;sigma;T]
call_price:{[S;K;r;q;sigma;tau]
   d1:compute_d1[S;K;r;q;sigma;T];
   d1:compute_d1[S;K;r;q;sigma;tau];
   d2:d1-sigma*sqrt[T];
   d2:d1-sigma*sqrt tau;
   F:S*exp[T*r-q];
   F:S*exp tau*r-q;
   (exp neg r*T)*(F*normal_cdf d1)-K*normal_cdf d2};
   (exp neg r*tau)*(F*normal_cdf d1)-K*normal_cdf d2};
</pre>
</pre>
and
<pre>
put_price:{[S;K;r;q;sigma;tau]
  d1:compute_d1[S;K;r;q;sigma;tau];
  d2:d1-sigma*sqrt tau;
  F:S*exp tau*r-q;
  (exp neg r*tau)*(K*normal_cdf neg d2)-F*normal_cdf neg d1};
</pre>
We can test these implementations on a few sets of parameters, for example
<pre>
call_price[100f;105f;.05;.07;.1;.5]
</pre>
gives 0.7991363, whereas
<pre>
put_price[100f;105f;.05;.07;.1;.5]
</pre>
gives 6.646135.

Revision as of 23:29, 17 June 2021

Background: the Black-Scholes formulae

Recall the celebrated Black-Scholes equation

Failed to parse (MathML with SVG or PNG fallback (recommended for modern browsers and accessibility tools): Invalid response ("Math extension cannot connect to Restbase.") from server "https://wikimedia.org/api/rest_v1/":): {\displaystyle \frac{\partial V}{\partial t} + \frac{1}{2} \sigma^2 S^2 \frac{\partial^2 V}{\partial S^2} + (r - q) S \frac{\partial V}{\partial S} - r V = 0. }

Here

  • Failed to parse (MathML with SVG or PNG fallback (recommended for modern browsers and accessibility tools): Invalid response ("Math extension cannot connect to Restbase.") from server "https://wikimedia.org/api/rest_v1/":): {\displaystyle t} is a time in years; we generally use Failed to parse (MathML with SVG or PNG fallback (recommended for modern browsers and accessibility tools): Invalid response ("Math extension cannot connect to Restbase.") from server "https://wikimedia.org/api/rest_v1/":): {\displaystyle t = 0} as now;
  • Failed to parse (MathML with SVG or PNG fallback (recommended for modern browsers and accessibility tools): Invalid response ("Math extension cannot connect to Restbase.") from server "https://wikimedia.org/api/rest_v1/":): {\displaystyle V(S, t)} is the value of the option;
  • Failed to parse (MathML with SVG or PNG fallback (recommended for modern browsers and accessibility tools): Invalid response ("Math extension cannot connect to Restbase.") from server "https://wikimedia.org/api/rest_v1/":): {\displaystyle S(t)} is the price of the underlying asset at time Failed to parse (MathML with SVG or PNG fallback (recommended for modern browsers and accessibility tools): Invalid response ("Math extension cannot connect to Restbase.") from server "https://wikimedia.org/api/rest_v1/":): {\displaystyle t} ;
  • Failed to parse (MathML with SVG or PNG fallback (recommended for modern browsers and accessibility tools): Invalid response ("Math extension cannot connect to Restbase.") from server "https://wikimedia.org/api/rest_v1/":): {\displaystyle \sigma} is the volatility — the standard deviation of the asset's returns;
  • Failed to parse (MathML with SVG or PNG fallback (recommended for modern browsers and accessibility tools): Invalid response ("Math extension cannot connect to Restbase.") from server "https://wikimedia.org/api/rest_v1/":): {\displaystyle r} is the annualized risk-free interest rate, continuously compounded;
  • Failed to parse (MathML with SVG or PNG fallback (recommended for modern browsers and accessibility tools): Invalid response ("Math extension cannot connect to Restbase.") from server "https://wikimedia.org/api/rest_v1/":): {\displaystyle q} is the annualized (continuous) dividend yield.

The solution of this equation depends on the payoff of the option — the terminal condition. In particular, if at the time of expiration, Failed to parse (MathML with SVG or PNG fallback (recommended for modern browsers and accessibility tools): Invalid response ("Math extension cannot connect to Restbase.") from server "https://wikimedia.org/api/rest_v1/":): {\displaystyle T} , the payoff is given by Failed to parse (MathML with SVG or PNG fallback (recommended for modern browsers and accessibility tools): Invalid response ("Math extension cannot connect to Restbase.") from server "https://wikimedia.org/api/rest_v1/":): {\displaystyle V(S, T) = C(S, T) =: \max\{S - K, 0\}} , in other words, the option is a European call option, then the value of the option at time Failed to parse (MathML with SVG or PNG fallback (recommended for modern browsers and accessibility tools): Invalid response ("Math extension cannot connect to Restbase.") from server "https://wikimedia.org/api/rest_v1/":): {\displaystyle t} is given by the Black-Scholes formula for the European call:

Failed to parse (MathML with SVG or PNG fallback (recommended for modern browsers and accessibility tools): Invalid response ("Math extension cannot connect to Restbase.") from server "https://wikimedia.org/api/rest_v1/":): {\displaystyle C(S_t, t) = e^{-r\tau} [F_t N(d_1) - K N(d_2)] }

where Failed to parse (MathML with SVG or PNG fallback (recommended for modern browsers and accessibility tools): Invalid response ("Math extension cannot connect to Restbase.") from server "https://wikimedia.org/api/rest_v1/":): {\displaystyle \tau = T - t} is the time to maturity, Failed to parse (MathML with SVG or PNG fallback (recommended for modern browsers and accessibility tools): Invalid response ("Math extension cannot connect to Restbase.") from server "https://wikimedia.org/api/rest_v1/":): {\displaystyle F = S_t e^{(r - q)\tau}} is the forward price, and

Failed to parse (MathML with SVG or PNG fallback (recommended for modern browsers and accessibility tools): Invalid response ("Math extension cannot connect to Restbase.") from server "https://wikimedia.org/api/rest_v1/":): {\displaystyle d_1 = \frac{1}{\sigma\sqrt{\tau}} \left[ \ln\left(\frac{S_t}{K}\right) + \left(r - q + \frac{1}{2}\sigma^2\right)\tau \right] }

and

Failed to parse (MathML with SVG or PNG fallback (recommended for modern browsers and accessibility tools): Invalid response ("Math extension cannot connect to Restbase.") from server "https://wikimedia.org/api/rest_v1/":): {\displaystyle d_2 = d_1 - \sigma\sqrt{\tau}. }

Here we have used Failed to parse (MathML with SVG or PNG fallback (recommended for modern browsers and accessibility tools): Invalid response ("Math extension cannot connect to Restbase.") from server "https://wikimedia.org/api/rest_v1/":): {\displaystyle N(x)} to denote the standard normal cumulative distribution function,

Failed to parse (MathML with SVG or PNG fallback (recommended for modern browsers and accessibility tools): Invalid response ("Math extension cannot connect to Restbase.") from server "https://wikimedia.org/api/rest_v1/":): {\displaystyle N(x) = \frac{1}{\sqrt{2\pi}} \int_{-\infty}^x e^{-z^2/2} \, dz. }

Similarly, if the payoff is given by Failed to parse (MathML with SVG or PNG fallback (recommended for modern browsers and accessibility tools): Invalid response ("Math extension cannot connect to Restbase.") from server "https://wikimedia.org/api/rest_v1/":): {\displaystyle V(S, T) = P(S, T) =: \max\{K - S, 0\}} , in other words, the option is a European put option, then the value of the option at time Failed to parse (MathML with SVG or PNG fallback (recommended for modern browsers and accessibility tools): Invalid response ("Math extension cannot connect to Restbase.") from server "https://wikimedia.org/api/rest_v1/":): {\displaystyle t} is given by the Black-Scholes formula for the European put:

Failed to parse (MathML with SVG or PNG fallback (recommended for modern browsers and accessibility tools): Invalid response ("Math extension cannot connect to Restbase.") from server "https://wikimedia.org/api/rest_v1/":): {\displaystyle P(S_t, t) = e^{-r\tau} [K N(-d_2) - F_t N(-d_1)]. }

We will implement the formulae for the European call and European put in q. However, our first task is to implement Failed to parse (MathML with SVG or PNG fallback (recommended for modern browsers and accessibility tools): Invalid response ("Math extension cannot connect to Restbase.") from server "https://wikimedia.org/api/rest_v1/":): {\displaystyle N(x)} .

Task 1: Implementing the standard normal cumulative distribution function

As mentioned in the Handbook of Mathematical Functions, Failed to parse (MathML with SVG or PNG fallback (recommended for modern browsers and accessibility tools): Invalid response ("Math extension cannot connect to Restbase.") from server "https://wikimedia.org/api/rest_v1/":): {\displaystyle N(x)} can be approximated by

Failed to parse (MathML with SVG or PNG fallback (recommended for modern browsers and accessibility tools): Invalid response ("Math extension cannot connect to Restbase.") from server "https://wikimedia.org/api/rest_v1/":): {\displaystyle \left\{ \begin{array}{ll} 1 - \phi(x) \left[ c_1 k + c_2 k^2 + c_3 k^3 + c_4 k^4 + c_5 k^5 \right], & x \geq 0, \\ 1 - N(-x), & x < 0, \end{array} \right. }

where

Failed to parse (MathML with SVG or PNG fallback (recommended for modern browsers and accessibility tools): Invalid response ("Math extension cannot connect to Restbase.") from server "https://wikimedia.org/api/rest_v1/":): {\displaystyle \phi(x) = \exp(-x^2 / 2)/\sqrt{2\pi}, }

Failed to parse (MathML with SVG or PNG fallback (recommended for modern browsers and accessibility tools): Invalid response ("Math extension cannot connect to Restbase.") from server "https://wikimedia.org/api/rest_v1/":): {\displaystyle k = 1 / (1 + 0.2316419x), c_1 = 0.319381530, c_2 = -0.356563782, c_3 = 1.781477937, c_4 = -1.821255978, c_5 = 1.330274429.}

Can you implement this function in q?

First, we need

pi:acos -1;

One (terse) implementation would be

normal_cdf:{abs(x>0)-(exp[-.5*x*x]%sqrt 2*pi)*t*.31938153+t*-.356563782+t*1.781477937+t*-1.821255978+1.330274429*t:1%1+.2316419*abs x};

Task 2: Implement the Black-Scholes formula for the European call and put

Equipped with our implementation of normal_cdf, can you implement the Black-Scholes formula for the European call?

First, we need

compute_d1:{[S;K;r;q;sigma;tau](log[S%K]+((r-q)+.5*sigma*sigma)*tau)%sigma*sqrt tau};

Then,

call_price:{[S;K;r;q;sigma;tau]
  d1:compute_d1[S;K;r;q;sigma;tau];
  d2:d1-sigma*sqrt tau;
  F:S*exp tau*r-q;
  (exp neg r*tau)*(F*normal_cdf d1)-K*normal_cdf d2};

and

put_price:{[S;K;r;q;sigma;tau]
  d1:compute_d1[S;K;r;q;sigma;tau];
  d2:d1-sigma*sqrt tau;
  F:S*exp tau*r-q;
  (exp neg r*tau)*(K*normal_cdf neg d2)-F*normal_cdf neg d1};

We can test these implementations on a few sets of parameters, for example

call_price[100f;105f;.05;.07;.1;.5]

gives 0.7991363, whereas

put_price[100f;105f;.05;.07;.1;.5]

gives 6.646135.