Chapter 6. Analytical Value–at–Risk for Options and Bonds (in R/Julia)


Copyright 2011 - 2019 Jon Danielsson. This code is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This code is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. The GNU General Public License is available at: https://www.gnu.org/licenses/.


Listing 6.1/6.2: Black-Scholes function in R
Last updated 2011

bs = function(X, P, r, sigma, T){
	d1 = (log(P/X) + (r + 0.5*sigma^2)*(T))/(sigma*sqrt(T))
	d2 = d1 - sigma*sqrt(T)
	Call = P*pnorm(d1,mean=0,sd=1)-X*exp(-r*(T))*pnorm(d2,mean=0,sd=1)
	Put = X*exp(-r*(T))*pnorm(-d2,mean=0,sd=1)-P*pnorm(-d1,mean=0,sd=1)
	Delta.Call = pnorm(d1, mean = 0, sd = 1)
	Delta.Put = Delta.Call - 1
	Gamma = dnorm(d1, mean = 0, sd = 1)/(P*sigma*sqrt(T))
	return(list(Call=Call,Put=Put,Delta.Call=Delta.Call,Delta.Put=Delta.Put,Gamma=Gamma))
}
		
Listing 6.1/6.2: Black-Scholes function in Julia
Last updated June 2018

function bs(X, P, r, sigma, T)
    d1 = (log.(P/X) + (r + 0.5 * sigma^2)*T)/(sigma * sqrt(T))
    d2 = d1 - sigma * sqrt(T)
    Call = P .* cdf.(Normal(0,1), d1) - X * exp(-r * T) .* cdf.(Normal(0,1), d2)
    Put = X * exp(-r * T) .* cdf.(Normal(0,1),-d2) - P .* cdf.(Normal(0,1), -d1)
    Delta_Call = cdf.(Normal(0,1), d1)
    Delta_Put = Delta_Call - 1
    Gamma = pdf.(Normal(0,1), d1) ./ (P * sigma * sqrt(T))
    return Dict("Call" => Call, "Put" => Put, "Delta_Call" => Delta_Call, "Delta_Put" => Delta_Put, "Gamma" => Gamma)
end
		

Listing 6.3/6.4: Black-Scholes in R
Last updated August 2016

f=bs(90,100,0.05,0.2,0.5)
print(f)
		
Listing 6.3/6.4: Black-Scholes in Julia
Last updated June 2018

f = bs(90, 100, 0.05, 0.2, 0.5)