주식투자

[파이썬 분석 23] 고정 비율 인출식 성과를 인플레이션을 고려해서 추정해 보자 (+보조 그래프)

오렌지사과키위 2025. 4. 26. 17:47

지난 글에서 은퇴 후 현금 흐름이 필요한 투자자를 위한 고정 금액 인출식 투자 성과를 추정하는 방법을 살펴보았습니다. 고정 금액 인출식은 투자한 자산의 가격 흐름에 따라 성과가 크게 달라질 수 있습니다. 운이 좋게 은퇴 직후 자산이 크게 상승하면 상당히 여유로운 현금 흐름을 만들 수 있지만, 그 반대로 장기 하락 횡보장이 이어지면, 경우에 따라서는 예금 수준 또는 그 이하의 결과를 얻을 수도 있습니다. 지난 글: [파이썬 분석 22] 고정 금액 인출식 성과를 인플레이션을 고려해서 추정해 보자

이 때문에 안정적인 현금 흐름이 필요한 투자자는 포트폴리오 안정성을 높일 수 있도록 자산 배분을 어느 정도 고민해야 합니다. 또한 고정 금액 인출식이 아닌 고정 비율 인출식을 사용하여 하락 및 횡보장에서 자산의 감소를 억제할 필요가 있습니다. 간단하게 말하면, 투자 성과가 좋지 않으면 그만큼 아껴 써야 합니다.

이 글에서는 고정 비율 인출식 투자 성과를 추정하는 방법을 살펴봅니다.

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

고정 비율 인출식 성과 추정과 고정 금액 인출식과의 비교

고정 비율 인출식의 성과를 계산하는 방식은 간단합니다. 매거래일 자산을 현금 인출 비율만큼 감소시켜 가며 누적하면 됩니다. 매거래일 인플레이션을 적용하는 것과 동일한 방식입니다.

INIT_BALANCE = 10000 * 10000
DAILY_RATIO = 2.4 / 100 / 240

discount_s = (1 - DAILY_RATIO) ** np.arange(1, len(df) + 1)
df['SPY (iKRW.RCF)'] = df['SPY (iKRW)'] * discount_s
cash_flow = df['SPY (iKRW.RCF)'] / (1 - DAILY_RATIO) * DAILY_RATIO * INIT_BALANCE

cols = ['SPY (iKRW)', 'SPY (iKRW.CCF)', 'SPY (iKRW.RCF)']

df[cols].plot()

plt.yscale('symlog', base = 1.1)

yticks = np.array([-1, 0, 2, 5] + (df[cols].iloc[-1] - 1).to_list() * 2)
plt.yticks(ticks = yticks + 1,
           labels = [f'{round(tick * 100)}%' for tick in yticks])

labels = [col + f' {calc_cagr(df[col]) * 100:.1f}%' for col in cols]
plt.legend(labels)

plt.show()

주요 코드 위주로 설명합니다.

INIT_BALANCE = 10000 * 10000
DAILY_RATIO = 2.4 / 100 / 240

초기 투자금을 1억원으로, 매거래일 계좌 평가액의 2.4% / 240거래일만큼 현금 흐름을 만든다고 설정하였습니다. 고정 금액 인출이라면 매일 1만원씩 현금 흐름을 만드는 경우와 비슷합니다.

discount_s = (1 - DAILY_RATIO) ** np.arange(1, len(df) + 1)
df['SPY (iKRW.RCF)'] = df['SPY (iKRW)'] * discount_s
cash_flow = df['SPY (iKRW.RCF)'] / (1 - DAILY_RATIO) * DAILY_RATIO * INIT_BALANCE

매거래일 현금을 인출하면 자산 가격은 그만큼 줄어듭니다. 잔여 자산 비율을 계산한 discount_s로 인출 후 계좌 평가액을 계산합니다. 매거래일 계좌 평가액은 일정 비율의 현금 흐름이 고려되어 있기에 이를 이용하여 역산하면, 당일 인출 금액을 계산할 수 있습니다.

고정 금액 및 고정 비율 인출식 성과 추이

그래프에서 오렌지색 선으로 표현된 SPY (iKRW,CCF)는 앞서 살펴본 인플레이션을 고려한 고정 금액 인출식입니다. 앞에서는 초기 투자금 대비 연 2.5%를 가정하고 인출했지만, 매거래일 인출 금액을 쉽게 가늠할 수 있도록 연 2.4%를 가정했습니다. 하루 1만원에 해당됩니다. 참고: 해당 기간 연평균 거래일수는 약 240일이었습니다.

고정 비율 인출식의 CAGR은 2.5%로 0.5%였던 고정 금액 인출식에 비해 더 많은 자산이 남은 것처럼 보이지만, 현금 흐름이 다릅니다. 현금 흐름을 살펴보아야 고정 금액 인출식과 비교할 수 있습니다.

cash_flow.plot()
plt.axhline(cash_flow.mean(), ls = '--', color = 'tab:red',
            label = f'Mean: {cash_flow.mean():.0f}')

plt.legend()
plt.show()

연 2.4% 고정 비율 인출식의 현금 흐름과 평균

연 2.4% 고정 비율 인출식의 경우 현금 흐름의 평균은 8,387원이었습니다. 고정 금액 인출식은 10,000원이니 직접 비교할 수 없습니다.

매거래일 인출 비율을 이리저리 조정해 보면, 연 3.3% 고정 비율 인출식의 일평균 인출 금액이 10,000원 정도였습니다.

연 3.3% 고정 비귤 인출식의 현금 흐름과 평균

동일한 평균 현금 흐름을 만들었지만 최종 자산은 고정 비율 인출식이 원금 기준으로 40% 더 많은 자산이 남았습니다. 또한 일 10,000원 이하의 현금 흐름이 만들어지는 15년 정도의 긴 기간도 있었습니다. 일 5,000원 수준으로 줄어들기도 했습니다. 고정 비율 인출식은 자산의 가격 변동에 따라 현금 흐름의 편차가 상당히 컸습니다.

최종적으로 동일한 자산이 남는 경우를 맞춰보면, 연 4.4%에 해당됩니다. 

연 4.4% 고정 비귤 인출식의 현금 흐름과 평균

고정 비율 인출식과 고정 금액 인출식의 최종 자산은 대략 원금 + 15%였습니다. 오른쪽 그래프를 보면, 고정 비율 인출식의 일 평균 현금 흐름은 11,329원으로 고정 금액 인출식보다 13% 정도 더 많았습니다. 이 경우에도 일 10,000원 이하의 현금 흐름이 12년 가까이 이어졌습니다.

은퇴 후 초기에는 일 15,000원 수준의 현금 흐름이 만들어졌음을 알 수 있습니다. 그러니 고정 비율 인출식을 사용할 경우에는 자산이 크게 증가했다고 필요 이상으로 현금 흐름을 만드는 것은 적절하지 않을 수 있습니다. 일 10,000원이 필요 현금 흐름이라면, 그 이상의 현금은 예금에 두거나 재투자하는 것이 바람직할 수 있습니다.

고정 비율 인출식으로 원금을 유지하면서 만들 수 있는 최대 현금 흐름은 해당 자산의 복리 수익률과 동일합니다. 인플레이션을 고려한 CAGR이 7%라면, 연 7%가 자산의 현재 가치를 유지할 수 있는 최대 현금 흐름 비율입니다. 참고: 엄밀하게는 손익비대칭성을 고려해야 합니다. CAGR이 r이라면, 1년간 r / (1 + r)만큼 현금 흐름을 만들 수 있습니다. 이를 현금 흐름을 만드는 주기에 해당되는 복리 수익률로 환산해야 합니다.

이를 다르게 말하면, 대부분의 커버드콜은 장기적으로 자산 가치와 배당금이 하락할 수밖에 없다는 의미입니다.

예를 들어 TIGER 미국배당다우존스타겟커버드콜2호는 기초자산으로 만드는 배당금 3%에 콜옵션 프리미엄으로 만드는 7%를 더해 연 10% 정도의 배당률(분배율)을 목표로 설계된 상품입니다. 인플레이션을 3%로 가정하면 기초 자산이 최소 연 10% + 3% = 13% 명목 성장해야 자산과 배당금의 현재 가치를 유지할 수 있습니다.

하지만 TIGER 미국배당다우존스타겟커버드콜2호는 기초 자산 대비 연 2% 정도 낮은 장기 수익률을 기대할 수 있습니다. 따라서 기초 자산이 연 13% = 2% = 15% 명목 성장해야 합니다. 10년 또는 그 이상의 기간에 대해 연 15% 수준의 장기 성장률은 현실적이지 않을 수 있습니다. 그러니 대개의 커버드콜은 장기적으로 현재 가치를 유지하기 어려운 상품입니다. 참고: 배당을 재투자한다면 애초에 커버드콜을 선택할 필요가 없습니다.

보조 그래프

현금 흐름 생성 후 자산의 가격 변화와 현금 흐름을 각각 그래프로 따로 그리면 전반적인 상황을 파악하기 불편할 수 있습니다. 보조 그래프를 활용하여 한 그래프에 나타내면 파악하기 쉬워집니다.

from matplotlib.gridspec import GridSpec

grid = GridSpec(4, 1)
fig = plt.figure(0)

ax1 = fig.add_subplot(grid[0:3, 0:1])
ax2 = fig.add_subplot(grid[3:4, 0:1], sharex = ax1)

df[cols].plot(ax = ax1)

ax1.set_yscale('symlog', base = 1.1)

yticks = np.array([-0.7, -0.5, 0, 1, 2, 4] + (df[cols].iloc[-1] - 1).to_list() * 2)
ax1.set_yticks(ticks = yticks + 1,
           labels = [f'{round(tick * 100)}%' for tick in yticks])

labels = [col + f' {calc_cagr(df[col]) * 100:.1f}%' for col in cols]
ax1.legend(labels)

ax2.axhline(DAILY_CASH * 10000, ls = '--', color = 'tab:orange',
            label = f'CCF: {DAILY_CASH * 10000:.0f}')
cash_flow.plot(color = 'tab:green', label = f'RCF: {cash_flow.mean():.0f}', ax = ax2)

ax2.set_ylim(0)
ax2.legend(ncols = 2, framealpha = 0.2)

plt.show()

앞에서 그래프를 그리기 위해 사용한 코드와 대부분 동일합니다. 그래프 영역을 2개로 나누고 각각에 대해 그리는 정도만 다릅니다.

from matplotlib.gridspec import GridSpec

grid = GridSpec(4, 1)
fig = plt.figure(0)

ax1 = fig.add_subplot(grid[0:3, 0:1])
ax2 = fig.add_subplot(grid[3:4, 0:1], sharex = ax1)

파이썬에서 그래프 영역을 분할하여 그리는 방법을 여러 가지가 있지만, 무난한 방법의 하나는 모눈종이처럼 영역을 지정하는 GridSpec()입니다. GridSpec(4, 1)은 세로로 4칸, 가로로 1칸짜리 모눈종이를 지정하는 것입니다.

add_subplot()을 이용하여 어떤 구역에 그래프를 추가할지 설정합니다. 세로로 0 ~ 2번째 칸에 그래프를 추가하고 ax1이라 이름을 붙였습니다. 세로로 3번째 칸에 다른 그래프를 추가하고 ax2라고 이름 붙였습니다. 0:3은 0부터 3이 되기 전까지라는 의미이니 [0, 1, 2] 범위가 됩니다. 마찬가지로 0:1은 [0]이고, 3:4는 [3]입니다.

두 번째 그래프 ax2를 정의할 때 sharex = ax1으로 지정했습니다. ax1과 동일한 x축을 사용하겠다는 의미입니다.

df[cols].plot(ax = ax1)

ax1.set_yscale('symlog', base = 1.1)

yticks = np.array([-0.7, -0.5, 0, 1, 2, 4] + (df[cols].iloc[-1] - 1).to_list() * 2)
ax1.set_yticks(ticks = yticks + 1,
           labels = [f'{round(tick * 100)}%' for tick in yticks])

labels = [col + f' {calc_cagr(df[col]) * 100:.1f}%' for col in cols]
ax1.legend(labels)

첫 번째 그래프를 그리는 코드입니다. plot()으로 선그래프를 그릴 때 ax = ax1을 지정하여 어느 그래프에 그림을 그릴지 지정했습니다. plt....으로 시작하는 코드는 ax1....으로 바꾸면 됩니다. 일부 함수는 set_를 붙여야 합니다. plt.yscale()은 ax1.set_yscale()로 바꾸었습니다.

ax2.axhline(DAILY_CASH * 10000, ls = '--', color = 'tab:orange',
            label = f'CCF: {DAILY_CASH * 10000:.0f}')
cash_flow.plot(color = 'tab:green', label = f'RCF: {cash_flow.mean():.0f}', ax = ax2)

ax2.set_ylim(0)
ax2.legend(ncols = 2, framealpha = 0.2)

하단 보조 그래프를 그리는 코드입니다. ax2를 사용하여 그리고 있습니다. DAILY_CASH는 앞서 고정 금액 인출식에서 정의한 값인데, 1억원이 아닌 10,000이 기준이기에 10,000을 곱했습니다. 시각적 착시를 방지하기 위해 세로축의 최소값을 0으로 지정하고, 범례가 그래프를 가리지 않도록 투명도를 높게 설정했습니다.

보조 그래프를 이용하여 인출식 자산 가격 변동과 현금 흐름을 함께 나타낸 결과

고정 금액 인출식과 고정 비율 인출식의 자산과 현금 흐름의 변화와 차이를 보다 쉽게 알아볼 수 있습니다.

정리하며

고정 금액 인출식에 이어 고정 비율 인출식에 대해 살펴보았습니다. 금융 자산을 충분한 규모로 보유한 상태가 아니라면, 고정 금액 인출식은 증시 상황에 따라 안정적인 현금 흐름 마련에 큰 위협이 될 수 있습니다. 증시가 장기간 하락 또는 횡보하면 자산이 기대보다 빠르게 감소할 수 있기 때문입니다.

일반적인 은퇴자라면 연금 등으로 만드는 기본 생활비에 금융 자산으로 만드는 고정 비율 인출식 현금 흐름을 더하는 것이 현실적입니다. 증시가 좋지 못한 경우라면 사용할 수 있는 생활비가 다소 줄어들겠지만, 투자 자산이 바닥나지 않으면서 인플레이션을 고려한 자산의 장기 성장률 수준으로 현금 흐름을 만들 수 있기 때문입니다.

고정 비율 인출식은 증시가 활황일 때 필요 이상의 현금 흐름이 만들어질 수 있습니다. 이 경우 최대 현금 흐름을 제한해서 혹시 모를 미래 위험에 대비할 필요가 있습니다. 이에 시뮬레이션하는 코드는 책으로 출간될 때 추가하여 소개할 계획입니다.

에필로그

파이썬을 이용하여 투자 관련 데이터를 가공하고 그래프로 표현하고 분석하는 방법을 살펴보았습니다. 지금까지의 연재를 차근차근 따라왔다면, 파이썬이 본인에게 필요한 도구인지, 그리고 어떻게 활용이 가능한지 가늠할 수 있을 것입니다.

연재 시작편에서도 이야기했지만, 투자자마다 투자 환경과 투자 목적이 다릅니다. 이 때문에 본인의 상황에 맞춰 투자 성과를 분석할 수 있는 기본적인 방법을 이해하고 활용하는 것이 바람직할 수 있습니다.

투자자에 따라서는 보다 익숙한 구글 시트와 같은 스프레드시트를 활용할 수도 있고, 파이썬과 같은 프로그래밍 언어를 사용할 수도 있습니다. 어느 어떤 툴이든 장기적인 관점에서 분석 방법을 공부해서 본인의 투자를 되돌아보고, 미래를 설계하는데 고려하는 것이 필요할 수 있습니다.

지금까지 읽어 주셔서 감사드립니다.

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

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

이어지는 글: [파이썬 분석 부록 A1] 파이썬 그래프에 한글 사용하기 (구글 코랩, 주피터 노트북)

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

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

  1. [파이썬 분석 22] 고정 금액 인출식 성과를 인플레이션을 고려해서 추정해 보자
  2. [파이썬 분석 21] 적립식 성과를 인플레이션을 고려해서 추정해 보자
  3. [파이썬 분석 20] 인플레이션을 고려해 보자 (한국은행 소비자물가지수 데이터 사용)
  4. [파이썬 분석 19] 관계의 안정성을 살펴보자 (상관 계수 변화를 통한 관찰)
  5. [파이썬 분석 18] 투자 기간에 따른 위험의 변화를 살펴보자 (기초자산과 커버드콜의 경우, VaR, CVaR)

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

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

facebook twitter kakaoTalk naver band