Options
Class Option

java.lang.Object
  extended byOptions.Option
Direct Known Subclasses:
CallAsPathDependent, DigitalOption, PathIndependentOption

public abstract class Option
extends java.lang.Object

Interface and default methods to price and hedge a possibly path * path dependent European option on a single underlying asset.

* *

We define a variety of methods by providing an implementation * which prints an error message and aborts the program. Admittedly * this is less elegant than throwing an exception but sorry I am too lazy * to write all these try-catch blocks. Mostly a call to such a method * when it is undefined is a fatal error in any case.

* *

It would be more elegant to define these methods as abstract but then * each concrete subclass has to implement them in some way. Proceeding * as we do we only have to implement what we need.

* *

Fundamental methods which must have nontrivial implementations in each * concrete subclass are declared as abstract if they cannot be implemented * at this level of generality.

* *

Pricing: analytic option prices (if analytic formulas exist) and * Monte Carlo prices with and without control variates are computed.

* * Default control variate: as default control * variate for the discounted option payoff we use the discounted * price S[T]=S^B(t) of the underlying at expiration simulated under the * risk neutral probability.

* *

Note that exp(qt)S^B(t) is a martingale in the risk neutral probability * P_B. Thus the conditional control variate mean is given as * E^{P_B}_t[S^B(T)]=exp(-q(T-t))S^B(t). * See book, chapter 3, section 1, equation 3.15.

* *

Hedging: The profit and loss of * hedging the option using various hedge deltas:

* *

is analyzed by computing mean and standard deviation from a sample of * price paths of the underlying asset. See the file "HedgeWeights.ps" * for the details.

* *

Information: the information available * at time t for conditioning is the history of the price path of the * underlying asset on the interval [0,t] (up to the present). * Conditioning on this information means to limit simulations of the price * of the underlying asset to paths which are branches of the current path where * branching occurs at time t.

* *

Warning: the abstract class Option does not initialize * the option price path. This is left to the concrete subclasses which can * decide wether analytic price formulas are available or not.

*


Field Summary
static int ANALYTIC_DELTA
          Flag identifying hedge weights.
static int ANALYTIC_MINIMUM_VARIANCE_DELTA
          Flag identifying hedge weights.
static int ANALYTIC_QUOTIENT_DELTA
          Flag identifying hedge weights.
static int MARKET_PROBABILITY
          Flag indicating probability controlling paths of the underlying.
static int MINIMUM_VARIANCE_DELTA
          Flag identifying hedge weights.
static int MONTE_CARLO_DELTA
          Flag identifying hedge weights.
static int QUOTIENT_DELTA
          Flag identifying hedge weights.
static int RISK_NEUTRAL_PROBABILITY
          Flag indicating probability controlling paths of the underlying.
 
Constructor Summary
Option(Asset asset, java.lang.String name)
          Constructor, does not initialize the option price path.
 
Method Summary
 double analyticDelta(int t)
          Delta dC/dS computed from discounted analytic price * C(t) Implementation at this level * is an error message and program exit.
 double analyticGamma(int t)
          Gamma d^2C/dS^2 computed from discounted analytic price * C(t).
 double analyticMinimumVarianceDelta(int whichProbability, int t)
          Analytic approximation to the minimumVarianceDelta(int, int, int) hedge * weights.
 double analyticQuotientDelta(int t)
          Analytic approximation to the quotientDelta(int, int) hedge * weights.
 double analyticSGamma(int t)
           S(t)*Gamma(t).
 double analyticTheta(int t)
          Theta dC/dt computed from discounted analytic price * C(t).
 double analyticThetaDelta(int t)
          Theta of delta dDelta/dt computed from discounted analytic * price C(t).
 double analyticVega(int t)
          Vega dC/dsigma computed from discounted analytic price * C(t).
 double conditionalControlVariateCorrelation(int t, int nPaths)
          Correlation of the discounted payoff with the control * variate conditioned on information * available at time t.
 double controlledDiscountedMonteCarloPrice(double precision, double confidence, int nSignChange)
          Monte Carlo price at time t=0 using the * default control variate * with price paths of the underlying simulated until desired precision is * reached with desired confidence.
 double controlledDiscountedMonteCarloPrice(int nPath)
           Monte Carlo price at time t=0 computed using the * default control variate.
 double controlledDiscountedMonteCarloPrice(int t, double precision, double confidence, int nSignChange)
          Monte Carlo price at time t using the * default control variate * with price paths of the underlying simulated until desired precision is * reached with desired confidence.
 double controlledDiscountedMonteCarloPrice(int t, int nPath)
           Monte Carlo price at time t computed using the * default control variate.
 ControlledRandomVariable controlledDiscountedPayoff()
          The discounted payoff as a controlled random variable using the * default control variate.
 double controlVariateCorrelation(int nPaths)
          Correlation of the discounted payoff with the control variate at * time t=0 (no information to condition on).
 double currentDiscountedHedgeGain(int whichDelta, int whichProbability, int nBranch, double fixed_trc, double prop_trc)
          HEDGE ERROR: The discounted profit and loss of hedging a short * position in one call on one share of the underlying along one path of the * underlying.
abstract  double currentDiscountedPayoff()
          Option payoff discounted to time t=0 and computed from the current * discounted price path of the underlying.
 double discountedAnalyticPrice(int t)
          Discounted option price C(t).
 RandomVariable discountedHedgeGain(int whichDelta, int whichProbability, int nBranch, double fixed_trc, double prop_trc)
          The hedge gain as a random variable.
 double discountedMonteCarloPrice(double precision, double confidence, int nSignChange)
          Monte Carlo price at time t=0 * with price paths of the underlying simulated until desired precision is * reached with desired confidence.
 double discountedMonteCarloPrice(int nPath)
          Monte Carlo option price at time t=0.
 double discountedMonteCarloPrice(int t, double precision, double confidence, int nSignChange)
          Monte Carlo price at time t computed as a conditional expectation * conditioned on information available at time t * with price paths of the underlying simulated until desired precision is * reached with desired confidence.
 double discountedMonteCarloPrice(int t, int nPath)
          Monte Carlo price at time t computed as a conditional expectation * conditioned on information available at time t * and computed from a sample of nPath (branches of) the price path of the * underlying.
 RandomVariable discountedPayoff()
          The discounted option payoff as a random variable.
 double[] get_C()
          Reference to the array C[ ] containing the discounted option * price path.
 double get_dt()
          Size of time step.
 int get_T()
          Number of time steps to horizon.
 Asset get_underlying()
          Reference to the underlying asset.
 java.lang.String getName()
          The name of the option (a string).
 boolean hasAnalyticPrice()
          True if and analytic formula for the option price * is implemented, false otherwise.
 double minimumVarianceDelta(int whichProbability, int t, int nPath)
          The minimum variance delta at time t (see file "HedgeWeights.ps") * minimizing the squared hedge error over the next time step.
 double minimumVarianceDelta(int whichProbability, int t, int nPath, Trigger rebalance)
          Same as minimumVarianceDelta(int,int,int) but the * hedge is rebalanced when the next hedge trade is triggered and the * squared error minimized over the stochastic time interval until * the next hedge trade.
 double monteCarloDelta(int t, int nPath)
          The Monte Carlo delta at time t (see file "HedgeWeights.ps").
 void newDiscountedPricePath(int whichProbability, int nPath)
          Computes one path of the underlying S and a corresponding path C of the * option (discounted prices).
 double quotientDelta(int t, int nPath)
          Weight w=E^P_t(\DeltaC(t))/E^P_t(\DeltaS(t)) mich makes the * conditional mean of the hedge error between hedge trades equal to zero.
 double quotientDelta(int t, int nPath, Trigger rebalance)
          Same as quotientDelta(int,int) but the * hedge is rebalanced when the next hedge trade is triggered.
 boolean underlyingIsCVA()
          Returns true if the underlying is a * ConstantVolatilityAsset, false otherwise.
 boolean underlyingIsDividendFreeCVA()
          Returns true if the underlying is a dividend free * ConstantVolatilityAsset, false otherwise.
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

MARKET_PROBABILITY

public static final int MARKET_PROBABILITY
Flag indicating probability controlling paths of the underlying.

See Also:
Constant Field Values

RISK_NEUTRAL_PROBABILITY

public static final int RISK_NEUTRAL_PROBABILITY
Flag indicating probability controlling paths of the underlying.

See Also:
Constant Field Values

MINIMUM_VARIANCE_DELTA

public static final int MINIMUM_VARIANCE_DELTA
Flag identifying hedge weights.

See Also:
Constant Field Values

ANALYTIC_MINIMUM_VARIANCE_DELTA

public static final int ANALYTIC_MINIMUM_VARIANCE_DELTA
Flag identifying hedge weights.

See Also:
Constant Field Values

MONTE_CARLO_DELTA

public static final int MONTE_CARLO_DELTA
Flag identifying hedge weights.

See Also:
Constant Field Values

ANALYTIC_DELTA

public static final int ANALYTIC_DELTA
Flag identifying hedge weights.

See Also:
Constant Field Values

QUOTIENT_DELTA

public static final int QUOTIENT_DELTA
Flag identifying hedge weights.

See Also:
Constant Field Values

ANALYTIC_QUOTIENT_DELTA

public static final int ANALYTIC_QUOTIENT_DELTA
Flag identifying hedge weights.

See Also:
Constant Field Values
Constructor Detail

Option

public Option(Asset asset,
              java.lang.String name)

Constructor, does not initialize the option price path. * This is left to the concrete subclasses which can * decide wether analytic price formulas are available or not.

* * @param asset the underlying asset. * @param name name of the option.

Method Detail

get_T

public int get_T()
Number of time steps to horizon.


get_dt

public double get_dt()
Size of time step.


get_C

public double[] get_C()
Reference to the array C[ ] containing the discounted option * price path.


getName

public java.lang.String getName()
The name of the option (a string).


get_underlying

public Asset get_underlying()
Reference to the underlying asset.


hasAnalyticPrice

public boolean hasAnalyticPrice()
True if and analytic formula for the option price * is implemented, false otherwise.


underlyingIsCVA

public boolean underlyingIsCVA()
Returns true if the underlying is a * ConstantVolatilityAsset, false otherwise. *


underlyingIsDividendFreeCVA

public boolean underlyingIsDividendFreeCVA()
Returns true if the underlying is a dividend free * ConstantVolatilityAsset, false otherwise. *


currentDiscountedPayoff

public abstract double currentDiscountedPayoff()
Option payoff discounted to time t=0 and computed from the current * discounted price path of the underlying.


discountedPayoff

public RandomVariable discountedPayoff()
The discounted option payoff as a random variable. * Underlying is modelled in the risk neutral probability.


controlledDiscountedPayoff

public ControlledRandomVariable controlledDiscountedPayoff()

The discounted payoff as a controlled random variable using the * default control variate. * Underlying is modelled in the risk neutral probability.


conditionalControlVariateCorrelation

public double conditionalControlVariateCorrelation(int t,
                                                   int nPaths)

Correlation of the discounted payoff with the control * variate conditioned on information * available at time t. * Underlying is modelled in the risk neutral probability.

* *

This method is used only to examine the quality of a control variate. * thus we forgo efficiency and simply reduce it to a random vector * correlation computation.

* * @param t current time. * @param nPaths number of paths generated to estimate the correlation.


controlVariateCorrelation

public double controlVariateCorrelation(int nPaths)

Correlation of the discounted payoff with the control variate at * time t=0 (no information to condition on). * Underlying is modelled in the risk neutral probability.

* *

Unconditional version of * conditionalControlVariateCorrelation(int,int).


discountedAnalyticPrice

public double discountedAnalyticPrice(int t)

Discounted option price C(t). Implementation at this level * is an error message and program exit. Overridden in subclasses where a * nontrivial implementation is possible.

* * @param t current time.


analyticDelta

public double analyticDelta(int t)

Delta dC/dS computed from discounted analytic price * C(t) Implementation at this level * is an error message and program exit. Overridden in subclasses where a * nontrivial implementation is possible.

* * @param t current time.


analyticTheta

public double analyticTheta(int t)

Theta dC/dt computed from discounted analytic price * C(t). Implementation at this level * is an error message and program exit. Overridden in subclasses where a * nontrivial implementation is possible.

* * @param t current time.


analyticVega

public double analyticVega(int t)

Vega dC/dsigma computed from discounted analytic price * C(t). Implementation at this level * is an error message and program exit. Overridden in subclasses where a * nontrivial implementation is possible.

* * @param t current time.


analyticGamma

public double analyticGamma(int t)

Gamma d^2C/dS^2 computed from discounted analytic price * C(t). Implementation at this level * is an error message and program exit. Overridden in subclasses where a * nontrivial implementation is possible.

* * @param t current time.


analyticSGamma

public double analyticSGamma(int t)

S(t)*Gamma(t). It's not defined here like that since it * is often easier to implement than Gamma(t) and can then be used to * implement Gamma(t). Implementation at this level * is an error message and program exit. Overridden in subclasses where a * nontrivial implementation is possible.

* * @param t current time.


analyticThetaDelta

public double analyticThetaDelta(int t)

Theta of delta dDelta/dt computed from discounted analytic * price C(t). Implementation at this level * is an error message and program exit. Overridden in subclasses where a * nontrivial implementation is possible.

* * @param t current time.


discountedMonteCarloPrice

public double discountedMonteCarloPrice(int t,
                                        int nPath)

Monte Carlo price at time t computed as a conditional expectation * conditioned on information available at time t * and computed from a sample of nPath (branches of) the price path of the * underlying.

* *

No standard deviation is computed so we do not need to pay attention to * the fact that paths of the uderlying may come in groups of dependent paths * (sign changes in standard normal increments).

* * @param t current time (determines information to condition on). * @param nPath number of path branches used to compute the option price.


discountedMonteCarloPrice

public double discountedMonteCarloPrice(int nPath)

Monte Carlo option price at time t=0.

* * @param nPath number of asset price paths used to compute the option price.


discountedMonteCarloPrice

public double discountedMonteCarloPrice(int t,
                                        double precision,
                                        double confidence,
                                        int nSignChange)

Monte Carlo price at time t computed as a conditional expectation * conditioned on information available at time t * with price paths of the underlying simulated until desired precision is * reached with desired confidence.

* *

Note: underlying.newPathBranch simulates asset price paths in groups of * dependent paths of size * sampleGroupsize=underlying.nSignChange.

* * @param t current time (determines information to condition on). * @param precision absolute error bound. * @param confidence probability with which the precision is reached. * @nSignChange size of groups of dependent price paths of the underlying.


discountedMonteCarloPrice

public double discountedMonteCarloPrice(double precision,
                                        double confidence,
                                        int nSignChange)

Monte Carlo price at time t=0 * with price paths of the underlying simulated until desired precision is * reached with desired confidence.

* *

See discountedMonteCarloPrice(int,double,double,int) .

* * @param precision absolute error bound. * @param confidence probability with which the precision is reached. * @nSignChange size of groups of dependent price paths of the underlying.


controlledDiscountedMonteCarloPrice

public double controlledDiscountedMonteCarloPrice(int t,
                                                  int nPath)

Monte Carlo price at time t computed using the * default control variate.

* *

Same discountedMonteCarloPrice(int,int) using the * default control variate.

* * @param t current time. * @param nPath number of asset price path branches simulated.


controlledDiscountedMonteCarloPrice

public double controlledDiscountedMonteCarloPrice(int nPath)

Monte Carlo price at time t=0 computed using the * default control variate.

* *

Same as controlledDiscountedMonteCarloPrice(int,int) * at time t=0.

* * @param nPath number of asset price path branches simulated.


controlledDiscountedMonteCarloPrice

public double controlledDiscountedMonteCarloPrice(int t,
                                                  double precision,
                                                  double confidence,
                                                  int nSignChange)

Monte Carlo price at time t using the * default control variate * with price paths of the underlying simulated until desired precision is * reached with desired confidence.

* *

Same as controlledDiscountedMonteCarloPrice(int,int) * but paths simulated until desired precision is reached with desired * confidence.

* *

Note: underlying.newPathBranch simulates asset price paths in groups of * dependent paths of size * sampleGroupsize=underlying.nSignChange.

* * @param t current time (determines information to condition on). * @param precision absolute error bound. * @param confidence probability with which the precision is reached. * @nSignChange size of groups of dependent price paths of the underlying.


controlledDiscountedMonteCarloPrice

public double controlledDiscountedMonteCarloPrice(double precision,
                                                  double confidence,
                                                  int nSignChange)

Monte Carlo price at time t=0 using the * default control variate * with price paths of the underlying simulated until desired precision is * reached with desired confidence.

* *

Same as * controlledDiscountedMonteCarloPrice(int,double,double,int) * at time t=0.

* * @param precision absolute error bound. * @param confidence probability with which the precision is reached. * @nSignChange size of groups of dependent price paths of the underlying.


newDiscountedPricePath

public void newDiscountedPricePath(int whichProbability,
                                   int nPath)

Computes one path of the underlying S and a corresponding path C of the * option (discounted prices).

* * @param whichProbability probability for simulation (risk neutral/market). * @param nPath number of asset price path branches used in the Monte Carlo * computation of the option price at each time step.


minimumVarianceDelta

public double minimumVarianceDelta(int whichProbability,
                                   int t,
                                   int nPath)

The minimum variance delta at time t (see file "HedgeWeights.ps") * minimizing the squared hedge error over the next time step. If * the underlying evolves in the risk neutral probability, the stepwise * hedge error have zero mean and are uncorrelated. In this case these weights * minimize the step wise and cumulative hedge error variance.

* *

It is assumed that a path S of the underlying has been computed * up to time t.

* *

Use for hedges rebalancing at each time step. * No standard deviation is computed so we do not need to pay attention to * the fact that paths of the underlying may come in groups of dependent paths. * It's not efficient here to introduce random variables to compute * the conditional expectations, we do it directly.

* *

WARNING: the computation is extremely slow (O(nPath^2)) if the * underlying evolves in the market probability and no analytic option * price is implemented. Otherwise it is O(nPath).

* * @param whichProbability probability for simulation (risk neutral/market). * @param t current time (time of branching). * @param nPath number of asset price path branches expended on each * conditional expectation.


minimumVarianceDelta

public double minimumVarianceDelta(int whichProbability,
                                   int t,
                                   int nPath,
                                   Trigger rebalance)

Same as minimumVarianceDelta(int,int,int) but the * hedge is rebalanced when the next hedge trade is triggered and the * squared error minimized over the stochastic time interval until * the next hedge trade.

* *

WARNING: the computation is extremely slow (O(nPath^2)) if the * underlying evolves in the market probability and no analytic option * price is implemented. Otherwise it is O(nPath).

* * @param whichProbability probability for simulation (risk neutral/market). * @param t current time (time of branching). * @param nPath number of asset price path branches expended on each * conditional expectation. * @param rebalance triggers the hedge trades.


monteCarloDelta

public double monteCarloDelta(int t,
                              int nPath)

The Monte Carlo delta at time t (see file "HedgeWeights.ps").

* *

It is assumed that a price path of the underlying asset has been * computed up to time t. * No standard deviation is computed so we do not need to pay attention to * the fact that paths of the uderlying may come in groups of dependent paths. * It's not efficient here to introduce random variables to compute * the conditional expectations, we do it directly.

* *

WARNING: this assumes that Z[t]=(W[t+1]-W[t])/sqrt(dt), * where W(t) is the Brownian motion driving the paths of the * underlying. Presently this is correct only for * ConstantVolatilityAssets.

* * @param t current time (time of branching). * @param nPath number of asset price path branches expended on each * conditional expectation.


quotientDelta

public double quotientDelta(int t,
                            int nPath)

Weight w=E^P_t(\DeltaC(t))/E^P_t(\DeltaS(t)) mich makes the * conditional mean of the hedge error between hedge trades equal to zero. * Underlying must evolve in the market probability (otherwise denominator * is zero). Hedge rebalanced at each time step. See the file * "HedgeWeights.ps".

* *

WARNING: the computation is extremely slow (O(nPath^2)) if the * underlying evolves in the market probability and no analytic option * price is implemented. Otherwise it is O(nPath).

* * @param t current time. * @param nPath number of path branches spent on each conditional expectation.


quotientDelta

public double quotientDelta(int t,
                            int nPath,
                            Trigger rebalance)

Same as quotientDelta(int,int) but the * hedge is rebalanced when the next hedge trade is triggered.

* *

WARNING: the computation is extremely slow (O(nPath^2)) if the * underlying evolves in the market probability and no analytic option * price is implemented. Otherwise it is O(nPath).

* * @param t current time. * @param nPath number of path branches spent on each conditional expectation. * @param rebalance triggers the hedge trades.


analyticMinimumVarianceDelta

public double analyticMinimumVarianceDelta(int whichProbability,
                                           int t)

Analytic approximation to the minimumVarianceDelta(int, int, int) hedge * weights. Implemented only if the underlying is a dividend free * ConstantVolatilityAsset. Exits program otherwise. See the file * "HedgeWeights.ps".

* * @param t current time. * @param whichProbability probability (risk neutral/market) for paths of * underlying


analyticQuotientDelta

public double analyticQuotientDelta(int t)

Analytic approximation to the quotientDelta(int, int) hedge * weights. Implemented only if the underlying is a dividend free * ConstantVolatilityAsset. Exits program otherwise. See the file * "HedgeWeights.ps".

* * @param t current time.


currentDiscountedHedgeGain

public double currentDiscountedHedgeGain(int whichDelta,
                                         int whichProbability,
                                         int nBranch,
                                         double fixed_trc,
                                         double prop_trc)

HEDGE ERROR: The discounted profit and loss of hedging a short * position in one call on one share of the underlying along one path of the * underlying.

* *

Price paths of the underlying asset can be simulated in the market * probability or risk neutral probability and the hedge is rebalance at each * time step. More general rebalance policies are implemented in the class * Hedge.

* *

Any one of the hedge weights (deltas) can be specified.

* *

At each time step nonanalytic hedge weights are derived from conditional * expectations. In the case of minimum variance deltas these conditional * expectations are computed in the same probability in which the underlying * asset price paths are simulated. Monte Carlo deltas are always computed * in the risk neutral probability.

* *

In each case the conditional expectations make it necessary to branch * price paths of the underlying asset, a very time consuming activity. * Each branch simulation destroys an existing price path of the underlying * asset from the time of branching forward. * Consequently we cannot simply compute a full path of the underlying and * then move the hedge along this path. Instead we evolve the path * simultaneous with the hedge in single time steps.

* *

The flags whichDelta, whichProbability indicate which type * of deltas are used in the hedge and under which probability the underlying * asset is evolved.

* *

Transaction costs have a fixed and a proportional component. The * fixed component also has to be normalized to cost per one share. * If you transact in lots of 1000 shares and such a trade costs 10 dollars * fixed transaction costs are 10/1000=0.01. The proportional transaction * costs come from bid-ask spread etc., 0.1 is a conservative number. * Transaction costs are assumed to remain constant in today's dollars.

* *

The option price path C[0] must be initialized with the option price at * time zero before this routine is called.

* *

This method is superceded by the more general methods * in the class Hedge (for general options) but should be * left in place since some programs use it.

* * @param whichDelta type of delta employed. * @param whichProbability the probability under which deltas are computed. * @param nBranch number of branches spent on each conditional expectation. * @param fixed_trc fixed transaction costs (normalized to one share). * @param prop_trc proportional transaction costs.


discountedHedgeGain

public RandomVariable discountedHedgeGain(int whichDelta,
                                          int whichProbability,
                                          int nBranch,
                                          double fixed_trc,
                                          double prop_trc)

The hedge gain as a random variable.

* * @param whichDelta type of delta employed. * @param deltaProbability the probability under which deltas are computed. * @param nBranch number of branches spent on each conditional expectation. * @param assetPathProbability probability for asset path simulation. * @param fixed_trc fixed transaction costs (normalized to one share). * @param prop_trc proportional transaction costs.