주식투자

[파이썬 분석 15] 기초자산과 커버드콜 (지수 개발사의 기초자산과 커버드콜 지수 + 외부 파일 읽기)

오렌지사과키위 2025. 4. 20. 13:10

지난 글에서 미국배당다우존스 지수와 이를 기초자산으로 7% 추가 분배율을 목표로 하는 커버드콜 지수를 추종하는 국내 상품의 수익률이 비교해 보았습니다. 상장 기간이 1.8년에 불과했지만, 해당 기간 동안 기초자산의 수익률이 커버드콜에 비해 안정적으로 높았다고 볼 수 있습니다. 지난 글: [파이썬 분석 14] 두 자산의 성과를 비교해 보자 (TIGER 미국배당다우존스와 TIGER 미국배당다우존스타겟커버드콜2호)

합리적인 투자 결정을 내리기 위해서는 조금 더 명확한 증거와 논리적인 설명을 원할 수 있습니다. 이를 위해서는 두 가지 관점에서 접근해야 합니다. 하나는 좀 더 긴 기간에 대한 데이터를 이용하여 통계적으로 분석하는 귀납적 접근입니다. 다른 하나는 상품의 구조적 특성을 파악하여 작동 방식을 살펴보면서 분석하는 연역적 접근입니다.

이 글에서는 통계적 데이터 분석을 통한 귀납적 접근 방식을 소개합니다. 기초자산과 커버드콜의 관계에 대한 논리적 설명은 제 책 <당신이 커버드콜에 장기 투자하면 안되는 이유 - 매년 100만원씩 손해보지 않는 방법>을 참고하기 바랍니다. 변동성과 수익률의 교환이라는 관점에서 해설하고 있습니다.

참고: 이 글과 전후 몇 편의 글은 기초자산과 커버드콜을 사례로 파이썬을 활용하여 자산의 성과를 비교 분석하는 방법을 소개합니다. 제 책과 글을 통해 여러 차례 상세하게 설명했지만, 커버드콜은 장기 투자자에게 투자 가치가 없다는 결론이 나오게 됩니다. 커버드콜도 투자자에 따라서는 투자할 가치가 있다고 반론하는 댓글에는 답변하지 않습니다. 대개는 데이터를 어떻게 분석했고, 분석 결과의 의미가 무엇인지 충분히 이해하지 못했기에 나오는 의문이거나, 데이터 분석의 전제를 고려하지 않은 지적이기 때문입니다.

주의: 이 글은 특정 상품 또는 특정 전략에 대한 추천의 의도가 없습니다. 이 글에서 제시하는 수치는 과거에 그랬다는 기록이지, 앞으로도 그럴 거라는 예상이 아닙니다. 분석 대상, 기간, 방법에 따라 전혀 다른 결과가 나올 수 있습니다. 데이터 수집, 가공, 해석 단계에서 의도하지 않은 오류가 있을 수 있습니다. 일부 설명은 편의상 현재형으로 기술하지만, 데이터 분석에 대한 설명은 모두 과거형으로 이해해야 합니다.

지수 데이터를 구하고 코랩에서 불러오기

패시브(passive) ETF는 기초 지수를 추종합니다. 일부 지수 개발사는 기초 지수의 과거 데이터를 상당 분량 공개하고 있습니다. 미국배당다우존스 지수와 이를 기초자산으로 커버드콜 전략을 사용하는 지수를 개발한 S&P Global은 최대 10년치의 데이터를 일반인들에게 무료로 공개하고 있습니다.

참고: 자산운용사는 지수 개발사에 보다 많은 데이터를 제공받습니다. ETF 개발과 운용에 필요하며, 지수 사용료도 납부하기 때문입니다. 이 연재에서 기초자산과 커버드콜에 대한 분석 결과와 의미를 자산운용사도 사전에 알고 있는 상황에서 상품을 개발하여 출시합니다.

S&P Global에서 미국배당다우존스 지수와 이를 기초자산으로 7% 추가 분배율을 추구하는 커버드콜 지수 데이터를 다운로드하는 방법은 [데이터 분석 13] 두 자산의 상대 수익률 변화를 살펴보자 (구글 시트 편, feat. 미국배당다우존스 커버드콜)을 참고하기 바랍니다.

다음은 다운로드한 파일을 마이크로소프트 엑셀에서 열어 필요하지 않은 상단 몇 개의 행을 제거한 결과입니다. 엑셀 대신 무료로 사용이 가능한 구글 시트(Google Sheets)로도 파일을 열어 볼 수 있습니다.

다운로드 받은 기초지수와 커버드콜 지수

다른 이름으로 저장하여 CSV 파일을 만들었습니다. 제 경우 div100-20250417.csv로 파일명을 지정했습니다.

이제 이 파일을 구글 코랩(Colab)에 올려야 합니다. 코랩에서 왼쪽 폴더(folder) 모양 아이콘을 눌러 파일을 선택해서 올리면 됩니다.

구글 코랩의 파일 업로드 아이콘과 업로드 후 결과

업로드가 완료되면 오른쪽 그림과 같이 파일 목록에 나타납니다. 이 파일은 코랩 접속 시 새로운 서버가 할당되면 사라집니다. 편의를 위해서는 본인 컴퓨터에 파이썬을 설치해서 사용하거나, 구글 드라이브에 파일을 올리는 방법이 있습니다. 참고: 구글 드라이브에 올리는 방법은 이어지는 연재에서 소개합니다.

CSV 파일은 Pandas의 pd.read_csv() 명령으로 읽어 DataFrame으로 변환할 수 있습니다. 다음은 해당 파일을 읽고 출력하는 코드입니다.

df = pd.read_csv("div100-20250417.csv")
df

지수 데이터를 읽어 DataFrame로 변환한 예

빈 셀들은 NaN으로 표시되어 있음을 알 수 있습니다. 칼럼은 순서대로 날짜, 커버드콜 지수, 기초자산 지수이기에, 이 세 칼럼만 남기고 지운 후에 dropna()로 NaN이 든 행을 지워봅니다.

df.iloc[:, [0, 1, 2]].dropna()

필요한 칼럼만 남기고, 불필요한 행을 제거한 결과

원하는 결과로 변환되는 것을 확인했으니 전체 코드를 만들면 됩니다. 칼럼명을 변경하고, 날짜(Date) 칼럼을 색인(인덱스; index)으로 지정하면 다음과 같은 결과를 얻을 수 있습니다. 파이썬은 대화형(인터렉티브; interactive) 언어이기에 이렇게 한 단계씩 실행하거나 조금씩 변경해 가며 원하는 결과를 만들 수 있는 코드를 작성하기에 편리합니다.

df = pd.read_csv("div100-20250417.csv")
df = df.iloc[:, [0, 1, 2]].dropna()
df.columns = ['Date', 'P+7%', 'Basic']
df = df.set_index('Date')
df.index = pd.to_datetime(df.index)
df

색인으로 지정한 Date는 날짜 타입이기에 이를 제대로 해석할 수 있도록 pd.to_datetime()으로 변환해 주었습니다.

칼럼명을 변경하고, 날짜를 색인으로 지정한 결과

그래프로 그려봅니다.

df.plot()

기초자산 지수와 커버드콜 지수 (10년치)

제대로 표시되었습니다. 2015년 3월 31일을 시작으로 10년치 정도의 데이터가 있습니다. 모두 배당 재투자(TR; Total Return)가 가정되었습니다. 참고: 모든 분석은 특별한 이유가 없는 한 배당 재투자가 기본입니다. 간혹 배당을 고려하면 커버드콜 수익률이 달라지지 않느냐고 질문하는 분들이 있습니다. 애초에 배당을 고려하지 않으면 합리적인 분석이 아닙니다.

기초자산 지수와 커버드콜 지수의 수익률 비교

이전 글에서 살펴본 방식으로 분석해 보겠습니다. 상대 누적 자산비(상대 누적 수익률)를 그려봅니다. 1년(252일) 이동 평균도 함께 나타내었습니다.

(df.div(df.Basic, axis = 0) - 1).plot()
(df['P+7%'].div(df.Basic, axis = 0) - 1).rolling(252).mean().plot(label = 'MA 252')

plt.gca().yaxis.set_major_formatter(PercentFormatter(xmax = 1, decimals = 0))

plt.legend()
plt.show()

기초자산과 커버드콜의 상대 누적 수익률과 1년 이동 평균

대체적으로 커버드콜은 기초자산 대비 장기 우하향했음을 알 수 있습니다. 1년 수익률의 변화와 차이도 그려봅니다.

US_DAYS = 252

df.pct_change(US_DAYS).plot()

diff = df.Basic.pct_change(US_DAYS) - df['P+7%'].pct_change(US_DAYS)
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()
US_DAYS = 252

252라는 숫자를 계속해서 사용하니 실수를 방지하기 위해 변수로 정의했습니다.

기초자산과 커버드콜의 1년 수익률과 차이

기초자산과 커버드콜 모두 1년 수익률이 80%에 달한 적도 있었습니다. 관심 있는 부분은 1년 수익률의 차이이므로 이 부분만 다시 그려봅니다.

diff = df.Basic.pct_change(US_DAYS) - df['P+7%'].pct_change(US_DAYS)
diff.plot(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()

기초자산과 커버드콜의 1년 수익률 차이

1년 수익률의 차이는 평균 2.9%였고, 간혹 커버드콜이 좀 더 높은 수익률을 보인적이 있었지만 최대 2% 정도에 불과했습니다. 이에 비해 기초자산이 더 높은 수익률을 보인 경우는 4%를 넘어간 경우도 빈번했습니다.

시각적으로 좀 더 쉽게 인식할 수 있도록 영역에 색을 칠해 봅니다.

diff = df.Basic.pct_change(US_DAYS) - df['P+7%'].pct_change(US_DAYS)
diff.plot(lw = 0.1, color = 'tab:gray', label = 'Diff')
plt.axhline(diff.mean(), ls = '--', lw = 1, color = 'tab:red',
            label = f'Diff Mean({diff.mean() * 100:.1f}%)')
plt.axhline(0, color = 'tab:gray')

cond = diff > 0
plt.fill_between(diff.index, diff, where = cond,
                 color = 'tab:blue', alpha = 0.5, label = 'Basic > P+7%')
plt.fill_between(diff.index, diff, where = ~cond,
                 color = 'tab:red', alpha = 0.5, label = 'Basic <= P+7%')

plt.gca().yaxis.set_major_formatter(PercentFormatter(xmax = 1, decimals = 0))

plt.legend(ncols = 2)
plt.show()

기초자산과 커버드콜이 동일한 수익률을 거두는 경우인 0%에 회색으로 수평선을 그었습니다. 기초자산이 커버드콜보다 수익률이 높았던 경우는 파란색으로, 커버드콜의 수익률이 높거나 같았던 경우는 빨간색으로 영역을 칠했습니다. 어떤 영역에 해당되는지는 cond에 지정하였습니다. cond는 기초자산 1년 수익률이 커버드콜보다 높았던 경우이며, ~cond는 그 반대의 경우입니다.

범례를 표시할 때 그래프를 가리지 않도록, ncols = 2로 지정하여 한 줄에 두 개씩 표시하도록 하였습니다.

기초자산 또는 커버드콜의 1년 수익률이 높았던 기간

색을 칠해서 비교해 보면 한눈에 파악하기 수월합니다. 커버드콜의 1년 수익률이 기초자산 보다 높았던 경우는 거의 없기도 했지만, 그 경우에도 차이는 2% 정도에 불과했습니다.

정리하며

지수 개발사에서 제공하는 10년치 백테스트 데이터를 이용하여 기초자산 지수와 커버드콜 지수를 비교해 보았습니다. 1년 수익률을 기준으로 보면 기초자산이 커버드콜보다 높은 수익률을 안정적으로 보였습니다. 커버드콜이 기초자산보다 더 높은 수익률을 얻었던 경우도 있었지만 상대적 빈도는 많지 않았으며, 수익률 차이도 크지 않았습니다.

이 정도 분석 결과만으로도 커버드콜은 신중하게 투자를 고려할 상품이 아니라는 것을 알 수 있습니다. 하지만, 투자자는 커버드콜 대비 기초자산에 대한 투자에 좀 더 확신을 가지고 싶을 수 있고, 커버드콜에 전략적으로 투자할 수 있지 않을까라는 생각이 들 수도 있습니다.

예를 들어 앞으로 1 ~ 2년간 기초자산이 횡보 또는 하락할 거라 투자자가 예상한다면, 상대적으로 커버드콜에 투자하는 것이 유리할 수 있다는 생각을 해 볼 수 있습니다. 아마 커버드콜에 대해 이렇게 말하는 것을 들어 본 적이 있을 것입니다.

만일 그렇다면, 투자자의 미래에 대한 전망과 맞물려서 단기적 또는 조건부로 커버드콜에 투자할 수 있을 것입니다. 이어지는 글에서 수익률 분포 비교를 통해 이를 살펴봅니다.

참고: 연재와 관련한 질문은 댓글로 남겨주시기 바랍니다. 답변을 드리거나 이후 연재에서 다룰 수 있도록 노력하겠습니다.

참고 서적: 왜 위험한 주식에 투자하라는 걸까? - 장기 투자와 분산 투자에 대한 통계학적 시각

이어지는 글: [파이썬 분석 16] 기초자산과 커버드콜 (기초자산 수익률에 따른 커버드콜 수익률 분포, +구글 드라이브 이용)

연재 목록: 자산 배분 분석 방법 책 소개, 연재글 및 사례 모음 [목록]

함께 읽으면 좋은 글 (최신 글)

  1. [파이썬 분석 14] 기초자산과 커버드콜 - 두 자산의 성과를 비교해 보자 (TIGER 미국배당다우존스와 TIGER 미국배당다우존스타겟커버드콜2호)
  2. [파이썬 분석 13] 시간이 흐름에 따른 주가의 변화는 표현해 보자 (이동평균, 하위 순위 주가, +rolling())
  3. [파이썬 분석 12] 위험 척도를 하나 더 표현해 보자 (+컬러맵 사용)
  4. [파이썬 분석 11] 장기 투자에 보다 적합한 복리 수익률을 구해보자 (통계량의 주관성)
  5. [파이썬 분석 10] 사용자 포트폴리오를 나타내 보고, 특정 위치의 포트폴리오의 투자 비중을 살펴보자

함께 읽으면 좋은 글 (인기 글)

  1. 챗GPT(ChatGPT)로 사진을 지브리 만화 스타일로 변환하기
  2. 구글 제미나이(Gemini)를 이용한 그림 생성하기 (vs. 마이크로소프트 이미지 크리에이터의 이미지 생성 AI)
  3. 스튜디오 지브리 만화 스타일로 그림 그리기 (구글 제미나이 + ImageFX)
  4. 스튜디오 지브리 만화 스타일로 그림 그리기 (구글 제미나이)
  5. 챗GPT(ChatGPT)로 사진을 지브리 vs 이누야샤 만화 스타일로 변환한 사례 비교 (인물 사진 #3)
도움이 되었다면, 이 글을 친구와 공유하는 건 어떻까요?

facebook twitter kakaoTalk naver band