Message-ID: <f44f9138-bbed-4683-885b-7c82bbda8d28@me.com>
Date: 2016-08-21T22:31:39Z
From: Glenn Schultz
Subject: [R-pkg-devel] Reference Classes
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
)