All,

My package BondLab is written in S4.  I need to build recursive tree to create 
human readable mortgage payment waterfalls in Bond Lab.  I am simply asking if 
the below idea is doable

The current waterfall implementation is a list of lists in a dataframe and 
payment rules are iterated over the data frame with a call to source which is 
the script used to allocate principal and interest (standard practice in MBS 
structured finance) This works fine but suffers from two drawbacks:

1) The source script is bespoke to the deal.
2) The source script is not human readable - in this case human readable means 
intuitive.  That is without examining/following procedural code.

So, I think a recursive tree is better.  

I have tested this idea on data.tree and it works well.  However, data.tree uses R6, 
which lives in the S3 world and forcing S4 classes into S3 does not seem a 
particularly good idea.  My research thus far has led me to believe that I can use 
S4 ReferenceClass to build a recursive tree which whose nodes (leafs?) would contain 
a class I have created called TrancheDetails and whose root is always “Deal".

For example, I have dput below a class TrancheDetails which is one of 5 
tranches classes belonging to FNMA 2016-53 - each with unique payment rules.  I 
am thinking something along the lines of the following.  Tranche is a leaf and 
Deal is the root (I am still learning about trees).  With this scheme I can now 
create methods whose functional representation is the waterfall payment rules.  
I have done this successfully with data.tree on a mock deal set-up using the 
package.  The real goal is to be able to load TrancheDetails which is the 
complete data representation of the Tranche (investor bond) within a REMIC with 
methods for principal and interest allocation.

Before I go down this road is my understanding of ReferenceClass correct and 
can I build a recursive tree with ReferenceClasses?  I am very close to the 
dream of creating open source analytics and human readable waterfalls for 
mortgage and asset backed securities and I know the answer lies in R I just 
have to unlock it.


My initial thoughts:

 setRefClass("Tranche",
              contains = "TrancheDetails")
  
  setRefClass("Deal",
              contains = "Tranche")

methods to initialize the tree  

new("TrancheDetails"
    , DealName = "FNMA2016053"
    , TrancheNumber = "1"
    , NumberofComponents = 0
    , ComponentofTranches = "0"
    , TrancheName = "053-AF"
    , TranchePrincipal = "pass-through"
    , TranchePrincipalDesc = "PT"
    , TrancheInterestDesc = "FLT"
    , TrancheOtherDescription = ""
    , Cusip = "3136AS4X1"
    , TrancheOrigBal = 38400349
    , TrancheInterest = "FLT"
    , TrancheCoupon = 0.95
    , AccrualRate = 0
    , TreasuryMaturity = 0
    , TreasuryYield = 0
    , TreasurySpread = 0
    , TrancheYield = 0
    , TranchePrice = 0
    , TrancheProceedsWithInterest = 0
    , TrancheAvgLife = 7.03937
    , TrancheDuration = 4.70661
    , TrancheDatedDate = "07-25-2016"
    , TrancheFirstPmtDate = "08-25-2016"
    , TrancheLastPmtDate = "02-25-2045"
    , TrancheNextPmtDate = "08-25-2016"
    , TrancheFinalPmtDate = "08-25-2046"
    , Delay = 0
    , InterestPmtFrequency = 12
    , PrinPmtFrequency = 12
    , PacLowBand = 0
    , PacHighBand = 0
    , FloaterIndex = "LIBOR1BBA"
    , InitialIndexValue = 0.45
    , FloaterMargin = 0.5
    , FloaterMultiplier = 1
    , FloaterCap = 6.5
    , FloaterFloor = 0.5
    , FloaterInitialCoupon = 0.95
    , FloaterResetFrequency = 12
    , FloaterFirstResetDate = "08-25-2016"
    , FloaterFormula = function (Cap, Floor, Margin, Index, Multiplier) 
{
    min(Cap, max((Index * Multiplier) + Margin, Floor))
}
    , Group = 1
    , TrancheType = "character"
    , Schedule = FALSE
    , Fixed = FALSE
)
______________________________________________
R-package-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-package-devel

Reply via email to