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

oryzaeです。

Evergrande(恒大集団)騒ぎ、なかなかに大きなインパクトです。クレジット市場は株式市場以上のパニック。今回はコロナの影響で家計貯蓄は大きく、経済を支える余力はあるものの、各国政府ともに余力はなく、企業体力も一般的には低下しているところもあるために、どの程度の株式市場全体へのダメージになるのか気になるところです。とはいえ、中国政府もサポートするような動きもあり、しばし注視ですね。

さて、オプションに戻ります。こんなグラフをよく目にすることがあるのではないでしょうか?

直線的に見えるものがコールオプションを買ったときのSQ日における損益曲線。曲線的に見えるものがSQ日まで残存日数を残している場合の損益曲線です。いずれにおいてもx軸は、日経平均の居所です。

例えば30500円のコールを210円で買ったとき、SQの値(や今の日経平均の価格)が幾らだったら、幾ら儲かるのか損するのかを示したグラフになります。

SQ日に関して言えば、SQ値が30500円を超えてくれば、SQ値-30500円で自動的に権利行使が行われ、30500円未満であれば、自動的に権利放棄がされます(30500円で買う権利なので、日経平均が30500円未満であれば、権利を使うことの経済合理性がないために、自動的に権利放棄となります)。

この権利を手に入れるための費用が210円だったということで、SQ日における損益は

SQ値が30500円以上の場合:30500円で買い付けた日経平均をSQ値で売却した金額から、権利取得に要した210円を差し引いたもの。要は SQ値-30500-210円となるわけです。

またSQ値が30500円未満の場合は、権利を放棄するために、権利取得に要した210円の損失ということになります。

SQまで残存日数がある場合には、インプライドボラティリティが一定の中という仮定の下で、日経平均が幾らになったら、オプション価格が幾らになるのかを計算し、そこから権利取得に要した210円を差し引いたものをグラフ化したものです。

さて、では前回に作ったVBA関数を使って遊んでみましょう。

直線的なものと曲線的なもの、Excelなので当然両方を一度に書いてもいいのですが、若干Excelの画面が判りにくくなるので、ここではそれぞれ別々に書いてみましょう。

まずは最終日のPLですが、全体はこんな感じ

B1-B4まではそれぞれ、「日経平均の現在値」、「中心としたいATM」、「配当予想金額」、「金利」を入れています。この中で、RSSから取得できるものは「日経平均現在値」だけですね。自分で計算するのがB2のATM。式はそれぞれ
B1: =RssIndexMarket(“N225″,”現在値”) – これはRSSの関数式そのまま、引数は「日経平均」を表す”N225″と「現在値」を表す”現在値”のふたつです。
B2: =ROUND(B1/125,0)*125 – 日経オプションの行使価格は残存三か月を切ると直近価格から125円刻みで設定されます(色々と細かい条件があるので、現在値から外れると125円刻みでは存在しない行使価格もあります)。そこで、日経平均の値を125円で割って小数点以下を四捨五入(よく書かれているようにROUND関数は四捨五入そのものではないですが、正の値ならば四捨五入として使ってもいいでしょ程度の感覚で使ってます)。その値を125倍することで、現在価格に最も近い125円刻みの値を計算しています。
B3、B4は予想配当金額と金利ですが、ここは定数として与えます。実際に何の値を入れるかはまたそのうちに。

B6には、いつ時点の損益曲線を描くかを日付形式で入れます。
次にA9-I9に、取引したオプションを入れていきます。
A9:取引日(これはある意味なくてもいいのですが、記録的な意味で)
B9:取引したオプションの行使価格
C9:コールならば「1」、プットならば「2」です。RSSの引数と同じものにしています。
D9:限月ですが、これはYYYYMMの数値です。これもRSSの引数として使うので、RSS引数定義通りです。
E9:ここはRSSで利用する銘柄コードになります。上記B9、C9、D9を使い、RSS関数を使って求めます。
  =RssFOPCode(“N225OP”,D9,C9,B9) これが銘柄コードを求める関数。最初の”N225OP”がオプションを表します。
F9:これがB6の日付から見たD9の限月オプションのSQ日までの日数です。このオプションのSQ日ですが、RSS関数を使って求めます。
  =RssFOPMarket($E9,”売買最終日”)+1-$B$6 先ほどE9で求めた銘柄コードを引数として、まず売買最終日(SQ日を求めるキーワードがRSSにはないようです)を求め、SQ日は売買最終日の翌日なので、売買最終日に1日足して、B6で設定した日付を引きました。
G9:このオプションのインプライドボラティリティの現在値をRSS関数から引っ張ってきました。RSS関数のインプライドボラティリティ自体、実際にいつ時点の何かなど若干疑問があるので、オプション価格から先日のVBA関数で計算させてもよいのですが、面倒を省きました。
  =RssFOPMarket($E9,”IV”)/100
H9:ここでオプション取引枚数を入れます。買っている場合には「+」、売っていれば「-」です。
I9:オプションを取引した価格です。

次に日経平均の値によってポジションがどうなるかということなのでグラフのX軸となる日経平均の値を入れていきますが、SQ日における損益は行使価格のところで不連続に曲がるために、125円刻みの値をいれていきます。現在の日経平均からどの程度の前後を見たいかによりますが、ここでは前後に3000円入れておきます。お好みでよいと思います。このX軸をJ7から右に入れていくことにします。
J7:ATM(B2の値)から3000円を引いたもの。=$B$2 – 3000
K7-BF7:まではその左の値に125円を足したものを入れていきます。例えばK7には=J7+125、L7には=K7+125です。

J8-BF8までがJ7-BF7までの日経平均のときのポジション全体の損益を入れるために、一度空けておいて、9行目に先ほど入力したオプションの損益を入れておきます。
J9:はこんな感じです。最終日損益なので、こんなことをする必要もないのですが、bsPremという関数でSQ日まで対応しておいたのでこのまま使う感じにしています。これでB6の損益を計算する日付を変更するだけでSQ日以降でもいつでも同じものが使えるようになっています。
  =(bsprem(J$7,$B9,$G9,$B$4,IFS($F9<=0,0,TRUE,$B$3/$B$1/$F9*365),IFS($F9<=0,0,TRUE,$F9/365),1)-$I9)*$H9
   全体としては、(日経平均がJ7のときのオプション価格)から(そのオプションを取得した価格)を引いて、枚数を掛けるで終了です。
  実際にはオプション一枚は1000倍なので、最後に1000掛けてあげて下さい。
  まず、日経平均がJ7の値であったときのオプションの価格を求めます。
  > bsPremというVBA関数に日経平均、行使価格、ボラティリティ、金利、配当利回り、残存年数、コールプットの別を入れるだけです。
  式の中に二つほど「IFS関数」が使われています。これはSQ日以降の日付を入れたときに、残存年数がマイナスになってしまうケースに対するエラー処理項目です。
絶対参照入れているので、あとはこれをK9-BF9までコピペすれば終了。
多くのポジションを持ったときように、8行目は9行目以下を合算したものを入れます。
7行目をX軸の項目として、8行目のグラフをかけば完成。

ここで、次にB6の損益を見たい日付を入れてあげれば、曲線の出来上がりです。

あとはこの二つを組み合わせていくのですが、ここは簡単に説明だけです。8行目には損益曲線が欲しい日付のポジション損益合算、9行目に一行挿入してSQ日損益合算を入れることとします。
10-19行目にポジションを入れ、ここをPL日付に入れた日付の損益曲線のデータ(この縦合算が8行目に入る)を入れます。
B20にSQ日を入力して、そのデータを使って、21-30行目には10-19行目に入れたポジションのSQ損益(この縦合算が9行目)を入れます。その上で8行目と9行目をグラフとして表示。
B20にわざわざSQ日を入れているのは、限月の異なるオプションがあったときに、SQ日が二つできてしまうので、ここはそのために日付を入れるスペースを置いてあるだけです。

さて、後出しじゃんけんになってますが、ご覧いただいたように、9/21にEvergrandeさ中に30500円のコールを210円で10枚ほど買ってました。ただ市場がそこまで安心でもないので、9/24に31000円のコールを20枚売ったとすると(売らないですが、、、)

ざっとこんな感じで使えそうですね。レシオコールになります。

ではまた。

コメント

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