VBAでブラックショールズ #3

oryzaeです。

菅さんが総裁選に出ないと日経平均3万円超え、TOPIXが30年ぶり高値等々、いまひとつわかりにくいものの、少なくとも政治的混乱が早めに収まったということで理解しておきます。政治的な見解を語るつもりは全くないですが、一つの方向に動いたら途中で交代ではなくしっかりやり遂げられるような長期政権が来ることだけを期待しておきます。

さて、VBAで関数ばかり書いているのも飽きてきているので、今回で終わりにさせます。

今回はオプションの世界でよく聞く、デルタ、ガンマといった指標についてまとめて終わらせます。

そもそもの話、どのような指標があって、それが何を意味するかというところだけ簡単に記載です。簡単に記載のためにあまりしっかりとは書けないと思いますが、その辺りはしっかりオプション理論の話を読んでくださいませ。

デルタ:デルタとは原資産価格(日経平均)が1単位(1円)動いたらオプション価格が幾ら変わるかという指標になります。数学的にはオプション価格という関数を原資産価格で偏微分したもの。かなり雑に言えば、30500円行使価格のコールの価格が日経平均30000円のときに400だったとして、日経平均が30100になったら一体コールの価格が幾らになるのかという感じのものです。ただしデルタの値自体が日経平均価格の関数であるために、あくまでも日経平均が30000円近辺だけでの近似値となります。近似値ですが、ある程度のイメージにはなると思うので、自分のオプションが日経平均が100円くらい動くとどれくらいの価格になるのかの参考として使いやすいものです。デルタの値がプラスであれば、日経平均が上がるとありがたいですし、マイナスであれば逆に下がるとありがたいということでいかがでしょうか。

ガンマ:ガンマとは日経平均が1単位(1円)動いたら、デルタがどの程度変化するかを表します。デルタの項で書いた通り、デルタ自体が日経平均の関数になります。あくまでブラックショールズのモデルにおける話ですが。そのデルタをさらに日経平均で偏微分したものがガンマです。ガンマをデルタに加味して、日経平均が100円上がったらオプション価格が幾らになるのかは直感的には使いにくいものですよね。使い方としては、色々な日経オプションを持っているときに、現在の自分のオプションが買って(コールであろうとプットであろうと)いる状態なのか売っている状態なのかを計るために使うような感じです。オプションを買ってもっている場合であれば、基本的には日経平均が大きく動くことがプラスに働く(デルタの正負は別に考える必要ありますが)ということを意味します。高校の数学で覚えていらっしゃる方もいると思います。デルタがオプション価格を日経平均で偏微分したもの、ガンマはそのデルタをさらに日経平均で偏微分したもの。要はガンマはオプション価格を日経平均で二回偏微分したもので、その値が正であれば下に突、負であれば上に突の関数だということを言っている感じです。

セータ(またはシータ):ご存知のようにオプションの価格は満期日を迎えるに従い、どんどん下がります。その理由は簡単で、今日30000円の日経平均が明日35000円になる可能性よりも半年後に35000円になる可能性のほうが高いために、残存期間の長いオプションの方が同じ行使価格であれば高い=残存期間が短くなるにつれてオプション価格は下がっていくということになります。さてセータは何かと言えば、オプション価格が1単位時間の経過でどの程度オプション価格が変動するかを表すものです。上記デルタ・ガンマ同様の話で、オプション価格を時間で偏微分したものとなります。とは言えブラックショールズの式では近似式の関係から時間は年数で表しており、使いにくいので、一般的に1日当たりに直すことが多いようです。ちなみに一般的なヨーロピアンオプションのセータは必ずマイナスになります。あるオプションを買っているときに、何も起こらなければ、それだけオプション価格が減ることを意味します。

ヴェガ:ヴェガはボラティリティ=変動に対する期待値の変化に対してオプション価格がどの程度変化するかを表します。

さて、これらを関数としてVBAで記述していくのですが、もともとのブラックショールズの式がオプション価格を求める式です。これを色々なもので偏微分していくので、引数としてはオプション価格を導いたものと同じものを使おうと思います。もちろん関数の記述の面倒を厭わないのであれば、インプライドボラティリティがの代わりにオプション価格を入れても求めることはできますが、その場合はひとつの関数の中でインプライドボラティリティを求めるという手続きが入ってしまうので、ここでの引数はオプション価格を求めたときと同じものを使っていきます。

デルタ
Delta = N(d1) or -N(-d1) それぞれコールとプット

Function bsDelta(ByVal S As Double, ByVal K As Double, ByVal sigma As Double, ByVal r As Double, ByVal d As Double, ByVal t As Double, ByVal CorP As Integer)
‘ S: 原資産価格 – 例えば日経平均指数
‘ K: オプション行使価格 – 27500とか
‘ sigma: ボラティリティ – ここでは%ではなく、小数点で(30ではなく、0.3)
‘ r: 無リスク金利 – %ではなく、小数点で
‘ d: 配当利回り – %ではなく、小数点で
‘ t: 残存年数 – 残存日数/365
‘ CorP: Call or Put, コール=1, プット=2の整数

Dim d1, nsdD1 As Double
' 残存年数がプラスの場合(SQ日より前)
    If t > 0 Then
        d1 = ((Log(S / K) + (r - d + sigma * sigma / 2) * t)) / (sigma * Sqr(t))
        If CorP = 1 Then
        ' コールのケース
            nsdD1 = WorksheetFunction.NormSDist(d1)
            bsDelta = nsdD1

        Else
        ' プットのケース
            nsdD1 = WorksheetFunction.NormSDist(-d1)
            bsDelta = -nsdD1
        End If
' 残存年数がゼロ以下の場合は適宜エラー処理
    Else
        'エラー処理省略
    End If

End Function

ガンマ(コール・プット共通)

\Gamma :={\frac  {\partial ^{2}C}{\partial S_{t}^{2}}}={\dfrac  {1}{\sigma S_{t}{\sqrt  {T-t}}}}{\frac  {1}{{\sqrt  {2\pi }}}}{\mathrm  {exp}}\left\{-{\frac  {1}{2}}d_{1}^{2}\right\}

Function bsGanma(ByVal S As Double, ByVal K As Double, ByVal sigma As Double, ByVal r As Double, ByVal d As Double, ByVal t As Double, ByVal CorP As Integer)
‘ S: 原資産価格 – 例えば日経平均指数
‘ K: オプション行使価格 – 27500とか
‘ sigma: ボラティリティ – ここでは%ではなく、小数点で(30ではなく、0.3)
‘ r: 無リスク金利 – %ではなく、小数点で
‘ d: 配当利回り – %ではなく、小数点で
‘ t: 残存年数 – 残存日数/365
‘ CorP: Call or Put, コール=1, プット=2の整数

Dim d1, pi As Double
' 円周率
    pi = Atn(1) * 4
' 残存年数がプラスの場合(SQ日より前)
    If t > 0 Then
        d1 = ((Log(S / K) + (r - d + sigma * sigma / 2) * t)) / (sigma * Sqr(t))
        bsGanma = Exp(-0.5 * d1 * d1) / (sigma * S * Sqr(t * 2 * pi))
' 残存年数がゼロ以下の場合は適宜エラー処理
    Else
        'エラー処理省略
    End If

End Function

セータ(コールの場合、プットの時は第一項がプラス、N(d2)がN(-d2)に変わる)

\Theta :={\frac  {\partial C}{\partial t}}=-rKe^{{-r(T-t)}}N(d_{2})-{\dfrac  {\sigma S_{t}}{2{\sqrt  {T-t}}}}{\frac  {1}{{\sqrt  {2\pi }}}}{\mathrm  {exp}}\left\{-{\frac  {1}{2}}d_{1}^{2}\right\}

Function bsTheta(ByVal S As Double, ByVal K As Double, ByVal sigma As Double, ByVal r As Double, ByVal d As Double, ByVal t As Double, ByVal CorP As Integer)
‘ S: 原資産価格 – 例えば日経平均指数
‘ K: オプション行使価格 – 27500とか
‘ sigma: ボラティリティ – ここでは%ではなく、小数点で(30ではなく、0.3)
‘ r: 無リスク金利 – %ではなく、小数点で
‘ d: 配当利回り – %ではなく、小数点で
‘ t: 残存年数 – 残存日数/365
‘ CorP: Call or Put, コール=1, プット=2の整数

Dim d1, d2, nsdD2, pi As Double
pi = Atn(1) * 4
' 残存年数がプラスの場合(SQ日より前)
    If t > 0 Then
        d1 = ((Log(S / K) + (r - d + sigma * sigma / 2) * t)) / (sigma * Sqr(t))
        d2 = ((Log(S / K) + (r - d - sigma * sigma / 2) * t)) / (sigma * Sqr(t))

        If CorP = 1 Then
        ' コールのケース
            nsdD2 = WorksheetFunction.NormSDist(d2)
            bsTheta = -sigma * S * Exp(-d1 * d1 / 2) / (2 * Sqr(2 * t * pi)) - Exp(-r * t) * K * nsdD2
        Else
        ' プットのケース
            nsdD2 = WorksheetFunction.NormSDist(-d2)
            bsTheta = sigma * S * Exp(-d1 * d1 / 2) / (2 * Sqr(2 * t * pi)) - Exp(-r * t) * K * nsdD2
        End If
' 残存年数がゼロ以下の場合は適宜エラー処理
    Else
        'エラー処理省略
    End If
' 一日に換算
    bsTheta = bsTheta / 365

End Function

ヴェガ(コール・プット同じ)

\kappa :={\frac  {\partial C}{\partial \sigma }}=S_{t}{\sqrt  {T-t}}{\frac  {1}{{\sqrt  {2\pi }}}}{\mathrm  {exp}}\left\{-{\frac  {1}{2}}d_{1}^{2}\right\}

Function bsVega(ByVal S As Double, ByVal K As Double, ByVal sigma As Double, ByVal r As Double, ByVal d As Double, ByVal t As Double, ByVal CorP As Integer)
‘ S: 原資産価格 – 例えば日経平均指数
‘ K: オプション行使価格 – 27500とか
‘ sigma: ボラティリティ – ここでは%ではなく、小数点で(30ではなく、0.3)
‘ r: 無リスク金利 – %ではなく、小数点で
‘ d: 配当利回り – %ではなく、小数点で
‘ t: 残存年数 – 残存日数/365
‘ CorP: Call or Put, コール=1, プット=2の整数

Dim d1, d2, nsdD2, pi As Double
pi = Atn(1) * 4
' 残存年数がプラスの場合(SQ日より前)
    If t > 0 Then
        d1 = ((Log(S / K) + (r - d + sigma * sigma / 2) * t)) / (sigma * Sqr(t))
        d2 = ((Log(S / K) + (r - d - sigma * sigma / 2) * t)) / (sigma * Sqr(t))

        bsVega = S * Sqr(t) * Exp(-d1 * d1 / 2) / Sqr(2 * pi)

' 残存年数がゼロ以下の場合は適宜エラー処理
    Else
        'エラー処理省略
    End If
' このままではボラティリティが100%動いたときのものになるので、1%あたりに換算
    bsVega = bsVega / 100

End Function

ほかにも金利回りに対する感応度のロー、特に名づけられてもいないものの配当利回りに対する感応度なんてものも出てきますが、通貨オプションとかでない限りあまり使わないのでここではいったん省略です。で、今回検証しようと思ったのですが、あまりにも長いので、検証はまた次回で。。。

コメント

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