【相場雑感】オプション・プライシング実践編②~プレミアム
とりあえずやってみましょう!
ここで必要になるのは金融工学でもプログラミングでもなく、『コピペ(コピー&ペースト)』という必殺技です(笑)
まずExcelで新規のワークブックを作ってください。
念のため、セキュリティレベルを確認し、マクロを有効にしておいてください。セキュリティ・レベルは「中」ぐらいがいいでしょうか。
そしてVisual Basic Editerを開いて、「挿入」→「標準モジュール」を選択してください。

とりあえずこんな感じになります。
真っさらな「標準モジュール」が出てきます。
そこに下記のややこしそうな部分を『コピペ』してください。
Function CallFv(残存日数, 現指数, 権利行使価格, 金利, IV)
If IsError(現指数) = False Then
If 残存日数 <= 0 Then
CallFv = 0
ElseIf 現指数 <= 0 Then
CallFv = 0
ElseIf 権利行使価格 <= 0 Then
CallFv = 0
ElseIf IV = 0 Then
CallFv = 現指数 - 権利行使価格
Else
Step0 = Application.Ln(現指数 / 権利行使価格)
Step1 = 残存日数 / 365
Step2 = (Step0 + (金利 + IV ^ 2 / 2) * Step1) / (IV * Sqr(Step1))
Step3 = Step2 - IV * Sqr(Step1)
Step4 = Application.NormSDist(Step2)
Step5 = Application.NormSDist(Step3)
Step6 = Exp(-金利 * Step1)
Step7 = 現指数 * Step4 - 権利行使価格 * Step6 * Step5
CallFv = Int(Step7 * 100 + 0.5) / 100
End If
Else
CallFv = 0
End If
End Function
Function PutFv(残存日数, 現指数, 権利行使価格, 金利, IV)
If IsError(現指数) = False Then
If 残存日数 <= 0 Then
PutFv = 0
ElseIf 現指数 <= 0 Then
PutFv = 0
ElseIf 権利行使価格 <= 0 Then
PutFv = 0
ElseIf IV = 0 Then
PutFv = 権利行使価格 - 現指数
Else
Step0 = Application.Ln(現指数 / 権利行使価格)
Step1 = 残存日数 / 365
Step2 = (Step0 + (金利 + IV ^ 2 / 2) * Step1) / (IV * Sqr(Step1))
Step3 = Step2 - IV * Sqr(Step1)
Step4 = Application.NormSDist(Step2)
Step5 = Application.NormSDist(Step3)
Step6 = Exp(-金利 * Step1)
Step7 = 現指数 * Step4 - 権利行使価格 * Step6 * Step5
Step8 = Step7 - 現指数 + 権利行使価格 * Step6
PutFv = Int(Step8 * 100 + 0.5) / 100
End If
Else
PutFv = 0
End If
End Function
VBAでは
Sub ○○○
End Sub
で作られる一定の処理をするプログラムと今回のように
Function ○○○()
End Function
で作られる「関数」があります。
この関数はExcelのワークシート上で何かを計算するときに使います。
例えばいくつかのセルにある数値を平均するときは
=Average(A1:A5)
といった具合に入力すれば、その範囲(ここではA1:A5)の数字の平均値が計算されます。
ここで作った二つの関数はコール・オプションとプット・オプションの価格を計算するプログラムです。
引数はあえて分かりやすいように日本語を使いました。
で、Excelのワークブックの方に戻り、こんな感じで入力してみてください。
A列にあるのは単なる見出し(=変数名)です。

そしてB列に数字を入力してみましょう。
とりあえずこのブログ作成時点で次のSQまで22日(残存期間)あるので、B2のセルには「22」という数字を入力します。
次にB3のセルには金曜日の日経平均株価の終値「9768.08」を入力します。
B4のセルには「10000(権利行使価格10000円)」
B5のセルには「0.1%(金利)」
B6のセルには「25%(IV)」
これらをただ入力しておいてください。
金利もIVもあくまで試しということで。
そして肝心なのはここから
B8のセルに以下の数式を入力してみてください。
=CallFv(B2,B3,B4,B5,B6)
すると「143.69」という数字が表示されるはずです。

こんな感じ(^^)
うまく数字が表示されない場合は、
マクロのセキュリティレベルが高くて有効になっていないか、違うワークブックにマクロ(標準モジュール)が作られてしまっているなどの理由が考えられます。
で、うまくいったと仮定して…
関数の説明をしましょう。
例えば、B2のセル「22」を「12」に変更してみてください。
するとB8のセルの数値は「86.28」に変わるはずです。
つまり10日後のオプション価格はこのように変化すると予測されるのです。
これまでの説明で出てきた「タイム・ディケイ(時間的価値の減少)」です。
逆に日数はそのまま「22」にして、現指数のところを「10500」に変更してみてください。
するとB8のセルは「576.73」に変わるはずです。
つまり日経平均株価が10500円まで上昇した場合、10000円の権利行使価格のオプション・プレミアム(価格)は576.73円になると予測されるのです。
もうお分かりですね。
このように数値を変更するだけで、コール・オプションの価格がどう変化するかを計算することができます。
プット・オプションの場合は「=Putfv()」という関数を使ってください。
これをいくつか組み合わせていけば、オプションのプレミアム(価格)の変化をシミュレーションしていくことができます。
複数のオプションでポジションを組んでいたとしても、それぞれを計算し、そのポジションに照らし合わせれば、ポジションの損益推移を予想することができるのです。
ここで必要になるのは金融工学でもプログラミングでもなく、『コピペ(コピー&ペースト)』という必殺技です(笑)
まずExcelで新規のワークブックを作ってください。
念のため、セキュリティレベルを確認し、マクロを有効にしておいてください。セキュリティ・レベルは「中」ぐらいがいいでしょうか。
そしてVisual Basic Editerを開いて、「挿入」→「標準モジュール」を選択してください。

とりあえずこんな感じになります。
真っさらな「標準モジュール」が出てきます。
そこに下記のややこしそうな部分を『コピペ』してください。
Function CallFv(残存日数, 現指数, 権利行使価格, 金利, IV)
If IsError(現指数) = False Then
If 残存日数 <= 0 Then
CallFv = 0
ElseIf 現指数 <= 0 Then
CallFv = 0
ElseIf 権利行使価格 <= 0 Then
CallFv = 0
ElseIf IV = 0 Then
CallFv = 現指数 - 権利行使価格
Else
Step0 = Application.Ln(現指数 / 権利行使価格)
Step1 = 残存日数 / 365
Step2 = (Step0 + (金利 + IV ^ 2 / 2) * Step1) / (IV * Sqr(Step1))
Step3 = Step2 - IV * Sqr(Step1)
Step4 = Application.NormSDist(Step2)
Step5 = Application.NormSDist(Step3)
Step6 = Exp(-金利 * Step1)
Step7 = 現指数 * Step4 - 権利行使価格 * Step6 * Step5
CallFv = Int(Step7 * 100 + 0.5) / 100
End If
Else
CallFv = 0
End If
End Function
Function PutFv(残存日数, 現指数, 権利行使価格, 金利, IV)
If IsError(現指数) = False Then
If 残存日数 <= 0 Then
PutFv = 0
ElseIf 現指数 <= 0 Then
PutFv = 0
ElseIf 権利行使価格 <= 0 Then
PutFv = 0
ElseIf IV = 0 Then
PutFv = 権利行使価格 - 現指数
Else
Step0 = Application.Ln(現指数 / 権利行使価格)
Step1 = 残存日数 / 365
Step2 = (Step0 + (金利 + IV ^ 2 / 2) * Step1) / (IV * Sqr(Step1))
Step3 = Step2 - IV * Sqr(Step1)
Step4 = Application.NormSDist(Step2)
Step5 = Application.NormSDist(Step3)
Step6 = Exp(-金利 * Step1)
Step7 = 現指数 * Step4 - 権利行使価格 * Step6 * Step5
Step8 = Step7 - 現指数 + 権利行使価格 * Step6
PutFv = Int(Step8 * 100 + 0.5) / 100
End If
Else
PutFv = 0
End If
End Function
VBAでは
Sub ○○○
End Sub
で作られる一定の処理をするプログラムと今回のように
Function ○○○()
End Function
で作られる「関数」があります。
この関数はExcelのワークシート上で何かを計算するときに使います。
例えばいくつかのセルにある数値を平均するときは
=Average(A1:A5)
といった具合に入力すれば、その範囲(ここではA1:A5)の数字の平均値が計算されます。
ここで作った二つの関数はコール・オプションとプット・オプションの価格を計算するプログラムです。
引数はあえて分かりやすいように日本語を使いました。
で、Excelのワークブックの方に戻り、こんな感じで入力してみてください。
A列にあるのは単なる見出し(=変数名)です。

そしてB列に数字を入力してみましょう。
とりあえずこのブログ作成時点で次のSQまで22日(残存期間)あるので、B2のセルには「22」という数字を入力します。
次にB3のセルには金曜日の日経平均株価の終値「9768.08」を入力します。
B4のセルには「10000(権利行使価格10000円)」
B5のセルには「0.1%(金利)」
B6のセルには「25%(IV)」
これらをただ入力しておいてください。
金利もIVもあくまで試しということで。
そして肝心なのはここから
B8のセルに以下の数式を入力してみてください。
=CallFv(B2,B3,B4,B5,B6)
すると「143.69」という数字が表示されるはずです。

こんな感じ(^^)
うまく数字が表示されない場合は、
マクロのセキュリティレベルが高くて有効になっていないか、違うワークブックにマクロ(標準モジュール)が作られてしまっているなどの理由が考えられます。
で、うまくいったと仮定して…
関数の説明をしましょう。
例えば、B2のセル「22」を「12」に変更してみてください。
するとB8のセルの数値は「86.28」に変わるはずです。
つまり10日後のオプション価格はこのように変化すると予測されるのです。
これまでの説明で出てきた「タイム・ディケイ(時間的価値の減少)」です。
逆に日数はそのまま「22」にして、現指数のところを「10500」に変更してみてください。
するとB8のセルは「576.73」に変わるはずです。
つまり日経平均株価が10500円まで上昇した場合、10000円の権利行使価格のオプション・プレミアム(価格)は576.73円になると予測されるのです。
もうお分かりですね。
このように数値を変更するだけで、コール・オプションの価格がどう変化するかを計算することができます。
プット・オプションの場合は「=Putfv()」という関数を使ってください。
これをいくつか組み合わせていけば、オプションのプレミアム(価格)の変化をシミュレーションしていくことができます。
複数のオプションでポジションを組んでいたとしても、それぞれを計算し、そのポジションに照らし合わせれば、ポジションの損益推移を予想することができるのです。
※お願い
ちなみにやってみた人。うまくいった、いかなかった、ちょっとコメントもらえると助かります。
Excelのバージョンによっても色々と違うので、どこで引っかかるかイマイチ読めません。ある程度リアクション確認して、大丈夫そうなら先に進みます。