안녕하세요! AI와 함께 코딩 한 줄 모르는 상태에서 비트코인 자동매매 봇을 구축해 나가는 My AI Stories 시리즈, 시즌 2의 7화입니다.
지난 6화에서는 볼린저 밴드와 RSI 같은 보조지표 필터를 결합해 롱 전략을 고도화하려 했으나, 오히려 강한 상승 추세 진입을 방해하고 잦은 손실 거래만 누적되어 수익률이 마이너스로 꼬꾸라지는 '복잡성의 역설'을 목격했습니다.
전략이 복잡할수록 과거 데이터에만 과도하게 맞춰지는 오버피팅(Overfitting)의 위험에 처하기 쉽다는 뼈아픈 진실이었습니다.
그래서 이번 7화에서는 전략 로직을 억지로 뜯어고치지 않고, 시스템의 판 자체를 흔드는 두 가지 패러다임 전환을 도입했습니다.
- 노이즈가 가득한 4시간봉 대신 더 거시적인 시야를 확보하는 '시간 프레임 확장(8시간봉 및 일봉)'
- 매수할 때마다 수학적 확률에 기초해 최적의 자금을 배분하는 '켈리 공식(Kelly Criterion) 기반 자금 관리'
단순한 이평선 돌파 전략의 뼈대는 그대로 유지한 채, 시간축과 자금 투입 방식만 튜닝하여 3개년 비트코인 데이터를 돌린 결과는 놀랍도록 신선했습니다.
1. 시간 프레임 확장과 켈리 공식의 직관적 원리
💡 시간 프레임 리샘플링(Resampling)의 의의
우리가 그동안 사용한 4시간봉은 시장의 잔파동(노이즈)이 꽤 많이 섞여 있습니다. 이 시간축을 8시간봉이나 일봉(24시간)으로 리샘플링하여 합치면, 자질구레한 흔들림은 캔들 내부로 숨어버리고 굵직한 거대 추세만 살아남습니다. 물리적으로 동일한 20일 이동평균선이라도, 기준 시간 프레임이 길어질수록 봇이 낚시성 돌파에 휩쓸리는 횟수가 극적으로 줄어듭니다.
💡 켈리 공식(Kelly Criterion) 자금관리란?
"내 자산을 매번 올인하지 않고, 성공 확률과 기대 수익에 비례해 자산의 일부만 베팅한다면 어떻게 될까?"라는 질문에서 출발한 수학 법칙입니다. 이평선 돌파 전략의 대략적인 승률(P)을 40%, 평균 이익/손실 비율(R)을 2.5배라고 가정할 때, 켈리 공식이 도출한 최적 베팅 비율은 다음과 같습니다. $$\text{Kelly Fraction (f)} = P - \frac{1 - P}{R} = 0.40 - \frac{0.60}{2.5} = 0.16 \text{ (16%)}$$ 이 수학 공식은 올인하지 말고 매회 전체 자산의 **16%**만 배분하는 것이 파산하지 않고 자산을 복리로 극대화하는 수학적 지점임을 말해줍니다. 이번 실험에서는 이 기준에 안전율 50%를 적용한 '하프 켈리(Half-Kelly)' 원칙에 따라 매수 시 자금의 8%만 투입하도록 설계했습니다.

2. 시간축 변환 및 켈리 공식 백테스팅 코드
기존 4시간봉 시세 데이터를 8시간봉과 일봉(1D)으로 변환(Resampling)하고, 하프 켈리 비율(8%)에 맞춰 매수 시 현금을 분할 투입하도록 개선한 파이썬 스크립트입니다.
import pandas as pd
import numpy as np
# 1. 4시간봉 데이터를 8시간봉 및 일봉(1D)으로 리샘플링
def resample_data(timeframe='4h'):
df = pd.read_csv('btc_4h_3years.csv')
df['timestamp'] = pd.to_datetime(df['timestamp'])
df.set_index('timestamp', inplace=True)
if timeframe == '4h':
df.reset_index(inplace=True)
return df
rule = '8h' if timeframe == '8h' else '1D'
# 고가, 저가, 시가, 종가 및 거래량 병합 규칙 적용
resampled = df.resample(rule).agg({
'open': 'first',
'high': 'max',
'low': 'min',
'close': 'last',
'volume': 'sum'
}).dropna().reset_index()
return resampled
# 2. 리샘플링 데이터 기준 백테스팅 및 켈리 공식 자금관리 적용
def run_backtest_timeframe(timeframe='4h', use_kelly=False):
df = resample_data(timeframe)
# 20일 기준 윈도우 조절 (4시간봉=120캔들, 8시간봉=60캔들, 일봉=20캔들)
if timeframe == '4h':
window = 120
elif timeframe == '8h':
window = 60
else:
window = 20
df['ma'] = df['close'].rolling(window=window).mean()
df['volume_ma'] = df['volume'].rolling(window=20).mean()
df = df.dropna().reset_index(drop=True)
init_balance = 10000.0
balance = init_balance
holdings = 0.0
portfolio_values = []
# 승률 40%, 손익비 2.5 기준 하프 켈리 비율인 8% 투자 비율 적용
kelly_fraction = 0.08 if use_kelly else 1.0
for i in range(len(df)):
current_price = df.loc[i, 'close']
current_ma = df.loc[i, 'ma']
current_volume = df.loc[i, 'volume']
current_vol_ma = df.loc[i, 'volume_ma']
total_asset = balance + (holdings * current_price)
portfolio_values.append(total_asset)
# 1. 청산 (이평선 하향 돌파 시)
if holdings > 0 and current_price < current_ma:
balance += (holdings * current_price) * 0.999
holdings = 0.0
# 2. 매수 진입 (거래량 필터 적용)
if current_price > current_ma and holdings == 0:
if current_volume > (current_vol_ma * 1.2):
# 켈리 공식 적용 시 자산의 일정 비율만 진입, 미적용 시 100% 올인
invest_amt = balance * kelly_fraction
holdings = (invest_amt * 0.999) / current_price
balance -= invest_amt
final_asset = balance + (holdings * df.iloc[-1]['close'])
df['portfolio_value'] = portfolio_values
df['cum_max'] = df['portfolio_value'].cummax()
df['drawdown'] = (df['portfolio_value'] - df['cum_max']) / df['cum_max']
mdd = df['drawdown'].min() * 100
cumulative_return = ((final_asset - init_balance) / init_balance) * 100
return len(df), cumulative_return, mdd
3. 대망의 3개년 시간프레임 & 자금관리 성적표
동일한 비트코인 3개년 시세를 기반으로, 올인 베팅 방식과 하프 켈리(8% 배분) 방식을 각 시간축별로 교차 검증한 결과입니다.
| 시간 프레임 구분 | 캔들 수 | 자금 운용 방식 | 누적 수익률 (%) | 최대 낙폭 (MDD, %) | 성과 및 변동성 평가 |
|---|---|---|---|---|---|
| 4시간봉 (4h) | 7,323개 | 100% 올인 베팅 | +141.74% | -27.30% | 변동성이 크나 수익 기회가 잦음 |
| 하프 켈리 자금관리 (8%) | +9.62% | -2.99% | 수익률은 대폭 감소, 낙폭은 극단적 안정(3% 미만) | ||
| 8시간봉 (8h) | 3,662개 | 100% 올인 베팅 | +81.69% | -35.30% | 애매한 프레임으로 휩소 노출 잦음 |
| 하프 켈리 자금관리 (8%) | +6.86% | -3.37% | 변동성 극단 억제 모드 | ||
| 일봉 (1D) | 1,222개 | 100% 올인 베팅 (최적) | +138.75% | -23.49% | 4시간봉 급 수익 달성 및 MDD 4%p 극적 개선 |
| 하프 켈리 자금관리 (8%) | +8.92% | -2.08% | 사실상 적금 수준의 안전한 우상향 곡선 |
4. 데이터가 알려준 위대한 진실
1) 시간 프레임 확장의 위력: 일봉(1D)의 대발견
우리는 보통 자동매매 봇을 만들 때 짧은 봉(1분봉, 15분봉, 4시간봉)을 선호합니다. 더 자주 매매해서 돈을 빨리 불리고 싶기 때문이죠. 하지만 데이터를 보면 일봉(1D) 올인 전략이 수익률 +138.75%, MDD -23.49%로 4시간봉 대비 전혀 꿀리지 않는 최상급 성적을 냈습니다. 4시간봉 대비 캔들 개수가 6분의 1 이하로 적어 매매 횟수와 수수료는 대폭 줄었음에도, 가짜 휩소 돌파에 낚이지 않고 큰 대세 상승장 흐름만 굵직하게 먹었기 때문에 가능한 결과입니다.
※ 단, 기술적 관점에서 짚고 넘어가야 할 점은 시간 프레임이 일봉으로 확장되면서 거래량 필터의 기준선(최근 20캔들 거래량 평균)의 물리적 일수도 일봉 기준 20일(4시간봉 기준은 3.3일)로 함께 확장되었다는 점입니다. 따라서 이 성과 개선은 단순한 시간축 확장뿐만 아니라, 거래량의 20일 장기 평균 필터가 가짜 돌파를 더욱 끈끈하게 잘 막아준 복합 효과가 작용한 결과입니다.
반면 8시간봉(8h)은 4시간봉의 변동성 단점과 일봉의 느린 템포 단점만 결합되어 오히려 MDD가 -35.30%로 악화되었습니다. 시간 프레임을 선택할 때는 확실하게 큰 단위(일봉)로 이동하는 것이 훨씬 효율적입니다.
2) 켈리 공식의 명암: '심리적 천국'과 '수익의 희생'
켈리 공식 자금관리를 적용했을 때 결과는 극단적이었습니다. 4시간봉에서 켈리를 쓰자 수익률은 +9.62%로 내려앉았지만, MDD가 무려 -2.99%로 사실상 원금 파손 리스크가 제로에 가까운 안전성을 보여주었습니다. 일봉의 경우 MDD가 단 **-2.08%**였습니다!
※ 참고로 이번 코드에 적용된 자금 관리는 매 거래의 승률과 손익비를 실시간으로 동적 계산해 베팅 크기를 늘리고 줄이는 고난도 동적 켈리가 아닌, 과거 고정 통계값(승률 40%, 손익비 2.5)을 기반으로 자산의 일정 비율(8%)만 진입하도록 설계한 정적 하프 켈리 자금배분 방식입니다. 켈리의 수학적 아이디어를 보수적인 고정 자금 비율 관리에 안전망으로 차용한 개념입니다.
매매 한 번에 8%의 적은 시드만 태우기 때문에, 아무리 큰 폭락을 맞아 손절이 나가더라도 전체 자산에는 상처조차 나지 않는 것입니다.
- 올인 전략: 고점 대비 자산이 27% 깎이는 롤러코스터 심장 마비를 견뎌야 함.
- 켈리 전략: 계좌가 2~3% 수준에서만 살짝 출렁이며 예금처럼 잔잔하게 우상향함.
수십억 단위의 큰 시드를 굴리거나 절대로 원금을 잃어서는 안 되는 안정형 투자자라면 켈리 공식(혹은 하프 켈리)을 이용한 자금 비중 제어가 필수적입니다. 반대로 공격적인 복리 성장을 원한다면 켈리 비율을 높이거나(예: 30~40%) 적절한 불타기를 섞어 타협점을 찾아야 합니다.
5. 에필로그 및 다음 화 예고
이번 백테스팅을 통해 전략 로직의 매수/매도 규칙을 복잡하게 손대지 않고도, 캔들 시간 프레임과 매수 비중 조절이라는 외적인 매개변수 조절만으로 계좌의 성격을 완전히 180도 바꿀 수 있음을 깨달았습니다.
- 잔노이즈를 걸러내고 효율을 올리고 싶다면: 일봉(1D) 프레임 도입
- 심장 쫄깃한 변동성을 억누르고 안전형 자산으로 굴리고 싶다면: 켈리 자금배분 기법 도입
비전공자인 저도 이제 제 투자 성향과 시드 규모에 맞는 자금 관리 모델을 명확한 데이터로 튜닝할 수 있게 되었습니다.
다음 8화에서는 지금까지 시즌 2에서 돌려본 모든 백테스팅 데이터를 총망라하고, 시즌 2를 최종 결산해 보겠습니다. 어떤 조합(시간축 + 필터 + 자금관리)이 우리의 실전 매매 봇을 위한 최종 낙찰 전략이 될지, 그리고 실제 파이썬 자동화 봇에 이 설계를 어떻게 코드로 주입하는지 최종 정리로 찾아뵙겠습니다!
여러분은 투자할 때 캔들 시간 프레임을 주로 어디에 두고 보시나요? 매수 시 시드의 몇 %를 투입하시는지 여러분만의 기준을 댓글로 나누어 주세요!
(참고: 본 포스팅에 기재된 시뮬레이션 결과는 과거 데이터 기반의 백테스팅 결과로, 미래의 투자 수익을 보장하지 않습니다. 모든 투자 책임은 본인에게 있습니다.)