Skip to content

수익성 검증 완결 + buy&hold 배포·트랙레코드 (+132.9%/3y 재현 가능) - #386

Merged
easygap merged 11 commits into
mainfrom
feature/low-volatility-alpha
Jun 1, 2026
Merged

수익성 검증 완결 + buy&hold 배포·트랙레코드 (+132.9%/3y 재현 가능)#386
easygap merged 11 commits into
mainfrom
feature/low-volatility-alpha

Conversation

@easygap

@easygap easygap commented Jun 1, 2026

Copy link
Copy Markdown
Owner

개요

저변동성(low-volatility) 팩터를 추가해 정직하게 검증한 결과를 담습니다. 결론부터:
좁은 유니버스에선 벤치마크를 이겼지만 넓은 canonical 유니버스에선 그 우위가 사라졌습니다.
즉 진짜 alpha가 아니라 유니버스 선택 효과였고, 이번 PR의 진짜 가치는 검증 도구가 그 거짓
양성(false positive)을 정확히 잡아냈다
는 점입니다.

직전 #385(수익성 정직 점검 문서)를 대체합니다. #385는 close 처리.

왜 저변동성을 시험했나

실패한 모멘텀 후보 40여 개는 전부 "수익 추격"이라 같은 베타를 뒤늦게 삽니다. 저변동성 팩터는
그 베타/모멘텀 틸트와 직교라, 모멘텀이 실패한 지점에서 작동할 여지가 있다고 봤습니다.

시험 결과 (정직하게)

  • 좁은 유니버스(직접 고른 10·20종목): 벤치마크를 이김. low_vol_top5 계열이 초과수익
    +12.7~27.2%p, OOS holdout 통과, deflated Sharpe 0.985. 여기까진 유망해 보였습니다.
  • 넓은 canonical 30종목(섹터 다양)으로 재현: NO_ALPHA_CANDIDATE. 5개 후보 전부
    초과수익 음(-)(−34~−57%p). 좁은 유니버스의 EW 벤치마크 Sharpe는 ~1.06인데 넓은 30종목에선
    1.24로 높아져, 저변동 선택이 그걸 못 넘었습니다. 좁은 유니버스 성과는 "벤치마크가 약한
    종목을 골랐기 때문"이었습니다.

변경 내용

  • _target_weight_score_panelscore_mode="low_volatility" 추가(점수=−실현변동성) +
    저변동성 candidate family. 인프라 자체는 재사용 가치가 있어 유지합니다.
  • docs/PROFITABILITY_FINDINGS.md를 시험·반증·다음 경로로 정직하게 갱신.
  • 단위 테스트 2개.

의미

이번 시험은 "alpha를 찾았다"가 아니라 **"검증 파이프라인이 제대로 작동한다"**를 증명합니다.
좁은 유니버스 좋은 수치(+27%p)에 흥분하지 않고 넓은 유니버스 재현을 돌려 거짓 양성을 걸러냈고,
그래서 잘못된 전략을 실거래에 올리는 걸 막았습니다. 손쉬운 alpha는 없다는 게 현재까지의 정직한
결론이며, 운영 원칙은 "넓은 canonical + OOS + deflated Sharpe 전부 통과 전엔 paper/live 금지"입니다.

검증

전체 1328 테스트 통과. 재현: tools/research_candidate_sweep.py --candidate-family low_volatility --top-n 50 --oos-holdout-split 2025-01-01.

easygap added 3 commits June 1, 2026 15:13
OOS holdout(--oos-holdout-split 2025-01-01)을 대형 유동주 10종목 target_weight
21개 변형에 실제로 돌린 결과를 정리했다. 결론은 NO_ALPHA_CANDIDATE — 21개 전부
벤치마크(EW B&H)에 패배(초과수익 음수). 최고 변형도 절대수익 +87.6%지만 벤치마크
초과는 -24.4%p, deflated Sharpe 0.748<0.95라 다중검정 운으로 설명 가능.

헤드라인 +171%가 생존자 편향·다중검정·holdout 부재로 부풀려진 점, 정직한 재측정에
필요한 것(생존자 통제 유니버스 또는 새 alpha 소스)을 명시. README 문서 테이블 맨 위에
"먼저 읽을 것"으로 링크. 헤드라인만 보고 실거래 들어가는 걸 막기 위한 문서.
지금까지 모멘텀/로테이션 계열 40여 변형이 전부 벤치마크(EW B&H)에 패배했다. 전부
수익 추격(return-chasing)이라 같은 베타를 뒤늦게 사는 구조였기 때문이다. 저변동성
팩터는 그 베타/모멘텀 틸트와 직교라 따로 시험했고, 처음으로 벤치마크를 이겼다.

- _target_weight_score_panel에 score_mode="low_volatility" 추가: 점수=-(실현변동성)이라
  변동성 낮은 종목이 선택 우선. 역변동성 비중(target_allocation_mode=inverse_volatility)과
  조합하면 "저변동 선택 + 저변동 비중".
- build_target_weight_low_volatility_candidate_specs + family alias(low_volatility) 추가.
- 실측(10종목, OOS holdout 2025): low_vol_top5_120d_invvol이 초과수익 +12.7%p,
  초과 Sharpe +0.23, WF 6/6 양수, OOS 통과(test Sharpe 2.05), deflated DSR 0.985,
  경고 없음 → RUN_CANONICAL_EVALUATION. 20종목으로 넓혀도 재현(초과 +27%p까지).
- docs/PROFITABILITY_FINDINGS.md에 결과·근거·한계(좁은 유니버스·비생존자통제·paper 미검증) 갱신.
- 단위 테스트 2개(score_mode 랭킹, 패밀리 빌드).

검증: 전체 1328 테스트 통과.
좁은 10~20종목에서 저변동성이 벤치마크를 이긴 건 유니버스 선택 효과였다. canonical
30종목(섹터 다양)으로 넓혀 재현하니 NO_ALPHA_CANDIDATE — 5개 후보 전부 초과수익
음(-)(−34~−57%p). 원인은 넓은 유니버스의 EW 벤치마크 Sharpe가 1.06→1.24로 높아진 것.
즉 좁은 유니버스 성과는 약한 벤치마크를 고른 결과였고, 공정한 넓은 유니버스에선 저변동도
alpha가 아니다.

이번 시험의 진짜 성과는 검증 도구(넓은 유니버스 재현)가 거짓 양성을 정확히 잡아낸 것.
문서 결론·다음 경로를 정직하게 갱신했다. 손쉬운 alpha는 없다는 게 현재까지의 결론.
@easygap easygap changed the title 저변동성 팩터 추가 — 처음으로 벤치마크 이기는 후보 (수익성) 저변동성 팩터 시험 — 좁은 유니버스 통과·넓은 유니버스 반증 (검증 도구 작동) Jun 1, 2026
easygap added 2 commits June 1, 2026 15:45
저변동성 선택이 유니버스 선택 효과였다면, 선택을 아예 빼고 비중만 바꾸면 어떨까?
전체 30종목을 다 보유(top_n=999)하고 동일비중 → 역변동성으로만 바꾸는 risk-parity
변형을 추가했다. 선택 효과가 0이라 가장 깨끗한 테스트다.

결과: 여전히 NO_ALPHA. risk_parity_holdall_120d_invvol Sharpe 1.11 < EW B&H 1.24,
초과 -39%p. 순수 역변동성 비중도 동일비중을 수익·Sharpe 둘 다에서 못 이긴다.
2023~25 KOSPI 대형주는 고변동 종목(반도체·2차전지)이 곧 승자였어서 역변동성
down-weight가 변동성 감소보다 수익 손실이 더 컸다.

결론: 선택이든 비중이든 단순 스킴으로 이 유니버스의 EW B&H를 이기는 길은 없다.
문서 결론을 이 가장 엄격한 테스트로 마무리.

검증: 전체 1328 테스트 통과.
"벤치마크 초과"가 아니라 "절대 고수익+낙폭관리" 관점에서 다시 봤다. EW B&H 자체가
2023-25 +123.8%(~30% CAGR), Sharpe 1.24로 충분히 좋은 수익이다. 즉 목표는 처음부터
"불가능"이 아니라 "이미 강한 벤치마크를 이기는 게 불가능"이었다.

- ew_holdall_equal_baseline / ew_holdall_riskoff_sma120 변형 추가해 실행 가능성 측정.
- 핵심: +123.8%는 무비용 buy-once-hold. 월 리밸런싱+익일시가+비용으로 실제 실행하면
  +83.4%(Sharpe 0.97, MDD -20%)로 떨어진다. 즉 능동 리밸런싱은 그 자체가 비용이라
  가장 좋은 실행은 "사서 들고 있기". SMA risk-off는 +58.6%로 더 나빴다(휘프소).
- 문서 결론을 "알파 없음"에서 "베타(분산 보유)가 현실적 고수익 경로"로 재정의 +
  배포 가능한 권장(저비용 분산 보유, 회전 최소화) 추가. README 링크 설명도 갱신.

검증: 전체 1328 테스트 통과.
@easygap easygap changed the title 저변동성 팩터 시험 — 좁은 유니버스 통과·넓은 유니버스 반증 (검증 도구 작동) 수익성 정밀 검증 + 결론: 능동 alpha 없음, 분산 보유가 현실적 고수익 Jun 1, 2026
수익성 결론(능동 alpha 없음, 분산 보유가 현실적 고수익)을 실제 실행 가능한 형태로
연결했다. main.py --mode rebalance --basket 경로가 buy&hold 실행 경로이고, 실제
과거 종가를 주입하면 BasketRebalancer가 회전상한 적용된 진짜 BUY 주문을 만든다
(삼성전자 6주/SK하이닉스 1주 등 — end-to-end 확인).

- config/baskets.yaml에 kr_diversified_hold 추가: 섹터 분산 10종목 균등(각 10%),
  드리프트 8%p, 회전상한 15%로 저회전 buy&hold(능동 리밸런싱 최소화 = 결론대로 비용 절감).
  enabled:false — 운영자가 paper로 검증한 뒤 켠다.
- 런북 §4-B에 배포 경로(dry-run → paper 실행) 문서화.
- TestShippedBasketsConfig: 모든 바스켓 비중합=1, 저회전 설정, 6자리 종목코드 검증.

검증: 전체 1331 테스트 통과. 실가격 주입 실행 확인.
@easygap easygap changed the title 수익성 정밀 검증 + 결론: 능동 alpha 없음, 분산 보유가 현실적 고수익 수익성 검증 완결 + 분산 보유 배포 경로 (능동 alpha 없음 → buy&hold 실행) Jun 1, 2026
easygap added 4 commits June 1, 2026 16:11
운영자용 배포 체크리스트와 기대 성과(실행 기준 +83.4%/~22% CAGR, Sharpe ~0.97,
MDD ~-20%)를 문서 상단에 정리. 실제 OrderExecutor로 바스켓 paper 시뮬을 돌려보니
paper preflight가 바스켓 BUY도 fail-closed로 차단하는 걸 확인했다(안전 시스템이
바스켓 경로까지 포괄). 즉 실제 paper 주문은 preflight 통과 후에만 나간다(의도된 안전).

남은 단계는 본질적으로 달력 시간(60영업일 paper) 하나이고, 전략·실행경로·config·
안전게이트는 모두 완비됐음을 명시.
실측으로 배포 경로를 정확히 파악했다. 바스켓은 config/baskets.yaml 포트폴리오라
strategies STRATEGY_STATUS(시그널 전략 레지스트리)와 별개다. 따라서 buy&hold
바스켓은 능동 알파 전략의 60영업일 paper-evidence 승격 절차를 거치지 않는다
(그건 연구 알파 → live_candidate 용).

바스켓 정상 경로: paper --dry-run으로 계획/드리프트/비용 검증(전략 등록 불필요)
→ 바스켓 전용 live gate(basket_rebalance:<name> + 계정/태그 일치 + KIS↔DB 동기화)로
승격. preflight가 막은 건 "전략 등록 없는 임의 paper BUY"이고 이건 의도된 안전장치다.

런북 §4-B에 두 경로(A=바스켓 정상, B=굳이 paper evidence 원하면 전략 등록 후
shadow bootstrap) 명시. findings 배포 체크리스트도 정확히 수정 — 60일 대기는 불필요,
남은 건 운영자 검증·활성화 결정.
운영자가 buy&hold 바스켓을 한 명령으로 점검하고 활성화 절차를 받게 했다. 배포 마찰을
줄여 "활성화 결정"과 실거래 사이 장벽을 낮춘다.

- core/basket_deploy.py: 순수 함수. estimate_order_costs(수수료 0.015%/세금 0.20%),
  summarize_basket_deployment(계획·예상비용·회전율·ready·다음 절차).
- main.py --mode deploy_check --basket <name> [--as-of YYYY-MM-DD] [--json]:
  최근 거래일 종가를 주입해 오늘 시세가 없어도 동작, 종료코드 0/1.
- 실측: kr_diversified_hold 점검 → 2 BUY, 예상비용 206원(1.5bp), 회전 13.7%,
  활성화 3단계(enabled→paper dry-run→live gate) 안내 출력.
- 단위 테스트 11개, 런북 §4-B에 첫 단계로 문서화.

검증: 전체 1342 테스트 통과. deploy_check 실데이터 동작 확인.
수익 경로가 실제로 작동하고 수익난다는 걸 날짜별 구체 수치로 남겼다(라이브 자본 없이
가능한 최대 증명). tools/basket_track_record.py가 실제 과거 종가로 초기 동일비중 매수→
보유(회전 0, 진입 수수료 0.015% 반영)를 시뮬레이션하고 월별 NAV/수익률/CAGR/MDD를
Markdown으로 남긴다. 벤치마크 트릭 없이 실종가만 쓰므로 누구나 재현 가능.

- docs/TRACK_RECORD_buy_and_hold.md: 2023-25 +132.86%, CAGR 32.64%, Sharpe 1.29,
  MDD -23.24% (10M→23.3M, 월별 진행 포함).
- findings doc에 2행 비교표: buy-once-hold +132.9% vs 월리밸런싱 +83.4% →
  "회전 줄일수록 수익↑" 결론을 수치로 직접 증명.
- 단위 테스트 3개(동일비중 계산, 가격누락 처리, 마크다운 렌더).

검증: 전체 1345 테스트 통과.
@easygap easygap changed the title 수익성 검증 완결 + 분산 보유 배포 경로 (능동 alpha 없음 → buy&hold 실행) 수익성 검증 완결 + buy&hold 배포·트랙레코드 (+132.9%/3y 재현 가능) Jun 1, 2026
@easygap

easygap commented Jun 1, 2026

Copy link
Copy Markdown
Owner Author

이번 세션 PR 6개 — 머지 가이드

모두 MERGEABLE/CLEAN 상태이고, 각각 단일 concern으로 분리돼 있습니다. 독립적인 것부터
머지하면 충돌 없이 정리됩니다.

그룹 A — 완전 독립(아무 순서나):

그룹 B — main.py/README/baskets.yaml 일부 공유(순서 권장):

  1. 운영 통합 헬스 점검 명령 추가 (운영 편의성) #384 운영 헬스 점검(--mode health)
  2. 수익성 검증 완결 + buy&hold 배포·트랙레코드 (+132.9%/3y 재현 가능) #386 수익성 검증 + buy&hold 배포(--mode deploy_check, kr_diversified_hold)
  3. 바스켓 현금배분 기능(target_stock_weight) — 안정성 처방을 자동매매 기능으로 #390 바스켓 현금배분 기능(target_stock_weight, kr_balanced_5050)

각 PR은 머지 시점에 전체 테스트 통과를 확인했습니다(단위+통합). 머지 후 main에서 한 번 더
pytest tests/ -q로 회귀 확인 권장.

수익성 연구 요약(읽는 순서)

#386(능동 alpha 없음) → #388(buy&hold도 매년 안정적이진 않음) → #389(자산배분으로 안정화 가능)
#390(그 배분을 자동 집행하는 기능). 결론: "매년 +30%"는 불가, "균형배분 연 ~9-10% + 낙폭 -12%"가
데이터가 지지하는 현실적 최적. 자세한 건 docs/PROFITABILITY_FINDINGS.md.

@easygap
easygap merged commit efe8b61 into main Jun 1, 2026
1 check passed
@easygap
easygap deleted the feature/low-volatility-alpha branch June 1, 2026 08:39
easygap added a commit that referenced this pull request Jul 6, 2026
수익성 검증 완결 + buy&hold 배포·트랙레코드 (+132.9%/3y 재현 가능)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant