Pricing_Library / Models / calibration.m
calibration.m
Raw
% bounds for parameters

- standard deviations (e.g. sigma, delta, eta)
Bounds : [eps, 1] or [0, 1] since a volatility of 100% is very high and a negative volatility is not admissible
Start  : around 0.2

- mean (e.g. mu, theta)
Bounds : [-5, 5] to have a symmetric interval
Start  : 0 to not give any advantage to having a positive or negative drift

- vol-of-vol (e.g. k)
Bounds : [eps, 5 * mean(maturities)] since k should be around the maturities of the options considered and it is positive
Start  : mean(maturities) since k should be around the maturities of the options considered

- jump intensities (e.g. lambda)
Bounds : [0, 200]
Start  : around 40

- parameter of exponential distributions (e.g. lambda plus, lambda minus)
Bounds : [0, 20] to have the biggest sensical interval
Start  : around 2 to reach sensical values

- probabilities (e.g. p)
Bounds : [0, 1] since are the natural bounds of the probability
Start  : 0.5 since starting in the middle does not give advantages to having a positive or a negative jump component

- mean reverting speed (e.g. xi)
Bounds : [eps, 3]
Start  : around 0.2


% how to decide between different starting points

- choose the one with the smallest error
- choose the one with the smallest maximum error
- look at the graph


% put-call parity

Data_put(:, 1) = Data_put(:, 1) + S0 - Data_put(:, 2) * exp( - r * maturity );
% call = put + S0 - K * exp( - r * T )


% how to understand if the data are from put or call

% European options with maturity close to 1 year (16 sept 2022)
Data_put = [1.83    95      236 % prices (USD), strikes (USD), volume
            2.01    97.5    100
            2.23   100      505
            2.45   102.5    142
            2.70   105      295
            2.99   107.5     79
            3.38   110      181
            3.70   112.5     16
            4.10   115      901
            4.50   117.5    454
            5.00   120      228
            5.60   122.5    185
            6.20   125     1253];

Data_call = [27.15   130    110 % prices (USD), strikes (USD), volume
             23.85   135    108
             20.75   140     88
             17.85	 145    388
             15.50	 150   1200
             13.23	 155    111
             11.40	 160    394
              9.72	 165     59
              8.21	 170    206
              7.00	 175     58
              5.88	 180    147];

mkt_prices = [Data_put(:, 1); Data_call(:, 1)]; % market prices
strikes    = [Data_put(:, 2); Data_call(:, 2)]; % strikes

figure
set(gcf, 'Color', 'w');
plot(strikes(1:13), mkt_prices(1:13), 's', 'Color', 'g', 'Markersize', 7, 'Linewidth', 1.5);
hold on
plot(strikes(14:end), mkt_prices(14:end), 'x', 'Color', 'r', 'Markersize', 7, 'Linewidth', 1.5);

legend('Put', 'Call')