Python

Calibration of Stoch Vol Jump Model via Numerical Integration Comp Model

  1. # Calibration of Complete Model of BCC97
  2. # Calibration of Stoch Vol Jump Model to EURO STOXX Option Quotes via Numerical Integration
  3. # Data Source: www.eurexchange.com
  4. # Bakshi, Cao and Chen (1997)
  5. #
  6. import sys
  7. sys.path.append('09_gmm')
  8. import math
  9. import numpy as np
  10. np.set_printoptions(suppress=True,
  11. formatter={'all': lambda x: '%5.3f' % x})
  12. import pandas as pd
  13. from scipy.optimize import brute, fmin, minimize
  14. import matplotlib as mpl
  15. mpl.rcParams['font.family'] = 'serif'
  16. from BCC_option_valuation import BCC_call_value
  17. from CIR_calibration import CIR_calibration, r_list
  18. from CIR_zcb_valuation import B
  19. from H93_calibration import options
  20. #
  21. # Calibrate Short Rate Model
  22. #
  23. kappa_r, theta_r, sigma_r = CIR_calibration()
  24. #
  25. # Market Data from www.eurexchange.com
  26. # as of 30. September 2014
  27. #
  28. S0 = 3225.93 # EURO STOXX 50 level
  29. r0 = r_list[0] # initial short rate
  30. #
  31. # Parameters from H93 & jump calibrations
  32. #
  33. kappa_v, theta_v, sigma_v, rho, v0 = np.load('11_cal/opt_sv.npy')
  34. lamb, mu, delta = np.load('11_cal/opt_jump.npy')
  35. p0 = [kappa_v, theta_v, sigma_v, rho, v0, lamb, mu, delta]
  36. #
  37. # Calibration Functions
  38. #
  39. i = 0
  40. min_MSE = 5000.0
  41. def BCC_error_function(p0):
  42. ''' Error function for parameter calibration in BCC97 model via
  43. Lewis (2001) Fourier approach.
  44. Parameters
  45. ==========
  46. kappa_v: float
  47. mean-reversion factor
  48. theta_v: float
  49. long-run mean of variance
  50. sigma_v: float
  51. volatility of variance
  52. rho: float
  53. correlation between variance and stock/index level
  54. v0: float
  55. initial, instantaneous variance
  56. lamb: float
  57. jump intensity
  58. mu: float
  59. expected jump size
  60. delta: float
  61. standard deviation of jump
  62. Returns
  63. =======
  64. MSE: float
  65. mean squared error
  66. '''
  67. global i, min_MSE
  68. kappa_v, theta_v, sigma_v, rho, v0, lamb, mu, delta = p0
  69. if kappa_v < 0.0 or theta_v < 0.005 or sigma_v < 0.0 or \
  70. rho < -1.0 or rho > 1.0 or v0 < 0.0 or lamb < 0.0 or \
  71. mu < -.6 or mu > 0.0 or delta < 0.0:
  72. return 5000.0
  73. if 2 * kappa_v * theta_v < sigma_v ** 2:
  74. return 5000.0
  75. se = []
  76. for row, option in options.iterrows():
  77. model_value = BCC_call_value(S0, option['Strike'], option['T'],
  78. option['r'], kappa_v, theta_v, sigma_v, rho, v0,
  79. lamb, mu, delta)
  80. se.append((model_value - option['Call']) ** 2)
  81. MSE = sum(se) / len(se)
  82. min_MSE = min(min_MSE, MSE)
  83. if i % 25 == 0:
  84. print '%4d |' % i, np.array(p0), '| %7.3f | %7.3f' % (MSE, min_MSE)
  85. i += 1
  86. return MSE
  87. def BCC_calibration_full():
  88. ''' Calibrates complete BCC97 model to market quotes. '''
  89. # local, convex minimization for all parameters
  90. opt = fmin(BCC_error_function, p0,
  91. xtol=0.000001, ftol=0.000001,
  92. maxiter=450, maxfun=650)
  93. np.save('11_cal/opt_full', np.array(opt))
  94. return opt
  95. def BCC_calculate_model_values(p0):
  96. ''' Calculates all model values given parameter vector p0. '''
  97. kappa_v, theta_v, sigma_v, rho, v0, lamb, mu, delta = p0
  98. values = []
  99. for row, option in options.iterrows():
  100. model_value = BCC_call_value(S0, option['Strike'], option['T'],
  101. option['r'], kappa_v, theta_v, sigma_v, rho, v0,
  102. lamb, mu, delta)
  103. values.append(model_value)
  104. return np.array(values)
# Calibration of Complete Model of BCC97

# Calibration of Stoch Vol Jump Model to EURO STOXX Option Quotes via Numerical Integration
# Data Source: www.eurexchange.com
# Bakshi, Cao and Chen (1997)
#
import sys
sys.path.append('09_gmm')
import math
import numpy as np
np.set_printoptions(suppress=True,
formatter={'all': lambda x: '%5.3f' % x})
import pandas as pd
from scipy.optimize import brute, fmin, minimize
import matplotlib as mpl
mpl.rcParams['font.family'] = 'serif'
from BCC_option_valuation import BCC_call_value
from CIR_calibration import CIR_calibration, r_list
from CIR_zcb_valuation import B
from H93_calibration import options
#
# Calibrate Short Rate Model
#
kappa_r, theta_r, sigma_r = CIR_calibration()
#
# Market Data from www.eurexchange.com
# as of 30. September 2014
#
S0 = 3225.93 # EURO STOXX 50 level
r0 = r_list[0] # initial short rate
#
# Parameters from H93 & jump calibrations
#
kappa_v, theta_v, sigma_v, rho, v0 = np.load('11_cal/opt_sv.npy')
lamb, mu, delta = np.load('11_cal/opt_jump.npy')
p0 = [kappa_v, theta_v, sigma_v, rho, v0, lamb, mu, delta]

#
# Calibration Functions
#
i = 0
min_MSE = 5000.0

def BCC_error_function(p0):
    ''' Error function for parameter calibration in BCC97 model via
    Lewis (2001) Fourier approach.
    Parameters
    ==========
    kappa_v: float
    mean-reversion factor
    theta_v: float
    long-run mean of variance
    sigma_v: float
    volatility of variance
    rho: float
    correlation between variance and stock/index level
    v0: float
    initial, instantaneous variance
    lamb: float
    jump intensity
    mu: float
    expected jump size
    delta: float
    standard deviation of jump
    Returns
    =======
    MSE: float
    mean squared error
    '''
    global i, min_MSE
    kappa_v, theta_v, sigma_v, rho, v0, lamb, mu, delta = p0
    if kappa_v < 0.0 or theta_v < 0.005 or sigma_v < 0.0 or \
                rho < -1.0 or rho > 1.0 or v0 < 0.0 or lamb < 0.0 or \
                    mu < -.6 or mu > 0.0 or delta < 0.0:
        return 5000.0
    if 2 * kappa_v * theta_v < sigma_v ** 2:
        return 5000.0
    se = []
    for row, option in options.iterrows():
        model_value = BCC_call_value(S0, option['Strike'], option['T'],
                                     option['r'], kappa_v, theta_v, sigma_v, rho, v0,
                                     lamb, mu, delta)
        se.append((model_value - option['Call']) ** 2)
    MSE = sum(se) / len(se)
    min_MSE = min(min_MSE, MSE)
    if i % 25 == 0:
        print '%4d |' % i, np.array(p0), '| %7.3f | %7.3f' % (MSE, min_MSE)
    i += 1
    return MSE

def BCC_calibration_full():
    ''' Calibrates complete BCC97 model to market quotes. '''
    # local, convex minimization for all parameters
    opt = fmin(BCC_error_function, p0,
               xtol=0.000001, ftol=0.000001,
               maxiter=450, maxfun=650)
    np.save('11_cal/opt_full', np.array(opt))
    return opt

def BCC_calculate_model_values(p0):
    ''' Calculates all model values given parameter vector p0. '''
    kappa_v, theta_v, sigma_v, rho, v0, lamb, mu, delta = p0
    values = []
    for row, option in options.iterrows():
        model_value = BCC_call_value(S0, option['Strike'], option['T'],
                                     option['r'], kappa_v, theta_v, sigma_v, rho, v0,
                                     lamb, mu, delta)
        values.append(model_value)
    return np.array(values)