시계열 모멘텀(Time-series Momentum) 전략
시계열 모멘텀(Time-series Momentum, TSM) 전략은 과거 특정 기간 동안의 자산 수익률을 기반으로 투자 결정을 내리는 퀀트 투자 기법입니다. 본 글에서는 시계열 모멘텀 전략의 개념을 설명하고, Python으로 구현한 백테스트와 성능 분석을 통해 전략의 효과를 검증합니다.1. 시계열 모멘텀 전략 개요
1.1 전략 개념
- 전략 구조: 위험자산과 무위험자산 두 가지를 활용.
- 투자 판단 기준:
- 과거 특정 기간(τ)의 수익률이 양수일 경우 위험자산에 투자.
- 음수일 경우 무위험자산에 투자.
1.2 하이퍼파라미터
하이퍼파라미터 | 설명 | 예시 |
---|---|---|
기간 | 데이터 분석 기간 | 1990/01/31 ~ 2021/11/30 |
단위 | 데이터의 시간 단위 | 1개월 |
모멘텀 측정 기간(τ) | 과거 수익률 계산 기간 | 12개월 |
비중 | 포트폴리오 내 각 자산의 투자 비중 | 100% / 0% |
리밸런싱 주기 | 포트폴리오 재조정 주기 | 1개월 |
2. Python을 활용한 구현
2.1 데이터 준비
먼저, 위험자산(KOSPI200)과 무위험자산(CD금리)의 데이터를 준비합니다.pythonimport pandas as pd # 데이터 불러오기 data = pd.read_excel('rawdata.xlsx', sheet_name='Sheet1', index_col='Date') data.index = pd.to_datetime(data.index) # 위험자산과 무위험자산 분리 risky_asset = data['KOSPI200'] risk_free_asset = data['CD1m'] # 수익률 계산 risky_return = risky_asset.pct_change() * 100 risk_free_return = risk_free_asset.shift(1) / 12
2.2 시계열 모멘텀 함수
다음 함수는 시계열 모멘텀 전략을 구현합니다. 과거 τ기간 동안의 수익률 추세를 계산하고, 이를 기반으로 투자 결정을 내립니다.pythondef time_series_momentum(tau, risky_return, risk_free_return, initial_money): # 모멘텀 계산 momentum = risky_return.shift(tau).rolling(window=tau).sum() signal = (momentum > 0).astype(int) # 양수면 위험자산 투자 # 백테스트 준비 portfolio_value = [initial_money] for t in range(tau, len(risky_return)): if signal.iloc[t] == 1: return_t = risky_return.iloc[t] else: return_t = risk_free_return.iloc[t] portfolio_value.append(portfolio_value[-1] * (1 + return_t / 100)) return portfolio_value
2.3 백테스트 실행
12개월(τ=12)을 기준으로 백테스트를 실행합니다.python# 초기 조건 설정 initial_money = 100 # 시계열 모멘텀 실행 portfolio_12m = time_series_momentum( tau=12, risky_return=risky_return, risk_free_return=risk_free_return, initial_money=initial_money )
2.4 결과 시각화
백테스트 결과를 시각화하여 전략 성과를 확인합니다.pythonimport matplotlib.pyplot as plt # 결과 그래프 그리기 plt.figure(figsize=(10, 6)) plt.plot(portfolio_12m, label='Momentum (12M)') plt.title('Time-series Momentum Strategy') plt.xlabel('Time') plt.ylabel('Portfolio Value') plt.legend() plt.grid() plt.show()
3. 추가 기능
3.1 성과 지표 계산
포트폴리오의 CAGR(연평균 성장률)과 Sharpe Ratio를 계산하여 전략 성과를 평가할 수 있습니다.pythondef calculate_performance(portfolio_value): # CAGR 계산 cagr = ((portfolio_value[-1] / portfolio_value[0]) ** (1 / (len(portfolio_value) / 12)) - 1) * 100 # Sharpe Ratio 계산 (무위험 자산 제외) returns = pd.Series(portfolio_value).pct_change().dropna() sharpe_ratio = returns.mean() / returns.std() * (12 ** 0.5) return round(cagr, 2), round(sharpe_ratio, 2) cagr, sharpe_ratio = calculate_performance(portfolio_12m) print(f"CAGR: {cagr}%, Sharpe Ratio: {sharpe_ratio}")
3.2 다양한 τ값 테스트
다양한 τ값(예: 3개월, 6개월 등)을 사용하여 성과를 비교할 수 있습니다.pythontaus = [3, 6, 12] results = {} for tau in taus: portfolio = time_series_momentum(tau, risky_return, risk_free_return, initial_money) cagr, sharpe_ratio = calculate_performance(portfolio) results[tau] = {'CAGR': cagr, 'Sharpe Ratio': sharpe_ratio} print(results)
4. 최적화 및 추가 분석
4.1 벤치마크 비교
벤치마크로 KOSPI200 지수를 사용하여 전략 성과와 비교합니다.pythondef benchmark_performance(risky_asset, initial_money): benchmark_portfolio = (risky_asset / risky_asset.iloc[0]) * initial_money returns = benchmark_portfolio.pct_change().dropna() cagr = ((benchmark_portfolio[-1] / benchmark_portfolio[0]) ** (1 / (len(benchmark_portfolio) / 12)) - 1) * 100 sharpe_ratio = returns.mean() / returns.std() * (12 ** 0.5) return benchmark_portfolio, round(cagr, 2), round(sharpe_ratio, 2) benchmark_portfolio, benchmark_cagr, benchmark_sharpe = benchmark_performance(risky_asset, initial_money) print(f"Benchmark CAGR: {benchmark_cagr}%, Sharpe Ratio: {benchmark_sharpe}")
4.2 Drawdown 분석
최대 손실(Drawdown)을 분석하여 리스크를 평가합니다.pythondef calculate_drawdown(portfolio_value): max_value = pd.Series(portfolio_value).cummax() drawdown = (pd.Series(portfolio_value) - max_value) / max_value * 100 max_drawdown = drawdown.min() return drawdown, round(max_drawdown, 2) drawdown_12m, max_drawdown_12m = calculate_drawdown(portfolio_12m) print(f"Max Drawdown (12M): {max_drawdown_12m}%")
5. 결론
시계열 모멘텀 전략은 단순하지만 강력한 툴로 다양한 시장 환경에서 유용하게 활용될 수 있습니다.주요 체크포인트:
- 데이터 준비: 위험자산 및 무위험자산 데이터를 동일한 기간과 단위로 정리.
- 하이퍼파라미터 설정: τ값 및 리밸런싱 주기를 신중히 선택.
- 성과 분석: CAGR 및 Sharpe Ratio 등을 통해 전략 성능 평가.
- 리스크 관리: Drawdown 분석을 통해 최대 손실 확인.
댓글 없음:
댓글 쓰기