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]]
Hi Madhavi, the error message means, that your function returns NA evaluated at the lower limit of the search interval. try f.ytm(0) to check that. I think, 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 } will not return what you expected, since the code evaluates solely E =NULL (tenure * no_comp - 1) times. (the opening curly bracket is misplaced) hth Madhavi Bhave schrieb:> 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 at 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. >-- Eik Vettorazzi Institut f?r Medizinische Biometrie und Epidemiologie Universit?tsklinikum Hamburg-Eppendorf Martinistr. 52 20246 Hamburg T ++49/40/7410-58243 F ++49/40/7410-57790
Dear Sir, Thank you for valuable guidance. Though I have been using R occassionally, it was limited to some basics and that way I am new to R. As suggested by you, I have gone through the said chapter of Introduction to R manual, though I have some urgent comittments to meet. I have tried writing function as given below. f = function(price, tenure, no_comp, coupon_rate, face_value) { coupon_payment = face_value * coupon_rate / no_comp cash_flow = c(rep(c(coupon_payment), (no_comp * tenure - 1)), face_value + coupon_payment) E = NULL for (i in 1 : (tenure * no_comp - 1)) { E[i] = cash_flow[i]/(1+ytm)^i } F = NULL { F = sum(E) + ((face_value + coupon_payment)/(1+ytm)^(no_comp * tenure)) - price } return(data.frame(S = uniroot.all(F, interval=c(0,25)))) } output = f(1010, 3, 1, 0.10, 1000) ## End of code However, when I try to execute the same, I get following error. Error: object 'ytm' not found My objective is to find ytm itself and I am not able to figure out where I am going wrong and how to overcome the same. Regards Madhavi --- On Tue, 2/2/10, Dennis Murphy <djmuser@gmail.com> wrote: From: Dennis Murphy <djmuser@gmail.com> Subject: Re: [R] Yield to Maturity using R To: "Madhavi Bhave" <madhavi_bhave@yahoo.com> Date: Tuesday, 2 February, 2010, 3:49 AM Hi: On Tue, Feb 2, 2010 at 3:01 AM, Madhavi Bhave <madhavi_bhave@yahoo.com> wrote: 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 } } For this to work, tenure, no_comp, cash_flow, face_value and coupon_payment have to be visible to the function - i.e., they either have to be in the function's calling environment or in the global environment. These are called 'free variables' under the lexical scoping rules of R. (Welcome to function writing :) You might want to look a little more closely at uniroot(), especially the conventions it requires for the *functions* it can evaluate. You want the body of what you send to uniroot() for evaluation to be a function of a single variable. Your previously supplied solution meets that requirement. This one doesn't (yet). Moreover, it appears that E[i] is never used and nothing is returned from f.ytm. I'd suggest an excursion into R function writing fundamentals. Start with Ch. 10 of the Introduction to R manual. HTH, Dennis 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. [[elided Yahoo spam]] [[alternative HTML version deleted]]