Black-Scholes model

delta(underlying_price, strike, expiry, sigma, put=False)

Black-Scholes Greek delta

Computes the Greek delta of the option -- i.e. the option price sensitivity with respect to its underlying price -- according to the Black-Scholes model.

Parameters

underlying_price : float Price of the underlying asset. strike : float Strike of the option. expiry : float Time remaining until the expiry of the option. sigma : float Volatility parameter. put : bool, optional Whether the option is a put option. Defaults to False.

Returns

float Greek delta according to Black-Scholes formula.

Example

import numpy as np from fyne import blackscholes sigma = 0.2 underlying_price = 100. strike = 90. expiry = 0.5 call_delta = blackscholes.delta( ... underlying_price, strike, expiry, sigma ... ) np.round(call_delta, 2) 0.79 put_delta = blackscholes.delta( ... underlying_price, strike, expiry, sigma, put=True ... ) np.round(put_delta, 2) -0.21

Source code in src/fyne/blackscholes.py
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
def delta(underlying_price, strike, expiry, sigma, put=False):
    """Black-Scholes Greek delta

    Computes the Greek delta of the option -- i.e. the option price sensitivity
    with respect to its underlying price -- according to the Black-Scholes
    model.

    Parameters
    ----------
    underlying_price : float
        Price of the underlying asset.
    strike : float
        Strike of the option.
    expiry : float
        Time remaining until the expiry of the option.
    sigma : float
        Volatility parameter.
    put : bool, optional
        Whether the option is a put option. Defaults to `False`.

    Returns
    -------
    float
        Greek delta according to Black-Scholes formula.

    Example
    -------

    >>> import numpy as np
    >>> from fyne import blackscholes
    >>> sigma = 0.2
    >>> underlying_price = 100.
    >>> strike = 90.
    >>> expiry = 0.5
    >>> call_delta = blackscholes.delta(
    ...     underlying_price, strike, expiry, sigma
    ... )
    >>> np.round(call_delta, 2)
    0.79
    >>> put_delta = blackscholes.delta(
    ...     underlying_price, strike, expiry, sigma, put=True
    ... )
    >>> np.round(put_delta, 2)
    -0.21

    """
    k = np.array(np.log(strike / underlying_price))
    expiry, sigma = map(np.array, (expiry, sigma))
    call_delta = _reduced_delta(k, expiry, sigma)
    return common._put_call_parity_delta(call_delta, put)

formula(underlying_price, strike, expiry, sigma, put=False)

Black-Scholes formula

Computes the price of the option according to the Black-Scholes formula.

Parameters

underlying_price : float Price of the underlying asset. strike : float Strike of the option. expiry : float Time remaining until the expiry of the option. sigma : float Volatility parameter. put : bool, optional Whether the option is a put option. Defaults to False.

Returns

float Option price according to Black-Scholes formula.

Example

import numpy as np from fyne import blackscholes sigma = 0.2 underlying_price = 100. strike = 90. expiry = 0.5 call_price = blackscholes.formula(underlying_price, strike, expiry, ... sigma) np.round(call_price, 2) 11.77 put_price = blackscholes.formula(underlying_price, strike, expiry, ... sigma, put=True) np.round(put_price, 2) 1.77

Source code in src/fyne/blackscholes.py
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
def formula(underlying_price, strike, expiry, sigma, put=False):
    """Black-Scholes formula

    Computes the price of the option according to the Black-Scholes formula.

    Parameters
    ----------
    underlying_price : float
        Price of the underlying asset.
    strike : float
        Strike of the option.
    expiry : float
        Time remaining until the expiry of the option.
    sigma : float
        Volatility parameter.
    put : bool, optional
        Whether the option is a put option. Defaults to `False`.

    Returns
    -------
    float
        Option price according to Black-Scholes formula.

    Example
    -------

    >>> import numpy as np
    >>> from fyne import blackscholes
    >>> sigma = 0.2
    >>> underlying_price = 100.
    >>> strike = 90.
    >>> expiry = 0.5
    >>> call_price = blackscholes.formula(underlying_price, strike, expiry,
    ...                                   sigma)
    >>> np.round(call_price, 2)
    11.77
    >>> put_price = blackscholes.formula(underlying_price, strike, expiry,
    ...                                  sigma, put=True)
    >>> np.round(put_price, 2)
    1.77

    """
    k = np.array(np.log(strike / underlying_price))
    expiry, sigma = map(np.array, (expiry, sigma))
    call = _reduced_formula(k, expiry, sigma) * underlying_price
    return common._put_call_parity(call, underlying_price, strike, put)

implied_vol(underlying_price, strike, expiry, option_price, put=False, assert_no_arbitrage=True)

Implied volatility function

Inverts the Black-Scholes formula to find the volatility that matches the given option price. The implied volatility is computed using Newton's method.

Parameters

underlying_price : float Price of the underlying asset. strike : float Strike of the option. expiry : float Time remaining until the expiry of the option. option_price : float Option price according to Black-Scholes formula. put : bool, optional Whether the option is a put option. Defaults to False. assert_no_arbitrage : bool, optional Whether to throw an exception upon no arbitrage bounds violation. Defaults to True.

Returns

float Implied volatility.

Example

import numpy as np from fyne import blackscholes call_price = 11.77 put_price = 1.77 underlying_price = 100. strike = 90. expiry = 0.5 implied_vol = blackscholes.implied_vol(underlying_price, strike, ... expiry, call_price) np.round(implied_vol, 2) 0.2 implied_vol = blackscholes.implied_vol(underlying_price, strike, ... expiry, put_price, put=True) np.round(implied_vol, 2) 0.2

Source code in src/fyne/blackscholes.py
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
def implied_vol(
    underlying_price,
    strike,
    expiry,
    option_price,
    put=False,
    assert_no_arbitrage=True,
):
    """Implied volatility function

    Inverts the Black-Scholes formula to find the volatility that matches the
    given option price. The implied volatility is computed using Newton's
    method.

    Parameters
    ----------
    underlying_price : float
        Price of the underlying asset.
    strike : float
        Strike of the option.
    expiry : float
        Time remaining until the expiry of the option.
    option_price : float
        Option price according to Black-Scholes formula.
    put : bool, optional
        Whether the option is a put option. Defaults to `False`.
    assert_no_arbitrage : bool, optional
        Whether to throw an exception upon no arbitrage bounds violation.
        Defaults to `True`.

    Returns
    -------
    float
        Implied volatility.

    Example
    -------

    >>> import numpy as np
    >>> from fyne import blackscholes
    >>> call_price = 11.77
    >>> put_price = 1.77
    >>> underlying_price = 100.
    >>> strike = 90.
    >>> expiry = 0.5
    >>> implied_vol = blackscholes.implied_vol(underlying_price, strike,
    ...                                        expiry, call_price)
    >>> np.round(implied_vol, 2)
    0.2
    >>> implied_vol = blackscholes.implied_vol(underlying_price, strike,
    ...                                        expiry, put_price, put=True)
    >>> np.round(implied_vol, 2)
    0.2

    """
    call = common._put_call_parity_reverse(
        option_price, underlying_price, strike, put
    )
    if assert_no_arbitrage:
        common._assert_no_arbitrage(underlying_price, call, strike)

    k = np.array(np.log(strike / underlying_price))
    c = np.array(call / underlying_price)
    k, expiry, c = np.broadcast_arrays(k, expiry, c)
    is_otm = k > 0
    k[is_otm] = -k[is_otm]
    c[is_otm] = 1 + np.exp(k[is_otm]) * (c[is_otm] - 1)
    noarb_mask = ~np.any(
        common._check_arbitrage(underlying_price, call, strike), axis=0
    )
    noarb_mask &= ~np.any(tuple(map(np.isnan, (k, expiry, c))), axis=0)

    iv0 = np.maximum(norm.ppf(c[noarb_mask]), c[noarb_mask]) / np.sqrt(
        expiry[noarb_mask]
    )
    iv = np.full(c.shape, np.nan)
    iv[noarb_mask] = _reduced_implied_vol(
        k[noarb_mask], expiry[noarb_mask], c[noarb_mask], iv0
    )
    return iv

vega(underlying_price, strike, expiry, sigma)

Black-Scholes Greek vega

Computes the Greek vega of the option -- i.e. the option price sensitivity with respect to its volatility parameter -- according to the Black-Scholes model. Note that the Greek vega is the same for calls and puts.

Parameters

underlying_price : float Price of the underlying asset. strike : float Strike of the option. expiry : float Time remaining until the expiry of the option. sigma : float Volatility parameter.

Returns

float Greek vega according to Black-Scholes formula.

Example

import numpy as np from fyne import blackscholes sigma = 0.2 underlying_price = 100. strike = 90. maturity = 0.5 vega = blackscholes.vega(underlying_price, strike, maturity, sigma) np.round(vega, 2) 20.23

Source code in src/fyne/blackscholes.py
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
def vega(underlying_price, strike, expiry, sigma):
    """Black-Scholes Greek vega

    Computes the Greek vega of the option -- i.e. the option price sensitivity
    with respect to its volatility parameter -- according to the Black-Scholes
    model. Note that the Greek vega is the same for calls and puts.

    Parameters
    ----------
    underlying_price : float
        Price of the underlying asset.
    strike : float
        Strike of the option.
    expiry : float
        Time remaining until the expiry of the option.
    sigma : float
        Volatility parameter.

    Returns
    -------
    float
        Greek vega according to Black-Scholes formula.

    Example
    -------

    >>> import numpy as np
    >>> from fyne import blackscholes
    >>> sigma = 0.2
    >>> underlying_price = 100.
    >>> strike = 90.
    >>> maturity = 0.5
    >>> vega = blackscholes.vega(underlying_price, strike, maturity, sigma)
    >>> np.round(vega, 2)
    20.23

    """
    k = np.array(np.log(strike / underlying_price))
    expiry, sigma = map(np.array, (expiry, sigma))
    return _reduced_vega(k, expiry, sigma) * underlying_price