지금까지 파이썬을 이용하여 데이터를 가공하고 그래프로 표현하는 여러 방법을 살펴보았습니다. 분석 목적에 따라 적합한 데이터 가공과 표현하는 방법이 있기에, 투자자는 연재에서 소개한 간단한 예제 정도는 직접 실습해 보길 권합니다. 한 번 정도는 손으로 해본 경험이 있어야 필요할 때 기억으로 떠올리기 수월하기 때문입니다.
이어지는 연재에서는 조금 더 현실적인 사례를 들어 데이터를 처리하고 그래프로 표현하는 방법을 소개합니다. 이 연재는 분석 방법의 기반이 되는 투자 이론에 대해서는 자세히 설명하지 않습니다. 거듭 말씀드리지만, 투자 이론에 대한 충분한 이해 없이 분석 기법이나 분석 결과를 투자에 활용하는 것은 상황에 따라서는 적절하지 않을 수 있습니다. 시간을 들여서라도 참고 도서로 소개한 제 책 또는 같은 주제를 소개하는 다른 책이나 글로 차근차근 공부해 보길 권합니다.
참고: 이 글과 이어지는 몇 편의 글은 기초자산과 커버드콜을 사례로 파이썬을 활용하여 자산의 성과를 비교 분석하는 방법을 소개합니다. 제 책과 글을 통해 여러 차례 상세하게 설명했지만, 커버드콜은 장기 투자자에게 투자 가치가 없다는 결론이 나오게 됩니다. 커버드콜도 투자자에 따라서는 투자할 가치가 있다고 반론하는 댓글에는 답변하지 않습니다. 대개는 데이터를 어떻게 분석했고, 분석 결과의 의미가 무엇인지 충분히 이해하지 못했기에 나오는 의문이거나, 데이터 분석의 전제를 고려하지 않은 지적이기 때문입니다.
공지: 연재를 묶어 보다 이해하기 쉽게 수정 보완한 책을 출간했습니다. 책 소개: 파이썬으로 그려보는 투자 포트폴리오 분석 (정량적 투자 분석을 위한 입문서) 출간에 부쳐 (샘플북 포함)
주의: 이 글은 특정 상품 또는 특정 전략에 대한 추천의 의도가 없습니다. 이 글에서 제시하는 수치는 과거에 그랬다는 기록이지, 앞으로도 그럴 거라는 예상이 아닙니다. 분석 대상, 기간, 방법에 따라 전혀 다른 결과가 나올 수 있습니다. 데이터 수집, 가공, 해석 단계에서 의도하지 않은 오류가 있을 수 있습니다. 일부 설명은 편의상 현재형으로 기술하지만, 데이터 분석에 대한 설명은 모두 과거형으로 이해해야 합니다.
비교 분석 대상 - 기초자산과 커버드콜
첫 번째 비교 분석 대상은 기초자산과 커버드콜(covered call)입니다. 제 책과 글에는 비교 사례로 기초자산과 커버드콜을 자주 들고 있습니다. 몇 가지 이유가 있습니다.
- 지수에 따라서는 최대 10년치 정도의 신뢰성 있는 과거 데이터를 지수 개발사 사이트에서 얻을 수 있습니다.
- 기초자산과 커버드콜은 상관성이 매우 높은 자산이기에, 분석이 수월하며 분석 결과의 불확실성도 낮습니다.
- 커버드콜에 대한 오해로 장기 투자하겠다는 결정을 다시 한번 되돌아볼 수 있습니다.
비교 대상이 되는 기초자산은 미국배당다우존스 지수(Dow Jones U.S. Dividend 100 Index)와 이를 기초자산으로 연 7% 추가 배당률을 목표로 하는 미국배당다우존스+7% 커버드콜 지수(Dow Jones U.S. Dividend 100 7% Premium Covered Call Index)입니다. 이 글에서는 각각을 기초자산(Basic)과 커버드콜(P+7%)로 표시합니다.
두 지수를 추종하는 ETF가 모두 국내에 상장되어 있습니다. 기초자산에 해당하는 ETF는 상장 순서대로 한국투자신탁운용(ACE 미국배당다우존스), 신한자산운용(SOL 미국배당다우존스), 미래에셋자산운용(TIGER 미국배당다우존스), 삼성자산운용(KODEX 미국배당다우존스)에서 출시하였습니다.
커버드콜에 해당하는 ETF는 추가 목표 분배율에 따라 +3%(TIGER 미국배당다우존스타겟커버드콜1호), +7%(TIGER 미국배당다우존스타겟커버드콜2호), +10%(KODEX 미국배당다우존스타겟커버드콜)가 있습니다. 이 3가지 상품은 월만기(monthly) 콜옵션(call option)을 발행하는 커버드콜 ETF입니다.
이 외에도 동일한 기초자산을 보유하면서 초단기(0DTE; Zero Day-to-Expiration) 콜옵션을 매일 발행하는 상품으로는 10% 추가 분배율을 목표로 하는 TIGER 미국배당다우존스타겟데일리커버드콜이 있습니다.
기초자산과 커버드콜 지수를 추종하는 ETF의 주가 표현
FinanceDataReader는 미국 상장 주식/ETF 뿐 아니라, 국내 상장 주식/ETF의 가격 데이터도 가져올 수 있습니다. 국내 주식 시장에서 사용하는 6자리 단축 코드를 사용하면 됩니다.
다음은 두 ETF의 가격을 불러와서 그래프로 그리는 코드입니다.
df = fdr.DataReader('458730, 458760')
df.columns = ['Basic', 'P+7%']
df.plot()
FinanceDataReader는 티커(여기서는 단축 코드)로 칼럼명을 붙이기에 각각 Basic과 P+7%로 바꾸었습니다.
가격이 이상해 보입니다. 국내 ETF는 대개 주당 10,000원(또는 만원 단위)으로 신규 상장합니다. 그래프에는 둘 다 10,000원 이하로 시작한 것처럼 표시되어 있습니다. FinanceDataReader로 가져온 주가는 배당 재투자를 고려한 수정 주가(TR; Total Return)이기 때문입니다.
초기 가격을 상장 가격인 10,000원으로 조정해서 다시 그려봅니다. 참고: 엄밀하게는 상장 가격이 아니라 상장 첫날 종가를 10,000원으로 정규화한 것이기에 실제와는 미세하게 차이가 있습니다.
df1 = df / df.iloc[0] * 10000
df1.plot()
plt.axhline(df1.iloc[-1].Basic, ls = '--', color = 'tab:blue')
plt.axhline(df1.iloc[-1]['P+7%'], ls = '--', color = 'tab:orange')
yticks, _ = plt.yticks()
yticks = np.append(yticks, [df1.iloc[-1].values] * 2)
plt.yticks(ticks = yticks, labels = yticks.astype(int))
plt.legend(loc = 'upper left')
plt.show()
코드의 주요 부분을 살펴봅니다.
df1 = df / df.iloc[0] * 10000
초기 가격을 10,000(원)으로 정규화하였습니다.
plt.axhline(df1.iloc[-1].Basic, ls = '--', color = 'tab:blue')
plt.axhline(df1.iloc[-1]['P+7%'], ls = '--', color = 'tab:orange')
plt.axhline()은 수평선을 긋는 함수입니다. 기초자산과 커버드콜의 최근 가격(iloc[-1])으로 수평선을 그었습니다. 각각의 주가 흐름과 동일한 색상으로 표시하기 위해 색을 지정했고, 점선으로 표시했습니다. 참고: '--'은 짧은 선분으로 이루어진 점선이고, ':'는 작은 점으로 만든 점선입니다.
yticks, _ = plt.yticks()
yticks = np.append(yticks, [df1.iloc[-1].values] * 2)
plt.yticks(ticks = yticks, labels = yticks.astype(int))
자동으로 설정된 y축 눈금을 plt.yticks()로 가져옵니다. plt.yticks()는 두 개의 결과를 돌려줍니다 첫 번째는 눈금의 위치이고, 두 번째는 눈금에 표시할 텍스트(text)입니다. 첫 번째 결과는 yticks에 넣고, 두 번째 결과는 언더바(_)에 넣었습니다. 파이썬에서는 관례적으로 할당은 하지만 사용하지는 않는 더미(dummy) 변수의 이름으로 언더바로 사용합니다.
가져온 눈금 수치에 기초자산과 커버드콜의 최종가를 추가했습니다. 각각 두 번씩(* 2) 넣어 진하게 눈금값이 나타나도록 설정했습니다. 만들어진 눈금 목록으로 다시 지정했습니다. 참고: 리스트([])에 대해 곱하기(*) 연산은 반복을 의미하며, 수치 배열에 사용하는 numpy.array에 대한 곱하기 연산은 수학에서 말하는 곱하기입니다.
다음과 같은 결과를 볼 수 있습니다.
기초자산의 최종 가격은 12,441원이었고, 커버드콜의 최종 가격은 11,788원이었습니다. 두 상품의 거래 단위인 5원으로 떨어지지 않는 이유는 배당 재투자로 계산한 가격이기 때문입니다. 12441 / 11788 - 1 ≒ 5.5%이고, 전체 기간은 1.8년 정도에 해당됩니다. 커버드콜은 기초자산에 비해 1년에 3% 정도 수익률이 낮았다고 볼 수 있습니다.
기초자산과 커버드콜의 상대 수익률
투자할 종목을 선택하고자 하는 투자자는 이 수익률 차이가 일시적인지 아니면 지속되는 것인지 알고 싶을 수 있습니다. 지속된다고 볼 수 있다면 기초자산에 투자하는 것이 합리적일 것입니다. 일시적이라고 판단된다면, 추가 사항을 고려하여 단기적으로 투자해야 할 것입니다. 이 연재는 자산 배분 방식으로 장기 투자하는 투자자를 염두에 두고 있기에 지속성이 있어 장기 투자에 무엇이 유리한지 위주로 살펴봅니다.
수익률 차이의 지속성을 살펴보는 간단한 방법의 하나는 시간에 따른 상대 변화인 상대 누적 자산비입니다. 커버드콜의 주가를 기초자산의 주가로 나누어서 시간에 따른 변화를 살펴보는 것입니다. 다음과 같이 계산해서 그래프로 그려볼 수 있습니다.
(df1.div(df1.Basic, axis = 0) - 1).plot()
plt.gca().yaxis.set_major_formatter(PercentFormatter(xmax = 1, decimals = 0))
plt.show()
div() 함수를 이용하여 기초자산과 커버드콜 가격을 기초자산 가격으로 나누었습니다. 이해하기 쉽도록 1을 빼서 누적 상대 수익률로 변환해서 그래프를 그렸습니다.
파란색의 기초자산이 항상 0%로 나오니 제대로 계산된 결과입니다. 커버드콜의 수익률이 기초자산과 비슷했던 기간에는 이 그래프가 수평선에 가깝게 나옵니다. 2023년 7월 ~ 10월, 그리고 2024년 7월 ~ 2025년 3월에서 이러한 현상을 볼 수 있습니다.
보다 쉽게 살펴보기 위해 이동평균을 사용할 수 있습니다. 다음과 같이 60일 이동평균을 그리는 코드 한 줄을 추가하고 그려봅니다.
(df1['P+7%'].div(df1.Basic, axis = 0) - 1).rolling(60).mean().plot()
rolling(60).mean()으로 60거래일 이동평균을 계산할 수 있습니다.
이동평균으로 보면 대략적인 흐름을 파악하기에 보다 수월합니다. 초록색 선이 상승한 경우는 커버드콜의 수익률이 상대적으로 좋았던 기간이고, 하락한 경우는 기초자산의 수익률이 상대적으로 높았던 구간입니다. 어느 정도 일정하게 유지되었다면, 두 자산의 수익률이 비슷했던 기간입니다.
전반적으로 커버드콜은 기초자산 대비 우하향하고 있었습니다. 길게 보면, 2024년 4월부터 2025년 4월까지 대략 1년간은 기초자산과 커버드콜의 성과가 비슷했습니다. 참고: 본래 이 그래프는 로그 스케일로 그려야 하지만, 여기서는 산술 스케일을 사용했습니다.
상대 누적 자산비(또는 수익률)는 전체 기간에 대한 경향을 파악하기 편리하지만, 단위 기간으로 살펴보기는 조금 불편합니다. 1년 수익률로 직접 비교해 보겠습니다.
df1.pct_change(250).plot()
diff = df1.Basic.pct_change(250) - df1['P+7%'].pct_change(250)
diff.plot(ls = ':', label = 'Diff')
plt.axhline(diff.mean(), ls = '--', lw = 1, color = 'tab:red',
label = f'Diff Mean({diff.mean() * 100:.1f}%)')
plt.gca().yaxis.set_major_formatter(PercentFormatter(xmax = 1, decimals = 0))
plt.legend()
plt.show()
pct_change(250)으로 1년 수익률을 그래프로 그렸습니다. 수익률 차이는 점선으로 표시했습니다. 참고: 분석 대상 기간 동안의 연평균 거래일수는 약 244일이었습니다.
두 상품은 국내에 상장된 지 1.8년 정도가 되었습니다. 두 상품의 1년 수익률 차이는 기간에 따라 변화가 있었지만, 기초자산의 수익률이 더 높았고 (0% 이상), 그 차이는 평균 5.4%였습니다.
평균 5.4%의 수익률 차이는 투자 기간 1년을 충족하는 경우로만 계산한 평균입니다. 지난 1년간 기초자산과 커버드콜의 수익률 차이가 크게 줄어들었던 현상은 충분히 반영되어 있지 않기에 다소 과대 평가되어 있습니다.
정리하며
미국배당다우존스 지수와 이를 기초자산으로 커버드콜 전략을 사용하는 커버드콜 지수를 추정호는 ETF의 수익률을 비교해 보았습니다. 두 지수를 추종하는 상품이 상장된 지난 1.8년을 보면 기초자산의 수익률이 커버드콜에 비해 안정적으로 높았음을 알 수 있습니다.
하지만, 이 정도의 분석 결과로 투자 결정을 내리기에는 충분하지 않습니다. 합리적인 투자 결정을 위해서는 좀 더 긴 기간에 대해 살펴볼 필요가 있습니다. 또한 여전히 의미 있는 수익률 차이가 발견된다면, 지속 가능한 것인지도 판단해야 합니다. 이어지는 글에서 살펴봅니다.
참고: 연재와 관련한 질문은 댓글로 남겨주시기 바랍니다. 답변을 드리거나 이후 연재에서 다룰 수 있도록 노력하겠습니다.
참고 서적: 왜 위험한 주식에 투자하라는 걸까? - 장기 투자와 분산 투자에 대한 통계학적 시각
이어지는 글: [파이썬 분석 15] 기초자산과 커버드콜 (지수 개발사의 기초자산과 커버드콜 지수 + 외부 파일 읽기)
연재 목록: 자산 배분 분석 방법 책 소개, 연재글 및 사례 모음 [목록]
함께 읽으면 좋은 글 (최신 글)
함께 읽으면 좋은 글 (인기 글)
'주식투자' 카테고리의 다른 글
투자 기간에 따른 위험의 변화를 살펴보자 - 기초자산과 커버드콜 (VaR, CVaR) [파이썬 분석 18] (0) | 2025.04.22 |
---|---|
투자 분석은 왜 통계적으로 접근해야 하나? (기초자산과 커버드콜의 경우) [파이썬 분석 17] (0) | 2025.04.21 |
기초자산 수익률에 따른 커버드콜 수익률 분포, +구글 드라이브 이용 [파이썬 분석 16] (0) | 2025.04.20 |
지수 개발사의 기초자산과 커버드콜 지수 + 외부 파일 읽기 [파이썬 분석 15] (0) | 2025.04.20 |
시간이 흐름에 따른 주가의 변화는 표현해 보자 (이동 평균, 하위 순위 주가, +rolling()) [파이썬 분석 13] (0) | 2025.04.18 |
위험 척도를 하나 더 표현해 보자 (+컬러맵 사용) [파이썬 분석 12] (0) | 2025.04.17 |
장기 투자에 보다 적합한 복리 수익률을 구해보자 (통계량의 주관성) [파이썬 분석 11] (0) | 2025.04.17 |
사용자 포트폴리오를 나타내 보고, 특정 위치의 포트폴리오의 투자 비중을 살펴보자 [파이썬 분석 10] (0) | 2025.04.16 |