Logo

BlackScholesMerton

Updated 2023-11-16 16:40:23.853000

Syntax

SELECT [westclintech].[wct].[BlackScholesMerton] (
  <@CallPut, nvarchar(4000),>
 ,<@AssetPrice, float,>
 ,<@StrikePrice, float,>
 ,<@TimeToMaturity, float,>
 ,<@RiskFreeRate, float,>
 ,<@DividendRate, float,>
 ,<@Volatility, float,>
 ,<@ReturnValue, nvarchar(4000),>)

Description

Use the scalar function BlackScholesMerton to calculate the price or Greeks of a European option using the Black-Scholes-Merton option pricing formula. The price and Greeks are calculated in closed form.

Arguments

@DividendRate

the annualized, continuously compounded dividend rate over the life of the option. For currency options, @DividendRate should be the foreign risk-free interest rate. @DividendRate is an expression of type float or of a type that can be implicitly converted to float.

@ReturnValue

identifies the calculation to be performed. @ReturnValue is an expression of type nvarchar or of a type that can be implicitly converted to nvarchar. For a full description of the return values, see BlackScholesMertonPriceNGreeks. @ReturnValue is not case-sensitive. The following values are acceptable for @ReturnValue

{"columns":[{"field":"@ReturnValue"},{"field":"Returns"}],"rows":[{"@ReturnValue":"'P' , 'PRICE'","Returns":"Price"},{"@ReturnValue":"'D' , 'DELTA'","Returns":"Delta"},{"@ReturnValue":"'G' , 'GAMMA'","Returns":"Gamma"},{"@ReturnValue":"'T' , 'THETA'","Returns":"Theta"},{"@ReturnValue":"'V' , 'VEGA'","Returns":"Vega"},{"@ReturnValue":"'R' , 'RHO'","Returns":"Rho"},{"@ReturnValue":"'L' , 'LAMBDA'","Returns":"Lambda"},{"@ReturnValue":"'DDDV' , 'VANNA' , 'DVEGADSPOT' , 'DDELTADVOL'","Returns":"DdeltaDvol"},{"@ReturnValue":"'DVV' , 'DDELTADVOLDVOL'","Returns":"DdeltaDvolDvol"},{"@ReturnValue":"'DT' , 'CHARM' , 'DDELTADTIME'","Returns":"DdeltaDtime"},{"@ReturnValue":"'GV' , 'ZOMMA' , 'DGAMMADVOL'","Returns":"DgammaDvol"},{"@ReturnValue":"'GP' , 'GAMMAP'","Returns":"GammaP"},{"@ReturnValue":"'DVDV' , 'VOMMA' , 'VOLGA' , 'DVEGADVOL'","Returns":"DvegaDvol"},{"@ReturnValue":"'VP' , 'VEGAP'","Returns":"VegaP"},{"@ReturnValue":"'PR2' , 'PHIRHO2'","Returns":"PhiRho2"},{"@ReturnValue":"'S' , 'SPEED' , 'DGAMMADSPOT'","Returns":"DgammaDspot"},{"@ReturnValue":"'DX' , 'DELTAX'","Returns":"Delta X"},{"@ReturnValue":"'RND' , 'RISKNEUTRALDENSITY'","Returns":"Risk Neutral Density"},{"@ReturnValue":"'VVV' , 'ULTIMA' , 'DVOMMADVOL'","Returns":"DvommaDvol"},{"@ReturnValue":"'VT' , 'VETA' , 'DVEGADTIME'","Returns":"DvegaDtime"},{"@ReturnValue":"'GT' , 'COLOR' , 'DGAMMADTIME'","Returns":"DgammaDtime"}]}

@RiskFreeRate

the annualized, continuously compounded risk-free rate of return over the life of the option. @RiskFreeRate is an expression of type float or of a type that can be implicitly converted to float.

@TimeToMaturity

the time to expiration of the option, expressed in years. @TimeToMaturity is an expression of type float or of a type that can be implicitly converted to float.

@CallPut

identifies the option as being a call ('C') or a put ('P'). @CallPut is an expression of type nvarchar or of a type that can be implicitly converted to nvarchar.

@StrikePrice

the exercise price of the option. @StrikePrice is an expression of type float or of a type that can be implicitly converted to float.

@Volatility

the volatility of the relative price change of the underlying asset. @Volatility is an expression of type float or of a type that can be implicitly converted to float.

@AssetPrice

the price of the underlying asset. @AssetPrice is an expression of type float or of a type that can be implicitly converted to float.

Return Type

float

Remarks

@Volatility must be greater than zero (@Volatility > 0).

@TimeToMaturity must be greater than zero (@TimeToMaturity > 0).

@AssetPrice must be greater than zero (@AssetPrice > 0).

@StrikePrice must be greater than zero (@StrikePrice > 0).

If @ReturnValue is NULL, then @ReturnValue is set to 'P'.

If @DividendRate is NULL then @DividendRate = 0.

If @RiskFreeRate is NULL @RiskFreeRate = 0.

For pricing American options, use BJERKSUNDSTENSLAND or BINOMIALAMERICAN.

To use the Binomial Tree method for European options, use BINOMIALEURO.

To get the implied volatility (given price), use BLACKSCHOLESMERTONIV.

To calculate the price and all the Greeks, use BLACKSCHOLESMERTONPRICENGREEKS.

Examples

Calculate the price for a call option on 2012-09-04, expiring on 2012-12-15, with a current asset price of 99.5, a strike price of 100 and a volatility of 20%. The risk free rate is 2% and the dividend rate is 0.5%.

SELECT cast(wct.BlackScholesMerton(   'C',                                                --PutCall
                                      99.5,                                               --Asset Price
                                      100,                                                --Strike Price
                                      datediff(d, '2012-09-04', '2012-12-15') / 365.0000, --Time-to-expiry
                                      .02,                                                --Risk Free Rate
                                      .005,                                               --Dividend Rate
                                      .20,                                                --Volatility
                                      'P'                                                 --Return Value
                                  ) as money) as Price;

This produces the following result.

{"columns":[{"field":"Price","headerClass":"ag-right-aligned-header","cellClass":"ag-right-aligned-cell"}],"rows":[{"Price":"4.15"}]}

To calculate the delta for the same option.

SELECT cast(wct.BlackScholesMerton(   'C',                                                --PutCall
                                      99.5,                                               --Asset Price
                                      100,                                                --Strike Price
                                      datediff(d, '2012-09-04', '2012-12-15') / 365.0000, --Time-to-expiry
                                      .02,                                                --Risk Free Rate
                                      .005,                                               --Dividend Rate
                                      .20,                                                --Volatility
                                      'D'                                                 --Return Value
                                  ) as money) as Delta;

This produces the following result.

{"columns":[{"field":"Delta","headerClass":"ag-right-aligned-header","cellClass":"ag-right-aligned-cell"}],"rows":[{"Delta":"0.5173"}]}

In this example we calculate the Call and Put prices for the same option with a series of different asset prices.

SELECT cast(n.S as money) as [Underlying],
       cast(wct.BlackScholesMerton(   'C',                                                --PutCall
                                      n.s,                                                --Asset Price
                                      100,                                                --Strike Price
                                      datediff(d, '2012-09-04', '2012-12-15') / 365.0000, --Time-to-expiry
                                      .02,                                                --Risk Free Rate
                                      .005,                                               --Dividend Rate
                                      .20,                                                --Volatility
                                      'P'                                                 --Return Value
                                  ) as money) as [Call Price],
       cast(wct.BlackScholesMerton(   'P',                                                --PutCall
                                      n.s,                                                --Asset Price
                                      100,                                                --Strike Price
                                      datediff(d, '2012-09-04', '2012-12-15') / 365.0000, --Time-to-expiry
                                      .02,                                                --Risk Free Rate
                                      .005,                                               --Dividend Rate
                                      .20,                                                --Volatility
                                      'P'                                                 --Return Value
                                  ) as money) as [Put Price]
FROM
(
    SELECT 98.5
    UNION ALL
    SELECT 99.0
    UNION ALL
    SELECT 99.5
    UNION ALL
    SELECT 100
    UNION ALL
    SELECT 100.5
    UNION ALL
    SELECT 101
) n(S);

This produces the following result.

{"columns":[{"field":"Underlying","headerClass":"ag-right-aligned-header","cellClass":"ag-right-aligned-cell"},{"field":"Call Price","headerClass":"ag-right-aligned-header","cellClass":"ag-right-aligned-cell"},{"field":"Put Price","headerClass":"ag-right-aligned-header","cellClass":"ag-right-aligned-cell"}],"rows":[{"Underlying":"98.50","Call Price":"3.6518","Put Price":"4.7319"},{"Underlying":"99.00","Call Price":"3.8961","Put Price":"4.477"},{"Underlying":"99.50","Call Price":"4.15","Put Price":"4.2316"},{"Underlying":"100.00","Call Price":"4.4134","Put Price":"3.9957"},{"Underlying":"100.50","Call Price":"4.6861","Put Price":"3.7691"},{"Underlying":"101.00","Call Price":"4.9681","Put Price":"3.5518"}]}

In this example we show all of the return values for an option (which can be more easily done using BLACKSCHOLESMERTONPRICENGREEKS ) .

SELECT n.rv as [Description],
       wct.BlackScholesMerton(   'C',                                                --PutCall
                                 99.5,                                               --Asset Price
                                 100,                                                --Strike Price
                                 datediff(d, '2012-09-04', '2012-12-15') / 365.0000, --Time-to-expiry
                                 .02,                                                --Risk Free Rate
                                 .005,                                               --Dividend Rate
                                 .20,                                                --Volatility
                                 n.rv                                                --Return Value
                             ) as [Value]
FROM
(
    SELECT 'Price'
    UNION ALL
    SELECT 'Delta'
    UNION ALL
    SELECT 'Gamma'
    UNION ALL
    SELECT 'Theta'
    UNION ALL
    SELECT 'Vega'
    UNION ALL
    SELECT 'Rho'
    UNION ALL
    SELECT 'Lambda'
    UNION ALL
    SELECT 'DdeltaDvol'
    UNION ALL
    SELECT 'DdeltaDvolDvol'
    UNION ALL
    SELECT 'DdeltaDtime'
    UNION ALL
    SELECT 'DgammaDvol'
    UNION ALL
    SELECT 'GammaP'
    UNION ALL
    SELECT 'DvegaDvol'
    UNION ALL
    SELECT 'VegaP'
    UNION ALL
    SELECT 'PhiRho2'
    UNION ALL
    SELECT 'DgammaDspot'
    UNION ALL
    SELECT 'DeltaX'
    UNION ALL
    SELECT 'RiskNeutralDensity'
    UNION ALL
    SELECT 'DvommaDvol'
    UNION ALL
    SELECT 'DvegaDtime'
    UNION ALL
    SELECT 'DgammaDtime'
) n(rv);

This produces the following result.

{"columns":[{"field":"Description"},{"field":"Value","headerClass":"ag-right-aligned-header","cellClass":"ag-right-aligned-cell"}],"rows":[{"Description":"Price","Value":"4.15002801072982"},{"Description":"Delta","Value":"0.517263007462764"},{"Description":"Gamma","Value":"0.0378316108959817"},{"Description":"Theta","Value":"-0.022410582448993"},{"Description":"Vega","Value":"0.209333286210361"},{"Description":"Rho","Value":"0.132230118433953"},{"Description":"Lambda","Value":"12.4017643036327"},{"Description":"DdeltaDvol","Value":"0.00120640336138375"},{"Description":"DdeltaDvolDvol","Value":"-1.56126607450338E-05"},{"Description":"DdeltaDtime","Value":"-0.000265884058435201"},{"Description":"DgammaDvol","Value":"-0.00189675260903188"},{"Description":"GammaP","Value":"0.0376424528415018"},{"Description":"DvegaDvol","Value":"-2.86185329331919E-05"},{"Description":"VegaP","Value":"0.418666572420722"},{"Description":"PhiRho2","Value":"-0.143827456785512"},{"Description":"DgammaDspot","Value":"-0.000542407991020922"},{"Description":"DeltaX","Value":"-0.473176412318152"},{"Description":"RiskNeutralDensity","Value":"0.0374542405772943"},{"Description":"DvommaDvol","Value":"-1.55316913764812E-06"},{"Description":"DvegaDtime","Value":"-0.101680055475941"},{"Description":"DgammaDtime","Value":"0.000187137587406527"}]}