본문 바로가기
금융공학

두드림 ELS? Do Dream? 2X 드림! : 이론가 계산하기 #2

by hustler78 2023. 3. 16.
728x90
반응형

 

 

이 글은

두드림 ELS? Do Dream? 2X 드림! : 이론가 계산하기 #1

 

두드림 ELS? Do Dream? 2X 드림! : 이론가 계산하기 #1

이 글은 두드림 ELS? Do Dream? 2X 드림! 두드림 ELS? Do Dream? 2X 드림! 신한투자증권에서 ELS 신상품을 공모 청약한다 해서 살펴봤습니다. ELS이름이 두드림 ELS인데요. 뭔가 이름에서 수익을 더블로(2X) 고

sine-qua-none.tistory.com

에 이어 두드림 ELS의 이론가 계산을 해보는 글입니다.

 

 

두드림 ELS 이론가 계산

 

두드림 ELS의 구조는 아래와 같습니다.

구조를 보면,  조기상환 시점의 기초자산 가격과 만기시점의 기초자산 가격 모델링이 중요합니다.

기초자산 $S_t$의 주가 모델을 GBM으로 가정합시다.

$$ dS_t/S_t = (r-q)dt+\sigma dW_t,$$

$W_t$는 위너프로세스로서, $W_t\sim \mathcal{N}(0,\sqrt{t}^2)$ 의 분포를 가지고, 변동성을 $\sigma$, 배당을 $q$, 시장의 무위험 이자율을 $r$이라 합시다.

 

이제 두드림 ELS의 계산 시점을 $t$, 조기상환 시점을 $T_1$, 만기시점을 $T_2$라 합시다.

 

 

물론 계산 시점이 조기상환시점보다 뒤에 있으면, $T_1$시점은 고려안해도 됩니다(조기상환이 안되고 만기까지 흘러가고 있다는 뜻이니까요.)

 

그러면, GBM 주가패스 만들기 #1: 만기시점 주가만 라는 글에 의해

 

$$S_{T_1} = S_t \exp\left( (r-q-\textstyle{\frac12}\sigma^2)(T_1-t) + \sigma\sqrt{T_1-t} \cdot w_1\right)~~, ~~ w_1 \sim \mathcal{N}(0,1)\tag{1}$$

입니다. (1)에서 구한 주가를 조기상환 배리어 $B(=0.85)$와 비교해 봅니다. 조기상환 조건을 만족하면(즉, 주가가 배리어 이상이면) 정해진 쿠폰 $c(=6\%)$ 을 지급하고 끝납니다. 아니라면, (1)에서 구한 $S_{T_1}$에서 출발하여 만기시점 $T_2$에서의 주가

$$ S_{T_2} = S_{T_1} \exp\left( (r-q-\textstyle{\frac12}\sigma^2)(T_2-T_1) + \sigma\sqrt{T_2-T_1} \cdot w_2\right)~~, ~~ w_2 \sim \mathcal{N}(0,1)\tag{2}$$ 

 

를 구합니다. 이렇게 구한 주가가 기준가 대비 $1$ 이상일 때,

$$ 2\left(\frac{S_{T_2}}{S_0}-1 \right)$$ 이 수익이고 여기에 원금 1을 더한 금액이 상환금액이 됩니다.

 

만일 만기 주가가 기준가 대비 $1$ 미만이면

$$ \frac{S_{T_2}}{S_0}-1$$이 손실금액이 되겠고, 여기에 원금 1을 더하여 상환합니다.

 

자 이제 python으로 이론가를 구해보겠습니다.

 

 

Python Code : 두드림 ELS 이론가 계산

 

우선 저번 글 두드림 ELS? Do Dream? 2X 드림! : 이론가 계산하기 #1

에서 구한 모수들은 아래와 같습니다.

모수
이자율 3.538%
배당률 0%
변동성 62.56%

 

이론가 계산하는 함수식은 아래와 같습니다.

 

def Dodream_ELS(caltime, currprice, rfr, div, vol, redemp_time, maturity, redemp_barrier, redemp_coupon, up_part,
                down_part):
    nIteration = 10000   # simulation 횟수는 10,000번
    np.random.seed(0)    # seed를 고정하여 재계산해도 같은 값이 나오도록 한다.
    mc_sum = 0           # 각 simulation당 payoff * df 를 합산할 변수
    redemp_cnt = 0       # early redemption (조기상환) 횟수를 세는 변수
    payoff_list = []     # 각 simulation 의 payoff 저장 list
    payoff_type_list = [] # 각 simulation 의 payoff type: 1.조기상환, 2. 만기수익상환, 3. 만기손실상환
    s_list = []          # payoff 결정시점의 주가
    for i in range(nIteration):
        is_terminated = False   # is_terminated : 상품이 상환되어 끝났는지 기록하는 flag
        if caltime <= redemp_time:  # 계산시점이 조기상환보다 앞이라면,
            nr1 = np.random.normal() # standard normal random 생성
            
            # 조기상환시점의 주가 생성
            drift = (rfr - div - 0.5 * vol ** 2) * (redemp_time - caltime)
            diffusion = vol * np.sqrt(redemp_time - caltime) * nr1
            s_redemp = currprice * np.exp(drift + diffusion)
            
            if s_redemp > redemp_barrier:  # 조기상환 시점 주가가 배리어 이상이면
                redemp_cnt += 1            # 조기상환 count 추가
                payoff = 1 + redemp_coupon # payoff는 원금+쿠폰
                df = np.exp(-rfr * (redemp_time - caltime))  # 계산시점으로의 할인율
                is_terminated = True       # 상품 끝
                payoff_list.append(payoff) # payoff 기록
                payoff_type_list.append(1) # payoff type 은 1
                s_list.append(s_redemp)    # 주가기록
            else:
                nr2 = np.random.normal()   # 조기상환 시점 주가가 배리어 밑이면 -> 만기까지 간다.
                drift = (rfr - div - 0.5 * vol ** 2) * (maturity - redemp_time)
                diffusion = vol * np.sqrt(maturity - redemp_time) * nr2
                s_mat = s_redemp * np.exp(drift + diffusion)  # 만기시 주가 생성 (s_redemp부터 생성)
                if s_mat >= 1:                           # 기준가보다 큰 경우
                    payoff = 1 + up_part * (s_mat - 1)   # 수익 payoff + 원금
                    payoff_list.append(payoff)      
                    payoff_type_list.append(2)           # payoff type은 2
                else:                                    # 기준가보다 작으면
                    payoff = 1 + down_part * (s_mat - 1) # 손실 payoff + 원금
                    payoff_list.append(payoff)    
                    payoff_type_list.append(3)           # payoff type :3
                df = np.exp(-rfr * (maturity - caltime)) # 할인율 계산
                s_list.append(s_mat)
        else:                                            # 계산시점이 조기상환시점 뒤인 경우(무조건 만기까지 감)
            if is_terminated == False:
                nr3 = np.random.normal()
                drift = (rfr - div - 0.5 * vol ** 2) * (maturity - caltime)
                diffusion = vol * np.sqrt(maturity - caltime) * nr3
                s_mat = currprice * np.exp(drift + diffusion)  # 만기 시점 주가
                if s_mat >= 1:
                    payoff = 1 + up_part * (s_mat - 1)
                    payoff_list.append(payoff)
                    payoff_type_list.append(2)
                else:
                    payoff = 1 + down_part * (s_mat - 1)
                    payoff_list.append(payoff)
                    payoff_type_list.append(3)
                df = np.exp(-rfr * (maturity - caltime))
                s_list.append(s_mat)

        one_time_value = payoff * df     # 1 time simulation의 payoff 현재가치
        mc_sum += one_time_value         # 위의 값을 다 더한다.

    return mc_sum / nIteration, redemp_cnt / nIteration, payoff_list, payoff_type_list, s_list
    
    # ----------return ----------------------------------
    # mc_sum / nIteration     : 두드림 ELS의 MC현재값
    # redemp_cnt / nIteration : 조기상환 확률
    # payoff_list             : 각 simulation 별 payoff
    # payoff_type_list        : 각 simulation 별 payoff type : 1,2,3
    # s_list                  : 각 simulation 별 payoff 발생시 주가 수준

 

 

설명은 주석을 참고해 주시기 바랍니다. 이제 두드림 ELS의 이론 가격과 주가 패스별 페이오프 그래프를 그려보도록 합시다.

 

if __name__ == '__main__':
    caltime = 0         # calculation time : 상품 시작일
    currprice = 1       # 현재가는 1 (performance 여서 기준가 대비 주가 하면 보통 1)
    rfr = 3.538 / 100   # 무위험이자율: 위의 parameter 표참조
    div = 0             # 연속배당률  :위의 parameter 표참조
    vol = 62.5/100      # 변동성 :    : 위의 parameter 표참조
    redemp_time = 0.25  # 조기상환 시점: 0.25y(3m)
    maturity = 1        # 만기시점     : 1y
    redemp_barrier = 0.85
    redemp_coupon = 0.06
    up_part = 2         # 상승참여율 200%
    down_part = 1       # 하락참여율 100%
    
    # 두드림 ELS 계산 -------------------
    res, prob, payoff_list, payoff_type_list, s_list = Dodream_ELS(caltime, currprice, rfr, div, vol, redemp_time,
                                                                   maturity,
                                                                   redemp_barrier, redemp_coupon,
                                                                   up_part,
                                                                   down_part)

    # 계산편의를 위해 각 list를 array 형태로 변환
    payoff_type_list = np.array(payoff_type_list)
    payoff_list = np.array(payoff_list)
    s_list = np.array(s_list)

    print('The DoDream ELS value is     : {:.2f}'.format(res*100)) # 보통 100을 원금으로 하여 표현함
    print('Early Redemption probability : {:.2f}'.format(prob))
	
    # chart 로 표시
    color_set = ['royalblue', 'forestgreen', 'tomato']
    label_name = ['redemption', 'maturity(gain)', 'maturity(loss)']
    for i in range(3):
        index = np.where(payoff_type_list == i + 1)
        plt.scatter(s_list[index], payoff_list[index], c=color_set[i], marker='*', s=10, label=label_name[i])
    plt.legend()
    plt.show()

 

 

결과는 아래와 같습니다.

The DoDream ELS value is     : 94.81
Early Redemption probability : 0.65

 

○ ELS 가격은 94.81이 나왔습니다. 위의 코드를 보면 res라는 변수에 100을 곱하여 나온 숫자죠. 이는 해당 ELS 원금이 100 일 때, 사실 이 ELS의 이론적 가치는 94.81인 거죠. 거꾸로 말해서 

 

고객은 94.81원짜리 ELS를 100원 주고 산 꼴

 

이라는 얘깁니다. 즉 5.19원 정도를 더 붙여 100원에 파는 것입니다.

이 5.19원에는 

1) 고객과 약속한 payoff를 만들어 내기 위한 비용 (헤지 비용)

2) 발행사의 마진 (수익)

 

등등이 있습니다. 발행사는 고객과 약속한 수익을 만들어 내기 위해 기초자산인 Tesla를 샀다 팔았다 하면서 수익을 내야 하는데요. 이 과정을 헤지(hedge)라고 합니다. 그런데 이 hedge가 잘될 수도, 잘 안될 수도 있습니다. 따라서 일정 금액 이상을 이렇게 마진으로 하여 파는 것이죠. 

또 발행사는 땅 파서 장사하는 것이 아닙니다. 값은 싸지만 매력 있는 ELS를 만들어 마진을 남겨먹는장사를 하는 것입니다. 이 마진은 헤지가 잘 안 되었을 때 완충역할을 해주고, 헤지가 잘될 때는 추가수익으로 작용합니다.

 

 

이제 주가 수준별 페이오프 그림을 보시죠. 

 

 

 

제일 위에서 봤던 그림과 똑같죠? 이렇게 페이오프를 그래프로 그려보며, python coding이 잘 되었는지 체크해 볼 수도 있습니다. 

728x90
반응형

댓글