February 15, 2016

Excel VBAで仕組債の期待リターンを計算する

仕組債は、通常の証券への投資と異なり、リターンを複数のルールの組み合わせで決定しているため、その分布も独特なものとなります。原資産や参照する資産のリターンは、左右対称の分布が期待される場合であっても、仕組債のリターンは非対称な複雑な形を取ります。

ここでは、マネックス証券の提供する日経平均連動型仕組債を参考に仕組債の理論価格をモンテカルロシミュレーションにより計算しました。

まず、対象とする証券は以下のものとしました。
  • 原則、3か月に1回利払いがある
  • 原則、2年後に償還される
  • 原則、額面で償還される
  • 但し、3か月に1回の早期償還判定日に参照株価が早期償還判定水準以上であれば、その時点で額面が償還され以降の利払いはない
  • 但し、参照株価がノックイン判定水準を一度でも下回った場合は、参照株価に連動した額面が償還される
また、計算の前提として以下を想定しました。
  • 日経平均株価の年率期待リターンは5%
  • 日経平均株価の年率期待ボラティリティは30%
  • 次月の日経平均株価は前月の株価を平均とする正規分布となる
  • 株価の計算間隔は月次
  • サブモデルの試行回数は1000回
  • モデル全体の試行回数は1000回
  • 割引率(あるいは投資家の期待収益率)は5%
  • 仕組債のクーポンレートは年率4.5%
  • 早期償還判定水準は105%
  • ノックイン判定水準は75%
計算された仕組債の割引現在価値は非対称な分布となります。大半の場合では早期償還される一方で、ノックイン判定水準である75%付近を中心とした釣鐘状分布を取り、参照株価の動き次第では投資額の50%を失う場合もありうる、という結果になりました。


割引現在価値の平均値は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