88from itertools import dropwhile
99import numpy_financial as npf
1010from datetime import datetime
11+ import numpy as np
1112
1213
1314from .deals import *
@@ -890,4 +891,94 @@ def test_account(setup_api):
890891 assert r ['accounts' ]['acc03' ].change .to_list () == [- 10 ,- 10 ,- 10 ]
891892 assert r ['accounts' ]['acc02' ].change .to_list () == [- 10 ] * 5
892893 assert r ['accounts' ]['acc01' ].loc ['2021-08-20' ].change .to_list ()[:2 ] == [10.0 ]* 2
893-
894+
895+ @pytest .mark .sensitivity
896+ def test_sensitivity_01 (setup_api ):
897+ # senstivity on structs
898+ test02 = test01 & lens .bonds .Each ()[1 ]['balance' ].modify (lambda x : 0.9 * x )
899+ dealMap = {
900+ "Normal" :test01 ,"Shrink" :test02
901+ }
902+
903+ rs = setup_api .runStructs (dealMap , read = True )
904+
905+ assert rs .keys () == {"Normal" ,"Shrink" }, "sensitivity run should have two results"
906+
907+ assert rs ['Shrink' ]['bonds' ]['A1' ].principal .sum ().item () == 900
908+ assert closeTo (rs ['Normal' ]['bonds' ]['A1' ].principal .sum ().item () ,1000 )
909+
910+
911+ @pytest .mark .sensitivity
912+ def test_sensitivity_02 (setup_api ):
913+ # senstivity on pool assump
914+ myAssumption = ("Pool" ,("Mortgage" ,{"CDR" :0.01 },None ,None ,None )
915+ ,None
916+ ,None )
917+
918+ myAssumption2 = ("Pool" ,("Mortgage" ,None ,{"CPR" :0.01 },None ,None )
919+ ,None
920+ ,None )
921+
922+ rs = setup_api .runByScenarios (test01
923+ ,poolAssump = {"withCdr" :myAssumption
924+ ,"withCpr" :myAssumption2 }
925+ ,read = True )
926+
927+ assert rs .keys () == {"withCdr" ,"withCpr" }
928+
929+ assert rs ['withCdr' ]['pool' ]['flow' ]['PoolConsol' ].Default .sum ().item () > 0
930+ assert rs ['withCdr' ]['pool' ]['flow' ]['PoolConsol' ].Prepayment .sum ().item () == 0
931+
932+ assert rs ['withCpr' ]['pool' ]['flow' ]['PoolConsol' ].Prepayment .sum ().item () > 0
933+ assert rs ['withCpr' ]['pool' ]['flow' ]['PoolConsol' ].Default .sum ().item () == 0
934+
935+
936+ @pytest .mark .sensitivity
937+ def test_sensitivity_03 (setup_api ):
938+ # senstivity on run assumption
939+ runAssumption01 = []
940+ runAssumption02 = [("call" , ("if" , ["date" , ">" , "2022-10-01" ]))]
941+
942+ rAssump = {
943+ "r0" :runAssumption01
944+ ,"r1" :runAssumption02
945+ }
946+
947+ rs = setup_api .runByDealScenarios (test01
948+ ,runAssump = rAssump
949+ ,read = True )
950+
951+ assert rs .keys () == {"r0" ,"r1" }
952+
953+ assert rs ['r1' ]['result' ]['status' ].loc [2 ].to_list () == ['2022-10-20' , '' , 'DealEnd' , 'Clean Up' ]
954+
955+ @pytest .mark .sensitivity
956+ def test_sensitivity_04 (setup_api ):
957+ # senstivity on combo
958+ test02 = test01 & lens .bonds .Each ()[1 ]['balance' ].modify (lambda x : 0.9 * x )
959+ dealMap = {
960+ "Normal" :test01 ,"Shrink" :test02
961+ }
962+
963+ myAssumption = ("Pool" ,("Mortgage" ,{"CDR" :0.01 },None ,None ,None )
964+ ,None
965+ ,None )
966+
967+ myAssumption2 = ("Pool" ,("Mortgage" ,None ,{"CPR" :0.01 },None ,None )
968+ ,None
969+ ,None )
970+
971+ runAssumption01 = []
972+ runAssumption02 = [("call" , ("if" , ["date" , ">" , "2022-10-01" ]))]
973+
974+ rAssump = {
975+ "r0" :runAssumption01
976+ ,"r1" :runAssumption02
977+ }
978+ rs = setup_api .runByCombo (dealMap
979+ ,poolAssump = {"withCdr" :myAssumption
980+ ,"withCpr" :myAssumption2 }
981+ ,runAssump = rAssump
982+ ,read = True )
983+
984+ assert len (rs .keys ())== 8
0 commit comments