| org.unizone.finance.interest | ![]() |
org.unizone.0.6330
Instance of Type
Inheriting from YieldData
Known subtypes are YieldLinearDataFixed
| Type data | Value |
| org.uninode.Type.displayPattern | a {att:org.uninode.Node.type} |
| Attribute summary | Defined in | Uninode® Id | Properties | Default | |
| String | toString This is the display string. | Node | org.uninode.0.102 | ||
| Type | type The type of an object determines the behaviour and attributes of the object. | Node | org.uninode.0.101 | ||
| String | uri | Node | org.uninode.0.103 | ||
| Script summary |
org.unizone.0.8541/*
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;
}
*/
|