برای دریافت مشاوره با کارشناسان و آموزش مناسب ، با شماره 09177062806 تماس بگیرید
0

کد VBA بلک شولز

کد VBA بلک شولز

کد VBA بلک شولز : مدل بلک-شولز که به مدل بلک شولز مرتون (BSM) نیز معروف است، یکی از مفاهیم مهم در نظریه مالی مدرن است. این معادله ریاضی ارزش نظری مشتقات را بر اساس سایر ابزارهای سرمایه گذاری با در نظر گرفتن تأثیر زمان و سایر عوامل ریسک تخمین می زند. در سال 1973 توسعه یافت و هنوز به عنوان یکی از بهترین روش ها برای قیمت گذاری قرارداد اختیار معامله در نظر گرفته می شود.

مدل بلک شولز، با نام مستعار مدل بلک شولز مرتون (BSM)، یک معادله دیفرانسیل است که به طور گسترده برای قیمت گذاری قراردادهای اختیار معامله استفاده می شود.

مدل بلک شولز به پنج متغیر ورودی نیاز دارد: قیمت اعمال اختیار، قیمت فعلی سهام، زمان تا انقضا، نرخ بدون ریسک و نوسانات.

اگرچه معمولاً دقیق است، اما مدل بلک شولز مفروضات خاصی را ایجاد می کند که می تواند منجر به پیش بینی هایی شود که از نتایج دنیای واقعی متفاوت باشد.

مدل استاندارد BSM فقط برای قیمت گذاری آپشن های اروپایی استفاده می شود، زیرا در نظر نمی گیرد که گزینه های آمریکایی می توانند قبل از تاریخ انقضا اعمال شوند

فرضیات بلک شولز

هیچ سود سهامی در طول عمر اختیار معامله پرداخت نمی شود.

بازارها تصادفی هستند (یعنی حرکات بازار قابل پیش بینی نیست).

هیچ هزینه معامله ای در خرید اختیار وجود ندارد.

نرخ بدون ریسک و نوسانات دارایی پایه مشخص و ثابت است.

بازده دارایی پایه معمولاً توزیع می شود.

این اختیار اروپایی است و فقط در انقضا قابل استفاده است.

:Guide

Stock : قیمت سهم پایه

 Exercise : قیمت اعمال

Time : زمان باقی مانده تا سررسید

Interest : سود بانکی یا انتظار بازدهی

Divyield : سود تقسیمی

Sigma : نوسان پذیری

Function dOne(stock, exercise, Time, _
interest, divyield, sigma)
    dOne = (Log(stock / exercise) + _
    (interest - divyield) * Time) / _
    (sigma * Sqr(Time)) + 0.5 * sigma * _
    Sqr(Time)
End Function

Function dTwo(stock, exercise, Time, _
interest, divyield, sigma)
    dTwo = dOne(stock, exercise, Time, _
    interest, divyield, sigma) - sigma * _
    Sqr(Time)
End Function

Function BSMertonCall(stock, exercise, Time, _
interest, divyield, sigma)
    BSMertonCall = stock * Exp(-divyield * _
    Time) * Application.NormSDist _
    (dOne(stock, exercise, Time, _
    interest, divyield, sigma)) - exercise * _
    Exp(-Time * interest) * Application.NormSDist _
    (dTwo(stock, exercise, Time, interest, _
    divyield, sigma))
End Function

'Put pricing function uses put-call
'parity theorem
Function BSMertonPut(stock, exercise, Time, _
interest, divyield, sigma)
    BSMertonPut = BSMertonCall(stock, exercise, _
    Time, interest, divyield, sigma) + _
    exercise * Exp(-interest * Time) - _
    stock * Exp(-divyield * Time)
End Function

'The standard normal probability density,
'this is N'(x)
Function normaldf(X)
    normaldf = Exp(-X ^ 2 / 2) / _
    (Sqr(2 * Application.Pi()))
End Function

Function DeltaCall(stock, exercise, Time, _
interest, divyield, sigma)
    DeltaCall = Exp(-divyield * Time) * _
    Application.NormSDist(dOne(stock, exercise, _
    Time, interest, divyield, sigma))
End Function

Function DeltaPut(stock, exercise, Time, _
interest, divyield, sigma)
    DeltaPut = -Exp(-divyield * Time) * _
    Application.NormSDist(-dOne(stock, _
    exercise, Time, interest, divyield, _
    sigma))
End Function

Function OptionGamma(stock, exercise, Time, _
interest, divyield, sigma)
    temp = dOne(stock, exercise, Time, _
    interest, divyield, sigma)
    OptionGamma = Exp(-divyield * Time) * _
    Application.Norm_S_Dist(temp, 0) / _
    (stock * sigma * Sqr(Time))
End Function

Function Vega(stock, exercise, Time, _
interest, divyield, sigma)
    Vega = stock * Sqr(Time) * _
    normaldf(dOne(stock, exercise, _
    Time, interest, divyield, sigma)) _
    * Exp(-divyield * Time)
End Function
Function ThetaCall(stock, exercise, Time, interest, divyield, sigma)

    ThetaCall = -stock * normaldf _
    (dOne(stock, exercise, Time, _
    interest, divyield, sigma)) * _
    sigma * Exp(-divyield * Time) / _
    (2 * Sqr(Time)) + divyield * stock * _
    Application.NormSDist(dOne(stock, _
    exercise, Time, interest, _
    divyield, sigma)) * Exp(-divyield * Time) _
    - interest * exercise * Exp(-interest * _
    Time) * Application.NormSDist _
    (dTwo(stock, exercise, Time, _
    interest, divyield, sigma))

   
End Function

Function ThetaPut(stock, exercise, Time, _
interest, divyield, sigma)
    ThetaPut = -stock * normaldf _
    (dOne(stock, exercise, _
    Time, interest, divyield, sigma)) * _
    sigma * Exp(-divyield * Time) / _
    (2 * Sqr(Time)) - divyield * stock _
    * Application.NormSDist(-dOne(stock, _
    exercise, Time, interest, divyield, _
    sigma)) * Exp(-divyield * Time) _
    + interest * exercise * Exp _
    (-interest * Time) * Application.NormSDist _
    (-dTwo(stock, exercise, Time, _
    interest, divyield, sigma))
End Function

Function RhoCall(stock, exercise, Time, _
interest, divyield, sigma)
    RhoCall = exercise * Time * _
    Exp(-interest * Time) * _
    Application.NormSDist(dTwo _
    (stock, exercise, Time, interest, _
    divyield, sigma))
End Function

Function RhoPut(stock, exercise, Time, _
interest, divyield, sigma)
    RhoPut = -exercise * Time * _
    Exp(-interest * Time) * _
    Application.NormSDist(-dTwo _
    (stock, exercise, Time, interest, _
    divyield, sigma))
End Function



 

 

 

 

5/5 - (8 امتیاز)
دیدگاه کاربران
  • babaksabbaghi 9 خرداد 1402

    سلام جناب زارع گرامی
    از کد بالا استفاده قابل توجهی در محاسباتم کردم ، ممنون از توضیحات تکمیلی که اضافه کردین
    سپاس از اینکه دانشتون و در اختیار عموم قرار میدین
    در توابع نوشته شده ، theta جواب درست و برنمیگردونه ، و با ماشین حساب فرابورس متفاوت است
    چند بار چک کردم دیتای آرگمان ها رو درست وارد کردم ،
    نمیدونم من دارم اشتباه میکنم یا کد ایراد داره
    در اکسل دیده بان اکسل ، شما از Metric_Theta استفاده میکنید که دیتای درست و بر میگردونه
    ولی در کد بالا ThetaCall وThetaPut جواب و اشتباه بر میگردونه ،
    سپاسگذارم

  • babaksabbaghi 9 خرداد 1402

    با سلام
    خیلی از توابع که در کد بالا نوشتید ، مشخص هست ، ولی بعضی ها رو نتونستم پیدا کنم ، مثلا برای لامبدا نمیدونم تابعی هست در لیست بالا یا خیر

ارسال دیدگاه