알고리즘 트레이딩이란?
- 사전에 정한 규칙(전략)을 코드로 구현해 주문까지 자동 실행하는 것.
- 퀀트(데이터 기반 의사결정)의 하위 집합. 퀀트는 신호만 만들고 사람이 수동 체결할 수도 있고, 알고리즘 트레이딩은 신호→주문까지 자동화.
시스템 구성 요소(필수 블록)
- 데이터 계층: 시세(틱/분/일), 체결·호가, 기업/온체인 등. 저장소(Parquet/DB), 정상성 점검.
- 전략 엔진: 시그널 생성(예: 모멘텀, 평균회귀, 이벤트 드리븐), 포지션 결정.
- 리스크/포트폴리오: 포지션 사이징, 손절·익절, 익스포저/섹터 한도, 맥스 드로다운 컷.
- 주문 라우터: 브로커/거래소 API, 주문/취소/정정, 재시도, 체결 확인, 중복 방지.
- 실행 스케줄러: cron/APScheduler, 장 시작·마감 훅, 리밸런싱 주기.
- 로깅/모니터링: 체결·슬리피지·에러 로그, 알림(메일/Slack/SMS), 대시보드.
- 보안/운영: API 키 보관(.env/Secret Manager), Kill switch, 재부팅 자동복구.
전략 유형(대표 예)
- 트렌드 추종(모멘텀): 이동평균 돌파, 고가 갱신 추격.
- 평균회귀: 볼린저 밴드 복귀, RSI 과매수/과매도 반전.
- 페어/스프레드: 상관쌍 스프레드 회귀.
- 이벤트: 실적·배당·상장폐지 공시/온체인 이벤트.
- 마켓메이킹/체결 전략: 호가 기반(난이도↑, 체결 비용↑).
백테스트에서 반드시 막아야 하는 함정
- 룩어헤드/미래 데이터 누수
- 생존자 편향(상장폐지/편출 종목 제외되는 문제)
- 슬리피지·수수료 미반영 → 실전괴리
- 과최적화(파라미터 튜닝으로 과거만 잘 맞음)
현실적인 단계별 접근(권장 루트)
- 리서치 툴킷 세팅: pandas, numpy, TA(ta, pandas-ta), 백테스트(backtesting.py / backtrader / vectorbt), 리포팅(quantstats).
- 반자동: 신호만 자동 생성 → Slack/메일로 알려주고 수동 체결. (실수·오발주 리스크 최소)
- 모의 자동매매: 브로커/거래소의 모의환경 또는 페이퍼 트레이딩으로 2–4주 이상.
- 소액 라이브: 리스크 한도(예: 1회 손실 ≤ 계좌 0.5~1%), MaxDD 컷, 알림/로그 완비.
- 확대·다변화: 종목·전략 분산, 체결 품질(슬리피지) 개선, 실패 시 롤백 절차 자동화.
파이썬 스택(간결 추천)
- 연구/백테스트: backtesting.py(간단), backtrader(풍부), vectorbt(빠름).
- 실거래 연동
- 해외 주식/선물: IBKR(ib_insync), Alpaca(미국 주식), Oanda(FX).
- 국내 증권: 키움/이베스트 등 OpenAPI(대개 Windows/COM 기반, 서버/원격 데스크톱 필요).
- 가상자산: ccxt(Upbit·Binance 등 다중 거래소 공통 인터페이스).
- 스케줄/운영: APScheduler/cron, Docker, PostgreSQL/SQLite(체결·P&L 로그), Grafana(P&L 모니터).
- 알림: Slack webhook, 이메일(SMTP), 텔레그램 봇.
미니 아키텍처(텍스트 다이어그램)
[Data Fetcher] -> [DB/Parquet] -> [Strategy Engine] -> [Risk Layer] -> [Order Router] -> [Broker]
| |
[Metrics/Logs] <-------------+----> [Notifier]
최소 예제(개념용 의사코드)
# 전략/리스크/주문을 분리해 테스트하기 쉬운 구조
price = load_ohlcv("BTC/USDT", interval="1h")
sig = generate_signal(price) # ex) MA 크로스
pos = position_sizing(sig, max_risk=0.01) # 1% 리스크 룰
orders = reconcile_orders(pos, current_positions(), price)
for o in orders:
try:
place_order(o) # 시장/지정가, 타임인포스, 재시도
except Exception as e:
alert(f"order error: {e}")
log_pnl(); check_kill_switch()
리스크·운영 체크리스트(핵심)
- Kill switch: 손익이 -X% 이하면 즉시 청산+정지.
- Idempotency: 재시도 시 중복주문 방지(클라이언트 오더ID).
- 주문 상태 동기화: 미체결/체결/취소 일치 여부 주기 점검.
- 장애 복구: 재시작 시 포지션/잔고를 읽어 상태 동결→동기화→재개.
- 시간 동기화: NTP.
- 비용 반영: 수수료/슬리피지/환전비용·세금 추정.
- 접속 제한/약관 준수: API rate limit·허용 전략 확인.
- 보안: API 키 암호화/권한 최소화, IP 화이트리스트, 로그에 키 미노출.
자산·지역별 현실 이슈
- 국내 주식: 다수 API가 Windows 전용+활동세션 필요. 서버 운영은 원격 데스크톱/VM으로 안정화가 관건. 체결 리스크는 낮추되 장애 대응 설계 필수.
- 가상자산(Upbit/Binance 등): 24/7, REST+WS 지원. ccxt로 시작하기 쉬움. 변동성·슬리피지 큼 → 리스크 룰 강화.
- 해외 브로커(IBKR): 자산군 다양·안정적, ib_insync로 개발 친화적. 페이퍼 계정 우수.
성과 측정(백테스트/실전 공통)
- CAGR, Sharpe, Max Drawdown, Calmar, Win Rate, Profit Factor
- 체결 품질: 실전 슬리피지, 미끄러짐 분포, 취소/정정 실패율
- 용량(capacity): 슬리피지 급증 지점(거래 규모 상한)
현실적인 첫 과제(추천 플랜)
- 데이터/전략 노트북: backtesting.py로 간단 모멘텀 전략 만들어 Sharpe/MaxDD 확인.
- 반자동 리포트: 매일 09:00 신호를 Slack으로 전송(주문은 수동).
- 모의 매매: ccxt(가상자산) 또는 IBKR 페이퍼로 동일 전략 2주.
- 소액 자동: 손실 1% 규칙·MaxDD 10% 컷·알림 완비 후 투입.
- 운영화: Docker+cron 배포, 장애 복구/리밸런싱 체크리스트 문서화, 주간 리포트 자동화.