Structured Securities - Tranche Example

Overview

This example examines a simple security that is structured like an amortized loan and backed by a pool of assets. In this example, the security has a stated principal and interest rate, and pays fixed payments.

Full Code



let amt = await import('/lib/finance/fixed-income/v1.0.0/amortized.mjs'); let pm = await import('/lib/finance/fixed-income/v1.0.0/payments.mjs'); let pd = await import('/lib/finance/fixed-income/v1.0.0/pay-dates.mjs'); let st = await import('/lib/sort/v1.0.0/sort.mjs'); let start = '2020-01-31'; let number = 12*10; let period=12; let endOfMonth = true; let principal = 100000; let rate = 0.05; let dates = pd.dates(start, number, period, endOfMonth); let dateMap = gp.group(dates, p=>p)(); let flows = [{date:'2010-01-01', value:10},{date:'2010-01-01', value:10}, {date:'2010-01-07', value:10},{date:'2010-01-10', value:10}, {date:'2010-08-07', value:10},{date:'2010-09-10', value:10}, {date:'2011-01-07', value:10},{date:'2011-01-10', value:10} ]; flows = [...flows, ...dates.map(p=>({date:p}))]; let cashFlows = gp.group(flows, p=>p.date).map((keys, values)=>{ let item = { date:keys[0], value : $list(values).filter(p=>p.value !== undefined).map(p=>p.value).sum(), } return item; }).values(); let tranches = [{ payments:[], payment:1000 },{ payments:[], payment:1000 },{ payments:[], payment:2000 }]; let cash = 0; for(let item of st.sort(cashFlows, p=>p.date)){ //increase the cash available by cash += item.value; if(item.date in dateMap){ item.fees = 10; cash -= item.fees; for(let tranche of tranches){ let payment = { date:item.date, value:0 }; if(cash > tranche.payment){ payment.value = tranche.payment; cash-=payment.value; } else if(cash>0){ payment.value = cash; cash = 0; } tranche.payments.push(payment); } } item.cash = cash; } $console.log('answer is '+ JSON.stringify(flows));