[Returnanalytics-commits] r3869 - pkg/Dowd/R

noreply at r-forge.r-project.org noreply at r-forge.r-project.org
Wed Jul 29 01:00:34 CEST 2015


Author: dacharya
Date: 2015-07-29 01:00:33 +0200 (Wed, 29 Jul 2015)
New Revision: 3869

Added:
   pkg/Dowd/R/AmericanPutESBinomial.R
Log:
Function AmericanPutESBinomial added.

Added: pkg/Dowd/R/AmericanPutESBinomial.R
===================================================================
--- pkg/Dowd/R/AmericanPutESBinomial.R	                        (rev 0)
+++ pkg/Dowd/R/AmericanPutESBinomial.R	2015-07-28 23:00:33 UTC (rev 3869)
@@ -0,0 +1,96 @@
+#' Estimates ES of American vanilla put using binomial tree.
+#' 
+#' Estimates ES of American Put Option using binomial tree to price the option
+#' and historical method to compute the VaR.
+#' 
+#' @param amountInvested Total amount paid for the Put Option.
+#' @param stockPrice Stock price of underlying stock.
+#' @param strike Strike price of the option.
+#' @param r Risk-free rate.
+#' @param volatility Volatility of the underlying stock.
+#' @param maturity Time to maturity of the option in days.
+#' @param numberSteps The number of time-steps considered for 
+#' the binomial model.
+#' @param cl Confidence level for which VaR is computed.
+#' @param hp Holding period of the option in days.
+#' @return ES of the American Put Option
+#' @references Dowd, Kevin. Measuring Market Risk, Wiley, 2007.
+#' 
+#' Lyuu, Yuh-Dauh. Financial Engineering & Computation: Principles, 
+#' Mathematics, Algorithms, Cambridge University Press, 2002.
+#' 
+#' @author Dinesh Acharya
+#' @examples
+#' 
+#'    # Market Risk of American Put with given parameters.
+#'    AmericanPutESBinomial(0.20, 27.2, 25, .16, .05, 60, 20, .95, 30)
+#'    
+#' @export
+AmericanPutESBinomial <- function(amountInvested, stockPrice, strike, r,
+                                   volatility, maturity, numberSteps, cl, hp){
+  s <- stockPrice
+  x <- strike
+  time <- maturity
+  sigma <- volatility
+  # convert maturity and holding period unit from days to years
+  time <- time/360
+  hp <- hp/360
+  # calculate the length of each interval, dt, and number of steps to end of
+  # holding period 
+  n <- numberSteps
+  dt <- time/n
+  m <- round(hp/dt) # number of steps to end of holding period
+  # 
+  # calculate movements and associated probabilities
+  #
+  u <- exp(sigma*sqrt(dt))
+  d <- 1/u
+  a <- exp(r*dt) # Note: Dowd's original code had (r-q), but since r is 
+  # risk-free rate of returns, it should be r only.
+  p <- (a-d)/(u-d)
+  jspan <- n*.5
+  jspan <- -((jspan>=0)*floor(jspan)+(jspan<0)*ceiling(jspan)) # j-th node 
+  # offset number
+  ispan <- round(time/dt)%%2 # i-th node offset number
+  i <- ispan:(n+ispan) # i-th node numbers
+  j <- jspan:(n+jspan) # j-th node numbers
+  
+  # expand i and j to eliminate for loop
+  jex <- matrix(rep(j, each=length(i)), ncol=length(i), byrow=TRUE)
+  iex <- matrix(rep(i, each=length(j)), nrow=length(j))
+  #
+  # asset price at nodes, matrix is flipped so tree appears correct visually
+  pr <- t(apply(apply((s*(u^jex)*(d^(iex-jex))), 2, rev), 1, rev))
+  # get upper triangle of pr
+  lower.tri(pr)
+  pr[lower.tri(pr)] <- 0
+  #
+  # option valuation along tree
+  opt <- matrix(0,nrow(pr),ncol(pr))
+  opt[,n+1] <- pmax(x-pr[,n+1],0) # determine final option value  from 
+  # underlying price
+  for(l in seq(n,1,by=-1)){
+    k=1:l
+    # probable option values discounted back one time step 
+    discopt=(p*opt[k,l+1]+(1-p)*opt[k+1,l+1])*exp(-r*dt)
+    # option value is max of X - current price or discopt
+    opt[,l]=c(pmax(x-pr[1:l,l],discopt),rep(0,n+1-l))
+  }
+  # initial option price and number of options in portfolio
+  initialOptionPrice <- opt[1,1]
+  numberOptions <- amountInvested/initialOptionPrice
+  # option tree values at end of holding period
+  endHpOptionPrice <- opt[,m+1]
+  endHpOptionPrice <- endHpOptionPrice[1:(m+1)]
+  # returns<-(endHpOptionPrice-initialOptionPrice)/initialOptionPrice
+  # option position Profit and Loss
+  profitOrLoss <- (endHpOptionPrice-initialOptionPrice)*numberOptions
+  #compute VaR
+  VaR <- HSVaR(profitOrLoss, cl)
+  if(VaR == amountInvested){
+    ES <- VaR
+  } else {
+    ES <- HSES(profitOrLoss, cl)
+  }
+  return(ES)
+}
\ No newline at end of file



More information about the Returnanalytics-commits mailing list