بلک شولز مدل Black-Scholes
مدل Black-Scholes اولین مدل رایج استفاده شده برای قیمت گذاری آپشن است. این مدل برای محاسبه ارزش نظری آپشنهای اروپایی European-Style از قیمت فعلی سهام، سود سهام مورد انتظار، قیمت انجام گزینه، نرخ بهره مورد انتظار، زمان انقضا استفاده میشود.
قیمتگذاری آپشن بسیار پیچیده است زیرا به عوامل مختلف بستگی دارد. این فرمول توسط سه اقتصاددان بزرگ، Fischer Black، Myron Scholes و Robert Merton توسعه داده شده است و شاید بهعنوان بهترین مدل قیمت گذاری موجود در جهان شناخته شود.
این فرمول در مقاله ۱۹۷۳ آنها، بهعنوان قیمت گذاری آپشنها و بدهیهای شرکت، منتشر شده در مجله Journal of Political Economy منتشر شده است. آقای Black درست دو سال قبل از آنکه Scholes و Merton جایزهی نوبل اقتصاد را به دلیل یافتن روش جدید محاسبهی ارزش مشتقات در سال ۱۹۹۷ را به دست آورند، فوت کرد.
فرض مدل Black-Scholes بر این است که:
این آپشن از نوع اروپایی است و تنها در زمان انقضای آن قابل اجرا است. در مدت دورهی زمانی این آپشن هیچ سود سهامی پرداخت نمیشود.
بازارها کارآمد هستند (بهعنوان مثال، حرکتهای بازار نمیتوان پیشبینی کرد).
هزینهی معاملهای در هنگام خرید آپشن وجود ندارد.
نرخ ریسکپذیری و نوسان دارایی پایه شناخته شده و ثابت است.
بازده داراییهای پایه بهصورت نرمال توزیع میشود.
نکته: در حالی که مدل اصلی Black-Scholes اثرات سود سهام پرداخت شده در طول عمر آپشن را نادیده گرفت، این مدل اغلب برای تعیین سود سهام از طریق تعیین ارزش تاریخی سود سهام پیشین، سازگار است.
فرمول Black-Scholes
فرمول نشان داده شده در شکل زیر، متغیرهای زیر را در نظر میگیرد:
قیمت پایه در حال حاضر.
قیمت انجام گزینه آپشن.
زمان تا زمان انقضا، بهعنوان یک درصد از سال بیان میشود.
نوسانات ضمنی.
نرخ بهره بدون ریسک.
این مدل اساسا به دو بخش تقسیم میشود: بخش اول، SN(d1)، تغییر قیمت پایه، افزایش میدهد. این بخشی از فرمول نشان دهنده سود مورد انتظار خرید است. بخش دوم، N (d2) Ke-rt، مقدار فعلی پرداخت قیمت اجرا را پس از انقضا فراهم میکند به لازم به ذکر است مدل Black-Scholes برای آپشنهای اروپایی مورداستفاده قرار میگیرد که میتوان آن را تنها در روز انقضا مورداستفاده قرار داد. همانطور که در معادله نشان داده شده است، مقدار آپشن با در نظر گرفتن تفاوت بین دو بخش محاسبه میشود.
کد بلک شولز به زبان VBA
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
کد بلک شولز به زبان c#
using System; namespace BlackScholes { /// <summary> /// Summary description for BlackSholes. /// </summary> public class BlackSholes { public BlackSholes() { // // TODO: Add constructor logic here // } /* The Black and Scholes (1973) Stock option formula * C# Implementation * uses the C# Math.PI field rather than a constant as in the C++ implementaion * the value of Pi is 3.14159265358979323846 S= Stock price X=Strike price T=Years to maturity r= Risk-free rate v=Volatility */ public double BlackScholes(string CallPutFlag, double S, double X, double T, double r, double v) { double d1 = 0.0; double d2 = 0.0; double dBlackScholes = 0.0; d1 = (Math.Log(S / X) + (r + v * v / 2.0) * T) / (v * Math.Sqrt(T)); d2 = d1 - v * Math.Sqrt(T); if (CallPutFlag == "c") { dBlackScholes = S * CND(d1) - X * Math.Exp(-r * T) * CND(d2); } else if (CallPutFlag == "p") { dBlackScholes = X * Math.Exp(-r * T) * CND(-d2) - S * CND(-d1); } return dBlackScholes; } public double CND(double X) { double L = 0.0; double K = 0.0; double dCND = 0.0; const double a1 = 0.31938153; const double a2 = -0.356563782; const double a3 = 1.781477937; const double a4 = -1.821255978; const double a5 = 1.330274429; L = Math.Abs(X); K = 1.0 / (1.0 + 0.2316419 * L); dCND = 1.0 - 1.0 / Math.Sqrt(2 * Convert.ToDouble(Math.PI.ToString())) * Math.Exp(-L * L / 2.0) * (a1 * K + a2 * K * K + a3 * Math.Pow(K, 3.0) + a4 * Math.Pow(K, 4.0) + a5 * Math.Pow(K, 5.0)); if (X < 0) { return 1.0 - dCND; } else { return dCND; } } } }