org.unizone.finance.interest

Type YieldLinearData

org.unizone.0.6330
Instance of Type
Inheriting from YieldData
Known subtypes are YieldLinearDataFixed

Type dataValue
org.uninode.Type.displayPatterna {att:org.uninode.Node.type}

Attribute summaryDefined inUninode® IdPropertiesDefault
StringtoString
This is the display string.
Nodeorg.uninode.0.102
Typetype
The type of an object determines the behaviour and attributes of the object.
Nodeorg.uninode.0.101
StringuriNodeorg.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;
}

*/