library(quantmod)

Define bond parameters

face_value <- 1000
coupon_rate <- 0.05  # 5% annual coupon rate
maturity_years <- 5
yield_to_maturity <- 0.04  # 4% annual yield to maturity

Calculate cash flows

cash_flows <- rep(coupon_rate * face_value, maturity_years)
cash_flows[maturity_years] <- cash_flows[maturity_years] + face_value

Calculate time periods

time_periods <- 1:maturity_years

Calculate present value of cash flows

pv_cash_flows <- cash_flows / (1 + yield_to_maturity)^(time_periods)

Calculate Macaulay duration

Macaulay durationmacaulay_duration <- sum(time_periods * pv_cash_flows) / sum(pv_cash_flows)

Consider a 3-year bond with a face value of $1,000, a coupon rate of 5% (paid annually), and a yield to maturity (YTM) of 6%.

Step 1: Calculate the present value of each cash flow:

* Year 1: PV(CF1) = $50 / (1+0.06)^1 = $47.17
* Year 2: PV(CF2) = $50 / (1+0.06)^2 = $44.50
* Year 3: PV(CF3) = $1,050 / (1+0.06)^3 = $883.85

Step 2: Calculate the weighted average time:

* Weighted average time = (1 * $47.17 + 2 * $44.50 + 3 * $883.85) / ($47.17 + $44.50 + $883.85) = 2.79 years

Therefore, the Macaulay duration of this bond is approximately 2.79 years. This means that for every 1% change in the interest rate, the bond’s price is expected to change by approximately 2.79%.

print(macaulay_duration)
LS0tDQp0aXRsZTogIkZNIER1cmF0aW9uIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCg0KDQpgYGB7cn0NCmxpYnJhcnkocXVhbnRtb2QpDQpgYGANCiMgRGVmaW5lIGJvbmQgcGFyYW1ldGVycw0KYGBge3J9DQpmYWNlX3ZhbHVlIDwtIDEwMDANCmNvdXBvbl9yYXRlIDwtIDAuMDUgICMgNSUgYW5udWFsIGNvdXBvbiByYXRlDQptYXR1cml0eV95ZWFycyA8LSA1DQp5aWVsZF90b19tYXR1cml0eSA8LSAwLjA0ICAjIDQlIGFubnVhbCB5aWVsZCB0byBtYXR1cml0eQ0KYGBgDQojIENhbGN1bGF0ZSBjYXNoIGZsb3dzDQoNCmBgYHtyfQ0KY2FzaF9mbG93cyA8LSByZXAoY291cG9uX3JhdGUgKiBmYWNlX3ZhbHVlLCBtYXR1cml0eV95ZWFycykNCmNhc2hfZmxvd3NbbWF0dXJpdHlfeWVhcnNdIDwtIGNhc2hfZmxvd3NbbWF0dXJpdHlfeWVhcnNdICsgZmFjZV92YWx1ZQ0KYGBgDQojIENhbGN1bGF0ZSB0aW1lIHBlcmlvZHMNCmBgYHtyfQ0KdGltZV9wZXJpb2RzIDwtIDE6bWF0dXJpdHlfeWVhcnMNCg0KYGBgDQojIENhbGN1bGF0ZSBwcmVzZW50IHZhbHVlIG9mIGNhc2ggZmxvd3MNCmBgYHtyfQ0KcHZfY2FzaF9mbG93cyA8LSBjYXNoX2Zsb3dzIC8gKDEgKyB5aWVsZF90b19tYXR1cml0eSleKHRpbWVfcGVyaW9kcykNCmBgYA0KIyBDYWxjdWxhdGUgTWFjYXVsYXkgZHVyYXRpb24NCmBgYHtyfQ0KTWFjYXVsYXkgZHVyYXRpb25tYWNhdWxheV9kdXJhdGlvbiA8LSBzdW0odGltZV9wZXJpb2RzICogcHZfY2FzaF9mbG93cykgLyBzdW0ocHZfY2FzaF9mbG93cykNCg0KYGBgDQpDb25zaWRlciBhIDMteWVhciBib25kIHdpdGggYSBmYWNlIHZhbHVlIG9mICQxLDAwMCwgYSBjb3Vwb24gcmF0ZSBvZiA1JSAocGFpZCBhbm51YWxseSksIGFuZCBhIHlpZWxkIHRvIG1hdHVyaXR5IChZVE0pIG9mIDYlLg0KDQoqKlN0ZXAgMTogQ2FsY3VsYXRlIHRoZSBwcmVzZW50IHZhbHVlIG9mIGVhY2ggY2FzaCBmbG93OioqDQoNCmBgYHtyfQ0KKiBZZWFyIDE6IFBWKENGMSkgPSAkNTAgLyAoMSswLjA2KV4xID0gJDQ3LjE3DQoqIFllYXIgMjogUFYoQ0YyKSA9ICQ1MCAvICgxKzAuMDYpXjIgPSAkNDQuNTANCiogWWVhciAzOiBQVihDRjMpID0gJDEsMDUwIC8gKDErMC4wNileMyA9ICQ4ODMuODUNCmBgYA0KKipTdGVwIDI6IENhbGN1bGF0ZSB0aGUgd2VpZ2h0ZWQgYXZlcmFnZSB0aW1lOioqDQpgYGB7cn0NCiogV2VpZ2h0ZWQgYXZlcmFnZSB0aW1lID0gKDEgKiAkNDcuMTcgKyAyICogJDQ0LjUwICsgMyAqICQ4ODMuODUpIC8gKCQ0Ny4xNyArICQ0NC41MCArICQ4ODMuODUpID0gMi43OSB5ZWFycw0KYGBgDQoNClRoZXJlZm9yZSwgdGhlIE1hY2F1bGF5IGR1cmF0aW9uIG9mIHRoaXMgYm9uZCBpcyBhcHByb3hpbWF0ZWx5IDIuNzkgeWVhcnMuIFRoaXMgbWVhbnMgdGhhdCBmb3IgZXZlcnkgMSUgY2hhbmdlIGluIHRoZSBpbnRlcmVzdCByYXRlLCB0aGUgYm9uZCdzIHByaWNlIGlzIGV4cGVjdGVkIHRvIGNoYW5nZSBieSBhcHByb3hpbWF0ZWx5IDIuNzklLg0KDQpgYGB7cn0NCnByaW50KG1hY2F1bGF5X2R1cmF0aW9uKQ0KYGBgDQoNCg0KDQo=