ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 파이썬으로 블랙숄즈 옵션 평가 모델 만들기
    파이썬 2020. 4. 2. 19:23

    이항분포 모형으로 만들었던 옵션 평가모델을 다시 블랙숄즈 모형으로 만들어보려고 합니다.

    일단 블랙숄즈 콜옵션 공식은 다음과 같습니다.

    C = S * N(d1) - K * e^(-Rf * T) * N(d2)

    N(d) : 표준정규분포의 z=d까지의 확률

    d1 = [ln(S / K) + (Rf + 1/2 * V^2) * T] / [V * T^(1/2)]

    d2 = d1 - V * T^(1/2)

    이항분포 모형(https://pythoncpa.tistory.com/2) 만들었을 때와 동일한 조건으로 변수들을 정리하도록 하겠습니다.

    S0 = 100

    V = 0.3

    T = 5

    dt = 무한대로 작은 수

    Rf = ln(1 + 0.05)

    K = 100

    여기서 이항모형과의 차이점은 dt가 무한대로 작은 수라는 점과 Rf를 연속복리로 적용하여야 한다는 점입니다.

    현재가치 1원을 무한대의 복리로 곱하였을 때 1년 뒤에 1.05가 되는 금리입니다.

    이번에는 그냥 colab(https://colab.research.google.com/drive/1di_YBA-Ve1UNudW5ByXmGEilETXIXgfQ)에 바로 작성해보았습니다. colab에 작성하면 태블릿으로도 작성할 수 있다는 장점이 있습니다.

    [1]은 e나 ln 등 수식을 구현하기 위하여 math 모듈을 임포트한 것입니다.

     

    [2]는 위에서 설명한 것과 동일하게 가정을 각 변수에 입력한 것입니다. m.log(1.05)는 ln(1.05)를 구현한 것입니다. 고등학교 수학시간에는 log가 밑이 10인 상용로그라고 배웠는데, math 모듈에서는 log가 자연로그이고 상용로그는 log10이라고 한다고 합니다. 결과값은 0.048790... 이렇게 나왔고, 맞게 잘 된건지 보기 위해서, e^(Rf)를 계산하였더니 1.05로 나왔습니다. 이리가나 저리가나 1년 뒤에는 1.05원이 되는 것인데, 중간에 무한대로 쪼개기 위해서 연속복리를 쓰는 것 같습니다.

     

    [3]은 결국 d1과 d2를 구한 것인데, d1이 산식이 길어서 분자(numerator)와 분모(denominator)로 나눈 것입니다. 이런 고급 영어는 이번 글을 쓰면서 멋지게 검색해 보았습니다. d1과 d2는 표준정규분포에서 z 값입니다. 이거를 구한 이유는 N(d1)과 N(d2)를 구하기 위함인데, N(d1)은 표준정규분포 왼쪽 끝에서부터 d1까지 면적(=누적확률)이고 N(d2)는 d2까지의 면적인 것으로 이해하고 있습니다.

     

    이제 N(d1)과 N(d2)를 구해서 콜옵션 가치를 구해보겠습니다.

    [4]는 통계계산을 위해서 scipy 모듈을 임포트하는 것인데, 2번째 줄과 같이 scipy.stats도 별도로 임포트를 해야합니다. 왜 그런지는 잘 모르겠지만, scipy에서 stats가 기본 모듈이 아니라서 한번 더 불러와야 하는 것 같습니다. 한번 임포트하지 않고 sp.stats라고 했더니 에러가 났습니다. 3번째 줄은 표준정규분포를 normdis라는 변수에 입력해주는 코드입니다. 엑셀에는 d1의 누적확률값을 구하는 NORMSDIST(아마도 NORMalStandardDISTribution이 아닐까 싶습니다만, 왠지 아닐 수도 있을 것 같습니다, '정규' '표준' '분포'만 있고, '누적'이 없네요)라는 함수에 d1을 입력하면 바로 누적확률을 알 수 있는데, 파이썬에서는 normdis(이름은 아무렇게나 지어도 됨)라는 표준정규분포를 가진 변수를 먼저 만들고 거기에다가 d1을 전달해주어야 표준정규분포에서 d1의 위치를 알려주는 것 같습니다.

     

    [5]는 normdis라는 표준정규분포 변수에서 누적확률을 구하는 cdf 메쏘드(cdf는 뭐의 약자인지 감이 전혀 안잡히네요, cumulative distribution function 일까요?...)를 활용하여 N(d1)과 N(d2)를 구한 것입니다. 엑셀에서도 같은 값이 나옵니다. 제가 이렇게 메쏘드의 뜻도 잘 모르는 이유는 저도 이 코드를 구글링으로 찾아내서 쓰고 있기 때문입니다. 필요한 거 있을 때마다 하나씩 찾아서 채워나가면 코드가 만들어지는게 파이썬의 위력인 것 같기도 하고... 참 많은 분들께 감사합니다.

     

    [6]은 최종적으로 콜옵션을 구한 것입니다. 이항분포로 구했을 때는 37원이 나왔는데 블랙숄즈로는 35.7원이 나왔습니다. 원래는 이항분포의 옵션은 만기이전 행사가 가능한 것을 가정하였기 때문에 더 높게 나오는 것으로 이해하고 있었는데 분명히 제가 만들었던 이항분포 옵션에서는 실제로 만기 이전에 행사하는 상황이 나오지 않았습니다. 블랙숄즈모형은 개념적으로다가 이산복리를 적용할 수 없기 때문에 이항분포모형을 1년을 100기간으로 쪼개서(dt = 0.01) 한번 동일한 조건으로 돌려보았습니다. 결과는 아래와 같은데 숫자가 감동적이네요. 35.707617...으로 콜옵션 가격이 산출되어서 블랙숄즈모형으로 구한 값과 차이가 0.01원보다 작아졌습니다. 단위기간이 긴쪽이 1기간의 변동성이 커져서 옵션가치가 높게 평가되는 것 같습니다. 엄청 극단적으로 가정하면 현재 주가로부터 1기간에 100배가 되거나 0.01배가 되는 쪽이, 1기간에 10배가 되거나 0.1배가 되고 2기간 누적으로 100배, 1배, 0.01배가 되는 쪽보다 옵션가치가 더 높게 나올 것 같은 느낌과 비슷한 것 같습니다. 순전히 저의 뇌피셜이므로 과도한 신뢰는 금물입니다.

     

     

     

    어쨌거나 저쨌거나 두번째 글까지 올리는 데 성공했습니다. 이렇게 일주일에 두개씩 올리면 1달이면 주제가 떨어질 것 같네요. 그래도 첫번째 글보다 좀 더 자연스러워지고 제딴의 유머코드도 집어넣고해서 만족스럽습니다.

     

    긴 글 읽어주셔서 감사합니다.

    댓글

Designed by Tistory.