さて、とりあえずこれでオプション・プレミアム(価格)の理論価格を計算することは出来るようになったはずです。
つまりそのオプションが何日後にいくらになるだとか、日経平均株価がどれぐらい動いたらいくらになっているとか…。
それが出来れば損益シミュレーションは出来るようになりますよね。
ただ今回作成した関数『CallFV』と『PutFV』という関数には5つの引数がありました。
残存日数, 現指数, 権利行使価格, 金利, IV
の5つです。
最初の3つは問題ないでしょう。
では最後の2つ、『金利』と『IV』はどの数値を入れればいいのでしょうか?
どちらも日経新聞のマーケット欄に出ているっちゃあ出ているのですが。
金利はどの数値が適当であるかは正直なんとも…。
昔はCD3ヵ月ものを入れていました。
金融機関などで一般的な資金調達手段として使われている金利が適当でしょう。
例えばTIBORとか。
ま、金利水準自体がエライ低いのでそれほどナーバスになる必要はありませんが(^^ゞ
で、問題なのは『IV』です。
『そもそもIVって何?』
っていう人のためにちょっと解説しておきましょう。
IV=インプライド・ボラティリティ
これはオプション・プレミアム(価格)から導き出されるボラティリティです。
つまり市場は今、変動リスクをどの程度織り込んでオプション・プレミアム(価格)を形成しているか、ということを計るものです。
一方で、ボラティリティには『HV(ヒストリカル・ボラティリティ)』というものがあります。
こちらは過去の値動きから変動率を計算したものです。
とりあえずこの二つを計算する関数をここでは紹介しましょう。
やり方は引き続き必殺『コピペ』でいきましょう(笑)
Function HVola(データ範囲)
Step1 = 0
Step2 = 0
データ数 = 0
For Each c In データ範囲
データ数 = データ数 + 1
データ位置 = c.Column
当日位置 = c.Row
当日値 = c.Value
前日位置 = 当日位置 - 1
前日値 = Cells(前日位置, データ位置).Value
式1 = Application.Ln(当日値 / 前日値)
Step1 = Step1 + 式1
Next
Step1 = Step1 / データ数
For Each c In データ範囲
データ位置 = c.Column
当日位置 = c.Row
当日値 = c.Value
前日位置 = 当日位置 - 1
前日値 = Cells(前日位置, データ位置).Value
式1 = Application.Ln(当日値 / 前日値)
式2 = (式1 - Step1) ^ 2
Step2 = Step2 + 式2
Next
Step3 = Step2 / (データ数 - 1)
Step4 = Step3 * 365
HVola = Sqr(Step4) * 100
End Function
この「=Hvola(データ範囲)」関数は選択範囲の期間ボラティリティを計算するためのものです。
使い方で注意して欲しいのは、前日からの変動を元に計算するため、欲しいデータ期間+1のデータが必要になる点です。
例えば、10日の期間ボラティリティを計算する場合は11日分以上のデータ期間が必要になります。
図のような感じです。
で、この図のB14のセルには
『=Hvola(B3:B12)』
とい数式が入っています。
B2に一つデータを残しておくのがポイントです(もっとうまく関数作れよという話もありますが、15年以上も前に作ったものなのでご容赦を(^^ゞ)。
もう一つの「IV」は、計算式による解ではなく、近似解を導き出すやり方で関するを作ってあります。あまりに以上な数値や近似解を導き出せなかった場合は、20%という数値を表示するように設定してあります。
さぁ、ここでも『コピペ』でサクサクッといきましょう(^^)
Function CallIV(プレミアム, 残存日数, 現指数, 権利行使価格, 金利)
If IsError(プレミアム) = False Then
If IsError(現指数) = False Then
If IsNumeric(プレミアム) = True Then
If 残存日数 <= 0 Then
CallIV = 0
ElseIf 現指数 = 0 Then
CallIV = 0
ElseIf 権利行使価格 = 0 Then
CallIV = 0
ElseIf プレミアム <= 0 Then
CallIV = 0
Else
IV = 0.2
許容誤差 = 0.01
試験値 = 0
Counter = 1
Do While Abs(プレミアム - CallFv(残存日数, 現指数, 権利行使価格, 金利, IV)) > 許容誤差
If Vega(残存日数, 現指数, 権利行使価格, 金利, IV) = 0 Then
IV = 0
Exit Do
End If
IV = IV + (プレミアム - CallFv(残存日数, 現指数, 権利行使価格, 金利, IV)) / Vega(残存日数, 現指数, 権利行使価格, 金利, IV) / 100
Counter = Counter + 1
If Counter = 200 Then Exit Do
Loop
CallIV = IV
End If
Else
CallIV = 0
End If
End If
End If
If Abs(プレミアム - CallFv(残存日数, 現指数, 権利行使価格, 金利, IV)) > 許容誤差 Then
CallIV = 0.2
End If
End Function
Function PutIV(プレミアム, 残存日数, 現指数, 権利行使価格, 金利)
If IsError(プレミアム) = False Then
If IsError(現指数) = False Then
If IsNumeric(プレミアム) = True Then
If 残存日数 <= 0 Then
PutIV = 0
ElseIf 現指数 = 0 Then
PutIV = 0
ElseIf 権利行使価格 = 0 Then
PutIV = 0
ElseIf プレミアム <= 0 Then
PutIV = 0
Else
IV = 0.2
許容誤差 = 0.01
試験値 = 0
Counter = 1
Do While Abs(プレミアム - PutFv(残存日数, 現指数, 権利行使価格, 金利, IV)) > 許容誤差
If Vega(残存日数, 現指数, 権利行使価格, 金利, IV) = 0 Then
IV = 0
Exit Do
End If
IV = IV + (プレミアム - PutFv(残存日数, 現指数, 権利行使価格, 金利, IV)) / Vega(残存日数, 現指数, 権利行使価格, 金利, IV) / 100
Counter = Counter + 1
If Counter = 200 Then Exit Do
Loop
End If
PutIV = IV
Else
PutIV = 0
End If
End If
End If
If Abs(プレミアム - PutFv(残存日数, 現指数, 権利行使価格, 金利, IV)) > 許容誤差 Then
PutIV = 0.2
End If
End Function
CallとPutで使う式が違います。
必要項目は『プレミアム, 残存日数, 現指数, 権利行使価格, 金利』の5つです。
繰り返しになりますがオプションの世界でプレミアムといえば、オプション価格のことです。
図のように数値を入力しました。
10000円コールのプレミアムは140円、残存日数は22日、現指数は9768.08円、権利行使価格は10000円、金利0.1%。
B8のセルには
『=CallIV(B2,B3,B4,B5,B6)』
という数式が入っています。
何もしないと0.2459…という数値になってしまうので、書式で%表示に直してあります。
ちなみに5つの項目をどれか異常な数値を入れてみてください。
20%という形に変わるはずです(異常値が出た場合の対応として)。
これで2つのボラティリティ
『ヒストリカル・ボラティリティ』と『インプライド・ボラティリティ』を計算できるようになりました(^^)