본문 바로가기
금융공학

클리켓 옵션 #2 가격 계산하기

by hustler78 2024. 7. 16.
728x90
반응형

지난 글에서는 cliquet option의 구조에 대해서 알아봤습니다.

2024.04.16 - [금융공학] - 클리켓 옵션 #1 클리켓 옵션이 뭐야?

 

클리켓 옵션 #1 클리켓 옵션이 뭐야?

이번 글은 클리켓 옵션에 대한 설명입니다. 단순하고 간단한(Vanilla) 옵션들에 대해서는 예전 글들에서 심도 있게 다룬 바 있습니다. 클리켓(Cliquet)이라는 단어는 톱니바퀴, 걸쇠 등을 나타내는

sine-qua-none.tistory.com

 

클리켓옵션의 특징 및 가격 계산법을  정리해보면 아래와 같습니다.

 



1. 만기까지 여러  관찰일이 있다.

2. 특정 관찰일에서 정의되는 행사가격은 바로 전 관찰일의 기초자산 종가이다.

3. 각 관찰일의 기초자산 수익률(related performance)은
   $$ {\rm{ related performance}} = \frac{S-K}K$$
로 정의된다. $S$는 해당 관찰일의 종가, $K$는 해당 관찰일의 종가, 즉 바로 전 관찰일의 기초자산 종가이다.
   
4. 각 관찰일의 payoff 즉, index performance를 구한다.
   index performance = max( floor , min(cap, related performance)

5. 마지막으로 각 관찰일의 index performance를 모두 합하여 최종 payoff를 구하고 현재가치로 할인한다.

 

 

그럼 이제 python 으로 클리켓 옵션의 가격을 계산해 보도록 하겠습니다.

주의할 점은. 

 

클리켓 옵션은 페이오프가 누적되는 상품, 구체적으로 계산시점보다 과거인 관찰시점에 정해진 페이오프가 누적되는 상품이므로 이를 잘 고려해줘야 함

 

 

계산시점이 $t=0$이면 누적된 페이오프가 없어서 상관이 없는데, 우리는 임의의 시점에 계산할 수 있어야겠죠.

 

 

Python Code

앞서 주의사항으로 말씀드렸던 사항이 바로 아래 code에서

  • accrual_payoff : 계산시점보다 과거에 결정된 페이오프의 누적 값
  • preceding_strike : 계산시점에 쓰이는 행사가격(즉, 계산시점 바로 전 관찰일의 기초자산 종가)

를 주의 깊게 봐야 합니다.

 

def cliquet_valuation_MC(curr_spot, vol, rfr, div,
                         valuation_date,
                         floor_barrier, cap_barrier,
                         calculation_time,
                         preceding_strike, accrual_payoff,
                         niter):
    """
    
    :param curr_spot: 현재 기초자산 가격
    :param vol: 기초자산 변동성
    :param rfr: 기초자산 통화의 무위험 이자율
    :param div: 기초자산 연속배당률
    :param valuation_date: cliquet option payoff 관찰일(연단위)
    :param floor_barrier: related performance의 floor barrier
    :param cap_barrier: related performance의 cap barrier
    :param calculation_time: 계산 시점
    :param preceding_strike: 현 계산시점에서 fixing 된 strike 
    :param accrual_payoff: 계산시점 전까지 누적 index performance
    :param niter: MC 시뮬레이션 횟수
    :return: cliauet option 평가가격
    """

    effetive_valution_date = valuation_date[valuation_date > calculation_time]
           # 계산시점보다 향후에 있는 관찰일을 택해 effective_valuation_date라 선언
    effective_tenor = effetive_valution_date - calculation_time
           # 계산시점과 관찰일의 차이, 즉 현재시점에서 관찰일까지의 잔존만기들
    maturity = effective_tenor[-1]        # 가장 마지막 배열값 즉, 상품의 잔존만기
    drift = (rfr - div - 0.5 * vol ** 2)  # 기초자산의 drift

    mc_sum = 0                 # MC simulation 중 payoff sum을 위한 변수
    np.random.seed(0)          # random seed 고정
    for iter in range(niter):  # niter 만큼의 simulation
        s_vec = []             # 관찰일 기초자산 종가를 저장하는 list

        s0 = curr_spot         # s0 : 기초자산 현재가
        for i in range(len(effective_tenor)):
            if i == 0:
                tt_mat = effective_tenor[i]
            else:
                tt_mat = effective_tenor[i] - effective_tenor[i - 1]
            s_res = s0 * np.exp(drift * tt_mat + vol * np.sqrt(tt_mat) * np.random.normal())
                              # 다음관찰일날의 기초자산 종가 modelling (GBM model)
            s_vec.append(s_res) # modeling 된 기초자산 종가를 s_vec 에 저장
            s0 = s_res
        strike_vec = s_vec[:-1]                 # strike vec 는 전관찰일 종가이므로 s_vec의 마지막 원소를 없애고
        strike_vec.insert(0, preceding_strike)  # 계산시점의 strike를 첫째 원소로 투입!

        s_vec = np.array(s_vec)                 # s_vec를 array로 변경
        strike_vec = np.array(strike_vec)       # strike_vec를 array로 변경

        related_perf = (s_vec - strike_vec) / strike_vec   # related_performance 계산
        perform_vec = np.maximum(floor_barrier, np.minimum(cap_barrier, related_perf)) 
                      # index performance 계산
        expected_payoff = perform_vec.sum()  #index performance 들의 합
        each_payoff = max(0, expected_payoff + accrual_payoff)
        		      # 이미 정해진 payoff인 accrual payoff를 합해서 계산

        mc_sum += each_payoff
    value_cliquet = mc_sum / niter * np.exp(-rfr * maturity)   # payoff 평균 및 현재가치 할인

    return value_cliquet

 

 

 

Cliquet option 계산 예제

 

아래처럼 간단한 구조의 cliquet option을 계산해 봅시다.

def cliquet_option_example():
    vol = 0.2   # 기초자산 변동성 20%
    r = 0.03    # 무위험 이자율  3%
    d = 0.0     # 연속배당률     0%

    valuation_date = np.arange(1, 13) / 12   # related payoff 관찰일은 monthly

    floor_barrier = -0.07          # floor = -7%
    cap_barrier = 1.85 / 100       # cap  = 1.85%


    curr_price = 100               # 기초자산 현재가
    curr_strike = 100              # 첫 strike
    known_payoff = 0.0             # 계산시점이 0인 경우 accrual payoff =0
    calculation_time = 0.0         # 계산시점 0
    n_simulation = 10000           # simulation 10000번
    value_mc = cliquet_valuation_MC(curr_price, vol, r, d, valuation_date,
                                    floor_barrier, cap_barrier, calculation_time, curr_strike, known_payoff,
                                    n_simulation)

    print(value_mc)


if __name__ == '__main__':
    cliquet_option_example()

 

계산결과는 아래와 같습니다.

 

0.005390964720049746

 

728x90
반응형

댓글