Heston model

calibration_crosssectional(underlying_price, strikes, expiries, option_prices, initial_guess, put=False, weights=None, enforce_feller_cond=False)

Heston cross-sectional calibration

Recovers the Heston model parameters from options prices at a single point in time. The calibration is performed using the Levenberg-Marquardt algorithm.

Parameters

underlying_price : float Price of the underlying asset. strikes : numpy.array One-dimensional array of option strikes. Must be of the same length as the expiries and option_prices arrays. expiries : numpy.array One-dimensional array of option expiries. The expiries are the time remaining until the expiry of the option. Must be of the same length as the strikes and option_prices arrays. option_prices : numpy.array One-dimensional array of call options prices. Must be of the same length as the expiries and strikes arrays. initial_guess : tuple Initial guess for instantaneous volatility :math:V_0 as :obj:float and the Heston parameters :math:\kappa, :math:\theta, :math:\nu and :math:\rho, respectively, as :obj:float. put : bool, optional Whether the option is a put option. Defaults to False. weights : numpy.array, optional One-dimensional array of call options prices. Must be of the same length as the option_prices, expiries and strikes arrays.

Returns

tuple Returns the calibrated instantaneous volatility :math:V_0 and the Heston parameters :math:\kappa, :math:\theta, :math:\nu and :math:\rho, respectively, as :obj:float.

Example

import numpy as np from fyne import heston vol, kappa, theta, nu, rho = 0.0457, 5.07, 0.0457, 0.48, -0.767 underlying_price = 1640. strikes = np.array([1312., 1312., 1640., 1640., 1968., 1968.]) expiries = np.array([0.25, 0.5, 0.25, 0.5, 0.25, 0.5]) put = np.array([False, False, False, False, True, True])

option_prices = heston.formula(underlying_price, strikes, expiries, ... vol, kappa, theta, nu, rho, put) initial_guess = np.array([vol + 0.01, kappa + 1, theta + 0.01, ... nu - 0.1, rho - 0.1]) calibrated = heston.calibration_crosssectional( ... underlying_price, strikes, expiries, option_prices, initial_guess, ... put) [np.round(param, 4) for param in calibrated] [0.0457, 5.07, 0.0457, 0.48, -0.767]

Source code in src/fyne/heston.py
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
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
def calibration_crosssectional(
    underlying_price,
    strikes,
    expiries,
    option_prices,
    initial_guess,
    put=False,
    weights=None,
    enforce_feller_cond=False,
):
    r"""Heston cross-sectional calibration

    Recovers the Heston model parameters from options prices at a single point
    in time. The calibration is performed using the Levenberg-Marquardt
    algorithm.

    Parameters
    ----------
    underlying_price : float
        Price of the underlying asset.
    strikes : numpy.array
        One-dimensional array of option strikes. Must be of the same length as
        the expiries and option_prices arrays.
    expiries : numpy.array
        One-dimensional array of option expiries. The expiries are the time
        remaining until the expiry of the option. Must be of the same length as
        the strikes and option_prices arrays.
    option_prices : numpy.array
        One-dimensional array of call options prices. Must be of the same
        length as the expiries and strikes arrays.
    initial_guess : tuple
        Initial guess for instantaneous volatility :math:`V_0` as :obj:float
        and the Heston parameters :math:`\kappa`, :math:`\theta`, :math:`\nu`
        and :math:`\rho`, respectively, as :obj:float.
    put : bool, optional
        Whether the option is a put option. Defaults to `False`.
    weights : numpy.array, optional
        One-dimensional array of call options prices. Must be of the same
        length as the option_prices, expiries and strikes arrays.

    Returns
    -------
    tuple
        Returns the calibrated instantaneous volatility :math:`V_0` and the
        Heston parameters :math:`\kappa`, :math:`\theta`, :math:`\nu` and
        :math:`\rho`, respectively, as :obj:`float`.

    Example
    -------

    >>> import numpy as np
    >>> from fyne import heston
    >>> vol, kappa, theta, nu, rho = 0.0457, 5.07, 0.0457, 0.48, -0.767
    >>> underlying_price = 1640.
    >>> strikes = np.array([1312., 1312., 1640., 1640., 1968., 1968.])
    >>> expiries = np.array([0.25, 0.5, 0.25, 0.5, 0.25, 0.5])
    >>> put = np.array([False, False, False, False, True, True])

    >>> option_prices = heston.formula(underlying_price, strikes, expiries,
    ...                                vol, kappa, theta, nu, rho, put)
    >>> initial_guess = np.array([vol + 0.01, kappa + 1, theta + 0.01,
    ...                           nu - 0.1, rho - 0.1])
    >>> calibrated = heston.calibration_crosssectional(
    ...     underlying_price, strikes, expiries, option_prices, initial_guess,
    ...     put)
    >>> [np.round(param, 4) for param in calibrated]
    [0.0457, 5.07, 0.0457, 0.48, -0.767]

    """

    calls = common._put_call_parity_reverse(
        option_prices, underlying_price, strikes, put
    )
    cs = calls / underlying_price
    ks = np.log(strikes / underlying_price)
    ws = 1 / cs if weights is None else weights / cs
    vol0, kappa0, theta0, nu0, rho0 = initial_guess
    params = np.array([vol0, kappa0, kappa0 * theta0, nu0, rho0])

    vol, kappa, a, nu, rho = _reduced_calib_xsect(
        cs, ks, expiries, ws, params, enforce_feller_cond
    )

    return vol, kappa, a / kappa, nu, rho

calibration_panel(underlying_prices, strikes, expiries, option_prices, initial_guess, put=False, weights=None)

Heston panel calibration

Recovers the Heston model parameters from options prices across strikes, maturities and time. The calibration is performed using the Levenberg-Marquardt algorithm.

Parameters

underlying_price : numpy.array One-dimensional array of prices of the underlying asset at each point in time. strikes : numpy.array One-dimensional array of option strikes. Must be of the same length as the expiries array. expiries : numpy.array One-dimensional array of option expiries. The expiries are the time remaining until the expiry of the option. Must be of the same length as the strikes array. option_prices : numpy.array Two-dimensional array of the call options prices. The array must be :math:n-by-:math:d, where :math:n is the size of underlying_price and :math:d is the size of strikes or expiries. initial_guess : tuple Initial guess for instantaneous volatility :math:V_0 as :obj:float and the Heston parameters :math:\kappa, :math:\theta, :math:\nu and :math:\rho, respectively, as :obj:float. put : bool, optional Whether the option is a put option. Defaults to False. weights : numpy.array, optional One-dimensional array of call options prices. Must be of the same length as the option_prices, expiries and strikes arrays.

Returns

tuple Returns the calibrated instantaneous volatilities :math:V_0 as a :obj:numpy.array and the Heston parameters :math:\kappa, :math:\theta, :math:\nu and :math:\rho, respectively, as :obj:float.

Example

import numpy as np from fyne import heston kappa, theta, nu, rho = 5.07, 0.0457, 0.48, -0.767 underlying_prices = np.array([90., 100., 95.]) vols = np.array([0.05, 0.045, 0.055]) strikes = np.array([80., 80., 100., 100., 120., 120.]) expiries = np.array([0.25, 0.5, 0.25, 0.5, 0.25, 0.5]) put = np.array([False, False, False, False, True, True]) option_prices = ( ... heston.formula(underlying_prices[:, None], strikes, expiries, ... vols[:, None], kappa, theta, nu, rho, put)) initial_guess = np.array([vols[1] + 0.01, kappa + 1, theta + 0.01, ... nu - 0.1, rho - 0.1]) vols, kappa, theta, nu, rho = heston.calibration_panel( ... underlying_prices, strikes, expiries, option_prices, initial_guess, ... put) np.round(vols, 4) array([0.05 , 0.045, 0.055]) [np.round(param, 4) for param in (kappa, theta, nu, rho)] [5.07, 0.0457, 0.48, -0.767]

Source code in src/fyne/heston.py
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
def calibration_panel(
    underlying_prices,
    strikes,
    expiries,
    option_prices,
    initial_guess,
    put=False,
    weights=None,
):
    r"""Heston panel calibration

    Recovers the Heston model parameters from options prices across strikes,
    maturities and time. The calibration is performed using the
    Levenberg-Marquardt algorithm.

    Parameters
    ----------
    underlying_price : numpy.array
        One-dimensional array of prices of the underlying asset at each point
        in time.
    strikes : numpy.array
        One-dimensional array of option strikes. Must be of the same length as
        the expiries array.
    expiries : numpy.array
        One-dimensional array of option expiries. The expiries are the time
        remaining until the expiry of the option. Must be of the same length as
        the strikes array.
    option_prices : numpy.array
        Two-dimensional array of the call options prices. The array must be
        :math:`n`-by-:math:`d`, where :math:`n` is the size of
        `underlying_price` and :math:`d` is the size of `strikes` or
        `expiries`.
    initial_guess : tuple
        Initial guess for instantaneous volatility :math:`V_0` as :obj:float
        and the Heston parameters :math:`\kappa`, :math:`\theta`, :math:`\nu`
        and :math:`\rho`, respectively, as :obj:float.
    put : bool, optional
        Whether the option is a put option. Defaults to `False`.
    weights : numpy.array, optional
        One-dimensional array of call options prices. Must be of the same
        length as the option_prices, expiries and strikes arrays.

    Returns
    -------
    tuple
        Returns the calibrated instantaneous volatilities :math:`V_0` as a
        :obj:`numpy.array` and the Heston parameters :math:`\kappa`,
        :math:`\theta`, :math:`\nu` and :math:`\rho`, respectively, as
        :obj:`float`.

    Example
    -------

    >>> import numpy as np
    >>> from fyne import heston
    >>> kappa, theta, nu, rho = 5.07, 0.0457, 0.48, -0.767
    >>> underlying_prices = np.array([90., 100., 95.])
    >>> vols = np.array([0.05, 0.045, 0.055])
    >>> strikes = np.array([80., 80., 100., 100., 120., 120.])
    >>> expiries = np.array([0.25, 0.5, 0.25, 0.5, 0.25, 0.5])
    >>> put = np.array([False, False, False, False, True, True])
    >>> option_prices = (
    ...     heston.formula(underlying_prices[:, None], strikes, expiries,
    ...                    vols[:, None], kappa, theta, nu, rho, put))
    >>> initial_guess = np.array([vols[1] + 0.01, kappa + 1, theta + 0.01,
    ...                           nu - 0.1, rho - 0.1])
    >>> vols, kappa, theta, nu, rho = heston.calibration_panel(
    ...     underlying_prices, strikes, expiries, option_prices, initial_guess,
    ...     put)
    >>> np.round(vols, 4)
    array([0.05 , 0.045, 0.055])
    >>> [np.round(param, 4) for param in (kappa, theta, nu, rho)]
    [5.07, 0.0457, 0.48, -0.767]

    """

    calls = common._put_call_parity_reverse(
        option_prices, underlying_prices[:, None], strikes, put
    )
    cs = calls / underlying_prices[:, None]
    ks = np.log(strikes[None, :] / underlying_prices[:, None])
    ws = 1 / cs if weights is None else weights / cs
    vol0, kappa0, theta0, nu0, rho0 = initial_guess
    params = vol0 * np.ones(len(underlying_prices) + 4)
    params[-4:] = kappa0, kappa0 * theta0, nu0, rho0

    calibrated = _reduced_calib_panel(cs, ks, expiries, ws, params)
    vols = calibrated[:-4]
    kappa, a, nu, rho = calibrated[-4:]

    return vols, kappa, a / kappa, nu, rho

calibration_vol(underlying_price, strikes, expiries, option_prices, kappa, theta, nu, rho, put=False, vol_guess=0.1, weights=None, n_cores=None)

Heston volatility calibration

Recovers the Heston instantaneous volatility from options prices at a single point in time. The Heston model parameters must be provided. The calibration is performed using the Levenberg-Marquardt algorithm.

Parameters

underlying_price : float Price of the underlying asset. strikes : numpy.array One-dimensional array of option strikes. Must be of the same length as the expiries and option_prices arrays. expiries : numpy.array One-dimensional array of option expiries. The expiries are the time remaining until the expiry of the option. Must be of the same length as the strikes and option_prices arrays. option_prices : numpy.array One-dimensional array of call options prices. Must be of the same length as the expiries and strikes arrays. kappa : float Model parameter :math:\kappa. theta : float Model parameter :math:\theta. nu : float Model parameter :math:\nu. rho : float Model parameter :math:\rho. put : bool, optional Whether the option is a put option. Defaults to False. vol_guess : float, optional Initial guess for instantaneous volatility :math:V_0. Defaults to 0.1. weights : numpy.array, optional One-dimensional array of call options prices. Must be of the same length as the option_prices, expiries and strikes arrays.

Returns

float Returns the calibrated instantaneous volatility :math:V_0.

Example

import numpy as np from fyne import heston vol = 0.0457 params = (5.07, 0.0457, 0.48, -0.767) underlying_price = 1640. strikes = np.array([1312., 1312., 1640., 1640., 1968., 1968.]) expiries = np.array([0.25, 0.5, 0.25, 0.5, 0.25, 0.5]) put = np.array([False, False, False, False, True, True]) option_prices = heston.formula( ... underlying_price, strikes, expiries, vol, params, put ... ) calibrated_vol = heston.calibration_vol( ... underlying_price, strikes, expiries, option_prices, params, put ... ) np.round(calibrated_vol, 4) 0.0457

Source code in src/fyne/heston.py
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
def calibration_vol(
    underlying_price,
    strikes,
    expiries,
    option_prices,
    kappa,
    theta,
    nu,
    rho,
    put=False,
    vol_guess=0.1,
    weights=None,
    n_cores=None,
):
    r"""Heston volatility calibration

    Recovers the Heston instantaneous volatility from options prices at a
    single point in time. The Heston model parameters must be provided. The
    calibration is performed using the Levenberg-Marquardt algorithm.

    Parameters
    ----------
    underlying_price : float
        Price of the underlying asset.
    strikes : numpy.array
        One-dimensional array of option strikes. Must be of the same length as
        the expiries and option_prices arrays.
    expiries : numpy.array
        One-dimensional array of option expiries. The expiries are the time
        remaining until the expiry of the option. Must be of the same length as
        the strikes and option_prices arrays.
    option_prices : numpy.array
        One-dimensional array of call options prices. Must be of the same
        length as the expiries and strikes arrays.
    kappa : float
        Model parameter :math:`\kappa`.
    theta : float
        Model parameter :math:`\theta`.
    nu : float
        Model parameter :math:`\nu`.
    rho : float
        Model parameter :math:`\rho`.
    put : bool, optional
        Whether the option is a put option. Defaults to `False`.
    vol_guess : float, optional
        Initial guess for instantaneous volatility :math:`V_0`. Defaults to
        0.1.
    weights : numpy.array, optional
        One-dimensional array of call options prices. Must be of the same
        length as the option_prices, expiries and strikes arrays.

    Returns
    -------
    float
        Returns the calibrated instantaneous volatility :math:`V_0`.

    Example
    -------

    >>> import numpy as np
    >>> from fyne import heston
    >>> vol = 0.0457
    >>> params = (5.07, 0.0457, 0.48, -0.767)
    >>> underlying_price = 1640.
    >>> strikes = np.array([1312., 1312., 1640., 1640., 1968., 1968.])
    >>> expiries = np.array([0.25, 0.5, 0.25, 0.5, 0.25, 0.5])
    >>> put = np.array([False, False, False, False, True, True])
    >>> option_prices = heston.formula(
    ...     underlying_price, strikes, expiries, vol, *params, put
    ... )
    >>> calibrated_vol = heston.calibration_vol(
    ...     underlying_price, strikes, expiries, option_prices, *params, put
    ... )
    >>> np.round(calibrated_vol, 4)
    0.0457

    """

    calls = common._put_call_parity_reverse(
        option_prices, underlying_price, strikes, put
    )
    cs = calls / underlying_price
    ks = np.log(strikes / underlying_price)
    ws = 1 / cs if weights is None else weights / cs

    (vol,) = _reduced_calib_vol(
        cs,
        ks,
        expiries,
        ws,
        kappa,
        kappa * theta,
        nu,
        rho,
        np.array([vol_guess]),
        n_cores=n_cores,
    )

    return vol

delta(underlying_price, strike, expiry, vol, kappa, theta, nu, rho, put=False)

Heston Greek delta

Computes the Greek :math:\Delta (delta) of the option according to the Heston 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. vol : float Instantaneous volatility. kappa : float Model parameter :math:\kappa. theta : float Model parameter :math:\theta. nu : float Model parameter :math:\nu. rho : float Model parameter :math:\rho. put : bool, optional Whether the option is a put option. Defaults to False.

Returns

float Option Greek :math:\Delta (delta) according to Heston formula.

Example

import numpy as np from fyne import heston v, kappa, theta, nu, rho = 0.2, 1.3, 0.04, 0.4, -0.3 underlying_price = 100. strike = 90. maturity = 0.5 call_delta = heston.delta(underlying_price, strike, maturity, v, kappa, ... theta, nu, rho) np.round(call_delta, 2) 0.72 put_delta = heston.delta(underlying_price, strike, maturity, v, kappa, ... theta, nu, rho, put=True) np.round(put_delta, 2) -0.28

Source code in src/fyne/heston.py
 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
139
140
141
142
143
144
145
146
147
def delta(
    underlying_price, strike, expiry, vol, kappa, theta, nu, rho, put=False
):
    r"""Heston Greek delta

    Computes the Greek :math:`\Delta` (delta) of the option according to the
    Heston 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.
    vol : float
        Instantaneous volatility.
    kappa : float
        Model parameter :math:`\kappa`.
    theta : float
        Model parameter :math:`\theta`.
    nu : float
        Model parameter :math:`\nu`.
    rho : float
        Model parameter :math:`\rho`.
    put : bool, optional
        Whether the option is a put option. Defaults to `False`.

    Returns
    -------
    float
        Option Greek :math:`\Delta` (delta) according to Heston formula.

    Example
    -------

    >>> import numpy as np
    >>> from fyne import heston
    >>> v, kappa, theta, nu, rho = 0.2, 1.3, 0.04, 0.4, -0.3
    >>> underlying_price = 100.
    >>> strike = 90.
    >>> maturity = 0.5
    >>> call_delta = heston.delta(underlying_price, strike, maturity, v, kappa,
    ...                           theta, nu, rho)
    >>> np.round(call_delta, 2)
    0.72
    >>> put_delta = heston.delta(underlying_price, strike, maturity, v, kappa,
    ...                      theta, nu, rho, put=True)
    >>> np.round(put_delta, 2)
    -0.28

    """

    k = np.log(strike / underlying_price)
    a = kappa * theta
    call_delta = _reduced_delta(k, expiry, vol, kappa, a, nu, rho)
    return common._put_call_parity_delta(call_delta, put)

formula(underlying_price, strike, expiry, vol, kappa, theta, nu, rho, put=False, assert_no_arbitrage=False)

Heston formula

Computes the price of the option according to the Heston 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. vol : float Instantaneous volatility. kappa : float Model parameter :math:\kappa. theta : float Model parameter :math:\theta. nu : float Model parameter :math:\nu. rho : float Model parameter :math:\rho. put : bool, optional Whether the option is a put option. Defaults to False.

Returns

float Option price according to Heston formula.

Example

import numpy as np from fyne import heston v, kappa, theta, nu, rho = 0.2, 1.3, 0.04, 0.4, -0.3 underlying_price = 100. strike = 90. expiry = 0.5 call_price = heston.formula(underlying_price, strike, expiry, v, kappa, ... theta, nu, rho) np.round(call_price, 2) 16.32 put_price = heston.formula(underlying_price, strike, expiry, v, kappa, ... theta, nu, rho, put=True) np.round(put_price, 2) 6.32

Source code in src/fyne/heston.py
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
57
58
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
def formula(
    underlying_price,
    strike,
    expiry,
    vol,
    kappa,
    theta,
    nu,
    rho,
    put=False,
    assert_no_arbitrage=False,
):
    r"""Heston formula

    Computes the price of the option according to the Heston 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.
    vol : float
        Instantaneous volatility.
    kappa : float
        Model parameter :math:`\kappa`.
    theta : float
        Model parameter :math:`\theta`.
    nu : float
        Model parameter :math:`\nu`.
    rho : float
        Model parameter :math:`\rho`.
    put : bool, optional
        Whether the option is a put option. Defaults to `False`.

    Returns
    -------
    float
        Option price according to Heston formula.

    Example
    -------

    >>> import numpy as np
    >>> from fyne import heston
    >>> v, kappa, theta, nu, rho = 0.2, 1.3, 0.04, 0.4, -0.3
    >>> underlying_price = 100.
    >>> strike = 90.
    >>> expiry = 0.5
    >>> call_price = heston.formula(underlying_price, strike, expiry, v, kappa,
    ...                             theta, nu, rho)
    >>> np.round(call_price, 2)
    16.32
    >>> put_price = heston.formula(underlying_price, strike, expiry, v, kappa,
    ...                            theta, nu, rho, put=True)
    >>> np.round(put_price, 2)
    6.32

    """

    ks = np.log(strike / underlying_price)
    a = kappa * theta
    broadcasted = np.broadcast(ks, expiry, vol)
    call = np.empty(broadcasted.shape)
    call.flat = [
        _reduced_formula(k, t, v, kappa, a, nu, rho, assert_no_arbitrage)
        for (k, t, v) in broadcasted
    ]
    call *= underlying_price
    return common._put_call_parity(call, underlying_price, strike, put)

vega(underlying_price, strike, expiry, vol, kappa, theta, nu, rho)

Heston Greek vega

Computes the Greek :math:\mathcal{V} (vega) of the option according to the Heston 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. vol : float Instantaneous volatility. kappa : float Model parameter :math:\kappa. theta : float Model parameter :math:\theta. nu : float Model parameter :math:\nu. rho : float Model parameter :math:\rho.

Returns

float Option Greek :math:\mathcal{V} (vega) according to Heston formula.

Example

import numpy as np from fyne import heston v, kappa, theta, nu, rho = 0.2, 1.3, 0.04, 0.4, -0.3 underlying_price = 100. strike = 90. maturity = 0.5 vega = heston.vega(underlying_price, strike, maturity, v, kappa, theta, ... nu, rho) np.round(vega, 2) 22.5

Source code in src/fyne/heston.py
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
191
192
193
194
195
196
197
198
def vega(underlying_price, strike, expiry, vol, kappa, theta, nu, rho):
    r"""Heston Greek vega

    Computes the Greek :math:`\mathcal{V}` (vega) of the option according to
    the Heston 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.
    vol : float
        Instantaneous volatility.
    kappa : float
        Model parameter :math:`\kappa`.
    theta : float
        Model parameter :math:`\theta`.
    nu : float
        Model parameter :math:`\nu`.
    rho : float
        Model parameter :math:`\rho`.

    Returns
    -------
    float
        Option Greek :math:`\mathcal{V}` (vega) according to Heston formula.

    Example
    -------

    >>> import numpy as np
    >>> from fyne import heston
    >>> v, kappa, theta, nu, rho = 0.2, 1.3, 0.04, 0.4, -0.3
    >>> underlying_price = 100.
    >>> strike = 90.
    >>> maturity = 0.5
    >>> vega = heston.vega(underlying_price, strike, maturity, v, kappa, theta,
    ...                    nu, rho)
    >>> np.round(vega, 2)
    22.5

    """

    k = np.log(strike / underlying_price)
    a = kappa * theta
    return _reduced_vega(k, expiry, vol, kappa, a, nu, rho) * underlying_price