본문 바로가기
금융공학

옵션 #8. 옵션 프리미엄 구하기 실습: Binomial Tree(with VBA)

by hustler78 2022. 8. 22.
728x90
반응형

 

지난 글

2022.08.22 - [금융공학] - 옵션 #7. 옵션 프리미엄 구하기 실습: Binomial Tree

 

옵션 #7. 옵션 프리미엄 구하기 실습: Binomial Tree

이번 글에서는 2022.08.21 - [금융공학] - 옵션 #6. 옵션 프리미엄 구하기 실습: MonteCarlo Simulation 옵션 #6. 옵션 프리미엄 구하기 실습: MonteCarlo Simulation 이번 글은 2022.08.19 - [금융공학] - 옵션 #..

sine-qua-none.tistory.com

에서 이항트리( Binomial Tree)를 이용하여 콜옵션의 가격을 계산해 보았습니다. 그런데 python으로 코딩을 하다 보니 시각적으로 나무 가지가 뻗어나가는 듯한 모습이 안 보였죠? 이럴 때 간단하게 이용해 볼 수 있는 프로그래밍 언어가 바로 엑셀 VBA입니다. 

 

VBA를 이용하여 델타원 상품의 가격을 계산해 본 글을 쓴 적이 있었습니다. 그 글에 수록된 코드를 거의 비슷하게 사용할 예정입니다.  

 

 

VBA Code

자세한 code 설명은 VBA를 이용하여 델타원 상품의 가격을 계산해 본 글을 참고하시기 바랍니다. 콜옵션에 맞춰 달라진 부분만 설명하도록 하겠습니다.

 

Option Explicit
Option Base 1


Type treeNode
    underlying_value As Double
    pv As Double
    step As Integer
    upcnt As Integer
    underlying_xpos As Integer
    underlying_ypos As Integer
    pv_xpos As Integer
    pv_ypos As Integer
End Type

Function payoff(s As Double, k As Double) As Double
    payoff = IIf(s > k, s - k, 0)
End Function

Sub test_binomial_tree()

    Dim s0 As Double
    Dim r As Double, q As Double, sigma As Double
    Dim maturity As Double, strike As Double
    Dim ntimeSteps As Integer
    Dim dt As Double
    Dim u As Double, d As Double
    Dim p As Double
    Dim a As Double
    

    s0 = 100
    r = 0.02
    q = 0.01
    sigma = 0.3
    maturity = 1
    strike = 100
    ntimeSteps = 20
    
    dt = maturity / ntimeSteps

    u = Exp(sigma * Sqr(dt))
    d = 1 / u

    a = Exp((r - q) * dt)
    p = (a - d) / (u - d)
    

    Dim nodes() As treeNode
    ReDim nodes(0 To ntimeSteps, 0 To ntimeSteps)


    Dim n As Integer, i As Integer
    Dim sVal As Double
    Dim df As Double
    
    df = Exp(-r * dt)
    
    
    With Range("A1").Resize(1000, 1000)
        .ClearContents
        .Interior.Color = xlNone
    End With
    
        

    For n = ntimeSteps To 0 Step -1

        For i = 0 To n
            sVal = s0 * (u) ^ (i) * (d) ^ (n - i)
            nodes(n, i).underlying_value = sVal
            nodes(n, i).step = n
            nodes(n, i).upcnt = i
            nodes(n, i).underlying_xpos = 2 * n
            nodes(n, i).underlying_ypos = -4 * i + 2 * n
            nodes(n, i).pv_xpos = 2 * n
            nodes(n, i).pv_ypos = -4 * i + 2 * n + 1

            If n = ntimeSteps Then
                nodes(n, i).pv = payoff(sVal, strike)
            Else
                nodes(n, i).pv = df * (p * nodes(n + 1, i + 1).pv + (1 - p) * nodes(n + 1, i).pv)
            End If

        Next i
    Next n

    
    Dim orng As Range
    
    
    Set orng = Cells(3 * ntimeSteps, "C")
    
    For n = 0 To ntimeSteps
        For i = 0 To n
            orng.Offset(nodes(n, i).underlying_ypos, nodes(n, i).underlying_xpos) = nodes(n, i).underlying_value
            orng.Offset(nodes(n, i).underlying_ypos, nodes(n, i).underlying_xpos).Interior.ColorIndex = 35
            orng.Offset(nodes(n, i).pv_ypos, nodes(n, i).pv_xpos) = nodes(n, i).pv
            orng.Offset(nodes(n, i).pv_ypos, nodes(n, i).pv_xpos).Interior.ColorIndex = 40
        Next i
    Next n


End Sub

 

달라진 부분은 payoff 함수부분입니다.

Function payoff(s As Double, k As Double) As Double
    payoff = IIf(s > k, s - k, 0)
End Function

○ VBA에서 제공하는 IIf 함수를 써서 콜옵션의 만기 payoff인 $\max(S-K,0)$를 구현했습니다.

 

 

결과를 보실까요? 현재 time step를 20으로 잡았을 때입니다.

 

너무 큰 나무라 한 화면에 잡히지 않은 결과

 

time step을 20으로 해 놓으니 트리가 방대하여 한 화면에 잡기 어렵네요. 결과를 확인하기 위해 앞에 5 단계 정도만 줌인해 보겠습니다.

 

연두색 셀은 기초자산의 가격, 주황색 셀은 콜옵션의 가격입니다. 제일 왼쪽의 셀이 현재 주가 100일 때 콜옵션의 현재가치입니다. 바로 12.099이고, 이건 전의 글에서 python으로 binomial tree를 만들어 얻은 결과와 일치합니다.

 

 


Binomial Tree까지 해서 콜옵션 가격을 산출하는 방법에 대해 모두 알아봤습니다. 가볍게 정리해 보자면 콜옵션 가격 구하는 방법은 아래의

Closed form

명시적 FDM함축적 FDM

MonteCarlo Simulation

Binomial Tree(python)과 이 글(VBA)

처럼 다양합니다. 콜옵션만큼은 아니지만 유명한 파생상품들은 아주 많이 있습니다. 다음 글에서 하나하나 알아보도록 하죠.

 

 

 

 

 

 

728x90
반응형

댓글