Dear R helpers,
 
 
Yesterday I had raised following query which was addressed by Mr Ellison. The 
query and the wonderful solution as provided by Mr. Ellison are as given below.
  
## PROBLEM
 
I am calculating the 'Yield to Maturity' for the Bond with following 
characteristics.
  
Its a $1000 face value, 3 year bond with 10% annual coupon and is priced at 
101. The yield to maturity can be calculated after solving the equation - 
  
1010 = [100 / (1+ytm)]  + [100 / (1+ytm)^2] + [ 1100 / (1 + ytm)^3]
  
This can be solved by trial and error method s.t. ytm = 9.601%. I wanted to 
find out how to solve this equation in R.
   
## SOLUTION 
 
Mr. Elisson had given me following wonderful solution 
 
f.ytm<-function(ytm) 100 / (1+ytm)  +100 / ((1+ytm)^2) + 1100 / ((1 +
ytm)^3) -1010

uniroot(f.ytm, interval=c(0,25))  

#$root has the answer
 
And I got the answer as 9.601.
 
## _____________________________________________________________
 
I was just trying to generalize this solution to any equation and accordingly 
written a code as given below. 
 
The following input I will be reading using csv file and thus my equation will 
change if tenure or no_comp etc. changes. So taking into account the variable 
nature of the input, I am trying to write a generalized code.
 
## Input
 
price = 101       # Price of bond
tenure = 3          
no_comp = 1      # no of times coupon paid in a year.
coupon_rate = 0.10  # i.e. 10%
face_value  = 100
 
# Computations
 
coupon_payment = face_value * coupon_rate
cash_flow = c(rep(c(coupon_payemnt), (no_comp * tenure - 1)), face_value + 
coupon_payment)
cash_flow
 
## I am trying to customize the code as given by Mr Ellison.
 
f.ytm = function(ytm)
 
{
 
 for (i in 1 : (tenure * no_comp - 1))
 E = NULL
 F = NULL
 {
 E[i] = cash_flow[i]/(1+ytm)^i
 F = (sum(E) + (face_value + coupon_payment)/((1+ytm)^(tenure * no_comp))) - 
price
    }
}
 
solution = uniroot(f.ytm, interval=c(0,25))  
 
ytm = solution$root
 
However, when I execute this code I get following error.
 
> solution = uniroot(f.ytm, interval=c(0,25))  
Error in uniroot(f.ytm, interval = c(0, 25)) : f.lower = f(lower) is NA

Please guide. ytm should be 0.09601 (i.e. 9.601%)
 
 
with regards
 
Madhavi Bhave
 
 


      Your Mail works best with the New Yahoo Optimized IE8. Get it NOW! 
http://downloads.yahoo.com/in/internetexplorer/
        [[alternative HTML version deleted]]

______________________________________________
R-help@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.

Reply via email to