리스크 기반 주식 포트폴리오 옵티마이저를 만들었습니다 (그리고 배운 점)
Source: Dev.to
많은 개발자들처럼, 나는 모호한 AI 주장이나 블랙‑박스 최적화를 내세우며 초과 수익을 약속하는 “포트폴리오 빌더” 도구들을 많이 보았다.
나는 다른 관점을 탐구하고 싶었다: 위험‑제어된 포트폴리오 구조—단순히 어떤 주식이 “위험”하다고 라벨링되는 것만이 아니라—가 최적화기를 이끌어낸다면?
👉 Live demo:

The Core Idea
대부분의 개인 투자 도구는 위험을 부수적인 효과로 취급한다:
- 위험이 높음 → “더 위험한 주식”
- 위험이 낮음 → “더 안전한 주식”
실제로 포트폴리오는 그렇게 움직이지 않는다. 위험 허용도는 보통 다음에 영향을 미친다:
- 얼마나 집중적으로 투자할 의향이 있는지
- 얼마나 많은 섹터 노출을 허용하는지
- 할당이 얼마나 비대칭적일 수 있는지
StockRisker에서는 위험이 포트폴리오 제약을 직접 제어한다:
- 위험이 높음 = 페널티 감소, 높은 집중 한도
- 위험이 낮음 = 더 엄격한 분산 규칙
위험은 단순한 라벨이 아니라 구조적인 입력이다.
How the Optimizer Works (High Level)
최적화기는 세 가지 레이어를 중심으로 구축된다:
Risk Mapping
사용자는 위험 수준(1–10)을 선택한다. 그 값은 동적으로 다음을 제어한다:
- 주식당 최대 할당 비율
- 섹터당 최대 할당 비율
- 분산 페널티의 강도
높은 위험 수준에서는, 사용자 의도와 맞지 않는 “안전한” 포트폴리오를 강제하기보다 페널티가 완화된다.
Constraint‑Driven Portfolio Generation
포트폴리오는 다음을 기준으로 평가된다:
- 하드 제약 (절대로 위배될 수 없음)
- 소프트 제약 (점수 페널티로 적용)
이는 최적화가 기술적으로 성공했지만 비현실적인 포트폴리오를 생성하는 일반적인 실패 모드를 방지한다.
Explainable Scoring
각 포트폴리오는 다음을 균형 있게 고려하는 가중 함수로 점수가 매겨진다:
- 예상 수익 추정치
- 변동성 및 분산
- 집중도 및 섹터 노출
결과가 의심스러워 보이면(예: 매우 높은 수익 대비 상대적으로 낮은 변동성), UI는 위험을 숨기지 않고 상황에 맞는 경고를 표시한다. “보장된 초과 수익”이라는 메시지는 없다.
What I Optimized Against
가장 흥미로운 도전 과제 중 하나는 수학이 아니라 기대 관리였다. 내가 의도적으로 피한 것들:
- S&P 500을 능가한다는 약속 없음
- 불투명한 AI 모델 없음
- 단일 “정답” 포트폴리오 없음
대신, 이 도구는 사용자가 트레이드‑오프를 고민하도록 돕는다:
- 집중 vs. 분산
- 위험 선호도 vs. 변동성
- 단순성 vs. 최적화
Tech Stack
- Backend: TypeScript + Node.js
- 모듈식 최적화기 설계 (위험 매핑 → 제약 → 점수화)
- 성능 및 안정성을 위한 캐시된 주식 유니버스
- Frontend: 명확성과 설명 가능성에 초점을 맞춘 깔끔하고 최소한의 UI
아키텍처는 다음과 같은 향후 확장을 지원하도록 설계되었다:
- 백테스팅
- 위험 조정 지표(샤프, 손실폭)
- 시나리오 시뮬레이션
What I Learned
- 위험은 UX 문제이며, 단순히 수학 문제만은 아니다 – 사용자는 포트폴리오가 왜 그런 형태인지 이해할 필요가 있다.
- 제약이 알고리즘보다 중요하다 – 좋은 제약을 가진 간단한 최적화기가 제약이 없는 복잡한 최적화기보다 우수하다.
- 투명성은 성과 주장보다 신뢰를 빠르게 구축한다 – 제한 사항을 드러내는 것이 실제로 신뢰를 높인다.