Attribute VB_Name = "FINAN_DERIV_IBT_LIBR" '------------------------------------------------------------------------------------- '------------------------------------------------------------------------------------- Option Explicit 'Requires that all variables to be declared explicitly. Option Base 1 'The "Option Base" statement allows to specify 0 or 1 as the 'default first index of arrays. '------------------------------------------------------------------------------------- '------------------------------------------------------------------------------------- 'The Generalized Reduced Gradient Algorithm needed to generate implied ending 'risk-neutral probabilities from a set of actual option prices and 'the backwards recursion needed to solve for the entire implied tree is missing. '------------------------------------------------------------------------------------- '------------------------------------------------------------------------------------- Private PUB_DISC_VAL As Double Private PUB_PROB_VAL As Double Private PUB_SPOT_VAL As Double Private PUB_THEOR_VAL As Double Private PUB_IBT_TREE_MAT As Variant Private PUB_IBT_COEF_MAT As Variant Private PUB_STRIKE_VEC As Variant Private PUB_BID_MARK_VEC As Variant Private PUB_ASK_MARK_VEC As Variant Private PUB_BID_THEOR_VEC As Variant Private PUB_ASK_THEOR_VEC As Variant Private PUB_MID_THEOR_VEC As Variant '************************************************************************************ '************************************************************************************ '© Copyright NicoSystem 2009. All rights reserved by Rafael Nicolas Fermin Cota, 'San Francisco, CA. USA www.rnfc.org 'nfermincota.hba2005@ivey.ca '************************************************************************************ '************************************************************************************ 'FUNCTION : IBT_VALUATION_FUNC 'DESCRIPTION : 'An IBT is a generalization of the Cox, Ross, and Rubinstein 'binomial tree (CRR) for option pricing (CRR [1979]). IBT techniques, like the 'CRR technique, build a binomial tree to describe the evolution of the values 'of an underlying asset. An IBT differs from CRR because the probabilities 'attached to outcomes in the tree are inferred from a collection of actual 'option prices, rather than simply deduced from the behavior of the underlying 'asset. These optionimplied risk-neutral probabilities (or alternatively, the 'closely related risk-neutral state-contingent claim prices) are then available 'to be used to price other options. Stephen Ross asserts that options should be 'spanned by state-contingent claims (Ross [1976]). One implication is that with 'sufficient structure, we should be able to infer state-contingent claim prices 'or a probability density from options prices (Rubinstein [1994, p779]). 'LIBRARY : DERIVATIVES 'GROUP : IBT 'ID : 001 'AUTHOR : RAFAEL NICOLAS FERMIN COTA 'LAST UPDATE : 01/31/2009 '************************************************************************************ '************************************************************************************ Function IBT_VALUATION_FUNC(ByVal SPOT As Double, _ ByVal SIGMA As Double, _ ByVal TENOR As Double, _ ByVal RATE As Double, _ ByVal nSTEPS As Long, _ ByRef STRIKE_RNG As Variant, _ ByRef ASK_RNG As Variant, _ ByRef BID_RNG As Variant, _ ByRef PARAM_RNG As Variant, _ Optional ByRef SIGMA_RNG As Variant, _ Optional ByVal OPTION_FLAG As Integer = 1, _ Optional ByVal GUESS_SIGMA As Double, _ Optional ByVal MIN_IMP_VAL As Double = 0#, _ Optional ByVal MAX_IMP_VAL As Double = 1#, _ Optional ByVal CND_TYPE As Integer = 0, _ Optional ByVal OUTPUT As Integer = 0, _ Optional ByVal nLOOPS As Long = 1000, _ Optional ByVal tolerance As Double = 10 ^ -10, _ Optional ByVal EPSILON As Double = 10 ^ -5) 'Option Strikes, Asks, and Bids (from a broker's web site at close of trade) Dim ii As Long Dim jj As Long Dim kk As Long Dim NROWS As Long Dim ERROR_VAL As Double Dim ASK_VECTOR As Variant Dim BID_VECTOR As Variant Dim TEMP_MATRIX As Variant Dim PARAM_VECTOR As Variant Dim SIGMA_VECTOR As Variant Dim STRIKE_VECTOR As Variant On Error GoTo ERROR_LABEL STRIKE_VECTOR = STRIKE_RNG If UBound(STRIKE_VECTOR, 1) = 1 Then: STRIKE_VECTOR = MATRIX_TRANSPOSE_FUNC(STRIKE_VECTOR) NROWS = UBound(STRIKE_VECTOR, 1) ASK_VECTOR = ASK_RNG If UBound(ASK_VECTOR, 1) = 1 Then: ASK_VECTOR = MATRIX_TRANSPOSE_FUNC(ASK_VECTOR) If NROWS <> UBound(ASK_VECTOR, 1) Then: GoTo ERROR_LABEL BID_VECTOR = BID_RNG If UBound(BID_VECTOR, 1) = 1 Then: BID_VECTOR = MATRIX_TRANSPOSE_FUNC(BID_VECTOR) If NROWS <> UBound(BID_VECTOR, 1) Then: GoTo ERROR_LABEL '------------------------------------------------------------------------------------ PUB_IBT_TREE_MAT = IBT_BINOMIAL_TREE_FUNC(SPOT, SIGMA, TENOR, RATE, nSTEPS) PUB_SPOT_VAL = SPOT PUB_DISC_VAL = Exp(-RATE * TENOR) PUB_STRIKE_VEC = STRIKE_VECTOR PUB_BID_MARK_VEC = BID_VECTOR PUB_ASK_MARK_VEC = ASK_VECTOR ReDim TEMP_MATRIX(1 To NROWS * 2, 1 To (nSTEPS + 1) + 2) kk = 1 For jj = 1 To NROWS * 2 Step 2 For ii = 1 To nSTEPS + 1 TEMP_MATRIX(jj, ii) = _ MAXIMUM_FUNC(PUB_IBT_TREE_MAT(ii, nSTEPS + 1) - _ PUB_STRIKE_VEC(kk, 1), 0) * PUB_DISC_VAL TEMP_MATRIX(jj + 1, ii) = TEMP_MATRIX(jj, ii) Next ii kk = kk + 1 Next jj kk = 1 For jj = 1 To NROWS * 2 Step 2 TEMP_MATRIX(jj, nSTEPS + 2) = "<=" TEMP_MATRIX(jj + 1, nSTEPS + 2) = ">=" TEMP_MATRIX(jj, nSTEPS + 3) = ASK_VECTOR(kk, 1) TEMP_MATRIX(jj + 1, nSTEPS + 3) = BID_VECTOR(kk, 1) kk = kk + 1 Next jj PUB_IBT_COEF_MAT = TEMP_MATRIX ReDim PUB_BID_THEOR_VEC(1 To NROWS, 1 To 1) ReDim PUB_ASK_THEOR_VEC(1 To NROWS, 1 To 1) ReDim PUB_MID_THEOR_VEC(1 To NROWS, 1 To 1) '------------------------------------------------------------------------------------ If IsArray(PARAM_RNG) = True Then '----------------------------------------------------------------------------------- PARAM_VECTOR = PARAM_RNG If UBound(PARAM_VECTOR, 1) = 1 Then: PARAM_VECTOR = MATRIX_TRANSPOSE_FUNC(PARAM_VECTOR) ERROR_VAL = IBT_OBJECTIVE_FUNC(, PARAM_VECTOR) '----------------------------------------------------------------------------------- Else 'Starting Value: CRR Ending Nodal Risk-Neutral Probabilities '----------------------------------------------------------------------------------- ReDim PARAM_VECTOR(1 To nSTEPS + 1, 1 To 1) For ii = 1 To nSTEPS + 1 jj = nSTEPS - ii + 1 PARAM_VECTOR(ii, 1) = COMBINATIONS_FUNC(nSTEPS, jj) * _ (PUB_PROB_VAL ^ jj) * _ ((1 - PUB_PROB_VAL) ^ (nSTEPS - jj)) Next ii ERROR_VAL = IBT_OBJECTIVE_FUNC(, PARAM_VECTOR) '----------------------------------------------------------------------------------- End If '------------------------------------------------------------------------------------ '------------------------------------------------------------------------------------ Select Case OUTPUT '------------------------------------------------------------------------------------ '------------------------------------------------------------------------------------ Case 0 '------------------------------------------------------------------------------------ ReDim TEMP_MATRIX(1 To 6, 1 To NROWS + 1) TEMP_MATRIX(1, 1) = "IBT_PRICE" TEMP_MATRIX(2, 1) = "STRIKE" TEMP_MATRIX(3, 1) = "BID_MARK" TEMP_MATRIX(4, 1) = "BID_THEOR_SPREAD" TEMP_MATRIX(5, 1) = "ASK_MARK" TEMP_MATRIX(6, 1) = "ASK_THEOR_SPREAD" For ii = 1 To NROWS TEMP_MATRIX(1, ii + 1) = PUB_MID_THEOR_VEC(ii, 1) TEMP_MATRIX(2, ii + 1) = PUB_STRIKE_VEC(ii, 1) TEMP_MATRIX(3, ii + 1) = PUB_BID_MARK_VEC(ii, 1) TEMP_MATRIX(4, ii + 1) = PUB_BID_THEOR_VEC(ii, 1) TEMP_MATRIX(5, ii + 1) = PUB_ASK_MARK_VEC(ii, 1) TEMP_MATRIX(6, ii + 1) = PUB_ASK_THEOR_VEC(ii, 1) Next ii '------------------------------------------------------------------------------------ IBT_VALUATION_FUNC = TEMP_MATRIX '------------------------------------------------------------------------------------ Case 1 '------------------------------------------------------------------------------------ '------------------------------------------------------------------------------------ If IsArray(SIGMA_RNG) = True Then '------------------------------------------------------------------------------------ SIGMA_VECTOR = SIGMA_RNG If UBound(SIGMA_VECTOR, 1) = 1 Then: SIGMA_VECTOR = MATRIX_TRANSPOSE_FUNC(SIGMA_VECTOR) For ii = 1 To NROWS If SIGMA_VECTOR(ii, 1) < tolerance Then SIGMA_VECTOR(ii, 1) = _ BLACK_SCHOLES_IMPLIED_VOLATILITY_BISEC_FUNC((BID_VECTOR(ii, 1) + ASK_VECTOR(ii, 1)) / 2, _ SPOT, STRIKE_VECTOR(ii, 1), TENOR, RATE, RATE - 0, _ OPTION_FLAG, GUESS_SIGMA, MIN_IMP_VAL, MAX_IMP_VAL, CND_TYPE) End If Next ii '------------------------------------------------------------------------------------ Else '------------------------------------------------------------------------------------ 1984: ReDim SIGMA_VECTOR(1 To NROWS, 1 To 1) For ii = 1 To NROWS SIGMA_VECTOR(ii, 1) = _ BLACK_SCHOLES_IMPLIED_VOLATILITY_BISEC_FUNC((BID_VECTOR(ii, 1) + ASK_VECTOR(ii, 1)) / 2, _ SPOT, STRIKE_VECTOR(ii, 1), TENOR, RATE, RATE - 0, _ OPTION_FLAG, GUESS_SIGMA, MIN_IMP_VAL, MAX_IMP_VAL, CND_TYPE) Next ii '------------------------------------------------------------------------------------ End If '------------------------------------------------------------------------------------ ReDim TEMP_MATRIX(1 To 12, 1 To NROWS + 1) TEMP_MATRIX(1, 1) = "IBT_PRICE" TEMP_MATRIX(2, 1) = "STRIKE" TEMP_MATRIX(3, 1) = "BID_MARK" TEMP_MATRIX(4, 1) = "BID_THEOR_SPREAD" TEMP_MATRIX(5, 1) = "ASK_MARK" TEMP_MATRIX(6, 1) = "ASK_THEOR_SPREAD" TEMP_MATRIX(7, 1) = "MID_MARK" TEMP_MATRIX(8, 1) = "MID_THEOR_SPREAD" TEMP_MATRIX(9, 1) = "IMPL_SIGMA" TEMP_MATRIX(10, 1) = "BLACK_THEOR" TEMP_MATRIX(11, 1) = "TARG_MODEL" '% error of fit --> Error between mid-spread IBT option and Black-Scholes TEMP_MATRIX(12, 1) = "TARG_MID" '% error of fit --> Error between mid-spread ATM option and Black-Scholes For ii = 1 To NROWS TEMP_MATRIX(1, ii + 1) = PUB_MID_THEOR_VEC(ii, 1) TEMP_MATRIX(2, ii + 1) = PUB_STRIKE_VEC(ii, 1) TEMP_MATRIX(3, ii + 1) = PUB_BID_MARK_VEC(ii, 1) TEMP_MATRIX(4, ii + 1) = PUB_BID_THEOR_VEC(ii, 1) TEMP_MATRIX(5, ii + 1) = PUB_ASK_MARK_VEC(ii, 1) TEMP_MATRIX(6, ii + 1) = PUB_ASK_THEOR_VEC(ii, 1) TEMP_MATRIX(7, ii + 1) = _ (PUB_BID_MARK_VEC(ii, 1) + PUB_ASK_MARK_VEC(ii, 1)) / 2 TEMP_MATRIX(8, ii + 1) = _ (PUB_BID_THEOR_VEC(ii, 1) + PUB_ASK_THEOR_VEC(ii, 1)) / 2 TEMP_MATRIX(9, ii + 1) = SIGMA_VECTOR(ii, 1) TEMP_MATRIX(10, ii + 1) = _ GENERALIZED_BLACK_SCHOLES_FUNC(SPOT, PUB_STRIKE_VEC(ii, 1), _ TENOR, RATE, RATE - 0, SIGMA_VECTOR(ii, 1), OPTION_FLAG, CND_TYPE) TEMP_MATRIX(11, ii + 1) = _ TEMP_MATRIX(10, ii + 1) / TEMP_MATRIX(1, ii + 1) - 1 TEMP_MATRIX(12, ii + 1) = _ TEMP_MATRIX(10, ii + 1) / TEMP_MATRIX(7, ii + 1) - 1 Next ii '------------------------------------------------------------------------------------ IBT_VALUATION_FUNC = TEMP_MATRIX '------------------------------------------------------------------------------------'------------------------------------------------------------------------------------ Case 2 '------------------------------------------------------------------------------------ IBT_VALUATION_FUNC = PUB_IBT_TREE_MAT '------------------------------------------------------------------------------------ Case 3 '------------------------------------------------------------------------------------ IBT_VALUATION_FUNC = PUB_IBT_COEF_MAT '------------------------------------------------------------------------------------ Case 4 '------------------------------------------------------------------------------------ IBT_VALUATION_FUNC = PUB_MID_THEOR_VEC '------------------------------------------------------------------------------------ Case 5 '------------------------------------------------------------------------------------ IBT_VALUATION_FUNC = PUB_BID_THEOR_VEC '------------------------------------------------------------------------------------ Case 6 '------------------------------------------------------------------------------------ IBT_VALUATION_FUNC = PUB_ASK_THEOR_VEC '------------------------------------------------------------------------------------ Case 7 '------------------------------------------------------------------------------------ IBT_VALUATION_FUNC = PUB_THEOR_VAL '------------------------------------------------------------------------------------ Case 8 '------------------------------------------------------------------------------------ IBT_VALUATION_FUNC = ERROR_VAL '------------------------------------------------------------------------------------ Case 9 '------------------------------------------------------------------------------------ IBT_VALUATION_FUNC = PARAM_VECTOR '------------------------------------------------------------------------------------ Case Else '------------------------------------------------------------------------------------ IBT_VALUATION_FUNC = IBT_CONSTRAINT_FUNC(PARAM_VECTOR) '------------------------------------------------------------------------------------ End Select '------------------------------------------------------------------------------------ Exit Function ERROR_LABEL: IBT_VALUATION_FUNC = Err.number End Function '************************************************************************************ '************************************************************************************ '© Copyright NicoSystem 2009. All rights reserved by Rafael Nicolas Fermin Cota, 'San Francisco, CA. USA www.rnfc.org 'nfermincota.hba2005@ivey.ca '************************************************************************************ '************************************************************************************ 'FUNCTION : IBT_BINOMIAL_TREE_FUNC 'DESCRIPTION : Function to build a binomial tree to describe the evolution 'of the values of an underlying asset. 'LIBRARY : DERIVATIVES 'GROUP : IBT 'ID : 002 'AUTHOR : RAFAEL NICOLAS FERMIN COTA 'LAST UPDATE : 01/31/2009 '************************************************************************************ '************************************************************************************ Private Function IBT_BINOMIAL_TREE_FUNC(ByVal SPOT As Double, _ ByVal SIGMA As Double, _ ByVal TENOR As Double, _ ByVal RATE As Double, _ ByVal nSTEPS As Long) Dim ii As Long Dim jj As Long Dim D_VAL As Double Dim P_VAL As Double Dim R_VAL As Double Dim U_VAL As Double Dim TIME_STEP As Double Dim TEMP_MATRIX As Variant On Error GoTo ERROR_LABEL TIME_STEP = TENOR / nSTEPS D_VAL = Exp(-Sqr(TIME_STEP) * SIGMA) 'Per Step R_VAL = Exp(TIME_STEP * RATE) 'Per Step U_VAL = Exp(Sqr(TIME_STEP) * SIGMA) 'Per Step P_VAL = (R_VAL - D_VAL) / (U_VAL - D_VAL) 'Per Step ReDim TEMP_MATRIX(0 To nSTEPS + 1, 0 To nSTEPS + 1) TEMP_MATRIX(0, 0) = "IBT" For ii = 1 To nSTEPS + 1 If ii = 1 Then TEMP_MATRIX(ii, ii) = SPOT Else TEMP_MATRIX(ii, ii) = TEMP_MATRIX(ii - 1, ii - 1) * D_VAL End If For jj = ii + 1 To nSTEPS + 1 TEMP_MATRIX(jj, ii) = "" TEMP_MATRIX(ii, jj) = TEMP_MATRIX(ii, jj - 1) * U_VAL Next jj '------------------------------HEADINGS----------------------------------- TEMP_MATRIX(0, ii) = ii - 1 TEMP_MATRIX(nSTEPS + 1 - ii + 1, 0) = TEMP_MATRIX(0, ii) '------------------------------------------------------------------------- Next ii '------------------------------------------------------------------------- PUB_PROB_VAL = P_VAL IBT_BINOMIAL_TREE_FUNC = TEMP_MATRIX '------------------------------------------------------------------------- Exit Function ERROR_LABEL: IBT_BINOMIAL_TREE_FUNC = Err.number End Function '************************************************************************************ '************************************************************************************ '© Copyright NicoSystem 2009. All rights reserved by Rafael Nicolas Fermin Cota, 'San Francisco, CA. USA www.rnfc.org 'nfermincota.hba2005@ivey.ca '************************************************************************************ '************************************************************************************ 'FUNCTION : IBT_BINOMIAL_TREE_FUNC 'DESCRIPTION : Objective function for IBT Ending Nodal Risk-Neutral Probabilities 'LIBRARY : DERIVATIVES 'GROUP : IBT 'ID : 003 'AUTHOR : RAFAEL NICOLAS FERMIN COTA 'LAST UPDATE : 01/31/2009 '************************************************************************************ '************************************************************************************ Private Function IBT_OBJECTIVE_FUNC( _ Optional ByRef DATA_MATRIX As Variant, _ Optional ByRef PARAM_VECTOR As Variant) Dim ii As Long Dim jj As Long Dim kk As Long Dim NSIZE As Long Dim NROWS As Long Dim nSTEPS As Long Dim ATEMP_SUM As Double Dim BTEMP_SUM As Double Dim TEMP_FACTOR As Double Dim TEMP_MATRIX As Variant On Error GoTo ERROR_LABEL NSIZE = UBound(PARAM_VECTOR, 1) NROWS = UBound(PUB_STRIKE_VEC, 1) nSTEPS = NSIZE - 1 TEMP_MATRIX = PUB_IBT_COEF_MAT kk = 1 For jj = 1 To NROWS ATEMP_SUM = 0 For ii = 1 To NSIZE ATEMP_SUM = ATEMP_SUM + (TEMP_MATRIX(kk, ii) * PARAM_VECTOR(ii, 1)) Next ii PUB_MID_THEOR_VEC(jj, 1) = ATEMP_SUM 'IBT Option Price PUB_ASK_THEOR_VEC(jj, 1) = _ PUB_ASK_MARK_VEC(jj, 1) - PUB_MID_THEOR_VEC(jj, 1) PUB_BID_THEOR_VEC(jj, 1) = _ PUB_MID_THEOR_VEC(jj, 1) - PUB_BID_MARK_VEC(jj, 1) kk = kk + 2 Next jj '------------------------------------------------------------------------------- TEMP_MATRIX = PUB_IBT_TREE_MAT ATEMP_SUM = 0 BTEMP_SUM = 0 For ii = 1 To NSIZE jj = nSTEPS - ii + 1 TEMP_FACTOR = COMBINATIONS_FUNC(nSTEPS, jj) * _ (PUB_PROB_VAL ^ jj) * _ ((1 - PUB_PROB_VAL) ^ (nSTEPS - jj)) ATEMP_SUM = ATEMP_SUM + (PARAM_VECTOR(ii, 1) - TEMP_FACTOR) ^ 2 BTEMP_SUM = BTEMP_SUM + (TEMP_MATRIX(ii, nSTEPS + 1) * PARAM_VECTOR(ii, 1)) Next ii '------------------------------------------------------------------------------- PUB_THEOR_VAL = BTEMP_SUM * PUB_DISC_VAL '------------------------------------------------------------------------------- If IBT_CONSTRAINT_FUNC(PARAM_VECTOR) = False Then BTEMP_SUM = 2 ^ 52 Else BTEMP_SUM = 1 End If If ATEMP_SUM = 0 Then: ATEMP_SUM = 1 IBT_OBJECTIVE_FUNC = ATEMP_SUM * BTEMP_SUM '------------------------------------------------------------------------------- Exit Function ERROR_LABEL: IBT_OBJECTIVE_FUNC = 2 ^ 52 End Function '************************************************************************************ '************************************************************************************ '© Copyright NicoSystem 2009. All rights reserved by Rafael Nicolas Fermin Cota, 'San Francisco, CA. USA www.rnfc.org 'nfermincota.hba2005@ivey.ca '************************************************************************************ '************************************************************************************ 'FUNCTION : IBT_CONSTRAINT_FUNC 'DESCRIPTION : Constraint function for IBT Ending Nodal Risk-Neutral Probabilities 'LIBRARY : DERIVATIVES 'GROUP : IBT 'ID : 004 'AUTHOR : RAFAEL NICOLAS FERMIN COTA 'LAST UPDATE : 01/31/2009 '************************************************************************************ '************************************************************************************ Private Function IBT_CONSTRAINT_FUNC(ByRef PARAM_RNG As Variant) Dim ii As Long Dim NSIZE As Long Dim NROWS As Long Dim TEMP_SUM As Double Dim PARAM_VECTOR As Variant On Error GoTo ERROR_LABEL IBT_CONSTRAINT_FUNC = True '----------------------------------------------------------------------------------- '----------------------------------------------------------------------------------- PARAM_VECTOR = PARAM_RNG If UBound(PARAM_VECTOR, 1) = 1 Then: PARAM_VECTOR = MATRIX_TRANSPOSE_FUNC(PARAM_VECTOR) NSIZE = UBound(PARAM_VECTOR, 1) NROWS = UBound(PUB_STRIKE_VEC, 1) '----------------------------------------------------------------------------------- '----------------------------------------------------------------------------------- For ii = 1 To NROWS '-0.000001 If ((PUB_BID_THEOR_VEC(ii, 1) < -0.000001) Or _ (PUB_ASK_THEOR_VEC(ii, 1) < -0.000001)) Then IBT_CONSTRAINT_FUNC = False Exit Function End If Next ii '----------------------------------------------------------------------------------- TEMP_SUM = 0 For ii = 1 To NSIZE '0.000001 If PARAM_VECTOR(ii, 1) < 0.000001 Then IBT_CONSTRAINT_FUNC = False Exit Function End If TEMP_SUM = TEMP_SUM + PARAM_VECTOR(ii, 1) Next ii '----------------------------------------------------------------------------------- If Abs(TEMP_SUM - 1) > 0.00001 Then 'TEMP_SUM <> 1 IBT_CONSTRAINT_FUNC = False Exit Function End If '----------------------------------------------------------------------------------- If Abs(PUB_THEOR_VAL - PUB_SPOT_VAL) > 0.001 Then '> 0.001 IBT_CONSTRAINT_FUNC = False Exit Function End If '----------------------------------------------------------------------------------- Exit Function ERROR_LABEL: IBT_CONSTRAINT_FUNC = False End Function '************************************************************************************ '************************************************************************************ '© Copyright NicoSystem 2009. All rights reserved by Rafael Nicolas Fermin Cota, 'San Francisco, CA. USA www.rnfc.org 'nfermincota.hba2005@ivey.ca '************************************************************************************ '************************************************************************************ 'FUNCTION : IBT_CONSTRAINT_FUNC 'DESCRIPTION : Jackwerth and Rubinstein 96 objective function 'LIBRARY : DERIVATIVES 'GROUP : IBT 'ID : 005 'AUTHOR : RAFAEL NICOLAS FERMIN COTA 'LAST UPDATE : 01/31/2009 '************************************************************************************ '************************************************************************************ Private Function IBT_SMOOTH_FUNC(ByRef PARAM_RNG As Variant) Dim ii As Long Dim NSIZE As Long Dim TEMP_SUM As Double Dim TEMP_ERR As Double Dim PARAM_VECTOR As Variant Dim tolerance As Double On Error GoTo ERROR_LABEL tolerance = 2 ^ -52 PARAM_VECTOR = PARAM_RNG If UBound(PARAM_VECTOR, 1) = 1 Then: _ PARAM_VECTOR = MATRIX_TRANSPOSE_FUNC(PARAM_VECTOR) NSIZE = UBound(PARAM_VECTOR, 1) TEMP_ERR = IBT_OBJECTIVE_FUNC(, PARAM_VECTOR) TEMP_SUM = ((PARAM_VECTOR(2, 1) - 2 * _ PARAM_VECTOR(1, 1) + tolerance) ^ 2) For ii = 2 To NSIZE - 1 TEMP_SUM = TEMP_SUM + ((PARAM_VECTOR(ii + 1, 1) - 2 * _ PARAM_VECTOR(ii, 1) + PARAM_VECTOR(ii - 1, 1)) ^ 2) Next ii TEMP_SUM = TEMP_SUM + ((tolerance - 2 * PARAM_VECTOR(NSIZE, 1) + _ PARAM_VECTOR(NSIZE - 1, 1)) ^ 2) IBT_SMOOTH_FUNC = TEMP_SUM Exit Function ERROR_LABEL: IBT_SMOOTH_FUNC = Err.number End Function