Node org.unizone.finance.interest.YieldLinearData

org.unizone.0.8541
Instance of TypeScriptInfo

Node dataValue
org.edgescript.TypeScriptInfo.prerequisiteParcelsList{}
org.edgescript.TypeScriptInfo.prerequisiteMethodsList{}
org.edgescript.TypeScriptInfo.script/* instance Array[Real] pYears; instance Array[Real] pRates; instance Collection[TimeData] tbills; instance Collection[TimeData] bonds; instance Collection[TimeData] allData; constructor(Source source, Time time) { TimeFunction:(source, time); } Real rateAt(Real years) { if (years < instance pYears.at(0)) { if (years < 1 / 366) return null; Real years0 = instance pYears.at(0); Real df0 = 1/((instance pRates.at(0)/100+1)^years0); Real df = 1 - (1 - df0) * years / years0; return ((1/df)^(1/years)-1) * 100; } Int left = 0; Int right = instance pYears.size - 1; while(right - left > 1) { Int test = ((left + right) / 2).round; if (years > instance pYears.at(test)) left = test; else right = test; } Real leftYears = instance pYears.at(left); Real leftRate = instance pRates.at(left); Real rightYears = instance pYears.at(right); Real rightRate = instance pRates.at(right); leftRate + (rightRate - leftRate) * (years - leftYears) / (rightYears - leftYears); } Real discountFactorAt(Real years) { if (years < instance pYears.at(0)) { if (years < 0) return null; if (years == 0) return 1; Real years0 = instance pYears.at(0); Real df0 = 1/((instance pRates.at(0)/100+1)^years0); return 1 - (1 - df0) * years / years0; } 1/((rateAt(years)/100 + 1) ^ years); } Void prepareTbill(TimeData td, Int index, Time t) { Real storeT = td.maturity.subtractDate(t.settlement(2)) / 365; Real t360 = td.maturity.subtractDate360(t.settlement(2)) / 360; Real df = 1 / (1 + t360 * td.value / 100); Real rate = ((1 / df) ^ (1 / storeT) - 1) * 100; instance pYears.set(index, storeT); instance pRates.set(index, rate); } Void prepareBond(TimeData td, Int index, Time t) { Time settleDate = t.settlement(3); Real storeT = td.maturity.subtractDate360(settleDate) / 360; if (storeT < 1) storeT = td.maturity.subtractDate(settleDate) / 365; Real price = InstrumentBond.dirtyPriceGreek(settleDate, td.maturity, td.value, td.coupon) / 100; Real coupon = td.coupon / 100; Real cDate = storeT - 1; while (cDate > 0) { price = price - discountFactorAt(cDate) * coupon; cDate = cDate - 1; if (cDate < 1) cDate = td.maturity.addYears(cDate - storeT).subtractDate(settleDate) / 365; } Real df = price / (1 + coupon); Real rate = ((1 / df) ^ (1 / storeT) - 1) * 100; instance pYears.set(index, storeT); instance pRates.set(index, rate); } Boolean iterate() { Array[Real] oldYears = instance pYears; Array[Real] oldRates = instance pRates; instance pYears = new Array(Real, instance allData.size); instance pRates = new Array(Real, instance allData.size); 0 .to(instance pYears.size - 1, Void(Int i) { if (oldYears == null) { instance pYears.set(i, i * 2); instance pRates.set(i, 4); } else { instance pYears.set(i, oldYears.at(i)); instance pRates.set(i, oldRates.at(i)); } }); Int index = 0; Time t = time(); instance tbills.do(Void(TimeData td) { prepareTbill(td, index, t); index = index + 1; }); instance bonds.do(Void(TimeData td) { prepareBond(td, index, t); index = index + 1; }); if (oldYears == null) return false; 0 .to(oldYears.size - 1, Void(Int i) { if ((oldRates.at(i) - instance pRates.at(i)).abs > 0.00001) return false; }); return true; } Boolean formatCurve( Collection[TimeData] tbills, Collection[TimeData] bonds) { List[TimeData] allData = new List(TimeData); allData.addAll(tbills); allData.addAll(bonds); if (allData.size < 1) return false; instance allData = allData; instance tbills = tbills; instance bonds = bonds; while(!iterate()); return true; } Object aspectValue(Symbol aspect) { if (aspect == #components) return instance allData; if (aspect == #discountFactor) return discountFactorAt(Real{external cond_maturity}); if (aspect == #value) return rateAt(Real{external cond_maturity}); return null; } */
org.edgescript.TypeScriptInfo.defineTypeorg.unizone.finance.interest.YieldLinearData
org.edgescript.TypeScriptInfo.prerequisiteScriptsList{}