Main Content

コール オプション価格についてのブラック・ショールズの公式

この例では、ブラック・ショールズの公式を使用してコール オプション価格を計算する方法を示します。この例では、vpasolve を使用して、ブラック・ショールズの公式からスポット価格とインプライド ボラティリティを求める問題を数値的に解きます。

コール オプション価格を求める

ブラック・ショールズの公式は、ヨーロピアン コール オプションの価格をモデル化したものです [1]。配当のない原株について、式のパラメーターが次のように定義されます。

  • S は、現在の株価またはスポット価格。

  • K は、行使価格。

  • σ は、株式の連続複利の年次収益の標準偏差。ボラティリティと呼ばれる。

  • T は、オプションが満期となるまでの期間 (年単位)。

  • r は、年率換算した無リスク金利。

ブラック・ショールズのパラメーターに基づくコール オプションの価格 C は次のようになります。

C=N(d1)×S-N(d2)×PV(K),

ここで

  • d1=1σT[log(SK)+(r+σ22)T]

  • d2=d1-σT

  • PV(K)=Kexp(-rT)

  • N(d) は標準正規累積分布関数で、N(d)=12π-dexp(-t2/2)dt となります。

95 ドルの行使価格で 3 か月で有効期限が切れるヨーロピアン ストック オプションの価格を求めます。原株が無配当で、100 ドルで取引され、ボラティリティが年間 50% であると仮定します。無リスク金利は年間 1% です。

sym を使用して、ブラック・ショールズのパラメーターの値を表現するシンボリック数を作成します。

syms t d
S = sym(100);        % current stock price (spot price)
K = sym(95);         % exercise price (strike price)
sigma = sym(0.50);   % volatility of stock
T = sym(3/12);       % expiry time in years
r = sym(0.01);       % annualized risk-free interest rate

オプション価格を近似なしで計算します。標準正規累積分布関数を表現するシンボリック関数 N(d) を作成します。

PV_K = K*exp(-r*T);
d1 = (log(S/K) + (r + sigma^2/2)*T)/(sigma*sqrt(T));
d2 = d1 - sigma*sqrt(T);
N(d) = int(exp(-((t)^2)/2),t,-Inf,d)*1/sqrt(2*sym(pi))
N(d) = 

erf(2d2)2+12

Csym = N(d1)*S - N(d2)*PV_K
Csym = 

50erf(24log(2019)+272002)-95e-1400erf(24log(2019)-232002)2+12+50

可変精度の数値結果を取得するには、vpa を使用します。既定では、vpa は有効桁数 32 桁の数値を返します。

Cvpa = vpa(Csym)
Cvpa = 12.52792339252145394554497137187

精度を変更するには、digits を使用します。有効桁数 6 桁でのオプション価格は 12.5279 ドルです。

digits(6)
Cvpa = vpa(Csym)
Cvpa = 12.5279

コール オプション価格のプロット

次に、同じストック オプションで、満期までの期間が変わり、日々の株価がわからないとします。満期までの期間 T を 0~0.25 年まで変動させ、スポット価格 S を 50 ドル~140 ドルまで変動させた場合の、このコール オプションの価格を求めます。行使価格 (K)、ボラティリティ (sigma)、および金利 (r) は、前の例の値を使用します。この場合、満期までの期間 T と日々の株価 S を変量として使用します。

シンボリック式 C を定義し、TS を未知の変数として使用してコール オプション価格を表現します。

syms T S

PV_K = K*exp(-r*T);
d1 = (log(S/K) + (r + sigma^2/2)*T)/(sigma*sqrt(T));
d2 = d1 - sigma*sqrt(T);
Nd1 = int(exp(-((t)^2)/2),-Inf,d1)*1/sqrt(2*pi);
Nd2 = int(exp(-((t)^2)/2),-Inf,d2)*1/sqrt(2*pi);
C = Nd1*S - Nd2*PV_K;

スポット価格と満期までの期間の関数としてコール オプション価格をプロットします。

fsurf(C,[50 140 0 0.25])
xlabel('Spot price')
ylabel('Expiry time')
zlabel('Call option price')

満期までの期間 0.1 年、スポット価格 105 ドルで、コール オプション価格を計算します。subs を使用して TS の値を式 C に代入します。vpa を使用して価格を数値結果として返します。

Csym = subs(C,[T S],[0.1 105]);
Cvpa = vpa(Csym)
Cvpa = 12.5868

スポット価格を求める

オプション価格が変化した場合に、原株価にどのような影響があるかを知りたいとします。これは、既知のパラメーター KσTr、および C を与えたブラック・ショールズの公式から S を求める問題です。

たとえば、1 か月後に、同じコール オプション価格が満期までの期間 2 か月で 15.04 ドルで取引されるとします。原株のスポット価格を求めます。未知のパラメーター S をもつブラック・ショールズの公式を表現するシンボリック関数 C(S) を作成します。

syms C(S) d1(S) d2(S) Nd1(S) Nd2(S)

K = 95;         % exercise price (strike price)
sigma = 0.50;   % volatility of stock
T = 2/12;       % expiry time in years
r = 0.01;       % annualized risk-free interest rate

PV_K = K*exp(-r*T);
d1(S) = (log(S/K) + (r + sigma^2/2)*T)/(sigma*sqrt(T));
d2(S) = d1 - sigma*sqrt(T);
Nd1(S) = int(exp(-((t)^2)/2),-Inf,d1)*1/sqrt(2*pi);
Nd2(S) = int(exp(-((t)^2)/2),-Inf,d2)*1/sqrt(2*pi);
C(S) = Nd1*S - Nd2*PV_K;

vpasolve を使用して原株のスポット価格を数値的に解きます。正の数値でのみ解を求めます。原株のスポット価格は 106.162 ドルです。

S_Sol = vpasolve(C(S) == 15.04,S,[0 Inf])
S_Sol = 106.162

インプライド ボラティリティを求める

オプション価格が変化した場合に、インプライド ボラティリティがどうなるか知りたいとします。これは、既知のパラメーター SKTr、および C を与えたブラック・ショールズの公式から σ の値を求める問題です。

95 ドルの行使価格で、3 か月で有効期限が切れる、同じストック オプションを考えます。原株が 100 ドルで取引され、無リスク金利が年間 1% であると仮定します。6 ドル~25 ドルの範囲のオプション価格の関数としてインプライド ボラティリティを求めます。オプション価格の範囲のベクトルを作成します。未知のパラメーター sigma をもつブラック・ショールズの公式を表現するシンボリック関数 C(sigma) を作成します。vpasolve を使用してインプライド ボラティリティを数値的に解きます。

syms C(sigma) d1(sigma) d2(sigma) Nd1(sigma) Nd2(sigma)

S = 100;        % current stock price (spot price)
K = 95;         % exercise price (strike price)
T = 3/12;       % expiry time in years
r = 0.01;       % annualized risk-free interest rate
C_Range = 6:25; % range of option price
sigma_Sol = zeros(size(C_Range));

PV_K = K*exp(-r*T);
d1(sigma) = (log(S/K) + (r + sigma^2/2)*T)/(sigma*sqrt(T));
d2(sigma) = d1 - sigma*sqrt(T);
Nd1(sigma) = int(exp(-((t)^2)/2),-Inf,d1)*1/sqrt(2*pi);
Nd2(sigma) = int(exp(-((t)^2)/2),-Inf,d2)*1/sqrt(2*pi);
C(sigma) = Nd1*S - Nd2*PV_K;
for i = 1:length(C_Range)
    sigma_Sol(i) = vpasolve(C(sigma) == C_Range(i),sigma,[0 Inf]);
end

オプション価格の関数としてインプライド ボラティリティをプロットします。

plot(C_Range,sigma_Sol)
xlabel('Option price')
ylabel('Implied volatility')

参考文献

[1] https://en.wikipedia.org/wiki/Black–Scholes_model

参考

関数