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));
					
Try it!

Contents