Example #1
0
    def test_price(self):
        m = BSEuropeanBinaryOption()

        result = m.price(0.0, 0.1, 0.2)
        expect = torch.tensor(0.4874)
        assert torch.allclose(result, expect, atol=1e-4)

        result = m.price(0.0001, 0.1, 0.2)
        expect = torch.tensor(0.4880)
        assert torch.allclose(result, expect, atol=1e-4)
Example #2
0
    def test_implied_volatility(self):
        # log_moneyness, expiry_time, price
        x = torch.tensor([[-0.01, 0.1, 0.40], [-0.01, 0.1, 0.41],
                          [-0.01, 0.1, 0.42]])
        m = BSEuropeanBinaryOption()
        iv = m.implied_volatility(x[:, 0], x[:, 1], x[:, 2])

        result = BSEuropeanBinaryOption().price(x[:, 0], x[:, 1], iv)
        expect = x[:, -1]
        assert torch.allclose(result, expect)
Example #3
0
    def test_example(self):
        from pfhedge import Hedger
        from pfhedge.instruments import BrownianStock
        from pfhedge.instruments import EuropeanBinaryOption

        deriv = EuropeanBinaryOption(BrownianStock())
        model = BSEuropeanBinaryOption(deriv)
        hedger = Hedger(model, model.features())
        price = hedger.price(deriv)

        assert torch.allclose(price, torch.tensor(0.5004), atol=1e-4)
Example #4
0
    def test_repr(self):
        m = BSEuropeanBinaryOption()
        assert repr(m) == "BSEuropeanBinaryOption()"

        liability = EuropeanBinaryOption(BrownianStock(), strike=1.1)
        m = BSEuropeanBinaryOption(liability)
        assert repr(m) == "BSEuropeanBinaryOption(strike=1.1)"

        with pytest.raises(ValueError):
            # not yet supported
            liability = EuropeanBinaryOption(BrownianStock(),
                                             strike=1.1,
                                             call=False)
            m = BSEuropeanBinaryOption(liability)
            assert repr(m) == "BSEuropeanBinaryOption(call=False, strike=1.1)"
Example #5
0
    def test_shape(self):
        torch.distributions.Distribution.set_default_validate_args(False)

        m = BSEuropeanBinaryOption()
        self.assert_shape_delta(m)
        # self.assert_shape_gamma(m)
        self.assert_shape_price(m)
        self.assert_shape_forward(m)
Example #6
0
    def test_gamma(self):
        m = BSEuropeanBinaryOption()
        result = m.gamma(0.01, 1.0, 0.2).item()
        assert np.isclose(result, -1.4645787477493286)

        with pytest.raises(ValueError):
            # not yet supported
            m = BSEuropeanBinaryOption(call=False)
            result = m.gamma(0.0, 1.0, 0.2).item()
Example #7
0
 def test_delta(self):
     m = BSEuropeanBinaryOption()
     result = m.delta(0.0, 0.1, 0.2)
     expect = torch.tensor(6.3047)
     assert torch.allclose(result, expect, atol=1e-4)
Example #8
0
 def test_forward(self):
     m = BSEuropeanBinaryOption()
     x = torch.tensor([0.0, 0.1, 0.2]).reshape(1, -1)
     result = m(x)
     expect = torch.tensor(6.3047)
     assert torch.allclose(result, expect, atol=1e-4)
Example #9
0
 def test_features(self):
     m = BSEuropeanBinaryOption()
     assert m.features() == ["log_moneyness", "expiry_time", "volatility"]
     _ = [get_feature(f) for f in m.features()]
Example #10
0
 def test_error_put(self):
     with pytest.raises(ValueError):
         # not yet supported
         liability = EuropeanBinaryOption(BrownianStock(), call=False)
         BSEuropeanBinaryOption(liability)