대상 독자: Alpha-Helix 개발팀. 퀀트 트레이딩 이론과 코드베이스 구조를 연결하는 기술 참조 문서.
Alpha-Helix 퀀트 엔진은 두 가지 오픈소스 프레임워크의 핵심 원리를 결합한다.
| 원천 | 기여 |
|---|---|
| QuantStart | 통계 강건성 검증 방법론 (Walk-Forward, 과적합 측정, 베이지안 HMM) |
| QuantConnect LEAN | 이벤트 드리븐 실행 구조 (QCAlgorithm, Schedule, Rebalance) |
- 강건성 우선: 높은 IS 성과보다 낮은 IS-OOS 갭이 더 중요
- 레짐 인식: 하나의 파라미터 세트가 모든 국면에 통하지 않음
- 리스크 비대칭: 손실을 피하는 것이 수익을 얻는 것보다 우선
- 설명 가능성: 모든 포지션 결정에 자연어 근거 제공
2-1. HMM (Hidden Markov Model) — 시장 국면 탐지
원리
시장은 관측 가능한 수익률 시퀀스 뒤에 숨은(hidden) 상태(regime)를 가진다. HMM은 이 숨은 상태를 확률적으로 추론한다.
관측: r_1, r_2, ..., r_T (일별 수익률)
숨은: s_1, s_2, ..., s_T (bull_quiet / bull_volatile / bear / crisis)
목표: P(s_t | r_1...r_T) 추정
Baum-Welch EM 알고리즘 (3단계)
E-step (기댓값):
γ_t(k) = P(s_t=k | 관측 전체) ← Forward-Backward 알고리즘
ξ_t(i,j) = P(s_t=i, s_{t+1}=j | 관측 전체) ← 전이 기댓값
M-step (최대화):
μ_k = Σ_t γ_t(k)·r_t / Σ_t γ_t(k) ← 상태별 평균 수익률
σ_k² = Σ_t γ_t(k)·(r_t-μ_k)² / Σ_t γ_t(k) ← 상태별 분산
A_ij = Σ_t ξ_t(i,j) / Σ_t γ_t(i) ← 전이행렬
수렴 기준: |LL_t - LL_{t-1}| < 1e-4
Viterbi 알고리즘 — 최적 상태 경로
δ_t(k) = max_{s_1...s_{t-1}} P(s_1...s_{t-1}, s_t=k, r_1...r_t)
점화식:
δ_t(k) = max_i [δ_{t-1}(i) · A_ik] · b_k(r_t)
Back-tracking으로 최적 경로 복원
구현 위치: analytics/strategy/helpers.py → BayesianRegimeDetector
원리
금융 시계열에서 큰 변동성은 큰 변동성을 유발하는 '변동성 클러스터링' 현상이 있다. GARCH(1,1)은 조건부 분산을 시간에 따라 모델링한다.
| 파라미터 | 역할 | Alpha-Helix 기본값 |
|---|---|---|
| 장기 분산 = |
자동 계산 | |
| 충격 반응 계수 (ARCH 효과) | 0.10 | |
| 분산 지속성 계수 | 0.85 | |
| 총 지속성 (< 1 이어야 정상성) | 0.95 |
레버리지 ETF 변동성 감쇠 (Volatility Decay)
3x ETF는 단순히 3배 수익을 내지 않는다. 매일 3배 복리 구조로 인한 경로의존성 비용이 발생한다:
- 변동성 감쇠항
$\frac{9}{2}\sigma^2$ 는 TQQQ가 장기적으로 QQQ의 3배보다 낮은 수익을 내는 이유 - 이 효과는
FatTailSynthesizer.generate_single(leverage=3.0)에서 시뮬레이션됨
구현 위치: analytics/strategy/helpers.py → FatTailSynthesizer
원리
실제 주식 수익률 분포의 첨도(kurtosis)는 정규분포(K=3)보다 높다. → 극단 손실이 정규분포 예측보다 훨씬 자주 발생 (블랙스완)
| 자유도 |
꼬리 두께 | 적용 |
|---|---|---|
|
|
얇음 | VaR 과소추정 |
| 5 | 중간 | 일반 주식 |
| 4 | 두꺼움 | TQQQ 합성 기본값 |
| 3 | 매우 두꺼움 | 극단 스트레스 테스트 |
연속 Kelly 공식
| 기호 | 의미 |
|---|---|
| 최적 자본 비중 (0 ~ 1) | |
| 일 평균 초과수익률 | |
| 일 수익률 분산 |
다중 에셋 Kelly (벡터 형태)
TQQQ/SOXL처럼 고상관 에셋에서
분수 켈리 적용 이유 (레버리지 ETF)
풀 켈리(Full Kelly)는 이론적 최적이지만:
- 파라미터 추정 오차 → 실제
$f^*$ 과대추정 - 레버리지 ETF의 fat-tail → 파산 위험 증가
- 심리적 낙폭 허용 한도 초과
분수 켈리 선택 기준:
0.25x (Alpha-Helix 기본) : 레버리지 ETF + 짧은 히스토리
0.50x : 일반 전략, ≥2년 OOS 검증
1.00x : 실증된 엣지, ≥5년 트랙레코드
구현 위치: analytics/strategy/risk_control.py → KellyPositionSizer
원리
전통적 균등비중(50:50)은 수익 배분을 동일하게 하지만, 고변동성 에셋이 리스크를 지배한다. 리스크 패리티는 각 에셋의 리스크 기여도를 균등화한다.
리스크 기여도 (Risk Contribution)
최적화 목적함수
TQQQ-SOXL 예시
TQQQ 연변동성: 70% | SOXL 연변동성: 85%
균등비중 (50:50):
TQQQ 리스크 기여 42% vs SOXL 리스크 기여 58% → 불균형
리스크 패리티 최적 비중:
TQQQ ≈ 55% vs SOXL ≈ 45% → 균등 리스크 기여
구현 위치: analytics/strategy/risk_control.py → RiskBudgetAllocator
원리
단순 인-샘플 최적화는 과적합을 감지하지 못한다. 워크포워드는 실제 트레이딩과 동일한 시간적 순서를 유지하며 검증한다.
앵커드(Anchored) 방식:
IS: [━━━━━━━━━━━━] OOS: [━━━]
IS: [━━━━━━━━━━━━━━━━] OOS: [━━━]
IS: [━━━━━━━━━━━━━━━━━━━━] OOS: [━━━]
롤링(Rolling) 방식:
IS: [━━━━━━━━━━━━] OOS: [━━━]
↓ 슬라이드
IS: [━━━━━━━━━━━━] OOS: [━━━]
과적합 지수
- < 20%: 우수 (과적합 없음)
- 20~50%: 주의
-
50%: 과적합 의심 → Trust Score 페널티 발동
Deflated Sharpe Ratio (DSR)
N개의 파라미터 세트를 시험할 때, 최고 IS Sharpe는 우연히 높을 수 있다. DSR은 다중 테스트 편향을 보정한다:
구현 위치: analytics/strategy/helpers.py → WalkForwardValidator, OverfitPenaltyEstimator
이벤트 드리븐 아키텍처
Initialize() → 에셋 등록, 스케줄 설정, 지표 초기화
↓
OnData(Slice) → 매 바마다 호출 (1분봉/일봉)
↓
OnEndOfDay() → 일일 마감 이벤트
↓
Rebalance() → 스케줄 이벤트 (주간/월간)
↓
OnOrderEvent() → 주문 체결 이벤트
Alpha-Helix 매핑
| LEAN | Alpha-Helix 구현 |
|---|---|
QCAlgorithm |
TQQQSOXLMomentumAlgorithm |
AddEquity() |
Initialize() 내 티커 등록 |
SetHoldings() |
OnData() → target_weights 반환 |
Schedule.On() |
Rebalance() 주간 호출 |
RiskManagementModel |
DrawdownCircuitBreaker |
AlphaModel |
ConfidenceScoringSystem |
PortfolioConstructionModel |
RiskBudgetAllocator |
구현 위치: analytics/strategy/main.py → TQQQSOXLMomentumAlgorithm
원리
pandas 루프 기반 백테스트는 느리다. vectorbt는 numpy 브로드캐스팅으로 전체 신호 행렬을 한 번에 연산한다.
# 기존 방식 (루프)
for i in range(len(prices)):
if signal[i] > 0:
portfolio_value[i] = portfolio_value[i-1] * (1 + returns[i])
# vectorbt 방식 (행렬 연산)
pf = vbt.Portfolio.from_signals(
close, # T × N 행렬
entries=entries, # T × N 불린 행렬
exits=exits,
size=0.5, # 비중
fees=0.001,
)
stats = pf.stats() # 한 줄로 모든 통계성능 비교 (1년 일봉, 2종목)
| 방법 | 실행 시간 |
|---|---|
| pandas 루프 | ~800ms |
| vectorbt | ~8ms (100배 빠름) |
| Monte Carlo 1000경로 | ~80ms |
구현 위치: analytics/strategy/main.py → vectorbt_bridge()
무한매수법은 레버리지 ETF의 변동성을 활용해 하락 시 분할매수, 상승 시 분할익절하는 전략.
초기 진입: 10% (1/5 포지션)
가격 하락 -7%마다 추가매수:
→ 2차 진입: +10% (누적 20%)
→ 3차 진입: +10% (누적 30%)
→ 4차 진입: +10% (누적 40%)
→ 5차 진입: +10% (누적 50%)
익절:
→ 평단가 +15%: 보유 포지션의 50% 청산
→ 평단가 +30%: 나머지 전량 청산
중단 조건:
→ 레짐 bear/crisis: 추가매수 중지, 기존 포지션 청산
→ 서킷브레이커 HALT: 전량 청산
레짐 없는 무한매수:
2022년 TQQQ -79% 하락 시 → 평단가 10배 악화 → 실질 손실 90%+
레짐 필터 적용:
HMM이 bear 감지 (2022.01~) → 포지션 0 → 손실 최소화
bull_quiet 재진입 (2023.01) → 저점 분할매수 재시작
| 파라미터 | 기본값 | 범위 | 설명 |
|---|---|---|---|
dca_splits |
5 | 3~10 | 분할 횟수 |
dca_drop_trigger |
-7% | -5% ~ -15% | 추가매수 하락 트리거 |
take_profit_1 |
+15% | +10% ~ +25% | 1차 익절 수익률 |
take_profit_2 |
+30% | +20% ~ +50% | 2차 익절 수익률 |
max_weight_per_leg |
50% | 20% ~ 70% | 단일 에셋 최대 비중 |
# 1. Python 패키지 설치
cd c:\Team2_AlphaHelix
pip install -r analytics/requirements.txt
# 추가 필요 패키지
pip install vectorbt scipy scikit-learn
# 2. 단독 테스트 실행
python analytics/strategy/helpers.py
python analytics/strategy/risk_control.py
python analytics/strategy/main.py
# 3. FastAPI 서버 실행 (analytics 서비스)
cd analytics
uvicorn app.main:app --port 8001 --reload# 백테스트 실행
curl -X POST http://localhost:8001/backtest \
-H "Content-Type: application/json" \
-d '{"tickers":["TQQQ","SOXL"],"start_date":"2020-01-01","end_date":"2024-12-31"}'
# Trust Score 조회
curl http://localhost:8001/trust-score?ticker=TQQQ| 주제 | 출처 |
|---|---|
| Baum-Welch EM | Baum et al. (1970) "A Maximization Technique..." |
| Viterbi Algorithm | Viterbi (1967) "Error Bounds for Convolutional Codes" |
| Kelly Criterion | Kelly (1956) "A New Interpretation of Information Rate" |
| Deflated Sharpe Ratio | Bailey & Lopez de Prado (2016) |
| Risk Parity | Qian (2005) "Risk Parity Portfolios" |
| Volatility Decay | Lu (2009) "On the Performance of Leveraged ETFs" |
| QuantConnect LEAN | https://github.com/QuantConnect/Lean |
| vectorbt | https://vectorbt.dev |
| QuantStart 아티클 | https://www.quantstart.com |
생성일: 2025 | Alpha-Helix Team 2