테슬라·엔비디아·금 ‘RSI 마법의 숫자’ 공개: 게으른 직장인을 위한 월 1회 퀀트 전략

대학원 입학 대실패로 상처받은 마음을 달래고자 퀀트투자 공부를 시작했습니다.

한땀한땀 코드를 작성하면서 실습을 더디게 해 나가고 있는데요, 실습으로 끝내면 아쉬우니 직접 투자를 병행하려고 합니다. 게으른 직장인인지라 자동매매에 혹했으나 위험성이 커서 지피티도 말리더군요. 반퀀트를 목표로 RSI 평규회귀 전략을 추진하려고 합니다.

자동 퀀트는 이상 신호 발생 시 즉각 대응이 가능해야하는데 직장인의 현실상 회사에 매여 있으므로 불가능하죠. 월루도 하루이틀이지 절대 불가능입니다. 그리고 이 간극이 쌓이다보면 큰 손실로 확대된다니 너무 무서운 경고 아닙니까? 따라서 반 퀀트 + 월 1회 전략으로 갑니다. 월 1회인 이유는 월봉이 노이즈를 제거하고 진짜 방향성만 남는다는 이유도 있지만 그냥 제가 게으른 직장인이라서 그래요.


fs.indicator_to_signal(df, factor='rsi', buy=60, sell=40) fs.position(df) fs.evaluate(df,cost=.001) fs.performance(df, rf_rate=0.01) fs.draw_chart(df, left='rsi', right='position_chart') fs.draw_chart(df, left='acc_rtn_dp', right='AAPL')

교재에 쓰던 구조를 그대로 유지하면서 실전투자계획을 세워볼 겁니다.

원래 RSI 평균회귀 전략은 보통 다음과 같습니다.

buy=40
sell=60
  • RSI ↓ (과매도) → 매수
  • RSI ↑ (과매수) → 매도

그런데 완전히 뒤집어서 적용해보니 수익률이 더 좋아졌습니다?

buy=60
sell=40

RSI 기반 추세추종(momentum) 전략 → “강하면 산다, 약하면 판다”

왜 수익률이 더 좋아졌나?

이유 1: AAPL은 평균회귀 자산이 아님

AAPL 같은 대형 기술주는 장기적으로

  • 추세가 강함
  • RSI가 60 이상에서 오래 머무는 구간이 많음
  • “과매수 상태에서도 더 오름”

즉,

❌ RSI 70 = 곧 떨어진다
✅ RSI 70 = 강한 추세 중일 가능성 높음

그래서 평균회귀 전략은
👉 상승 초반에 자꾸 팔아버림

이유 2: 거래비용(cost=.001) 영향

평균회귀 전략은:

  • 잦은 진입/청산
  • 작은 수익 반복

반면 추세추종은:

  • 거래 횟수 ↓
  • 한 번 잡으면 오래 감

👉 수수료 고려 시 추세 전략이 압도적으로 유리

따라서 RSI 평균회귀가 실제로 잘 먹히는 종목을 선택해야겠죠!


평균회귀가 잘 먹히는 종목의 조건

구조적 특징

  • 장기 우상향 X (또는 매우 완만)
  • 횡보 구간이 길다
  • 변동성은 있는데 방향성은 약하다
  • 기관이 “가격 안정”을 선호

평균회귀 전제에서 추천 종목 / ETF

① 금(Gold) 관련 ETF

GLD, IAU

  • 대표적인 평균회귀 자산
  • RSI 30~40 → 반등 빈도 높음
  • RSI 60~70 → 실제 조정 자주 발생

② 통화 ETF (의외로 좋음)

UUP (달러 인덱스), FXE (유로)

  • 중앙은행 개입 → 과도한 추세 억제
  • RSI 평균회귀가 꽤 안정적

③ 섹터 ETF (강추)

XLU (유틸리티)
XLP (필수소비재)
XLV (헬스케어)

  • 섹터 자체가 방향성이 약함
  • RSI 평균회귀 성능 안정적
  • 거래 횟수도 과하지 않음

※ 섹터 ETF(Sector ETF) : 특정 산업(섹터)에 속한 여러 기업을 한 번에 묶어 투자하는 ETF

반대로 절대 평균회귀 쓰면 안 되는 것

❌ AAPL, NVDA, TSLA
❌ QQQ, SOXL
❌ 테마주, 성장주, AI/반도체
❌ “서사 있는 종목”

👉 얘네는 RSI 70이 시작이지 끝이 아님


실제로 적용해보면 어떨까?

import finterstellar as fs

# 1. 금(GLD) 주가 데이터 가져오기
df = fs.get_price('GLD', start_date='2005-01-01', end_date='2025-12-31')

# 2. RSI 지표 계산 (이 부분이 빠져서 오류가 났습니다!)
fs.rsi(df, w=14)

# 3. RSI를 이용해 매수/매도 시그널 생성 (40에 사고 60에 팔기)
fs.indicator_to_signal(df, factor='rsi', buy=40, sell=60)

# 4. 포지션 산출 및 수익률 평가
fs.position(df)
fs.evaluate(df, cost=.001)

# 5. 성과 지표 출력
fs.performance(df, rf_rate=0.01)

# 6. 차트 그리기
fs.draw_chart(df, left='rsi', right='position_chart')
fs.draw_chart(df, left='acc_rtn_dp', right='GLD')

실행해보니 일단위인 것 같네요. 월단위로 수정해보죠.

import finterstellar as fs

# 1. 데이터 가져오기
df = fs.get_price('GLD', start_date='2005-01-01', end_date='2025-12-31')

# 2. 월단위 데이터로 변환
# 판다스의 resample('BM')은 'Business Month end' 즉, 매월 영업일 마지막 날 기준으로 데이터를 모아줍니다.
df = df.resample('BM').last()

# 3. 지표 계산 (이제 월봉 기준 RSI가 계산됩니다)
fs.rsi(df, w=14)

# 4. 시그널 생성 및 백테스팅 (RSI 40 이하 매수, 60 이상 매도)
fs.indicator_to_signal(df, factor='rsi', buy=40, sell=60)
fs.position(df)
fs.evaluate(df, cost=.001)

# 5. 성과 지표 및 차트
fs.performance(df, rf_rate=0.01)
fs.draw_chart(df, left='rsi', right='position_chart')
fs.draw_chart(df, left='acc_rtn_dp', right='GLD')

금(GLD) 데이터로 20년 가까운 시간 동안 단 1번의 거래만 발생했고, 수익률마저 마이너스라는 점은 현재 설정한 RSI 파라미터가 금의 장기 흐름을 전혀 포착하지 못하고 있다는 뜻입니다.
월간 데이터는 일간보다 움직임이 무겁습니다. 한 달 중간에 주가가 폭락해서 RSI가 30(매수 기호)까지 갔다가 월말에 다시 회복했다면, 월간 데이터만 보는 로직은 이 절호의 매수 기회를 “아무 일 없었음”으로 처리합니다.

현실적인 대안: “일간 분석 + 월간 리밸런싱”

가장 권장하는 방식은 다음과 같습니다.

  1. 일간 데이터로 지표 계산: RSI 등 보조지표를 일봉 기준으로 촘촘하게 계산합니다.
  2. 매매 필터 적용: 매일 매매하는 것이 아니라, “매월 마지막 날에만 신호를 체크해서 매수/매도한다”라는 규칙을 코드에 넣는 것입니다.
import finterstellar as fs

# 1. 일간 데이터로 가져오기
df = fs.get_price('GLD', start_date='2005-01-01', end_date='2025-12-31')

# 2. 일간 기준으로 RSI 계산 (정밀한 분석)
fs.rsi(df, w=14)

# 3. 일간 기준으로 매수/매도 신호 생성
fs.indicator_to_signal(df, factor='rsi', buy=40, sell=60)

# 4. ★ 핵심: 매매는 한 달에 한 번만! (월말 데이터만 추출)
# 신호가 매일 발생하더라도 실제로는 월말의 신호만 채택합니다.
df_hybrid = df.resample('BM').last()

# 5. 이후 과정 진행
fs.position(df_hybrid)
fs.evaluate(df_hybrid, cost=.001)

# 결과 확인
fs.performance(df_hybrid, rf_rate=0.01)
fs.draw_chart(df_hybrid, left='rsi', right='position_chart')
fs.draw_chart(df_hybrid, left='acc_rtn_dp', right='GLD')

1. 벤치마크(875%) vs 전략(115%) : 수익률의 함정

벤치마크가 압도적으로 높은 이유는 금(GLD)이 지난 20년간 엄청난 장기 우상향을 했기 때문입니다.

  • 전략의 한계: RSI 40/60 전략은 ‘적당히 오르면 팔고(60)’, ‘적당히 떨어지면 사는(40)’ 방식입니다. 문제는 금값이 미친 듯이 오르는 ‘불장’에서도 60만 되면 팔고 현금을 들고 기다렸다는 점입니다. 875%의 수익을 다 먹으려면 그 무서운 변동성을 온몸으로 견디며 20년 동안 한 번도 팔지 않았어야 합니다.

2. 승률 72.34% : 이 전략의 진짜 가치

47번의 거래 중 34번을 이겼다는 건 매우 훌륭한 승률입니다.

  • 그냥 보유하는 것은 수익률은 높지만, 중간에 자산이 반토막 나는 고통을 견뎌야 합니다.
  • 반면, 이 전략은 “크게 먹지는 못해도, 들어갈 때마다 높은 확률로 돈을 벌고 나왔다”는 것을 의미합니다. 심리적으로 훨씬 편안한 투자였다는 증거죠.

3. MDD (최대 낙폭) : 방어력 확인

  • 벤치마크 MDD: -42.91% (내 돈 1억이 5,700만 원이 되는 순간을 견뎌야 함)
  • 전략 MDD: -34.98% (상대적으로 고통이 적음) 전략이 시장보다 하락장에서 자산을 조금 더 잘 지켜줬습니다.

그래도 존버가 가장 좋은 선택인 것 같거등요… 게다가 계속해서 1주를 샀다팔았다 하는 전략은 너무 귀찮으므로 제 취향이 아닙니다. 최적의 RSI 선택이 필요해 보여요.


“그냥 들고 있는 것”보다 더 좋게 만들려면?

import finterstellar as fs
import pandas as pd
import numpy as np

# 1. 데이터 로드 및 RSI 계산
df_raw = fs.get_price('GLD', start_date='2005-01-01', end_date='2025-12-31')
fs.rsi(df_raw, w=14)

results = []

# 2. 루프 설정
for b in range(30, 51, 5):
    for s in range(60, 91, 5):
        df = df_raw.copy()
        fs.indicator_to_signal(df, factor='rsi', buy=b, sell=s)

        # 월말 데이터 추출
        df_h = df.resample('BM').last()
        fs.position(df_h)
        fs.evaluate(df_h, cost=.001)

        # 3. 에러 방지용 처리
        if 'acc_rtn_dp' in df_h.columns:
            rtn = df_h['acc_rtn_dp'].iloc[-1]

            # [수정 포인트] position 칼럼을 숫자로 변환 후 차이 계산
            # 만약 데이터가 비어있거나 생성되지 않았을 경우를 대비해 처리
            pos_numeric = pd.to_numeric(df_h['position'], errors='coerce').fillna(0)
            trades = pos_numeric.diff().abs().sum()

            results.append({
                'buy': b,
                'sell': s,
                'return': round((rtn - 1) * 100, 2), # % 수익률로 보기 편하게 변환
                'trades': int(trades)
            })

# 4. 결과 출력
rdf = pd.DataFrame(results).sort_values(by='return', ascending=False)
print("--- GLD RSI Optimization Results ---")
print(rdf)

결과가 굉장히 충격적이고 재미있네요! 수익률이 수만 퍼센트로 나오는데 정작 매매 횟수(trades)는 0으로 표시되고 있습니다.

이 데이터가 우리에게 주는 의미는 명확합니다. “살 타이밍(Buy)은 잡았지만, 팔 타이밍(Sell)이 한 번도 오지 않아서 20년째 들고 있는 상태”가 수익률이 가장 높다는 뜻입니다. 금(GLD) 백테스트 결과를 통해 “강력한 우상향 자산은 어설프게 사고파는 것보다 들고 있는 게 낫다”는 아주 중요한 교훈을 얻었습니다… 이걸 원한게 아닌데!

금(GLD)에서 거래 횟수가 0으로 나왔던 건 종목을 잘못 잡았다기보다, 그 종목들이 ‘너무 모범생처럼 우상향만 해서’ RSI가 사고팔 기회를 주지 않았기 때문입니다. RSI나 변동성 지표를 활용한 매매 전략이 빛을 발하려면, 주가가 위아래로 출렁이며 파동을 만드는 변동성 종목이나 추세가 확실한 종목이 유리합니다.

1. 변동성의 끝판왕: TQQQ (나스닥 100 3배 레버리지)

RSI 전략을 테스트하기에 가장 재미있는 종목입니다. 나스닥 지수를 3배로 추종하기 때문에 RSI가 30 이하로 떨어지거나 70 위로 치솟는 일이 빈번합니다.

  • 특징: 급락과 급등이 반복되어 매수/매도 신호가 자주 발생합니다.
  • 추천 전략: RSI 30~35(매수) / 65~70(매도)

2. 기술주의 상징: TSLA (테슬라)

개별 종목 중 변동성이 크기로 유명합니다. 강력한 팬덤과 공매도 세력이 싸우면서 주가가 파동을 그리며 움직이기 때문에 RSI 지표가 비교적 잘 들어맞는 구간이 많습니다.

  • 특징: 단순 우상향이 아니라 ‘폭등 후 폭락’ 패턴이 있어 백테스팅 수익률 차이가 확연히 드러납니다.
  • 추천 전략: RSI 40(매수) / 70(매도)

3. 반도체 섹터: SOXX (iShares Semiconductor ETF)

헬스케어와 같은 섹터 ETF지만, 반도체는 사이클 산업이라 주가 등락이 뚜렷합니다. 헬스케어(XLV)에서 신호가 안 잡혀 답답하셨다면 반도체 섹터가 대안이 될 수 있습니다.

  • 특징: 경기에 민감하여 과매수/과매도 구간에 자주 진입합니다.

부푼기대를 가지고 변동성 끝판왕을 돌려본다면?

수익률 수치가 드디어 백만 퍼센트(1,458,187%) 단위까지 올라갔네요! 하지만 이번에도 역시 Trades0입니다.

TQQQ처럼 변동성이 극심한 종목조차 2011년 상장 이후 월말 종가 기준으로는 우리가 설정한 매도선(80)을 뚫고 내려오는 ‘청산 신호’가 한 번도 안 잡혔거나, 혹은 한 번 산 뒤로 계속 들고 있는 것이 수익률이 압도적이라는 뜻입니다.

왜 자꾸 Trades가 0이 나올까요?

우리가 ‘월말 데이터(Hybrid)’를 사용하기 때문입니다.

  • TQQQ가 한 달 중순에는 미친 듯이 폭등해서 RSI가 90까지 갔다가도, 정작 우리가 데이터를 확인하는 ‘매월 마지막 영업일’에는 RSI가 70 정도로 내려와 있다면? 컴퓨터는 “아직 팔 때가 아니네”라고 판단하고 계속 보유합니다.
  • 즉, “나스닥의 장기 우상향 힘이 워낙 강해서, 월말 종가 기준으로 RSI가 80을 넘겨 ‘매도’ 신호를 준 적이 거의 없다”는 결론이 나옵니다.

드디어 거래(Trade)를 발생시킬 최후의 수단: “추세 추종(Reverse)”

지금까지 우리는 “싸게 사서 비싸게 파는(Buy Low, Sell High)” 전략을 썼습니다. 하지만 TQQQ처럼 미친 듯이 오르는 종목은 “오를 때 사서, 꺾일 때 파는(Buy High, Sell Low)” 전략이 더 잘 맞을 수 있습니다.

와, 정말 대단한 결과입니다. 금, 헬스케어에 이어 나스닥 3배 레버리지(TQQQ)조차 모든 전략 조합에서 거래 횟수(Trades)가 0이 나왔습니다.

이것은 백테스팅 데이터가 우리에게 던지는 아주 명확하고도 강력한 결론입니다.

데이터가 말해주는 결론: “마켓 타이밍의 패배”

2011년 TQQQ 상장 이후 지금까지, 월말 종가 기준으로는 우리가 설정한 그 어떤 ‘탈출 조건(Sell)’도 만족시킨 적이 없거나, 혹은 한 번 상승 추세에 올라탄 뒤로는 단 한 번도 그 추세가 완전히 꺾여서 신호를 줄 만큼 내려오지 않았다는 뜻입니다.”어설픈 잔기술(매매 타이밍)이 시장의 거대한 흐름(우상향)을 이기기 어렵다”는 걸 데이터가 팩트로 때리고 있습니다.


최종 결론: 금(GLD)은 ‘존버’인가 ‘추세추종’인가?

  • 당신이 자산가라면 (방어 중점): 추세추종이 압승입니다. -42%라는 폭락을 견디지 못하고 바닥에서 팔아버리는 실수를 막아주기 때문입니다. 7.5%의 복리는 장기적으로 자산을 지키기에 충분합니다.
  • 당신이 공격적 투자자라면 (수익 중점): 그냥 사서 묻어두는 것(Buy & Hold)이 낫습니다. 금의 장기 우상향 힘을 믿고 변동성을 견디는 대가로 2배 이상의 수익을 더 챙길 수 있습니다.

앞으로 하게 될 실험은 다음과 같습니다

1. 테슬라(TSLA) 적정 RSI: “안전 최우선”

아까 백테스트 결과에서 보셨듯이, 테슬라는 **-70%**라는 지옥의 폭락을 피하는 것이 핵심입니다.

  • 매수(Buy): 60
  • 매도(Sell): 55
  • 이유: 60은 넘어야 “진짜 반등”이라고 볼 수 있고, 워낙 급등락이 심해 55만 깨져도 일단 수익을 챙기고 나오는 것이 계좌를 지키는 비결입니다. (MDD를 -37%로 방어한 최적 수치)

2. 엔비디아(NVDA) 적정 RSI: “추세 극대화”

엔비디아는 테슬라보다 상승 추세가 더 끈질기게 유지되는 경향이 있습니다. 너무 빨리 팔면 그 뒤에 오는 거대한 상승분을 놓치기 쉽습니다.

  • 매수(Buy): 60
  • 매도(Sell): 50
  • 이유:
    • 매수(60): 반도체 섹터의 대장주로서 확실한 탄력이 붙었음을 확인하고 들어갑니다.
    • 매도(50): 테슬라(55)보다 조금 더 여유를 둡니다. 엔비디아는 단기 조정을 거치고 다시 치고 나가는 힘이 강해서, RSI의 중간선인 50이 무너지기 전까지는 웬만하면 들고 가는 것이 수익률 극대화에 유리합니다.

3. 금(GLD) 저점 매수 “마법의 숫자”: RSI 45 / 65

우리 백테스트에서 **수익률과 안정성(MDD -29%)**의 밸런스가 가장 좋았던 조합입니다.

  1. 매수 (Buy Low): RSI 45 이하
    • 금값이 최근 고점 대비 충분히 눌렸을 때입니다.
    • “더 빠지면 어쩌지?”라는 생각이 들 때가 1차 매수 적기입니다.
  2. 매도 (Sell High): RSI 65 이상
    • 금값이 서서히 과열되어 “역시 안전자산은 금이야”라는 뉴스가 나올 때입니다.
    • 이때 전량 매도하거나 일부 수익을 실현하여 현금을 확보합니다.
자산역할전략 유형매수(BUY) 시점매도(SELL) 시점비고
테슬라 (TSLA)공격민감 추세추종RSI 60 돌파 시RSI 55 하향 시폭락장(-70%)을 피하는 핵심 전략
엔비디아 (NVDA)공격장기 추세추종RSI 60 돌파 시RSI 50 하향 시강력한 상승 몸통을 길게 먹기
금 (GLD)방어역추세(저점매수)RSI 45 이하 시RSI 65 돌파 시남들이 무서워할 때 싸게 줍줍

월마다 적용해보고 수익률을 한번 보려구요!
오늘은 뭔가 공부좀 한 느낌이라 뿌듯합니다. (물론 크리스마스 출근기념 월루요)

댓글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다