Skip to content

Commit e302649

Browse files
authored
Merge pull request #64 from chemardes/feature/adding-unit-tests
FEATURE: adding tests
2 parents 55b4070 + d9135f7 commit e302649

1 file changed

Lines changed: 44 additions & 8 deletions

File tree

pdesolvers/tests/test_black_scholes.py

Lines changed: 44 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)