PR

オプション取引シミュレーターを作る

オプション取引
Photo by Sean Sinclair on Unsplash
記事内に広告が含まれています。

本稿では、Excel VBAのFunctionプロシージャーの機能を用いて、オプション価格とボラティリティを計算するシミュレーターを作る。

オプション価格シミュレーターを作る

配当込みのコールのオプション価格の公式は、次のように表されることは別稿で示した。

\(\quad C=SN(d_1)-Ke^{-r(T-t)} N(d_2) \)

ただし、

\(\quad N(z)=\dfrac{1}{\sqrt{2\pi}}\displaystyle\int_{-\infty}^{z}e^{-\frac{y^2}{2}}dy \)

\(\quad d_1=\dfrac{ln(\dfrac{S}{K})+(r+\dfrac{\sigma^2}{2})(T-t)}{\sigma\sqrt{T-t}}\)

\(\quad d_2=\dfrac{ln(\dfrac{S}{K})+(r-\dfrac{\sigma^2}{2})(T-t)}{\sigma\sqrt{T-t}}=d_1-\sigma\sqrt{T-t}\)

\(\quad S\):原資産価格、\(K\):権利行使価格、\(r\):無リスク利子率、\(\sigma\):ボラティリティ、

\(\quad T\):満期日、\(t\):現在

本稿では、Excel VBAのFunctionプロシージャーの機能を用いて、自作の関数F_CallValueを作成した。VBAコードは以下の通りである。

Function F_CallValue(myS As Double, myK As Double, myR As Double, myQ As Double, myV As Double, _
myT As Double) As Double

Dim myD1 As Double, myD2 As Double

 If myT = 0 Then

  myT = 0.000001

 End If

myD1 = (Log(myS / myK) + (myR - myQ + (myV) ^ 2 / 2) * myT) / (myV * Sqr(myT))
myD2 = (Log(myS / myK) + (myR - myQ - (myV) ^ 2 / 2) * myT) / (myV * Sqr(myT))

F_CallValue = Exp(-myQ * myT) * myS * WorksheetFunction.Norm_S_Dist(myD1, True) _
- Exp(-myR * myT) * myK * WorksheetFunction.Norm_S_Dist(myD2, True)

End Function

なお、標準正規分布の累積分布関数\(N(z)\)は、VBAコードでは以下のように記述する。worksheetfunction.norm_s_dist(z,true)

オプション価格の公式のパラメーターとVBAコードの変数との対応関係は、以下の通りである。

\(\quad d_1⇔myD_1\)、\(d_2⇔myD_2\)、\(S⇔myS\)、\(K⇔myK\)、\(r⇔myR\)、

\(\quad q⇔myQ\)、\(\sigma⇔myV\)

\(T\)と\(t\)は、扱いやすさの観点からVBAコードでは\(\tau=T-t\)と置き換え、変数\(myT\)とした。

6~10行目のコードは、\(\tau=0\)になるとコールオプション価格の公式でエラーとなることを、回避するためである。


Excelスプレッドシートに、日経225オプションを例に、2026年9月限のコールオプション価格を計算した。

各パラメーターはセルD2~D8、権利行使価格\(K\)はC列12行目以降、設定日\(t\)は11行目D列以降、\(\tau=T-t\)は10行目D列以降に記載した。

なお、無リスク利子率\(r=\)0.0285、配当利回り\(q=\)0.0161とした。2026年8月22日の取引終了後の原資産価格\(S=\)66,010円、権利行使価格66,000円でのボラティリティ\(\sigma=\)0.3087とした。

権利行使価格\(K\)と\(\tau=T-t\)との各交点に、先ほど作成した自作関数F_CallValueを使用して、コールオプション価格を計算したので、以下に示した。水色の網掛け部分が計算したコールオプション価格である。このように、自作関数を使用することで、簡単に複数のオプション価格を、同時に計算することができる。


自作関数F_CallValueは配当込みのコールオプション価格のみの計算しかできないため、配当込みのプットオプション価格も同じ式で計算できるようにする自作関数F_OptionValueを作成した。以下にVBAコードは以下の通りである。

Function F_OptionValue(myType As String, myS As Double, myK As Double, myR As Double, myQ As Double, _
 myV As Double, myT As Double) As Double

Dim myD1 As Double, myD2 As Double

    If myT = 0 Then

    myT = 0.000001

    End If

myD1 = (Log(myS / myK) + (myR - myQ + ((myV) ^ 2) / 2) * myT) / (myV * Sqr(myT))
myD2 = (Log(myS / myK) + (myR - myQ - ((myV) ^ 2) / 2) * myT) / (myV * Sqr(myT))

    Select Case myType
    
    Case Is = "Call"
    
        F_OptionValue = Exp(-myQ * myT) * myS * WorksheetFunction.Norm_S_Dist(myD1, True) _
        - Exp(-myR * myT) * myK * WorksheetFunction.Norm_S_Dist(myD2, True)
    
    Case Is = "Put"
    
        F_OptionValue = -Exp(-myQ * myT) * myS * WorksheetFunction.Norm_S_Dist(-myD1, True) _
        + Exp(-myR * myT) * myK * WorksheetFunction.Norm_S_Dist(-myD2, True)
        
    End Select

End Function

第1パラメーターにオプションタイプ(コールかプットか)(myType\)を追加した。15~27行目でオプションタイプ毎に計算できるようにした。

ボラティリティシミュレーターを作る

オプション価格は、計算に必要なパラメーターが揃っていれば、解析的に求めることができる。一方、ボラティリティは解析解が無いため、収束計算により近似値を求めることになる。

収束計算の方法として二分法やニュートン・ラフソン法等があるが、本稿では、ニュートン・ラフソン法を収束計算に用いた。

ニュートン・ラフソン法とは、適当においた\(x_1\)での\(f(x)\)の接線\(f'(x_1)\)と\(x\)軸との交点\(x_2\)を先ず求める。次に\(x_2\)での\(f(x)\)の接線\(f'(x_2)\)と\(x\)軸との交点\(x_3\)を求める。この操作を繰り返し行い、\(x_4\)、\(x_5\)、・・・と順番に求め、関数\(f(x)\)が0となる\(x\)を求める方法である。


\(f(x)\)は(コールオプションの公式)-(コールオプションの価格)とし、\(f'(x)\)はコールオプション\(C\)のボラティリティ\(\sigma\)での偏微分関数であるベガ\(\mathcal V\)として、前述と同様に、Excel VBAのFunctionプロシージャーの機能を用いて、自作の関数F_Volatilityを作成した。

VBAコードは以下の通りである。

Function F_Volatility(myType As String, myS As Double, myK As Double, myR As Double, myQ As Double, _
 myOV As Double, myT As Double) As Double

Dim myV1 As Double, myV2 As Double, myOV1 As Double, myDV1 As Double, k As Long

    myV1 = 10

    Do
        myOV1 = F_OptionValue(myType, myS, myK, myR, myQ, myV1, myT) - myOV
        
        myDV1 = F_Vega(myType, myS, myK, myR, myQ, myV1, myT) * 100
        
        myV2 = myV1 - myOV1 / myDV1
    
        myV1 = myV2
    
    Loop While myOV1 > 0.000001
 
F_Volatility = myV1

End Function

なお、自作関数のパラメーターのうち、\(myOV\)はオプション価格である。その他は、前述のパラメーターと同じである。

ベガ\(\mathcal V\)については、別途、自作関数F_Vegaを作成して、使用した。


ボラティリティの設定について

前述のオプション価格の計算において、ボラティリティを全ての権利行使価格で同じ値を設定した。ボラティリティは実際には下に凸となる曲線となる。人が笑った時の口の形に見えることからボラティリティスマイルと呼ぶ。

日経225オプションを例に説明する。8月22日の取引終了後の2026年9月限のコールオプション価格より、各権利行使価格のボラティリティを計算したので、データと共にグラフに示した。

なお、各パラメーターはセルD2~D9、権利行使価格\(K\)はC列12行目以降、コールオプション価格\(C\)はD列12行目以降、計算したボラティリティ\(\sigma\)はE列12行目以降に記載した。権利行使価格によりボラティリティが変化する様子が分かる。


各権利行使価格\(K\)のボラティリティ\(\sigma\)を計算し、前述のコールオプション価格\(C\)の計算をし直したのが、以下である。なお、ボラティリティはB列12行目以降に記載しているが、各権利行使価格のコールオプション価格から計算したボラティリティの回帰曲線より求めた。

また、上記の結果を、横軸を権利行使価格\(K\)、縦軸にコールオプション価格\(C\)として、プロットしたのが下のグラフである。日数が経過して、SQ日の9月11日に近づくにつれ、時間価値が減り、本質的価値に近づいていく様子がわかる。


プロのオプショントレーダーや熱心なオプショントレーダーは、独自にボラティリティを設定して、オプション取引に利用している筆者は毎週末のオプション価格からボラティリティを算出して、翌週の取引に活用している。

【オプション投資に関する免責事項】
本ブログで発信している情報は、オプション取引の仕組みや戦略に関する情報提供を目的としており、特定の取引を推奨・勧誘するものではありません。

オプション取引は高いレバレッジ効果により、短期間で手元資金を上回る非常に大きな損失が発生するリスクがあります。特にオプションの「売り(ショート)」戦略には原理的に無限大の損失リスクが存在します。

実際の取引にあたっては、取引ルールやリスクを十分に理解された上で、必ずご自身の判断と自己責任において行ってください。本ブログの情報に基づいて被ったいかなる損害・損失についても、当方は一切の責任を負いかねます。

タイトルとURLをコピーしました