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