본문 바로가기
금융공학

두드림 ELS? Do Dream? 2X 드림!

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

신한투자증권에서 ELS 신상품을 공모 청약한다 해서 살펴봤습니다.

 

ELS이름이 두드림 ELS인데요.

 

사진클릭하면 뉴스로 이동함

 

뭔가 이름에서 수익을 더블로(2X) 고객에게 드린다는 뜻으로 보입니다. Do Dream의 한글표기법으로도 보여 굉장히 잘 지은 상품명이라 생각되네요.  과연 어떤 상품일까요? 신한투자증권 홈페이지에서 두드림 ELS 상품을 찾을 수 있었습니다.

 

 

 

Tesla를 기초자산으로 하는 ELS상품을 청약 중에 있었습니다. 만기는 1년이고요. 특정 조건을 만족하면 연 24%의 짭짤한 이익을 챙겨주는 구조라 합니다. 하지만 이게 다가 아닙니다. ELS의 구조를 같이 보시죠.

 

 

 

위에 말한 연 24%의 수익은 사실 3개월 뒤 조기상환 조건을 충족할 때 6%을 준다는 뜻입니다.

( 3개월의 6%이니 연이율로는 6% ×4= 24% 가 맞네요.)

 

하지만 두드림이라는 뜻의 진가는 만기 때 나옵니다.  오른쪽 그림을 보시면, 만기 때의 Tesla 주가가 기준가대비 상승하면 그 상승분의 2배 (상승 참여율 200%)를 챙겨준다는 거죠. 

 

하락했을 때는 마치 주식을 들고 있듯이 하락분만큼 손실이 발생한다는 것입니다. 즉,

 

 

조기상환이 안돼도 만기 때 상승으로 끝나면 수익률 2배로 챙겨드립니다!

 

라는 상품입니다. Do Dream 이자 두(two) 드림이죠.

 

갑자기 부당거래의 한장면이 생각납니다.

 

 

 

좋은 상품인지 확인을 위해 실제 Tesla 주가를 가지고 시뮬레이션을 해보겠습니다. 이렇게 과거 시계열 데이터를 가지고 상품성을 확인하는 것을 백테스트(Back Test)라 합니다.

 

 

 

백테스트

 

python을 통해 위 상품을 그래도 백테스팅 해보겠습니다. 편의상 3개월은 60 영업일, 1년은 250 영업일로 생각하겠습니다. 

 

import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm
from mpl_toolkits.mplot3d import Axes3D
from scipy.stats import norm
import time
import pprint
import FinanceDataReader as fdr
import datetime
from dateutil.relativedelta import relativedelta


# stock data load
def load_data(stock_code, start_date, end_date):   
    df = fdr.DataReader(stock_code, start_date, end_date, exchange='NASDAQ')
    return df


def Backtest():
    stock_code = 'TSLA'                     # TESLA 종목
    end_date = datetime.datetime.today()    # 조회종료일
    start_date = end_date - relativedelta(years=10)  #조회시작일 10년
    df = load_data(stock_code, start_date, end_date)
    df['Date'] = df.index
	
    # 3M(60일 뒤) 종가가 기준가대비 85% 이상이면, 상품 종료(is terminated)
    df['isTerminated'] = df['Close'].shift(-60) / df['Close'] >= 0.85   
    
    # 기준가대비 1년(250일 뒤) 종가를 구해서 df에 저장
    df['MatPerform'] = df['Close'].shift(-250) / df['Close']
    
    # 상품이 종료(즉, 조기상환)되면 쿠폰 6% 지급(연 24%), 아니면 만기주가를 관찰하는데
    # 만기주가가 기준가대비 1이상이면 참여율 200%의 수익률
    # 만기주가가 기준가대비 1미만이면 참여율 100%의 손실률
    df['Payoff'] = np.where(df['isTerminated'] == True, 1 + 0.06,
                            np.where(df.MatPerform >= 1, 1 + 2 * (df.MatPerform - 1), df.MatPerform))
    # payoff 유형은 조기상환(redmemption), 만기시 수익(gain), 만기시 손실(loss)로 나눔
    df['Payoff_type'] = np.where(df['isTerminated'] == True, 'redemption',
                                 np.where(df['MatPerform'] >= 1, 'maturity(gain)', 'maturity(loss)'))
    df = df.dropna()
	
    # redemption, maturity gain, maturity loss 별로 graph 의 color, label, marker type/size 지정
    color_set = ['royalblue', 'forestgreen', 'tomato']
    label_name = ['redemption', 'maturity(gain)', 'maturity(loss)']
    marker_type = ['s', 'o', 'x']
    marker_size = [3, 60, 60]
    fig, ax = plt.subplots()
    
    # payoff type (redemption, maturity gain, maturity loss)별로 plotting
    for i, ty in enumerate(label_name):
        ax.scatter(df.Date[df['Payoff_type'] == ty], df.Payoff[df['Payoff_type'] == ty], c=color_set[i],
                   label=label_name[i], marker=marker_type[i], s=marker_size[i])
    # 보조축을 설정함
    ax1 = ax.twinx()
    ax1.plot(df.Date, df.Close, color='gray', label='TSLA')   #Tesla 주가 plotting
    ax.legend(loc='upper left')
    ax1.legend(loc='upper right')
    plt.show()

    total_samples = len(df)       # 총 샘플개수
    redemption_cnt = len(df[df['Payoff_type'] == 'redemption'])   # 조기상환 개수
    mat_gain_cnt = len(df[df['Payoff_type'] == 'maturity(gain)']) # 만기 수익 개수
    mat_loss_cnt = len(df[df['Payoff_type'] == 'maturity(loss)']) # 만기 손실 개수

    print('first issue date  : {}'.format(df['Date'].iloc[0]))    #backtest 시작일
    print('last  issue date  : {}'.format(df['Date'].iloc[-1]))   #backtest 종료일
    print('total samples     : {}'.format(total_samples))
    print('redemption case   : {}'.format(redemption_cnt))
    print('maturity gain case: {}'.format(mat_gain_cnt))
    print('maturity loss case: {}'.format(mat_loss_cnt))
    print('-' * 30)
    print('maximum loss      : {:.2f}'.format(df['Payoff'].min()-1))   # backtest 중 최고손실
    print('maximum gain      : {:.2f}'.format(df['Payoff'].max()-1))   # backtest 중 최고수익
    print('-' * 30)
    print('Early redemption ratio: {:.2f}'.format(redemption_cnt / total_samples)) # 조기상환 확률

Backtest()

 

 

위의 코드 중

 

def load_data(stock_code, start_date, end_date):

부분은 주식 데이터 불러오기 : FinanceDataReader 라이브러리 글을 참고하시기 바랍니다.

 

 

 

아래 결과는 상품의 발행일(x축)과 그 상품의 향후  손익(y축) 그래프입니다. 보조축을 두어 Tesla 주가를 같이 그려 넣었습니다.

 

 

거의 대부분의 경우 조기상환이 됩니다(아래 결과를 보시면 86% 의 확률.) 아래 출력된 결과를 보시죠.

first issue date  : 2013-03-15 00:00:00
last  issue date  : 2022-03-14 00:00:00
total samples     : 2266
redemption case   : 1947
maturity gain case: 147
maturity loss case: 172
------------------------------
maximum loss      : -0.55
maximum gain      : 4.30
------------------------------
Early redemption ratio: 0.86

 

손실확률은 172 / 2266 = 7.59% 이고   수익확률은 92.41%입니다. 엄청난 수익 확률이죠. 하지만 손실도 나고 역사적으로 최대 손실은 -55% 였네요. 하지만 Tesla가 폭등하며 원금의 4.3배의 수익을 거둔 경우도 있네요.

 

무엇보다 3개월 투자에 6%를 먹어 갈 수 있으니, 큰 메리트가 있는 상품입니다.

 

그런데, 이 상품을 발행한 회사는 과연 고객에게 줄 수익을 만들어 낼 수 있을까요? 

다음 글에서 금융 공학 이론을 도입하여 이 상품의 적정 가치를 구해보도록 하겠습니다.

 

 

 

728x90
반응형

댓글