کد 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
Visitor Rating: 5 Stars
سلام جناب زارع گرامی
از کد بالا استفاده قابل توجهی در محاسباتم کردم ، ممنون از توضیحات تکمیلی که اضافه کردین
سپاس از اینکه دانشتون و در اختیار عموم قرار میدین
در توابع نوشته شده ، theta جواب درست و برنمیگردونه ، و با ماشین حساب فرابورس متفاوت است
چند بار چک کردم دیتای آرگمان ها رو درست وارد کردم ،
نمیدونم من دارم اشتباه میکنم یا کد ایراد داره
در اکسل دیده بان اکسل ، شما از Metric_Theta استفاده میکنید که دیتای درست و بر میگردونه
ولی در کد بالا ThetaCall وThetaPut جواب و اشتباه بر میگردونه ،
سپاسگذارم
برای هر یک روز محاسبه میشه
با سلام
خیلی از توابع که در کد بالا نوشتید ، مشخص هست ، ولی بعضی ها رو نتونستم پیدا کنم ، مثلا برای لامبدا نمیدونم تابعی هست در لیست بالا یا خیر
کدام؟