【问题标题】:Pricing a European Option using Simulaitons使用模拟为欧式期权定价
【发布时间】:2016-11-23 02:29:19
【问题描述】:

我创建了一个用户表单,该表单允许用户更改与期权定价相关的各种变量(执行价格、波动率等),同时允许用户更改达到价格(或均值)所需的模拟在这种情况下的价格)。但是,一旦我单击 OK 按钮,我就无法在我的代码中调用公共订阅者。任何关于我做错了什么的建议将不胜感激。 [我还在下面添加了我的用户表单的图片]

   Option Explicit
      Private cancel As Boolean

        Public Function ShowInputsDialog(currentPrice As Single, _
        exercisePrice As Single, riskfreeRate As Double, _
        volatility As Single, duration As Single, simulation As Double) As Boolean

    Call Initialize
    Me.Show
    If Not cancel Then

     'Capture the other inputs.
        currentPrice = txtCurrentPrice.Text
        exercisePrice = txtExercisePrice.Text
        riskfreeRate = txtRiskfreeRate.Text
        volatility = txtVolatility.Text
        duaration = txtDuration.Text
        simulation = txtSimulation.Text

     ShowInputsDialog = Not cancel
    Unload Me
    End Function

     Public Sub ErrorCheck()
    ' Perform error checking for user inputs.

    If IsNumeric(currentPrice) = False Or currentPrice < 0 Then
        MsgBox ("Please enter a numeric value for the Current Price")
    End If
    If IsNumeric(exercisePrice) = False Or exercusePrice < 0 Then
         MsgBox ("Please enter a positive numeric value for the exercise price")
    End If
    If IsNumeric(riskfreeRate) = False Then
        MsgBox ("Please enter a numerical value for the risk-free rate")
    End If
    If IsNumeric(volatility) = False Then
        MsgBox ("Please enter a numerical value for the Standard deviation")
    End If
    If IsNumeric(duration) = False Then
        MsgBox ("Please enter a numerical valye for duration")
    End If

    End Sub

    Public Sub Call_Eur(currentPrice As Single, _
        exercisePrice As Single, riskfreeRate As Double, _
        volatility As Single, duration As Single, simulation As Double)
        Dim stockPrice As Single
        Dim CallcashflowTermination As Single
        Dim PutcashflowTermination As Single
        Dim CalldiscountedValue As Double
        Dim PutdiscountedValue As Double
        Dim i As Integer
        Dim CallMean As Double
        Dim PutMean As Double
        Dim arrayCallPrice() As Integer
        Dim arrayPutPrice() As Integer
    For i = 1 To simulation
    ' stock price
    stockPrice = currentPrice * Exp((riskfreeRate - 0.5 * volatility ^ 2) * duration + volatility * Application.WorksheetFunction.Norm_Inv(Rnd(), 0, 1) * Sqr(duration))

    ' option cash flow at termination
    CallcashflowTermination = Application.WorksheetFunction.Max(0, stockPrice - exercisePrice)
    PutcashflowTerminatio = Application.WorksheetFunction.Funciton.Max(0, exercisePrice - stockPrice)

    ' discounted value of the option
    CalldiscountedValue = CallcashflowTermination * Exp(-duration * riskfreeRate)
    PutdiscountedValue = PutcashflowTermination * Exp(-duration * riskfreeRate)

    arrayCallPrice(i) = CalldiscountedValue
    arrayPutPrice(i) = PutdiscountedValue

    CallMean = Application.WorsheetFunction.Average(arrayCallPrice)
    PutMean = Application.WorksheetFunction.Average(arrayPutPrice)

    Next i

    MsgBox "The Call option price is " & CallMean & " the Put option price is " & PutMean

End Sub
 Private Sub CmdCancel_Click()
    Me.Hide
    cancel = True
End Sub

Private Sub CmdOK_Click() '<--- ERROR!!!
Call Call_Eur(currentPrice As Single, _
        exercisePrice As Single, riskfreeRate As Double, _
        volatility As Single, duration As Single, simulation As Double)
End Sub

Private Sub UserForm_Click()

End Sub

【问题讨论】:

  • 您调用 Call_Eur 的方式是错误的语法。调用 sub 时不必定义参数的类型。
  • @A.S.H 当我没有定义参数时,它仍然给我一个语法错误。我还能怎么称呼它?
  • 我认为您需要以不同的方式定义(Dim)变量(exercisePriceriskfreeRate 等),即作为全局范围。

标签: vba excel excel-formula userform finance


【解决方案1】:

大红旗!!!!

调用子程序时。您需要将值传递给它。不重新定义它的参数。

Private Sub CmdOK_Click() '<--- ERROR!!!
    Call Call_Eur(12.50, 13.43, 14, 33.56, 100, 13.67)
End Sub

我更喜欢去掉括号,根本不使用 Call。

Private Sub CmdOK_Click() '<--- ERROR!!!
    Call_Eur 12.50, 13.43, 14, 33.56, 100, 13.67
End Sub

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-27
    • 2021-04-24
    • 2013-02-12
    相关资源
    最近更新 更多