www.gusucode.com > fininst 案例源码程序 matlab代码 > fininst/SwingOptionExample.m

    %% Pricing Swing Options using the Longstaff-Schwartz Method
%
% This example shows how to price a swing option using a Monte Carlo
% simulation and the Longstaff-Schwartz method. A risk-neutral
% simulation of the underlying natural gas price is conducted using a
% mean-reverting model. The simulation results are used to price a swing
% option based on the Longstaff-Schwartz method [6]. This approach uses a
% regression technique to approximate the continuation value of the option.
% A comparison is made between a polynomial and spline basis to fit the
% regression. Finally, the resulting prices are analyzed against lower and
% upper price boundaries derived from standard European and American
% options.
%
% Copyright 2014 The MathWorks, Inc.

%% Overview of Swing Options
%
% Swing options are popular financial instruments in the energy market,
% which provide flexibility in the volume of the delivered asset. In order
% for energy consumers to protect themselves against fluctuations in energy
% prices, they want to lock in a price by purchasing a forward contract,
% called the baseload forward contract. However, consumers do not know
% exactly how much energy will be used in the future, and energy
% commodities such as electricity and gas cannot easily be stored.
% Therefore, the consumer wants the flexibility to change the amount of
% energy that is delivered at each delivery date. Swing options provide
% this flexibility. Thus, the full contract is composed of two parts: the
% baseload forward contract, and the swing option component.
%
% Swing options are generally over-the-counter (OTC) contracts that can be
% highly customized. Therefore, there are many different types of
% constraints and penalties (see [5] for more details). In this
% example, a swing option is priced where the only constraint is the daily
% volume, which is known as the Daily Contract Quantity (DCQ). When a swing
% right is exercised, the volume cannot go below the minimum DCQ
% (|minDCQ|), or go above the maximum DCQ (|maxDCQ|).
%
% There are several methods to price swing options, such as finite
% differences, simulation, and dynamic programming based on trees [5]. This
% example uses the simulation based approach with the Longstaff-Schwartz
% method. The benefit of the simulation based approach is that the dynamics
% used to simulate the underlying asset price is separated from the pricing
% algorithm. In the finite difference and tree based methods, the pricing
% algorithm must be changed in order to consider pricing with a different
% underlying price dynamic.

%% Risk-Neutral Simulation of Natural Gas Price
%
% In this example, natural gas is used as the underlying asset with the
% following mean-reverting dynamic [8]:
%
% $dS_t = \kappa (\mu - \log(S_t))S_tdt + \sigma S_tdW_t$
%
% where $W_t$ is a standard Brownian motion. Applying Ito's Lemma to the
% logarithm of the price leads to an Orstein-Uhlenbeck process:
%
% $dX_t = \kappa (\theta - X_t)dt + \sigma dW_t$
%
% where $X_t = \log(S_t)$, $\kappa > 0$, and $\theta$ is defined as:
%
% $\theta = \mu - \frac{\sigma^2}{2 \kappa}$
%
% $\theta$ is the mean-reversion level that determines the value at which
% the simulated values will revert to in the long run. $\kappa$ is the
% mean-reversion speed that determines how fast this reversion occurs. 
% $\sigma$ is the volatility of $X$. We first proceed by simulating the
% logarithm of the price. Afterwards, the exponential of the simulated
% values are taken to obtain the prices.
%
% The length of the simulation is for a one year period, with the initial
% price of 3.9 dollars per MMBtu. The Monte Carlo simulation is conducted
% for 1,000 trials, with daily periods. In practice, these parameters are
% calibrated against market data. In this example, $\kappa = 1.2$,
% $\theta = 1.7$, and $\sigma = 59\%$. The |HWV| object from the Financial
% Toolbox(TM) is used to simulate the mean-reverting dynamics of the
% natural gas price.

% Settlement date
Settle = '01-Jun-2014';

% Maturity Date
Maturity = '01-Jun-2015';

% Actual/Actual basis
Basis = 0;

% Initial log(price in $/MMBtu)
X0 = log(3.9);

% Volatility of log(price)
Sigma = 0.59;

% Number of trials in the Monte Carlo simulation
NumTrials =1000;

% Number of periods (daily)
NumPeriods = daysdif(Settle, Maturity, Basis);

% Daily time step
dt = 1/NumPeriods;

% Mean reversion speed of log(price)
Kappa = 1.2;

% Mean reversion level of log(price)
Theta = 1.7;

% Create HWV object
hwvobj = hwv(Kappa, Theta, Sigma, 'StartState', X0);

%%
% The simulation is run and plotted below.

% Set random number generator seed
savedState = rng(0, 'twister');

% Simulate gas prices
[Paths, Times] = hwvobj.simBySolution(NumPeriods, 'NTRIALS', NumTrials, ...
    'DeltaTime', dt);
Paths = squeeze(exp(Paths));

% Restore random number generator state
rng(savedState);

% Plot paths
figure;
plot(Times, Paths);
title('Natural Gas Risk-Neutral Price Simulation');
xlabel('Time');
ylabel('Price');

%%
% In this example, natural gas is used as the underlying asset with a
% mean-reverting dynamic. However, the Longstaff-Schwartz algorithm can be
% used for other underlying assets, such as electricity, with any
% underlying price dynamic.

%% Pricing the Swing Option
%
% We consider a swing option with five swing rights at the strike of
% $4.69/MMBtu, which can be exercised daily between the day after the
% settlement date and the maturity date. The Daily Contract Quantity (DCQ)
% is 10,000 MMBtu, which is the average amount of natural gas that the
% consumer expects to purchase on a given day. The consumer has the
% flexibility to reduce the purchase amount (downswing) in one day to the
% minimum DCQ of 2,500 MMBtu, or increase the purchase (upswing) to 15,000
% MMBtu. The continuously compounded annual risk-free rate is 1%.
%
% |RATESPEC| is used to represent the interest-rate term structure. For the
% sake of simplicity, we consider a flat interest-rate term structure in
% this example. The values of |RATESPEC| can be modified to accomodate any
% interest-rate curve. The function |HSWINGBYLS| in this example assumes a
% daily exercise if the |ExerciseDates| input is empty.

% Define RateSpec
rfrate = 0.01;
Compounding = -1;
RateSpec = intenvset('ValuationDate', Settle, 'StartDates', Settle, ...
                     'EndDates', Maturity, 'Rates', rfrate, ...
                     'Compounding', Compounding, 'Basis', Basis);

% Daily exercise
% hswingbyls assumes daily exercise for empty ExerciseDates
ExerciseDates = [];

% Number of swings
NumSwings = 5;

% Daily Contract Quantity in MMBtu
DCQ = 10000;

% Minimum DCQ constraint in MMBtu
minDCQ = 2500;

% Maximum DCQ constraint in MMBtu
maxDCQ = 15000;

% Strike
Strike = 4.69;

%%
% The Longstaff-Schwartz method is a backward iteration algorithm, which
% steps backward in time from the maturity date. At each exercise date, the
% algorithm approximates the continuation value, which is the value of the
% option if it is not exercised. This is done by fitting a regression
% against the values of the simulated prices and the discounted future
% value of the option at the next exercise date. The future value of the
% option is known as the algorithm moves backward in time. The continuation
% value is compared to the sum of the payoff from immediate exercise (a
% downswing or upswing) and the continuation value of a swing option with
% one less swing right. If this sum is smaller, the option holder's optimal
% strategy is to not exercise on that date. The function |HSWINGBYLS| in
% this example uses this method to determine the optimal exercise strategy
% and the price for swing options [1,2,7].
%
% As discussed earlier, the only constraint considered in this example is
% the minimum and maximum DCQ. In this case, the optimal early exercise
% strategy is of a bang-bang type. This means that when it is optimal to
% upswing or downswing at a certain exercise date, the option holder should
% always exercise at the maximum or minimum DCQ to maximize profit. The
% bang-bang exercise would not be the optimal strategy if, for example,
% there is a terminal penalty based on volume. The pricing algorithm would
% then need to additionally keep track of all possible volume levels, which
% significantly adds to the runtime performance cost.
%
% First, the swing option is priced using a 3rd order polynomial to fit the
% regression of the Longstaff-Schwartz method. The function |HSWINGBYLS|
% also generates a plot of the regression between the underlying price and
% the continuation value at the exercise date before maturity.

% Price swing option using 3rd order polynomial to fit Longstaff-Schwartz
% regression
tic;
useSpline = false;
SwingPrice = hswingbyls(Paths, Times, RateSpec, Settle, Maturity, ...
    Strike, ExerciseDates, NumSwings, DCQ, minDCQ, maxDCQ, useSpline, ...
    [], true)
lsPolyTime = toc;

%%
% The above plot of the regression fit shows that the 3rd order polynomial
% does not fit the continuation value perfectly, especially near the hinge
% and at the extreme points. We now use the |CSAPS| function to fit the
% regression using a cubic smoothing spline with a smoothing parameter of
% 0.7. The Curve Fitting Toolbox(TM) is required to run the remainder of
% the example.

% Price swing option using smoothed splines to fit Longstaff-Schwartz
% regression
tic;
useSpline = true;
smoothingParam = 0.7;
SwingPriceSpline = hswingbyls(Paths, Times, RateSpec, Settle, Maturity, ...
    Strike, ExerciseDates, NumSwings, DCQ, minDCQ, maxDCQ, useSpline, ...
    smoothingParam, true)
lsSplineTime = toc;

%%
% The plot of the regression shows that the cubic smoothing spline has a
% better fit against the data, thus obtaining a more accurate value for the
% continuation values. However, the below comparison shows that using a
% cubic smoothing spline takes longer than a 3rd order polynomial.

% Print comparison of running times
fprintf('Comparison of running times:\n\n');
fprintf('3rd order polynomial: %.2f sec\n', lsPolyTime);
fprintf('Spline              : %.2f sec\n\n', lsSplineTime);

%%
% Also, it is important to note that the price represents solely the
% optionality component. Hence, the price of the baseload forward
% contract is not included in the above calculated price. Because we used a
% fixed strike price, the baseload contract has a non-zero value, which can
% be calculated by:
%
% $BaseLoadPrice = \sum_{i=1}^{N}e^{-rt_i}E(S_{t_i} - K)$
%
% where $t_i, i=1,...,N,$ are the exercise dates (see [3] for more 
% details). The full price of the contract including the baseload and the
% swing option is calculated below using the swing option price from the
% smoothed cubic spline.

% Obtain discount factors
RS2 = intenvset(RateSpec, 'StartTimes', 0, 'EndTimes', Times(2:end));
D = intenvget(RS2,'Disc');

% Calculate baseload price
BaseLoadPrice = DCQ.*mean(Paths(2:end,:)-Strike,2)'*D;

% Calculate full contract price, based on results from cubic spline LS
FullContractPrice = BaseLoadPrice + SwingPriceSpline

%% Price Bounds
%
% A lower bound for the swing option is a strip of European options, and
% the upper bound is a strip of American options [4]. Compared to European
% options, swing options have an early exercise premium at each exercise
% date, thus the price should be higher. The price is lower than the
% American option strips, because only a single swing right can be
% exercised at each exercise date. More than one strip can be exercised in
% a single day using American options.
%
% The prices for the strips of the lower and upper bounds are calculated
% below to check that the swing option prices are within these bounds. The
% European strip prices are calculated against the last five excercise
% dates.

% Obtain discount factor for the last NumSwings exercise dates
D = D(end-NumSwings+1:end);

% European lower bound
idx = size(Paths, 1):-1:(size(Paths, 1) - NumSwings + 1);
putEuro = D'*mean(max(Strike - Paths(idx,:), 0),2);
callEuro = D'*mean(max(Paths(idx,:) - Strike, 0),2);
lowerBound = ((DCQ-minDCQ).*putEuro+(maxDCQ-DCQ).*callEuro);

% American upper bound
[putAmer, callAmer] = hamericanPrice(Paths, Times, RateSpec, Strike);
upperBound = NumSwings.*((DCQ-minDCQ).*putAmer+(maxDCQ-DCQ).*callAmer);

% Print price and lower/upper bounds
fprintf('Comparison to lower and upper bounds:\n\n');
fprintf('Lower bound (European) : %.2f\n', lowerBound);
fprintf('Swing Option Price     : %.2f\n', SwingPriceSpline);
fprintf('Upper bound (American) : %.2f\n\n', upperBound);

%%
% The prices calculated using the Longstaff-Schwartz algorithm are within
% the lower and upper bounds. The below plot shows a comparison between the
% swing option and the upper and lower bounds as the number of swings
% increases, ceteris paribus. When the number of swings is one, the swing
% option is equivalent to an American option. In the case of daily exericse
% opportunity (|NumSwings = 365|), the swing option is equivalent to the
% strip of European options with daily maturity.
%
% <<../SwingOptionExample_numswings.png>>

%% Conclusion
%
% The example shows the use of the Longstaff-Schwartz method to price a
% swing option where the underlying asset follows a mean-reverting dynamic.
% A 3rd order polynomial and a smoothed cubic spline are used to fit the
% regression in the Longstaff-Schwartz algorithm to approximate the
% continuation value. It was shown that the smoothed cubic spline fits the
% data better at the cost of slower performance. Finally, the resulting
% swing option prices were checked against the lower bound of a strip of
% European options and an upper bound of a strip of American options.

%% References
%
% [1] Boogert, A., de Jong, C., Gas storage valuation using a Monte Carlo
%     method. Journal of Derivatives, 15(3):81-98, 2008.
%
% [2] Dorr, Uwe, Valuation of Swing Options and Estimation of Exercise
%     strategies by Monte Carlo Techniques, Oxford, 2002.
%
% [3] Hull, John C., Options, Futures, and Other Derivatives, Sixth
%     Edition, Pearson Education, Inc., 2006.
%
% [4] Jaillet, P., Ronn, E. I., Tompaidis, S., Valuation of commodity-based
%     swing options, Management Science, 50(7):909-921, 2004.
%
% [5] Loland, Ambers, Lindqvist, Ola, Valuation of Commodity-Based Swing
%     Options: A Survey, Norsk, Regnesentral, 2008.
%
% [6] Longstaff, Francis A., Schwartz, Eduardo S, Valuing American Options
%     by Simulation: A Simple Least-Squares Approach, The Review of
%     Financial Studies, 14(1):113-147, 2001.
%
% [7] Meinshausen, N., Hambly, B.M., Monte Carlo methods for the valuation
%     of multiple exercise options, Mathematical Science, 14:557-583, 2004.
%
% [8] Schwartz, Eduardo S, The Stochastic Behavior of Commodity Prices:
%     Implications for Valuation and Hedging, The Journal of Finance,
%     52(3):923-973, 1997.