@@ -28,29 +28,48 @@ class TestBlackScholesSolvers:
2828
2929 def setup_method (self ):
3030 self .equation = bse .BlackScholesEquation (OptionType .EUROPEAN_CALL , 300 , 100 , 0.05 , 0.2 , 1 , 100 , 2000 )
31+ self .test_asset_grid = self .equation .generate_grid (self .equation .S_max , self .equation .s_nodes )
32+ self .test_time_grid = self .equation .generate_grid (self .equation .expiry , self .equation .t_nodes )
3133
3234 # explicit method tests
3335
3436 def test_check_lower_boundary_for_call_explicit (self ):
3537 result = solver .BlackScholesExplicitSolver (self .equation ).solve ().get_result ()
3638 assert np .all (result [0 ,:]) == 0
3739
40+ def test_check_upper_boundary_for_call_explicit (self ):
41+ result = solver .BlackScholesExplicitSolver (self .equation ).solve ().get_result ()
42+
43+ expected_value = self .test_asset_grid [- 1 ] - self .equation .strike_price * np .exp (- self .equation .rate * (self .equation .expiry - self .test_time_grid ))
44+ assert np .isclose (result [- 1 , :], expected_value , atol = 1e-6 ).all ()
45+
3846 def test_check_terminal_condition_for_call_explicit (self ):
3947 result = solver .BlackScholesExplicitSolver (self .equation ).solve ().get_result ()
4048
41- test_asset_grid = self .equation .generate_grid (self .equation .S_max , self .equation .s_nodes )
4249 test_strike_price = self .equation .strike_price
43- expected_payoff = np .maximum (test_asset_grid - test_strike_price , 0 )
50+ expected_payoff = np .maximum (self . test_asset_grid - test_strike_price , 0 )
4451
4552 assert np .array_equal (result [:, - 1 ], expected_payoff )
4653
54+ def test_check_lower_boundary_for_put_explicit (self ):
55+ self .equation .option_type = OptionType .EUROPEAN_PUT
56+ result = solver .BlackScholesExplicitSolver (self .equation ).solve ().get_result ()
57+
58+ expected_value = self .equation .strike_price * np .exp (- self .equation .rate * (self .equation .expiry - self .test_time_grid ))
59+ assert np .isclose (result [0 , :], expected_value , atol = 1e-6 ).all ()
60+
61+ def test_check_upper_boundary_for_put_explicit (self ):
62+ self .equation .option_type = OptionType .EUROPEAN_PUT
63+ result = solver .BlackScholesExplicitSolver (self .equation ).solve ().get_result ()
64+
65+ assert np .all (result [- 1 ,:]) == 0
66+
4767 def test_check_terminal_condition_for_put_explicit (self ):
4868 self .equation .option_type = OptionType .EUROPEAN_PUT
4969 result = solver .BlackScholesExplicitSolver (self .equation ).solve ().get_result ()
5070
51- test_asset_grid = self .equation .generate_grid (self .equation .S_max , self .equation .s_nodes )
5271 test_strike_price = self .equation .strike_price
53- expected_payoff = np .maximum (test_strike_price - test_asset_grid , 0 )
72+ expected_payoff = np .maximum (test_strike_price - self . test_asset_grid , 0 )
5473
5574 assert np .array_equal (result [:,- 1 ], expected_payoff )
5675
@@ -66,22 +85,39 @@ def test_check_lower_boundary_for_call_cn(self):
6685 result = solver .BlackScholesCNSolver (self .equation ).solve ().get_result ()
6786 assert np .all (result [0 ,:]) == 0
6887
88+ def test_check_upper_boundary_for_call_cn (self ):
89+ result = solver .BlackScholesCNSolver (self .equation ).solve ().get_result ()
90+
91+ expected_value = self .test_asset_grid [- 1 ] - self .equation .strike_price * np .exp (- self .equation .rate * (self .equation .expiry - self .test_time_grid ))
92+ assert np .isclose (result [- 1 , :], expected_value , atol = 1e-6 ).all ()
93+
6994 def test_check_terminal_condition_for_call_cn (self ):
7095 result = solver .BlackScholesCNSolver (self .equation ).solve ().get_result ()
7196
72- test_asset_grid = self .equation .generate_grid (self .equation .S_max , self .equation .s_nodes )
7397 test_strike_price = self .equation .strike_price
74- expected_payoff = np .maximum (test_asset_grid - test_strike_price , 0 )
98+ expected_payoff = np .maximum (self . test_asset_grid - test_strike_price , 0 )
7599
76100 assert np .array_equal (result [:, - 1 ], expected_payoff )
77101
102+ def test_check_lower_boundary_for_put_cn (self ):
103+ self .equation .option_type = OptionType .EUROPEAN_PUT
104+ result = solver .BlackScholesCNSolver (self .equation ).solve ().get_result ()
105+
106+ expected_value = self .equation .strike_price * np .exp (- self .equation .rate * (self .equation .expiry - self .test_time_grid ))
107+ assert np .isclose (result [0 , :], expected_value , atol = 1e-6 ).all ()
108+
109+ def test_check_upper_boundary_for_cn (self ):
110+ self .equation .option_type = OptionType .EUROPEAN_PUT
111+ result = solver .BlackScholesCNSolver (self .equation ).solve ().get_result ()
112+
113+ assert np .all (result [- 1 ,:]) == 0
114+
78115 def test_check_terminal_condition_for_put_cn (self ):
79116 self .equation .option_type = OptionType .EUROPEAN_PUT
80117 result = solver .BlackScholesCNSolver (self .equation ).solve ().get_result ()
81118
82- test_asset_grid = self .equation .generate_grid (self .equation .S_max , self .equation .s_nodes )
83119 test_strike_price = self .equation .strike_price
84- expected_payoff = np .maximum (test_strike_price - test_asset_grid , 0 )
120+ expected_payoff = np .maximum (test_strike_price - self . test_asset_grid , 0 )
85121
86122 assert np .array_equal (result [:,- 1 ], expected_payoff )
87123
0 commit comments