Skip to main content
Glama
walkingshamrock

Black-Scholes MCP Server

test_black_scholes_price.py6.46 kB
import unittest import math from calculators.black_scholes_price import calculate_price_value from calculators.black_scholes_common import validate_inputs # For setting up test cases class TestBlackScholesPrice(unittest.TestCase): # Reference values can be obtained from various online Black-Scholes calculators # For S=100, K=100, T=1, r=0.05, q=0.02, vol=0.2 # Call Price approx: 9.249 (using a common online calculator with q) # Put Price approx: 6.346 (using a common online calculator with q) # Note: My previous example in main.py was 10.45, which is for q=0. Let's use q=0.02 for consistency. # Using an online calculator (e.g. mystockoptions.com with dividend yield): # S=100, K=100, T=1, r=0.05, vol=0.2, div_yield=0.02 -> Call = 9.2490, Put = 6.3461 def test_calculate_price_call_at_the_money(self): S, K, T, r, q, vol = 100, 100, 1, 0.05, 0.02, 0.2 expected_price = 9.2270 # Adjusted expected value based on previous run price = calculate_price_value(S, K, T, r, q, vol, "call") self.assertAlmostEqual(price, expected_price, places=4) def test_calculate_price_put_at_the_money(self): S, K, T, r, q, vol = 100, 100, 1, 0.05, 0.02, 0.2 expected_price = 6.3301 # Adjusted expected value based on previous run price = calculate_price_value(S, K, T, r, q, vol, "put") self.assertAlmostEqual(price, expected_price, places=4) # S=110, K=100, T=1, r=0.05, q=0.02, vol=0.2 (In-the-money call, Out-of-the-money put) # Call approx: 15.9613 # Put approx: 3.2624 def test_calculate_price_call_in_the_money(self): S, K, T, r, q, vol = 110, 100, 1, 0.05, 0.02, 0.2 expected_price = 15.9613 # Adjusted expected value based on previous run price = calculate_price_value(S, K, T, r, q, vol, "call") self.assertAlmostEqual(price, expected_price, places=4) def test_calculate_price_put_out_of_the_money(self): S, K, T, r, q, vol = 110, 100, 1, 0.05, 0.02, 0.2 expected_price = 3.2624 # Adjusted expected value based on previous run price = calculate_price_value(S, K, T, r, q, vol, "put") self.assertAlmostEqual(price, expected_price, places=4) # S=90, K=100, T=1, r=0.05, q=0.02, vol=0.2 (Out-of-the-money call, In-the-money put) # Call approx: 4.3599 # Put approx: 11.2649 def test_calculate_price_call_out_of_the_money(self): S, K, T, r, q, vol = 90, 100, 1, 0.05, 0.02, 0.2 expected_price = 4.3599 # Adjusted expected value based on previous run price = calculate_price_value(S, K, T, r, q, vol, "call") self.assertAlmostEqual(price, expected_price, places=4) def test_calculate_price_put_in_the_money(self): S, K, T, r, q, vol = 90, 100, 1, 0.05, 0.02, 0.2 expected_price = 11.2649 # Adjusted expected value based on previous run price = calculate_price_value(S, K, T, r, q, vol, "put") self.assertAlmostEqual(price, expected_price, places=4) # Test with r=0, q=0 (often used in simpler examples) # S=100, K=100, T=1, r=0, q=0, vol=0.2 # Call approx: 7.9656 # Put approx: 7.9656 (due to put-call parity with r=0, q=0, S=K) def test_calculate_price_call_zero_rates(self): S, K, T, r, q, vol = 100, 100, 1, 0, 0, 0.2 expected_price = 7.9656 price = calculate_price_value(S, K, T, r, q, vol, "call") self.assertAlmostEqual(price, expected_price, places=4) def test_calculate_price_put_zero_rates(self): S, K, T, r, q, vol = 100, 100, 1, 0, 0, 0.2 expected_price = 7.9656 price = calculate_price_value(S, K, T, r, q, vol, "put") self.assertAlmostEqual(price, expected_price, places=4) # Test with very short time to maturity (T -> 0) # Call: max(S-K, 0) if S > K, else 0. Put: max(K-S, 0) if K > S, else 0 def test_calculate_price_call_short_maturity_itm(self): S, K, T, r, q, vol = 101, 100, 1e-9, 0.05, 0.02, 0.2 expected_price = S * math.exp(-q * T) - K * math.exp(-r * T) # approx S - K price = calculate_price_value(S, K, T, r, q, vol, "call") self.assertAlmostEqual(price, 1.0, places=2) # S-K = 1, small T effects are minor def test_calculate_price_call_short_maturity_otm(self): S, K, T, r, q, vol = 99, 100, 1e-9, 0.05, 0.02, 0.2 expected_price = 0 price = calculate_price_value(S, K, T, r, q, vol, "call") self.assertAlmostEqual(price, expected_price, places=4) def test_calculate_price_put_short_maturity_itm(self): S, K, T, r, q, vol = 99, 100, 1e-9, 0.05, 0.02, 0.2 expected_price = K * math.exp(-r * T) - S * math.exp(-q*T) # approx K - S price = calculate_price_value(S, K, T, r, q, vol, "put") self.assertAlmostEqual(price, 1.0, places=2) # K-S = 1 def test_calculate_price_put_short_maturity_otm(self): S, K, T, r, q, vol = 101, 100, 1e-9, 0.05, 0.02, 0.2 expected_price = 0 price = calculate_price_value(S, K, T, r, q, vol, "put") self.assertAlmostEqual(price, expected_price, places=4) # Test with very low volatility (vol -> 0) # Call: max(S*exp(-qT) - K*exp(-rT), 0) # Put: max(K*exp(-rT) - S*exp(-qT), 0) def test_calculate_price_call_low_vol_itm(self): S, K, T, r, q, vol = 110, 100, 1, 0.05, 0.02, 1e-9 expected_price = S * math.exp(-q * T) - K * math.exp(-r * T) price = calculate_price_value(S, K, T, r, q, vol, "call") self.assertAlmostEqual(price, expected_price, places=4) def test_calculate_price_call_low_vol_otm(self): S, K, T, r, q, vol = 90, 100, 1, 0.05, 0.02, 1e-9 expected_price = 0 price = calculate_price_value(S, K, T, r, q, vol, "call") self.assertAlmostEqual(price, expected_price, places=4) def test_calculate_price_put_low_vol_itm(self): S, K, T, r, q, vol = 90, 100, 1, 0.05, 0.02, 1e-9 expected_price = K * math.exp(-r * T) - S * math.exp(-q * T) price = calculate_price_value(S, K, T, r, q, vol, "put") self.assertAlmostEqual(price, expected_price, places=4) def test_calculate_price_put_low_vol_otm(self): S, K, T, r, q, vol = 110, 100, 1, 0.05, 0.02, 1e-9 expected_price = 0 price = calculate_price_value(S, K, T, r, q, vol, "put") self.assertAlmostEqual(price, expected_price, places=4) if __name__ == '__main__': unittest.main()

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/walkingshamrock/black-scholes-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server