ここでは、マネックス証券の提供する日経平均連動型仕組債を参考に仕組債の理論価格をモンテカルロシミュレーションにより計算しました。
まず、対象とする証券は以下のものとしました。
- 原則、3か月に1回利払いがある
- 原則、2年後に償還される
- 原則、額面で償還される
- 但し、3か月に1回の早期償還判定日に参照株価が早期償還判定水準以上であれば、その時点で額面が償還され以降の利払いはない
- 但し、参照株価がノックイン判定水準を一度でも下回った場合は、参照株価に連動した額面が償還される
- 日経平均株価の年率期待リターンは5%
- 日経平均株価の年率期待ボラティリティは30%
- 次月の日経平均株価は前月の株価を平均とする正規分布となる
- 株価の計算間隔は月次
- サブモデルの試行回数は1000回
- モデル全体の試行回数は1000回
- 割引率(あるいは投資家の期待収益率)は5%
- 仕組債のクーポンレートは年率4.5%
- 早期償還判定水準は105%
- ノックイン判定水準は75%
割引現在価値の平均値は93となり、期待リターン5%の投資家にとっては、この仕組債はNPVマイナスの損な投資であるといえるでしょう(93の価値のものに100の値段がついている)。
もっとも、参照株価の動きにどのような前提を置くのかでリターンは異なってくるため、この証券が一方的に販売側に有利に設計されている、とまではいえません。また、この計算で置いた前提はかなり疑問のあるもので、例えば、株価の分布の前提は正しくは、「月次リターンがファットテール分布となる」とすべきでしょうし、分布のパラメータも正しく見積もる必要があるはずです。さらに試行回数も結果の収束を確認して最適化すべきでしょうし、計算間隔も月次でいいのか、は疑問点です。
とはいえ、モンテカルロシミュレーションを用いることで、直感的には理解しにくい仕組債の期待リターンを可視化することができ、そもそもどのような性質の商品なのかが分かりやすくなることは間違いないですね。
計算に用いたコード:
Sub derivative() Dim Price As Double, AnnualVolatility As Double, AnnualReturn As Double Dim MonthlyVolatility As Double, MonthlyReturn As Double Dim CouponRate As Double, QuarterlyCouponRate As Double Dim KnockOut As Double, KnockIn As Double Dim Iteration As Integer Dim DiscountRate As Double Dim ExpectedValue(0 To 1000) As Double Dim PriceArray(0 To 24) As Double Dim PayoffArray(0 To 24) As Double Price = 100 AnnualVolatility = 0.3 AnnualReturn = 0.05 CouponRate = 0.045 KnockOut = 1.05 KnockIn = 0.75 MonthlyVolatility = AnnualVolatility / Sqr(12) MonthlyReturn = (1 + AnnualReturn) ^ (1 / 12) - 1 QuarterlyCouponRate = CouponRate / 4 Iteration = 10000 DiscountRate = 0.05 Math.Randomize For j = 0 To 1000 For i = 0 To 24 PayoffArray(i) = 0 Next PriceArray(0) = Price For i = 1 To 24 ' creat new price PriceArray(i) = WorksheetFunction.Norm_Inv(Math.Rnd(), PriceArray(i - 1) * (1 + MonthlyReturn), PriceArray(i - 1) * MonthlyVolatility) ' on the end of quarter If i Mod 3 = 0 Then ' pay off interest PayoffArray(i) = PayoffArray(i) + Price * QuarterlyCouponRate ' If price is more than knock out level If (PriceArray(i) > Price * KnockOut) And (i <> 24) Then ' Payoff principle and exit loop PayoffArray(i) = PayoffArray(i) + Price Exit For ElseIf i = 24 Then If WorksheetFunction.Min(PriceArray) < Price * KnockIn Then PayoffArray(i) = PayoffArray(i) + PriceArray(i) Else PayoffArray(i) = PayoffArray(i) + Price End If End If End If Next ExpectedValue(j) = (WorksheetFunction.NPV((1 + DiscountRate) ^ (1 / 12) - 1, PayoffArray)) * ((1 + DiscountRate) ^ (1 / 12)) Next Range("a1:a1001") = WorksheetFunction.Transpose(ExpectedValue) End Sub
No comments :
Post a Comment