bond_price_float <- function (date_ini, disc_mar, coupon, matur, freq, conv, serie_float_rate, issue_date=NULL, amort_mat = NULL, in_arrears=0, round_val=5)
{
##Esta funcion calcula precio para un titulo a partir de la tasa variable y un margen de descuento.
##disc_mar: margen de descuento
## serie_float_rate: Matrix donde columna 1 es fecha, columna 2 es valor.
##conv=c("act_360","act_365","act_act","30_360","30_360I","30_360E","nl_365" )
##si in_arrears==1, todos los flujos se proyectan con indicador actual. Si in_arrears=0, el primer flujo se proyecta con tasa previa.
model_count=switch(conv, "act_360"=days_act_360, "act_365"=days_act_365,"act_act"=days_act_act,"30_360"=days_30_360,"30_360I"=days_30_360I,"30_360E"=days_30_360E,"nl_365"=days_nl_365)
model_diff=switch(conv, "act_360"=diff_act_360, "act_365"=diff_act_365,"act_act"=diff_act_act,"30_360"=diff_30_360,"30_360I"=diff_30_360I,"30_360E"=diff_30_360E,"nl_365"=diff_nl_365)
coupon0=coupon
per = 1
length = 1
if (freq != 0) {
per = 12/freq
length = as.numeric(freq * (matur - date_ini)/365) + 2
}
cpn_dates = sort(unique(c(seq(matur, by = paste0("-", per, " months"), length = length),issue_date)))
fut_cpn_dates = cpn_dates[cpn_dates > date_ini]
lfutcpn=length(fut_cpn_dates)
times = model_count(fut_cpn_dates, date_ini)$times
delta = tail(model_diff(cpn_dates)$times, length(fut_cpn_dates))
date_prev=tail(cpn_dates[cpn_dates < date_ini],1)
float_rate_1=as.numeric(serie_float_rate[findInterval(date_ini, index(serie_float_rate))])
if(length(float_rate_1)==0){stop("Actualizar Series de Indices!!")}
coupon=rep(float_rate_1+coupon,lfutcpn)
if(in_arrears==0){
float_rate_0=as.numeric(serie_float_rate[findInterval(date_prev, index(serie_float_rate))])
coupon[1]=float_rate_0+coupon0
}
if(any(is.na(delta)) & coupon[1]!=0){
delta = model_count(fut_cpn_dates, issue_date)$times}
delta=ifelse(is.na(delta),1,delta)
df = 1/(1 + (float_rate_1+disc_mar)*times)
df=ifelse(df<0,1,df)
cum_coupon=round(coupon[1]*(delta[1]-model_count(fut_cpn_dates[1], date_ini)$times),round_val)
if(!is.null(amort_mat)){
cf_cap=rep(0,lfutcpn)
pos_amort=match(amort_mat[,1],fut_cpn_dates)
if(any(is.na(pos_amort))){stop("Fechas de amortizaci?n no coinciden con fechas de flujos.")}
cf_cap[pos_amort]=amort_mat[,2]
cf = coupon * delta + cf_cap
}else{
cf = coupon * delta
cf[lfutcpn] = cf[lfutcpn] + 1
}
full_price = round(sum(cf * df),round_val)
clean_price=round(full_price-cum_coupon, round_val)
return(list(full_price = full_price, clean_price = clean_price, cum_coupon=cum_coupon))
}
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.