# Chapter 6. Analytical Value-at-Risk for Options and Bonds (in R/Python)

Copyright 2011 - 2020 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 Python Last updated June 2018

import numpy as np
from scipy import stats
def bs(X, P, r, sigma, T):
d1 = (np.log(P/X) + (r + 0.5 * sigma**2)*T)/(sigma * np.sqrt(T))
d2 = d1 - sigma * np.sqrt(T)
Call = P * stats.norm.cdf(d1) - X * np.exp(-r * T) * stats.norm.cdf(d2)
Put = X * np.exp(-r * T) * stats.norm.cdf(-d2) - P * stats.norm.cdf(-d1)
Delta_Call = stats.norm.cdf(d1)
Delta_Put = Delta_Call - 1
Gamma = stats.norm.pdf(d1) / (P * sigma * np.sqrt(T))
return {"Call": Call, "Put": Put, "Delta_Call": Delta_Call, "Delta_Put": Delta_Put, "Gamma": Gamma}


##### Listing 6.3/6.4: Black-Scholes in R Last updated July 2020

f = bs(X = 90, P = 100, r = 0.05, sigma = 0.2, T = 0.5)
print(f)

##### Listing 6.3/6.4: Black-Scholes in Python Last updated July 2020

f = bs(X = 90, P = 100, r = 0.05, sigma = 0.2, T = 0.5)
print(f)