[R-SIG-Finance] Simulated expected return for a hedge fund
Afshartous, David
d.afshartous at Vanderbilt.Edu
Fri Dec 23 21:43:41 CET 2011
All,
Below is an R-lab problem from Ch2 of Statistics and Data Analysis for Financial Engineering (Ruppert, 2010). The R code runs okay but the answer seems strange. Any hints much appreciated.
Cheers,
David
David Afshartous, Ph.D.
Research Associate Professor
PSTAT®: ASA Accredited Professional Statistician
Department of Biostatistics
Vanderbilt University Medical Center
## suppose Hedge fund owns $1,000,000 of stock and used $50,000 capital and
## $950,000 borrowed money for the purchase.
## Daily log returns on the stock have a mean of 0.05/year and SD of 0.23/year,
## which can be converted to per trading day by dividing by 253 and sqrt(253)
## the hedge fund will sell the stock for a profit of at least $100,000 if the value
## of the stock rises to at least $1,100,000 at the end of one of the first 100 trading days,
## sell it for a loss if the value falls below $950,000 at the end of one of the first
## 100 trading days, or sell after 100 trading days if the closing price has stayed between
## $950,000 and $1,1000,000.
## PROBLEM 7: What is the expected return? When answering this question, remember
## that only $50,000 was invested. Also, the units of return are time, e.g.,
## one can express a return as a daily return or a weekly return. Therefore,
## one must keep track of how long the hedge fund holds its position before selling
The code below simulates whether value falls below 950,000, goes above 1,1000,000, or stays between. The amount lost/gained in the 1st/2nd scenario is a constant, whereas the amount lost/gained in the third scenario is random.
### simulation code; written for readability as opposed to speed
niter = 10000 ## number of iterations
below = rep(0, niter) ## set up storage
above = rep(0, niter)
between = rep(0, niter)
between.ending.value = NULL
below.ending.day = NULL
above.ending.day = NULL
set.seed(2009)
for (i in 1:niter) {
r = rnorm(100, mean = .05/253, sd = .23/sqrt(253))
logPrice = log(1e6) + cumsum(r) ## 1e6 = initial price
minLogP = min(logPrice) ## min price over next 45 days
maxLogP = max(logPrice) ## min price over next 45 days
crossBelowLogP.day = ifelse( minLogP < log(950000), min(which(logPrice < log(950000))), 101) ## 101 means doesn't cross
crossAboveLogP.day = ifelse( maxLogP > log(1100000), min(which(logPrice > log(1100000))), 101)
if ( (minLogP >= log(950000)) & (maxLogP <= log(1100000)) ) { ## Neither cross boundary
between[i] = 1
between.ending.value = append(between.ending.value, exp(logPrice[100]))
}
if ( (minLogP < log(950000)) & (maxLogP > log(1100000))) { ## Both cross
ifelse (crossBelowLogP.day < crossAboveLogP.day, below[i] <- 1, above[i] <-1)
ifelse (crossBelowLogP.day < crossAboveLogP.day, below.ending.day <- append(below.ending.day, crossBelowLogP.day),
above.ending.day <- append(above.ending.day, crossAboveLogP.day))
}
if ( (minLogP < log(950000)) & (maxLogP <= log(1100000)) ) { ## Only cross below
below[i] = 1
below.ending.day = append(below.ending.day, crossBelowLogP.day)
}
if ( (minLogP >= log(950000)) & (maxLogP > log(1100000)) ) { ## Only cross above
above[i] = 1
above.ending.day = append(above.ending.day, crossAboveLogP.day)
}
}
mean(above) ## this will give the probability of the value crossing the above threshold
When annualizing returns, the day in which a boundary needs to be accounted for. The following code calculates the overall expected return by conditioning on each scenario:
# cross above: always make constant 100,000 based on initial investment of 50,000
# P_t/P_t-1 = 100,000/50,000 = 2 = gross return --> net return = 2 - 1 = 1
ret.above = (1 + 1)^(365/(above.ending.day)) - 1 ### annualized
# cross below: always lose constant 50,000 based on initial investment of 50,000
# P_t/P_t-1 = 50,000/50,000 = 1 = gross return --> net return = 1 - 1 = 0
ret.below = 0
## betwen: final value depends on realized value on 100th day
# P_t/P_t-1 = between.ending.value/50,000 = --> net return = gross return - 1
net = ifelse(between.ending.value < 1000000,
(1000000 - between.ending.value)/50000 - 1, ## net return, gain
(between.ending.value - 1000000)/50000 - 1) ## net return, loss
ret.between = (1 + net)^(365/100) - 1
exp.return = mean(above)*mean(ret.above) + mean(below)*mean(ret.below) + mean(between) * mean(ret.between)
8.669104e+50???
More information about the R-SIG-Finance
mailing list