Переставить уравнение для решения для другой переменной - PullRequest
0 голосов
/ 15 января 2020

Я смотрю на код (функцию) VBA, написанный кем-то другим.

Вот код:

Function EuropeanDelta(StrikePrice, MarketPrice, Volatility, InterestRate As Double, PC As String, ValueDate, ExpiryDate As Date, Optional PriceOrYield As String = "P") As Double

Rem Declare our working variables
  Dim r As Double
  Dim d1 As Double
  Dim d2 As Double
  Dim t As Double
  Dim SqT As Double
Rem End of variable declaration

  If PriceOrYield = "Y" Then
    MarketPrice = 100 - MarketPrice
    StrikePrice = 100 - StrikePrice
    If PC = "C" Then
      PC = "P"
    Else
      PC = "C"
    End If
  End If

Rem Initiase our working variables

  t = (ExpiryDate - ValueDate) / 365
  SqT = Sqr(t)
  r = Application.WorksheetFunction.Ln(1 + InterestRate)

  d1 = (Application.WorksheetFunction.Ln(MarketPrice / StrikePrice) + (Volatility * Volatility * 0.5) * t) / (Volatility * SqT)

Rem Quick logic to deal with Calls or Puts

  If PC = "C" Then
    EuropeanDelta = Exp(-r * t) * Application.WorksheetFunction.NormSDist(d1)
  Else
    EuropeanDelta = -Exp(-r * t) * Application.WorksheetFunction.NormSDist(-d1)
  End If

  If PriceOrYield = "Y" Then
    EuropeanDelta = EuropeanDelta * -1
  End If

End Function

Вся проблема основана на строке «d1». Я хотел бы реорганизовать, чтобы решить для "StrikePrice". Я попытался написать это математически, а затем перестроить, а затем вернуться к VBA.

Ответы [ 2 ]

1 голос
/ 16 января 2020

@ duffymo является верным, но я даю ответ прямо с точки зрения кода VBA

' d1 = (Log(MarketPrice / StrikePrice) + (Volatility * Volatility * 0.5) * t) / (Volatility * Sqr(t))
'
' Volatility * Sqr(t) * d1 = Log(MarketPrice / StrikePrice) + Volatility^2 * t/2
'
' Log(MarketPrice / StrikePrice) = Volatility * Sqr(t) * d1 - Volatility^2 * t/2
'
' MarketPrice / StrikePrice = Exp(Volatility * Sqr(t) * d1 - Volatility^2 * t/2)
'
StrikePrice = MarketPrice / Exp(Volatility * Sqr(t) * d1 - Volatility^2 * t/2)

Другие примечания:

  • Для для краткости замените Application.WorksheetFunction.Ln() на Log()
  • Нет необходимости в кэше SqT = Sqr(t), поскольку он используется только один раз.
  • Для ясности замените Volatility*Volatility на Volatility^2, поскольку внутри он делает то же самое.
1 голос
/ 15 января 2020

Это всего лишь алгебра - математика средней школы.

Делайте это шаг за шагом. Убедитесь, что вы проделали одну и ту же операцию для обеих сторон, чтобы убедиться, что равенство все еще выполняется.

Вот ваше начальное уравнение:

d = {ln(m/s) + v*v*t/2}/(v*sqrt(t))

Умножьте обе стороны на знаменатель RHS:

d*v*sqrt(t) = ln(m/s) + v*v*t/2

Вычтите v*v*t/2 с обеих сторон:

(d*v*sqrt(t) - v*v*t/2) = ln(m/s)

Примените экспоненциальную функцию к обеим сторонам, отметив, что exp(ln(x)) = x:

exp(d*v*sqrt(t) - v*v*t/2) = m/s

Умножьте обе стороны по s:

s*exp(d*v*sqrt(t) - v*v*t/2) = m

Разделите обе стороны на exp(d*v*sqrt(t) - v*v*t/2), чтобы получить желаемый результат:

s = m/exp(d*v*sqrt(t) - v*v*t/2)

Давайте посмотрим, имеет ли эта функция смысл.

В t = 0 знаменатель exp(0) = 1, поэтому цена исполнения равна рыночной цене.

Как и t -> infinity, мы надеемся, что знаменатель станет большим, поэтому s -> zero. Здесь поможет правило L'Hospital.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...