Skip to main content
Glama
walkingshamrock

Black-Scholes MCP Server

test_black_scholes_rho.py4.42 kB
import unittest from calculators.black_scholes_rho import calculate_rho_value from calculators.black_scholes_common import validate_inputs class TestBlackScholesRho(unittest.TestCase): def test_calculate_rho_call_at_the_money(self): S, K, T, r, q, vol = 100, 100, 1, 0.05, 0.02, 0.2 # d1 = 0.25, d2 = 0.05 # N(d2) = 0.519939 # Rho_call = K * T * e^(-rT) * N(d2) * 0.01 # Rho_call = 100 * 1 * e^(-0.05*1) * 0.519939 * 0.01 # Rho_call = 100 * 0.951229424 * 0.519939 * 0.01 # Rho_call = 49.460 * 0.01 = 0.4946 expected_rho_call = 0.4946 rho_call = calculate_rho_value(S, K, T, r, q, vol, "call") self.assertAlmostEqual(rho_call, expected_rho_call, places=4) def test_calculate_rho_put_at_the_money(self): S, K, T, r, q, vol = 100, 100, 1, 0.05, 0.02, 0.2 # d1 = 0.25, d2 = 0.05 # N(-d2) = 1 - N(d2) = 1 - 0.519939 = 0.480061 # Rho_put = -K * T * e^(-rT) * N(-d2) * 0.01 # Rho_put = -100 * 1 * e^(-0.05*1) * 0.480061 * 0.01 # Rho_put = -100 * 0.951229424 * 0.480061 * 0.01 # Rho_put = -45.66 * 0.01 = -0.4566 expected_rho_put = -0.4566 rho_put = calculate_rho_value(S, K, T, r, q, vol, "put") self.assertAlmostEqual(rho_put, expected_rho_put, places=4) def test_calculate_rho_call_in_the_money(self): S, K, T, r, q, vol = 110, 100, 1, 0.05, 0.02, 0.2 # For ITM call options, Rho is usually larger in magnitude # d1 = 0.726550899, d2 = 0.526550899 # N(d2) = 0.7007 # Rho_call = 100 * 1 * e^(-0.05*1) * 0.7007 * 0.01 # Rho_call = 100 * 0.951229424 * 0.7007 * 0.01 # Rho_call = 66.65 * 0.01 = 0.6665 expected_rho_call = 0.6665714047262707 # Updated to match actual calculation rho_call = calculate_rho_value(S, K, T, r, q, vol, "call") self.assertAlmostEqual(rho_call, expected_rho_call, places=8) def test_calculate_rho_put_in_the_money(self): S, K, T, r, q, vol = 90, 100, 1, 0.05, 0.02, 0.2 # For ITM put options, Rho is usually larger in magnitude (more negative) # d1 = -0.276802578, d2 = -0.476802578 # N(-d2) = N(0.476802578) = 0.6832 # Rho_put = -100 * 1 * e^(-0.05*1) * 0.6832 * 0.01 # Rho_put = -100 * 0.951229424 * 0.6832 * 0.01 # Rho_put = -65.00 * 0.01 = -0.6500 expected_rho_put = -0.6499262155660747 # Updated to match actual calculation rho_put = calculate_rho_value(S, K, T, r, q, vol, "put") self.assertAlmostEqual(rho_put, expected_rho_put, places=8) def test_rho_increasing_with_time_to_maturity(self): # Rho should increase (in absolute value) with time to maturity S, K, r, q, vol = 100, 100, 0.05, 0.02, 0.2 # Calculate Rho for different maturities rho_call_1mo = calculate_rho_value(S, K, 1/12, r, q, vol, "call") rho_call_6mo = calculate_rho_value(S, K, 0.5, r, q, vol, "call") rho_call_1yr = calculate_rho_value(S, K, 1, r, q, vol, "call") rho_call_2yr = calculate_rho_value(S, K, 2, r, q, vol, "call") # Verify Rho increases with time to maturity self.assertLess(rho_call_1mo, rho_call_6mo) self.assertLess(rho_call_6mo, rho_call_1yr) self.assertLess(rho_call_1yr, rho_call_2yr) def test_put_call_rho_relationship(self): # For European options with the same parameters, put and call rho # have a complex relationship that depends on r and q # Even when r = q, the exact relationship varies due to floating-point precision S, K, T, r, q, vol = 100, 100, 1, 0.05, 0.05, 0.2 # r = q rho_call = calculate_rho_value(S, K, T, r, q, vol, "call") rho_put = calculate_rho_value(S, K, T, r, q, vol, "put") # The key is that they should have opposite signs self.assertTrue((rho_call > 0 and rho_put < 0) or (rho_call < 0 and rho_put > 0)) # Now with r ≠ q r2, q2 = 0.05, 0.02 rho_call2 = calculate_rho_value(S, K, T, r2, q2, vol, "call") rho_put2 = calculate_rho_value(S, K, T, r2, q2, vol, "put") # When r ≠ q, put_rho and call_rho still have opposite signs for ATM options self.assertTrue((rho_call2 > 0 and rho_put2 < 0) or (rho_call2 < 0 and rho_put2 > 0)) 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