#Exercise, using montecarlo simulation calculate the 10 day 99% var for a portfolio of 20 million equally invested in call and put options with the following parameters
call<-c(30,50,0.05,0.5,0.75,.02,.75,10/252,.75-(10/252))
put<-c(35,20,0.08,0.8,1,.02,.75,10/252,1-(10/252))
parameters<-rbind(call,put)
colnames(parameters)<-c("S_0","K","mu","sigma","T","r","p","dt","t-dt")
print(parameters)
## S_0 K mu sigma T r p dt t-dt
## call 30 50 0.05 0.5 0.75 0.02 0.75 0.03968254 0.7103175
## put 35 20 0.08 0.8 1.00 0.02 0.75 0.03968254 0.9603175
#generating realisations of 2 normal distributions with correlation .75 for the error term
n<-1000
set.seed(420)
rho<-.75
mu1<-0;s1<-1
mu2<-0;s2<-1
mu<-c(mu1,mu2)
#covariance matrix
sigma<-matrix(c(s1^2,s1*s2*rho,s1*s2*rho,s2^2),nrow=2)
rownames(sigma)<-c(1,2)
colnames(sigma)<-c(1,2)
library(ggplot2)
library(MASS)
bvn<-mvrnorm(n,mu,sigma)
#simulating stock price,d1, d2 in 10 days
#define s_t_ij+delta t = st_2ij for i observation and asset j
st_2ji<-function(s0,mu,sigma,dtx,error){
return(s0*exp((mu-(0.5*sigma^2))*dtx+(sigma*sqrt(dtx)*error)))
}
#call stock prices
st_2a<-st_2ji(s0=parameters[1,1],
mu=parameters[1,3],
dtx=parameters[1,8],
error=bvn[,1],
sigma=parameters[1,4])
#put stock prices
st_2b<-st_2ji(s0=parameters[2,1],
mu=parameters[2,3],
dtx=parameters[2,8],
error=bvn[,2],
sigma=parameters[2,4])
#defining d1 function
function_d1<-function(st,k,sigma,dtx){
return((log(st/k)+
((parameters[1,6]+(sigma^2/2))*dtx)) /
(sqrt(dtx)*sigma))}
#calculating d1
d1_a<-function_d1(st=st_2a,
k=parameters[1,2],
dtx=parameters[1,9],
sigma=parameters[1,4])
d1_b<-function_d1(st=st_2b,
parameters[2,2],
dtx=parameters[2,9],
sigma=parameters[2,4])
#defining d2 function
fucntion_d2<-function(d1,sigma,dtx){
return(d1-(sigma*sqrt(dtx)))
}
#calculating d2
d2_a<-fucntion_d2(d1=d1_a,
sigma=parameters[1,4],
dtx=parameters[1,9])
d2_b<-fucntion_d2(d1=d1_b,
sigma=parameters[2,4],
dtx=parameters[2,9])
#calculating call price
function_call<-function(st,d1,d2,k,dtx){
return(st*pnorm(d1)-(k/exp(parameters[1,6]*dtx)*pnorm(d2)))}
c_a<-function_call(st_2a,
d1=d1_a,
d2=d2_a,
k=parameters[1,2],
dtx = parameters[1,9])
#calculating put price
function_put<-function(st,d1,d2,k,dtx){
return((k/exp(parameters[1,6]*dtx)*pnorm(-d2))-(st*pnorm(-d1)))}
p_b<-function_put(st=st_2b,
d1=d1_b,
d2=d2_b,
k=parameters[2,2],
dtx = parameters[2,9])
#calculating portfolio #calculating purchase price of call and put
d1_call<-function_d1(st=parameters[1,1],
k=parameters[1,2],
dtx = parameters[1,5],
sigma=parameters[1,4])
d1_put<-function_d1(st=parameters[2,1],
k=parameters[2,2],
dtx=parameters[2,5],
sigma=parameters[2,4])
d2_call<-fucntion_d2(d1=d1_call,
sigma=parameters[1,4],
dtx = parameters[1,5])
d2_put<-fucntion_d2(d1=d1_put,
sigma=parameters[2,4],
dtx=parameters[2,5])
call_price<-function_call(st=parameters[1,1],
d1=d1_call,
d2=d2_call,
k=parameters[1,2],
dtx=parameters[1,5])
put_price<-function_put(st=parameters[2,1],
d1=d1_put,
d2=d2_put,
k=parameters[2,2],
dtx = parameters[2,5])
call_price
## [1] 1.027953
put_price
## [1] 2.743948
#quantity of call/puts bought with 10 million allocation each (in 000's)
q_c<-10000/call_price
q_p<-10000/put_price
V_t<-(2*10000*exp(parameters[1,6]*10/252))-(q_c*c_a+q_p*p_b)
#sorting data to estimate VAR
v_t<-as.data.frame(sort(V_t,decreasing=F))
names(v_t)<-"sorted"
v_lowest_20<-as.data.frame(v_t$sorted[1:20])
names(v_lowest_20)<-"sorted"
#10 day 99% VAR
v_lowest_20$sorted[10]
## [1] -14447.32
library(ggplot2)
ggplot(v_t,aes(x=sorted))+geom_histogram(binwidth = 1750)
#ES 98%
ggplot(v_lowest_20,aes(x=sorted))+geom_histogram(binwidth = 5000)
sum(v_lowest_20)/length(v_lowest_20)
## [1] -301924.9