지난 글
2022.08.22 - [금융공학] - 옵션 #7. 옵션 프리미엄 구하기 실습: Binomial Tree
에서 이항트리( 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까지 해서 콜옵션 가격을 산출하는 방법에 대해 모두 알아봤습니다. 가볍게 정리해 보자면 콜옵션 가격 구하는 방법은 아래의
○ Binomial Tree(python)과 이 글(VBA)
처럼 다양합니다. 콜옵션만큼은 아니지만 유명한 파생상품들은 아주 많이 있습니다. 다음 글에서 하나하나 알아보도록 하죠.
'금융공학' 카테고리의 다른 글
배리어옵션 -UOC 옵션 #2 함축적 FDM (0) | 2022.08.25 |
---|---|
배리어옵션 -UOC 옵션 #1 수학공식(Closed form) (0) | 2022.08.24 |
옵션 #7. 옵션 프리미엄 구하기 실습: Binomial Tree (0) | 2022.08.22 |
옵션 #6. 옵션 프리미엄 구하기 실습: MonteCarlo Simulation (0) | 2022.08.21 |
옵션 #5. 옵션 프리미엄 구하기 실습: 함축적 FDM (0) | 2022.08.19 |
댓글