Cardinal
Cardinal

Reputation: 228

Solve for unknown value in R

I want to discount a number of cashflows and find the ''fair'' interest rate of a financial instrument. That is, I want to set the interest rate in such a way that $$P=\sum_i^T e^{-ri}c_i$$, where P is some value. As a toy example, I came up with this:

value <- c(1,2,3,4,5,6,7,8,9,10)
discounted_value <- c()
for(i in 1:10){
  discounted_value[i] <- value[i]*exp(-r*i)
}
should_be_equal_to <- 50

I want to find a r such that the sum of the vector of discounted_values is equal to 50 (should_be_equal_to). Does anyone have an idea how to solve this? I prefer not to use a number of manual grids for r.

Upvotes: 1

Views: 138

Answers (1)

StupidWolf
StupidWolf

Reputation: 46898

It's like a least square problem. You define a function that calculates the difference between the sum of your predicted value for a given r :

fn <- function(value,r) {   
         delta = 50 - sum(value*exp(-r*seq_along(value)))
         abs(delta)
     }

Then you optimize this function, providing boundaries:

optim(par = 0.5,fn=fn, value=value,method="Brent",lower=0,upper=1)

$par
[1] 0.01369665

$value
[1] 2.240363e-07

$counts
function gradient 
      NA       NA 

$convergence
[1] 0

$message
NULL

And you can try the optimized parameter:

r = 0.01369665
discounted_value = value*exp(-r*seq_along(value))
sum(discounted_value)
[1] 50

Upvotes: 1

Related Questions