퀀터스 면접준비
퀀터스 면접준비
🏢 회사정보 및 채용정보
인재상
- 프로들의 모임 : 워라벨보다 목적, 성과지향적 자세
- 지적 솔직함 : 모르는 것을 인정하고 습득하는 자세
- 도전 정신 : 도전과 성취를 통한 성장 동력
주요업무
- 백엔드 엔진 개발 : 데이터 특성 상 복잡하고 연산량이 많은 연산이 필요
자격요건
- 퀀트 지식 : 퀀트 투자에 대한 기본 지식
- Dango/FastAPI : 기본 기술 스텍
- MSA : 마이크로서비스에 대한 이해도
💼 도메인
퀀트 투자
정의 : Quantitative Investment로 정량적인 수치와 데이터를 통계적으로 분석하고 자동화된 투자하는 전략
- 특징
- 객관성과 일관성 : 정해진 규칙에 따라 데이터에 의존하여 결정
- 대용량 데이터 처리 : 방대한 시장 데이터를 동시에 분석
- 리스크관리 : 수학적 모델로 리스크를 정량화하고 통제
- 백테스트 : 과거데이터로 전략의 성과를 검증
- 한계점
- 모델의존적 : 모델에 따라 수익성이 결정
- 블랙스완 : 급변하는 시장상황에 취약
- 과적합 : 과거 상황에 의존하여 새로운 시장에는 효용성이 없음
기본 지식
모델관련
지표 설명 중요성 수익률 투자의 이익이나 손실을 백분율로 나타낸 값 모델의 성과를 측정하는 지표 변동성 수익률의 표준편차로, 투자 위험도를 나타내는 지표 불확실성과 리스크를 측정 최대낙폭 고점에서 저점까지의 최대 하락폭 변동성 예측, 레버리지 결정, 투자지속성에 활용 샤프비율 (수익률 - 무위험수익률) / 변동성 서로 다른 위험수준의 투자 모델을 비교 재무관련
재무제표 지표 설명 중요성 손익계산서 매출액 회사가 벌어들인 총 수입 회사의 규모와 성장성의 기본지표 손익계산서 영업이익 본업에서 발생한 이익 회사의 핵심 사업 수익성 지표 손익계산서 순이익 모든 비용을 제외하고 최종적으로 남은 이익 주주에게 돌아가는 실제 이익 손익계산서 EBITDA 감가상각비 차감전 영업이익 현금유동성 파악 재무상태표 총자산 회사가 보유한 모든 자원(자기자본+부채) 회사의 전체규모와 자원 재무상태표 자기자본 주주가 실제 소유한 회사자산 회사의 진짜 가치 재무상태표 부채 회사가 갚아야할 부채 재무 안정성 재무상태표 현금성자산 유동화 가능한 현금 유동성의 척도 현금흐름표 영업활동현금흐름 본업에서 실제 유입된 현금 순이익의 현금화 정도, 질적 평가 현금흐름표 자유현금흐름 투자 후 남은 여유 현금 배당, 부채상환 등 여유자금 주가관련
지표 설명 중요성 PER 주가 ÷ 주당순이익(EPS) 수익 대비 주가 적정성 판단 PBR 주가 ÷ 주당순자산(BPS) 장부가치 대비 저평가/고평가 측정 ROE 순이익 ÷ 자기자본 × 100 자본 효율성, 경영진 능력 측정 ROA 순이익 ÷ 총자산 × 100 자산 활용 효율성 영업이익률 영업이익 ÷ 매출 × 100 본업 수익성, 경쟁력 순이익률 순이익 ÷ 매출 × 100 최종 수익 창출 능력 매출증가율 전년 대비 매출 증가 정도 사업 확장성, 성장 모멘텀 순이익증가율 전년 대비 순이익 증가 정도 실질적 성장성 측정 부채비율 부채 ÷ 자기자본 × 100 재무 안정성, 파산 위험도 유동비율 유동자산 ÷ 유동부채 × 100 단기 지급능력
💻 과제질문
🏗️ 아키텍처 & 설계
기본 설계 질문
FastAPI를 선택한 이유는 무엇인가요? Django나 Flask 대신 FastAPI를 사용한 특별한 이유가 있나요?</br>
- 개발 생산성 : 7일이란 과제 시간에 ORM설정, Admin 생성과 같은 설정이 복잡</br>
- 타입 안정성 : 처음으로 pandas와 fastAPI를 결합을 시도 했는데 타입에러를 줄이기 위해 선택</br>
- 비동기 처리 : 현재 기업별 재무제표를 ThreadPoolExecutor로 병렬 처리, 향후 비동기 처리 강화(현재 멀티스레딩 방식으로 OS레벨에서 스레드를 생성, 단일 쓰레드에서 이벤트 루프 기반으로 실행 하는 방식)</br>
- 트레이드 오프 : async 미지원 라이브러리, 동기/비동기 혼용으로 복잡도 증가</br>
현재 구현된 레이어드 아키텍처(Controller-Service-API)의 장단점을 설명해주세요.</br> 관심사 분리 : Controller는 HTTP 요청/응답, 비즈니스로직은 Service, API는 외부 통신용</br> 재사용성 : 여러조합을 재사용 가능 </br> 성능 오버헤드 : DataFrame → Pydantic → DataFrame 구조로 메모리 사용량이 많음 </br> 순환 의존성 위험 : 서비스들이 서로 참조하면서 의존성 문제 발생 가능성 -> DI 컨테이너 도입</br>
서비스가 커질 때 이 구조를 어떻게 확장하시겠나요? 마이크로서비스로 분리한다면 어떤 기준으로 나누겠나요?</br> DDD원리에 따라 도메인 별로 구분 (데이터 수집, 데이터 분석, 백테스트)</br> 데이터 수집 : 외부 데이터 수집로직, 데이터 전처리</br> 데이터 분석 : 재무비율 계산, 이상치 제거, 통계 분석, CPU 집약적으로 별도 스케쥴링이 필요</br> 백테스트 : 수익률 분석, 장시간 실행되는 비동기 작업 특화 </br>
심화 설계 질문
현재 코드에서
KrxApi
와DartApi
가 싱글톤 패턴으로 구현되어 있는데, 이 선택의 이유와 잠재적 문제점은 무엇인가요?</br> 지금 싱글톤으로 만드려고 했지만 미완성 단계, 싱글톤 패턴의 문제는 여러 쓰레드가 객체를 동시에 생성 할 수 있음. </br> 선택의 이유 : API키 관리 효율성과 HTTP 연결 풀을 재사용</br> DI 컨테이너 도입을 필요 </br>
백테스트 서비스에서 대량의 금융 데이터를 처리할 때 메모리 최적화는 어떻게 하시겠나요?</br> 현재 DB를 사용 하지 않고 있어서 메모리 누수가 발생</br> PostgreSQL과 같은 DB를 사용해서 데이터 조회(금융 데이터 중 필요한 컬럼만 조회)</br> pandas를 사용하던 부분을 Pydantic모델을 사용해서 메모리 효율성 증가 </br>
투자 지표 계산 로직이 복잡한데, 이를 더 모듈화하고 테스트 가능하게 만들려면 어떻게 리팩토링하시겠나요?</br> 지표별 클래스 분리</br> 팩토리 패턴 적용</br> 의존성 주입</br>
🚀 성능 & 최적화
기본 성능 질문
현재 코드에서 ThreadPoolExecutor를 사용하는 부분이 있는데, 언제 멀티스레딩을 사용하고 언제 비동기를 사용해야 하나요?</br> 멀티쓰레딩 : 여러쓰레드가 동시작업, 메모리공유, CPU집약적 작업에 적합</br> 비동기 : 단일 쓰레드에서 이벤트루프로 논블로킹 처리, I/O 바운드 작업에 적합</br> 현재 코드는 threadPool을 전부 사용하고 있지만, 기업주가를 불러오는 api 비동기, 각종 지표를 생성하고 분석하는 경우는 멀티쓰레딩이 적합</br>
DART API 호출 시 Rate Limiting을 어떻게 처리하고 있나요? 더 효율적인 방법은 없을까요?</br> 현재 상황 : 멀티쓰레딩을 워커를 제한하여 동시요청을 보내고 있음 -> API 제공 업체측의 제한 사항을 고려하지 않음</br> 개선 방안 : 429응답에 대한 지수백오프 (오류 시 요청 인터벌 증가), 일일 호출제한량 카운팅</br>
Pandas DataFrame 연산이 많은데, 대용량 데이터에서 성능 이슈가 발생한다면 어떻게 해결하시겠나요?</br> 현재 상황 : 데이터 분석을 위해 pandas를 사용 한것을 그대로 차용 </br> 개선 방안 : DB모델링을 통해 인덱싱을 하고 Pydantic을 활용하여 데이터를 구조화 및 타입안정성을 높으는 전략으로 수정</br>
심화 성능 질문
백테스트에서 월별 리밸런싱을 수행할 때 O(n²) 복잡도가 발생할 수 있는데, 이를 최적화하는 방법은?</br> 개선방안1 : pandas를 사용한다면 행 전체를 필터링해서 결과를 가져와서 데이터 규모를 줄인다. O(n^2) 복잡도 소요</br> 개선방안2 : DB모델링을 통해 스크리닝 결과를 한번의 쿼리로 가져온 후 연산을 수행 O(nlogn) 복잡도 소요</br>
캐싱 전략을 구현한다면 어떤 데이터를 캐싱하고, 어떤 저장소(Redis, Memcached)를 선택하시겠나요?</br> Dart, KRX API : 비교적 호출 빈도가 적은 데이터, 과거 데이터로 변경 빈도가 낮음.</br> 적용 방안 : 최초 API 호출 시 DB에 데이터 저장, 향후 재 사용시 DB에서 redis로 캐싱 후 사용 </br> Redis : TTL 설정과 복잡한 데이터 구조 저장이 용이하기 때문</br> 캐시 무효화 처리 : 분기별 데이터는 TTL을 3개월로 설정하고, 신규 분기 발표 시 관련 캐시를 수동으로 무효화</br> 메모리 사용량이 증가 대책 : LRU 정책으로 오래된 데이터를 자동 삭제하고, 자주 조회되는 데이터만 Redis에 유지</br>
데이터베이스를 도입한다면 현재 CSV 파일 기반 저장을 어떻게 마이그레이션하시겠나요?</br> 모델 객체를 만들고 alembic을 통해 데이터 주입</br> 트랜잭션 처리 : csv데이터 검증 후, 배치 단위로 트랜잭션 커밋 및 롤백을 진행</br>
💾 데이터 처리 & 분석
기본 데이터 처리
Pydantic 모델을 사용하는 이유와 장점을 설명해주세요.</br> 타입안정성 : 런타임 타입 검증, 타입힌트 제공으로 에러 방지</br> 데이터검증 : Field 제약조건(검증규칙), validator 제공</br> 직렬화/역직렬화 : Json 변환 지원, DB연동</br> 성능 오버해드/ 과도한 검증 : dict자료 구조보다 많은 메모리 차지</br>
filter_zero_accounts
함수에서 0 값을 필터링하는 로직의 목적은 무엇인가요?</br> 데이터 이상치 제거, 누락된 값이 전체적인 통계에 영향을 줄 수 있음</br>
IQR 방식으로 이상치를 제거하는 이유와 다른 방법들과의 차이점은?</br> IQR 선택 : 데이터가 정규분포를 따르지 않는다는 가정, 오른쪽 극단값이 치우는 경향</br> 이상치 제거 방안 : Z-index(정규분포를 따를때), 퍼센트(임의점 기준) </br>
심화 데이터 분석
PER, PBR, ROE 등 재무비율 계산에서 분기별 연환산 로직이 있는데, 이 방식의 정확성을 어떻게 검증하시겠나요?</br> 분기별 재무제표를 실제로 분석, 1~3 분기에서 받은 데이터는 실제 각 분기값만 반환, 4분기 데이터는 전체 1년 성과를 반환</br> 업종별 세분화는 필요, 계절성인 강한 업종은 TTM방식이 적합하지만 이외의 종목에서는 실제 값을 사용하는 것이 타당 </br>
백테스트 결과의 신뢰성을 보장하기 위한 검증 방법은 무엇인가요? 실시간 데이터 스트리밍이 필요하다면 현재 배치 처리 구조를 어떻게 변경하시겠나요?
🛡️ 에러 처리 & 안정성
기본 안정성
외부 API 호출 실패 시 재시도 로직이 구현되어 있는데, 이 방식의 개선점은 무엇인가요?</br> API 호출 제한량 실패 원인은 일일 호출 제한, 분당 호출 제한이 있음</br> 분당 호출 제한을 피하기 위해서는 재시도 로직에서 인터벌을 추가하여 다시 호출을 시도</br>
HTTPException
을 일관성 있게 사용하고 있는데, 커스텀 Exception 클래스를 만든다면 어떻게 설계하시겠나요?</br> 기본 분류 : 각 도메인별 에러를 분류</br> 기본 정보 : 에러 코드, 메시지, 발생 위치 표시 </br> 위험도 분류 : critical, warning, recoverable로 분류</br>
심화 안정성
Circuit Breaker 패턴을 적용한다면 어떤 부분에 적용하시겠나요?</br> circuit breaker 패턴 : open, closed, half-open 상태를 활용하여 연쇄적인 시스템 장애 방지</br> 적용 방안 : API 호출 시, 과도한 트래픽이 걸렸을 경우 적용 -> 요청이 30%이상 실패시 open으로 전환하고 1분 이후 half-open으로 전환하여 상태를 확인 후 closed로로 최종 전환</br>
데이터 일관성을 보장하기 위한 트랜잭션 처리는 어떻게 구현하시겠나요?</br> 트랜잭션이 필요한 상황 : 재무데이터+주가 데이터 배치 저장(대용량), 백테스트 결과</br> 트랜잭션 범위 : 단일테이블(재무데이터, 주가), 다중테이블(기업정보, 각종 지표), 배치 트랜젝션(대량 데이터 처리)</br> 격리 수준 : 데이터의 일관성이 중요하므로 Serializable로 사용</br>
시스템 장애 시 백테스트 작업을 이어서 수행할 수 있는 방법은?</br> 해야할 작업을 큐에 저장 작업이 완료시 큐에서 작업</br> 체크포인트를 만들어서 백테스트 진행 상황을 기록</br> 캐시DB를 활용해서 분기별 진행 상황을 캐싱</br> 미 완료시 재시도 로직 구현</br>
🔧 개발 방법론 & 코드 품질
기본 개발 프랙티스
- 현재 코드의 테스트 전략을 어떻게 세우시겠나요? 단위 테스트와 통합 테스트 비중은?
- 코드 리뷰 시 가장 중점적으로 봐야 할 부분은 무엇인가요?
- API 문서화를 위해 FastAPI의 자동 문서 생성 외에 추가로 할 일은?
심화 코드 품질
- DRY 원칙 관점에서 현재 코드의 개선점은 무엇인가요?
- SOLID 원칙을 적용해서 현재 서비스 클래스들을 리팩토링한다면?
- 코드의 응집도(Cohesion)와 결합도(Coupling)를 개선하는 방법은?
📊 비즈니스 로직 이해
금융 도메인 지식
- 포트폴리오 리밸런싱에서 동일가중 방식 외에 다른 가중치 전략을 구현한다면?
- 백테스트에서 거래비용, 슬리패지 등을 고려하지 않은 이유와 추가 시 고려사항은?
- 투자 지표 분석에서 월별 통계 vs 일별 통계의 트레이드오프는?
시스템 확장성
- 실제 운영 환경에서 이 시스템을 사용한다면 추가해야 할 기능들은?
- 알고리즘 트레이딩 시스템으로 확장한다면 어떤 아키텍처 변경이 필요한가요?
- 다중 사용자 지원을 위한 인증/인가 시스템을 어떻게 설계하시겠나요?
🚨 실전 문제 해결
시나리오 기반 질문
- “백테스트가 3시간째 돌고 있는데 결과가 안 나와요” - 어떻게 디버깅하시겠나요?
- “특정 종목의 재무 데이터가 이상해요” - 데이터 검증 프로세스를 어떻게 구축하시겠나요?
- “시스템이 갑자기 느려졌어요” - 어떤 순서로 문제를 찾아가시겠나요?
코드 리뷰 시뮬레이션
면접관이 실제 코드 일부를 보여주며:
- 이 코드에서 개선할 점 3가지를 찾아보세요
- 이 함수를 더 읽기 쉽게 리팩토링해보세요
- 이 부분에서 발생할 수 있는 버그는 무엇인가요?
💡 추가 기술 스택 질문
현재 스택 확장
- 현재 FastAPI + Pandas 조합에서 Celery를 추가한다면 어떤 작업들을 비동기로 처리하시겠나요?
- PostgreSQL이나 MongoDB 중 이 시스템에 더 적합한 DB는 무엇이고 이유는?
- Docker 컨테이너화 시 고려사항과 멀티 스테이지 빌드 전략은?
모니터링 & 운영
- 프로덕션 환경에서 어떤 메트릭들을 모니터링하시겠나요?
- 로깅 전략과 log level 설정 기준은?
- 장애 대응을 위한 알림 시스템은 어떻게 구축하시겠나요?
📋 면접 팁
준비해야 할 것들:
- 코드 설명 연습 - 자신이 작성한 핵심 로직을 5분 내로 설명
- 개선 아이디어 - 현재 코드의 한계점과 개선 방안
- 기술 선택 이유 - 왜 이 기술을 선택했는지 논리적 설명
- 실무 경험 - 비슷한 문제를 해결했던 경험 사례
- 질문 준비 - 역으로 팀과 시스템에 대해 물어볼 질문들
답변 구조:
- 결론 먼저 → 이유 설명 → 대안 제시 → 트레이드오프 언급