Share Brilliantly
forecasting cash flows
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!