@@ -206,7 +206,7 @@ def test_first_loss(setup_api):
206206 ,None )
207207 ,read = True
208208 )
209- closeTo (r0 ['FirstLossResult' ][ 0 ], 31.60100353659348 , r = 6 )
209+ closeTo (r0 [0 ], 31.60100353659348 , r = 6 )
210210
211211@pytest .mark .analytics
212212def test_irr_01 (setup_api ):
@@ -217,7 +217,6 @@ def test_irr_01(setup_api):
217217 ,runAssump = [("pricing" ,{"IRR" :{"B" :("holding" ,[("2021-04-01" ,- 500 )],500 )}})]
218218 ,read = True
219219 )
220- #print(">>>", r0)
221220 closeTo (r0 ['pricing' ]['summary' ].loc ["B" ].IRR , 0.264238 , r = 6 )
222221
223222 r1 = setup_api .run (Irr01
@@ -245,6 +244,31 @@ def test_irr_01(setup_api):
245244 closeTo (r3 ['pricing' ]['summary' ].loc ["A1" ].IRR , 0.12248 , r = 6 )
246245
247246
247+ @pytest .mark .analytics
248+ def test_rootfind_stressppy (setup_api ):
249+ poolPerf = ("Pool" ,("Mortgage" ,{"CDR" :0.002 },{"CPR" :0.001 },{"Rate" :0.1 ,"Lag" :18 },None )
250+ ,None
251+ ,None )
252+ pricing = ("pricing" ,{"IRR" :{"B" :("holding" ,[("2021-04-15" ,- 1000 )],1000 )}})
253+ r = setup_api .runRootFinder (test01 , poolPerf ,[pricing ]
254+ ,("stressPrepayment" ,("bondMetTargetIrr" , "B" , 0.25 ))
255+ )
256+ assert r [1 ][1 ]['PoolLevel' ][0 ]['MortgageAssump' ][1 ] == {'PrepaymentCPR' : 0.38642105474696914 }
257+
258+ @pytest .mark .analytics
259+ def test_rootfind_stressdef (setup_api ):
260+ poolPerf = ("Pool" ,("Mortgage" ,{"CDR" :0.002 },{"CPR" :0.001 },{"Rate" :0.1 ,"Lag" :18 },None )
261+ ,None
262+ ,None )
263+ pricing = ("pricing" ,{"IRR" :{"B" :("holding" ,[("2021-04-15" ,- 1000 )],1000 )}})
264+ r = setup_api .runRootFinder (test01 , poolPerf ,[pricing ]
265+ ,("stressDefault" ,("bondMetTargetIrr" , "B" , 0.10 ))
266+ )
267+ assert r [1 ][1 ]['PoolLevel' ][0 ]['MortgageAssump' ][0 ] == {'DefaultCDR' : 0.07603587859615266 }
268+
269+
270+
271+
248272@pytest .mark .bond
249273def test_pac_01 (setup_api ):
250274 r = setup_api .run (pac01 , read = True , runAssump = [])
@@ -274,4 +298,45 @@ def test_bondGrp(setup_api):
274298 r = setup_api .run (bondGrp , read = True , runAssump = [])
275299 grpFlow = readBondsCf (r ['bonds' ])['A' ].xs ('balance' ,axis = 1 ,level = 1 )
276300 assert grpFlow .A1 .to_list ()[:8 ] == [1000.0 , 1000.0 , 1000.0 , 1000.0 , 1000.0 , 1000.0 , 1000.0 , 993.93 ]
277- assert grpFlow .A2 .to_list ()[:8 ] == [510.6 , 436.68 , 364.06 , 290.75 , 217.26 , 143.1 , 68.74 , 0.0 ,]
301+ assert grpFlow .A2 .to_list ()[:8 ] == [510.6 , 436.68 , 364.06 , 290.75 , 217.26 , 143.1 , 68.74 , 0.0 ,]
302+
303+ @pytest .mark .trigger
304+ def test_trigger_chgBondRate (setup_api ):
305+ withTrigger = test01 & lens .trigger .set ({
306+ "BeforeDistribution" :{
307+ "changeBndRt" :{"condition" :[">=" ,"2021-08-20" ]
308+ ,"effects" :("changeBondRate" , "A1" , {"floater" :[0.05 , "SOFR1Y" ,- 0.02 ,"MonthEnd" ]}, 0.12 )
309+ ,"status" :False
310+ ,"curable" :False }
311+ }
312+ })
313+ r = setup_api .run (withTrigger , read = True ,runAssump = [("interest" ,("SOFR1Y" ,0.04 ))])
314+ assert r ['bonds' ]['A1' ].rate .to_list () == [0.07 , 0.12 , 0.02 , 0.02 , 0.02 , 0.02 , 0.02 , 0.02 , 0.02 , 0.02 ]
315+
316+ @pytest .mark .pool
317+ def test_pool_lease_end (setup_api ):
318+ """ Lease end date """
319+ myPool = {'assets' :[l1 ],'cutoffDate' :"2022-01-01" }
320+ r = setup_api .runPool (myPool
321+ ,poolAssump = ("Pool" ,("Lease" , None , ('days' , 20 ) , ('byAnnualRate' , 0.0 ), ("byExtTimes" , 2 ))
322+ ,None
323+ ,None
324+ )
325+ ,read = True )
326+ assert r ['PoolConsol' ][0 ].index [- 1 ] == '2024-12-15'
327+
328+ r = setup_api .runPool (myPool
329+ ,poolAssump = ("Pool" ,("Lease" , None , ('days' , 20 ) , ('byAnnualRate' , 0.0 ), ("earlierOf" , "2023-11-15" , 2 ))
330+ ,None
331+ ,None
332+ )
333+ ,read = True )
334+ assert r ['PoolConsol' ][0 ].index [- 1 ] == '2023-12-15'
335+
336+ r = setup_api .runPool (myPool
337+ ,poolAssump = ("Pool" ,("Lease" , None , ('days' , 20 ) , ('byAnnualRate' , 0.0 ), ("laterOf" , "2023-11-15" , 3 ))
338+ ,None
339+ ,None
340+ )
341+ ,read = True )
342+ assert r ['PoolConsol' ][0 ].index [- 1 ] == '2025-12-15'
0 commit comments