BinomialTree
Updated: 15 Dec 2013
Use the table-valued function BinomialTree to return the option value, intrinsic value, and underlying value for each node on a binomial tree for an American or European option.
Syntax
SELECT * FROM [wctOptions].[wct].[BinomialTree](
<@CallPut, nvarchar(4000),>
,<@AssetPrice, float,>
,<@StrikePrice, float,>
,<@TimeToMaturity, float,>
,<@RiskFreeRate, float,>
,<@DividendRate, float,>
,<@Volatility, float,>
,<@nSteps, int,>
,<@AmEur, nvarchar(4000),>)
Arguments
@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.
@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.
@StrikePrice
the exercise price of the option. @Strike 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. @Time is an expression of type float or of a type that can be implicitly converted to float.
@RiskFreeRate
the annualized, continuously compounded risk-free rate of return over the life of the option. @RiskFree is an expression of type float or of a type that can be implicitly converted to float.
@DividendRate
the annualized, continuously compounded dividend rate over the life of the option. For currency options, @Div should be the foreign risk-free interest rate. @Div 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.
@NumberOfSteps
the number of steps in the binomial tree. @NumberOfSteps is an expression of type int or of a type that can be implicitly converted to int.
@AmEur
identifies the option as being American ('A') or European ('E'). @AmEur is an expression of type nvarchar or of a type that can be implicitly converted to nvarchar.
Return Types
RETURNS TABLE (
[node] [int] NULL,
[stepno] [int] NULL,
[underlying] [float] NULL,
[intrinsic] [float] NULL,
[price] [float] NULL
)
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).
· @Strike must be greater than zero (@Strike > 0).
· If @DividendRate is NULL then @DividendRate is set to zero.
· If @RiskFreeRate is NULL then @RiskFreeRate is set to zero.
Examples
Calculate the price for an American 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%. The number of steps is 10.
SELECT *
FROM wct.BinomialTree(
'C' --@CallPut
,99.5 --@AssetPrice
,100 --@StrikePrice
,datediff(d,'2012-09-04','2012-12-15') / 365.0000 --@TimeToMaturity
,.02 --@RiskFreeRate
,.005 --@DividendRate
,.20 --@Volatility
,10 --@NumberOfSteps
,'E' --@AmEur
)
This produces the following result which has been reformatted for presentation purposes.
node
|
stepno
|
underlying
|
intrinsic
|
price
|
0
|
0
|
99.5
|
0
|
4.103311265
|
0
|
1
|
96.22834929
|
0
|
2.392745577
|
1
|
1
|
102.882883
|
2.882882987
|
5.83283543
|
0
|
2
|
93.06427344
|
0
|
1.181236385
|
1
|
2
|
99.5
|
0
|
3.617105639
|
2
|
2
|
106.38078
|
6.380780018
|
8.073703831
|
0
|
3
|
90.00423528
|
0
|
0.444198037
|
1
|
3
|
96.22834929
|
0
|
1.925784612
|
2
|
3
|
102.882883
|
2.882882987
|
5.326677766
|
3
|
3
|
109.9976014
|
9.997601434
|
10.85284203
|
0
|
4
|
87.04481397
|
0
|
0.096901257
|
1
|
4
|
93.06427344
|
0
|
0.794907303
|
2
|
4
|
99.5
|
0
|
3.068312001
|
3
|
4
|
106.38078
|
6.380780018
|
7.609971526
|
4
|
4
|
113.7373905
|
13.73739053
|
14.13510512
|
0
|
5
|
84.18270113
|
0
|
0
|
1
|
5
|
90.00423528
|
0
|
0.194724294
|
2
|
5
|
96.22834929
|
0
|
1.401018234
|
3
|
5
|
102.882883
|
2.882882987
|
4.753039094
|
4
|
5
|
109.9976014
|
9.997601434
|
10.49941749
|
5
|
5
|
117.604328
|
17.60432805
|
17.81716633
|
0
|
6
|
81.41469717
|
0
|
0
|
1
|
6
|
87.04481397
|
0
|
0
|
2
|
6
|
93.06427344
|
0
|
0.391300916
|
3
|
6
|
99.5
|
0
|
2.420779915
|
4
|
6
|
106.38078
|
6.380780018
|
7.110202129
|
5
|
6
|
113.7373905
|
13.73739053
|
13.92885641
|
6
|
6
|
121.6027369
|
21.6027369
|
21.75810355
|
0
|
7
|
78.73770771
|
0
|
0
|
1
|
7
|
84.18270113
|
0
|
0
|
2
|
7
|
90.00423528
|
0
|
0
|
3
|
7
|
96.22834929
|
0
|
0.786324108
|
4
|
7
|
102.882883
|
2.882882987
|
4.07166649
|
5
|
7
|
109.9976014
|
9.997601434
|
10.18221376
|
6
|
7
|
117.604328
|
17.60432805
|
17.72257196
|
7
|
7
|
125.7370869
|
25.73708695
|
25.8519225
|
0
|
8
|
76.1487401
|
0
|
0
|
1
|
8
|
81.41469717
|
0
|
0
|
2
|
8
|
87.04481397
|
0
|
0
|
3
|
8
|
93.06427344
|
0
|
0
|
4
|
8
|
99.5
|
0
|
1.58012818
|
5
|
8
|
106.38078
|
6.380780018
|
6.588679916
|
6
|
8
|
113.7373905
|
13.73739053
|
13.81732919
|
7
|
8
|
121.6027369
|
21.6027369
|
21.68047788
|
8
|
8
|
130.012
|
30.01200003
|
30.08739136
|
0
|
9
|
73.6449001
|
0
|
0
|
1
|
9
|
78.73770771
|
0
|
0
|
2
|
9
|
84.18270113
|
0
|
0
|
3
|
9
|
90.00423528
|
0
|
0
|
4
|
9
|
96.22834929
|
0
|
0
|
5
|
9
|
102.882883
|
2.882882987
|
3.175287438
|
6
|
9
|
109.9976014
|
9.997601434
|
10.03810777
|
7
|
9
|
117.604328
|
17.60432805
|
17.6437716
|
8
|
9
|
125.7370869
|
25.73708695
|
25.77539422
|
9
|
9
|
134.4322551
|
34.43225514
|
34.46934756
|
0
|
10
|
71.22338864
|
0
|
0
|
1
|
10
|
76.1487401
|
0
|
0
|
2
|
10
|
81.41469717
|
0
|
0
|
3
|
10
|
87.04481397
|
0
|
0
|
4
|
10
|
93.06427344
|
0
|
0
|
5
|
10
|
99.5
|
0
|
0
|
6
|
10
|
106.38078
|
6.380780018
|
6.380780018
|
7
|
10
|
113.7373905
|
13.73739053
|
13.73739053
|
8
|
10
|
121.6027369
|
21.6027369
|
21.6027369
|
9
|
10
|
130.012
|
30.01200003
|
30.01200003
|
10
|
10
|
139.0027937
|
39.00279372
|
39.00279372
|
Since the purpose of the function is to show all the nodes it can return quite a number of rows. The number of row returned will be ((@NumberOfSteps + 2) / 2) * (@NumberOfSteps + 1).
In this example, we PIVOT the price values.
SELECT stepno,[0],[1],[2],[3],[4],[5],[6],[7],[8],[9],[10]
FROM (
SELECT k.stepno
,k.node
,ROUND(k.price,2) as price
FROM wct.BinomialTree(
'C' --Call/Put
,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
,10 --Number of Steps
,'E'
)k
)d
PIVOT
(SUM(price) FOR NODE IN([0],[1],[2],[3],[4],[5],[6],[7],[8],[9],[10])) as P
This produces the following result which has been reformatted for ease of viewing.
stepno
|
0
|
1
|
2
|
3
|
4
|
5
|
6
|
7
|
8
|
9
|
10
|
0
|
4.1
|
NULL
|
NULL
|
NULL
|
NULL
|
NULL
|
NULL
|
NULL
|
NULL
|
NULL
|
NULL
|
1
|
2.39
|
5.83
|
NULL
|
NULL
|
NULL
|
NULL
|
NULL
|
NULL
|
NULL
|
NULL
|
NULL
|
2
|
1.18
|
3.62
|
8.07
|
NULL
|
NULL
|
NULL
|
NULL
|
NULL
|
NULL
|
NULL
|
NULL
|
3
|
0.44
|
1.93
|
5.33
|
10.85
|
NULL
|
NULL
|
NULL
|
NULL
|
NULL
|
NULL
|
NULL
|
4
|
0.1
|
0.79
|
3.07
|
7.61
|
14.14
|
NULL
|
NULL
|
NULL
|
NULL
|
NULL
|
NULL
|
5
|
0
|
0.19
|
1.4
|
4.75
|
10.5
|
17.82
|
NULL
|
NULL
|
NULL
|
NULL
|
NULL
|
6
|
0
|
0
|
0.39
|
2.42
|
7.11
|
13.93
|
21.76
|
NULL
|
NULL
|
NULL
|
NULL
|
7
|
0
|
0
|
0
|
0.79
|
4.07
|
10.18
|
17.72
|
25.85
|
NULL
|
NULL
|
NULL
|
8
|
0
|
0
|
0
|
0
|
1.58
|
6.59
|
13.82
|
21.68
|
30.09
|
NULL
|
NULL
|
9
|
0
|
0
|
0
|
0
|
0
|
3.18
|
10.04
|
17.64
|
25.78
|
34.47
|
NULL
|
10
|
0
|
0
|
0
|
0
|
0
|
0
|
6.38
|
13.74
|
21.6
|
30.01
|
39
|