자동매매 시스템은 ‘연구 → 백테스트 → 모의 → 실거래’의 순환 고리로 성장합니다. 이 글은 데이터 품질과 거래비용, 생존 편향을 먼저 통제하고, 전략/리스크/집행을 분리 설계하는 방법을 다룹니다. 본 문서는 정보 제공이며 투자/법률/세무 자문이 아닙니다. 실제 거래 전에는 반드시 모의와 소액 검증을 거치세요.
- 데이터 레이어 설계: 수집/정제/검증/보관
- 전략 아이디어 → 피처/라벨링 → 규칙화
- 백테스트: 거래비용/슬리피지/체결 논리 현실화
- 워크포워드·샘플외 검증 → 모의 → 소액 실거래
- 모니터링·알림·드로다운 한도·킬스위치
시스템 아키텍처 — ‘분리’가 안정성을 만든다
시세/체결/호가/기업 이벤트/뉴스/대체데이터. 빈칸/중복/타임존/서머타임/분기점(액면분할·배당) 처리.
피처 엔지니어링(모멘텀/변동성/가치/퀄리티), 스케일링/정규화, 라벨링(상승/하락/보합, 수익-위험 비율).
거래비용/슬리피지, 체결 규칙(시장가/지정가/스톱), 리밸런싱 주기, 포지션 한도, 워크포워드.
OMS/EMS, 주문 큐/재시도/체결 확인, 라우팅, 실패 시 롤백/알림.
데이터 레이어 — 품질이 수익보다 앞선다
자동매매의 절반은 데이터 정합성입니다. 단일 소스에 의존하지 말고, 타임스탬프·조정주가·거래정지를 처방표처럼 기록하세요.
| 항목 | 체크포인트 | 실전 팁 |
|---|---|---|
| 시세/체결 | 타임존/서머타임, 틱 누락, 휴장일 | 장 시작/마감 5~10분 구간 별도 플래그 |
| 조정주가 | 액면분할/합병/배당 | ‘원시가격’과 ‘조정가격’을 모두 보관 |
| 기업 이벤트 | 공시 시간, 실적 발표 래그 | 룩어헤드 금지: 발표 이후 시점만 사용 |
전략 카탈로그 — 단순하게 시작하고 증명으로 확장
SMA/EMA 교차, 52주 신고가 돌파, ADX 필터. 핵심은 손절/재진입 규칙.
- 추세 필터: 200SMA 위에서만 매수
- 출구: ATR×k 스톱/트레일링
볼린저/RSI/괴리율. 급등락·체결 리스크 완화 위해 포지션/종목 캡을 둡니다.
- 엔트리: 밴드 하단 돌파 후 복귀
- 익절: 평균 회귀 시 분할 청산
모멘텀·가치·퀄리티·변동성/규모 결합. 섹터 중립/리스크 패리티로 변동성 관리.
- 리밸런싱: 월/분기
- 상관 노출 제한(섹터/테마)
백테스트 — 현실을 과감히 ‘과소평가’하라
좋은 백테스트는 숫자를 키우기보다, 실제에서 떨어질 요소를 미리 깎아 냅니다.
- 거래비용: 수수료+세금+스프레드. 틱/체결 우선순위/체결율 모델링
- 슬리피지: 거래량 대비 주문량 캡, 장 시작/마감 변동성 페널티
- 룩어헤드·생존 편향 제거: 상폐/정지/공시 시간 엄수
- 워크포워드: 롤링 리밸런싱/파라미터, 샘플외 검증
- 턴오버/홀딩기간/포지션 캡으로 과최적화 억제
의사코드 — “간결한 추세추종”의 뼈대
# 1) 데이터: 일봉 OHLCV, 조정가격 사용
# 2) 규칙: 200SMA 위 + 20SMA 상향돌파 매수, ATR*3 트레일링 스톱
for each symbol:
if close > sma(close, 200) and crossover(sma(close, 20), sma(close, 50)):
size = risk_budget(0.01) / (atr(14) * 3) # 계정 1% 리스크 캡
buy(size, type="limit/market hybrid")
if close <= trailing_stop(atr(14)*3):
sell_all()
# 3) 리밸런싱: 주 1회, 턴오버 20% 초과 금지
# 4) 거래비용: 커미션/세금/슬리피지 모델 필수
# 5) 검증: 워크포워드, 샘플외, 모의 → 소액 → 스케일업
※ 구현 시에는 자체 백테스터 또는 검증된 프레임워크를 사용하세요(예: Backtrader, vectorbt 등). 라이브러리 선택 시 최근 유지보수 여부를 확인하세요.
- 거래당 리스크 캡(계정의 0.5~1.0%) + 포지션/섹터 한도
- 드로다운 한도(예: 10~15%) 도달 시 자동 중지/쿨다운
- 장 시작/마감, 이벤트 데이(실적/배당/지수변경) 별도 정책
체크리스트 — 빌드하기 전에 마지막 10문항
- 데이터 공백/중복/서머타임/조정 여부가 로그로 남는가?
- 룩어헤드/생존 편향 테스트를 자동화했는가?
- 거래비용/슬리피지를 과다 추정했는가?
- 턴오버·홀딩기간·섹터 한도를 넘지 않는가?
- 워크포워드/샘플외/모의→소액 순서를 강제했는가?
- 실거래 장애 시 롤백/알림/킬스위치가 있는가?
- 로그·메트릭·주문감사 트레일이 보존되는가?
- 전략/리스크/집행 코드가 분리되어 있는가?
- 테스트 결과의 재현이 가능한가?
- 컴플라이언스(데이터 라이선스/개인정보/지역 규정)를 준수하는가?
Q. 전략은 복잡할수록 좋은가요?
A. 아닙니다. 데이터 품질·거래비용·규칙 명확성이 수익보다 앞섭니다. 단순 규칙을 여러 시장/기간에 검증해 일관성을 먼저 확보하세요.
Q. 인공지능을 바로 써도 되나요?
A. 가능합니다. 다만 피처/라벨·샘플외·리스크/집행 분리가 선행되어야 합니다. 예측보다 집행·리스크가 결과를 좌우합니다.
Q. 백테스트 수익률이 높으면 실거래도 높을까요?
A. 일반적으로 낮아집니다. 슬리피지/체결/심리/이벤트 리스크로 절하되며, 이를 보수적으로 반영할수록 생존 확률이 높습니다.
요약 — 구조가 먼저, 성과는 그다음
자동매매의 핵심은 ‘분리’와 ‘현실화’입니다. 데이터/전략/리스크/집행을 분리하고, 백테스트에서 거래비용·슬리피지·체결 논리를 과감히 반영하세요. 워크포워드와 모의→소액의 계단을 오르다 보면, 전략의 진짜 성능이 드러납니다.
※ 본 문서는 일반 정보입니다. 실제 투자 판단과 손익은 전적으로 본인에게 귀속됩니다.
실거래 인프라 — 브로커 API/집행/모니터링
전략이 아무리 좋아도, 집행 레이어가 흔들리면 모든 수치가 무의미해집니다. 본문은 브로커 API 연동, 주문 정책, 배포·알림 시스템, 운영 체크리스트를 “모의 → 소액 → 스케일업”의 단계로 정리합니다. 본 글은 정보 제공이며 투자/법률/세무 자문이 아닙니다.
- 브로커/거래소 연결: REST · WebSocket · FIX
- 주문 정책: 시장가/지정가/스톱/트레일링 · 유효기간(DAY/IOC/FOK/GTC)
- 체결/슬리피지 모델 · 유동성 감지(스프레드/호가 뎁스)
- 배포/운영: Docker · 스케줄러 · 비밀키 관리 · 알림(슬랙/텔레그램)
- 모니터링: 로그/메트릭 · 지연/오류 · 드로다운/한도 · 킬스위치
브로커/거래소 API — 연결 유형과 국내외 예시
Interactive Brokers — TWS/IB Gateway, Socket/FIX 지원. 광범위한 종목·마켓.
Alpaca — 주식/ETF API 중심. 지역/계정 정책을 사전 확인.
REST는 간결·호환성↑, WebSocket은 틱/호가 실시간성↑, FIX는 저지연·규모화에 적합.
- 장점과 운영비(복잡성/유지보수)를 함께 비교
- 타임싱크(NTP)·재연결·백오프 로직을 표준화
주문/집행 정책 — 체결 확률 vs. 가격 개선
| 유형 | 설명 | 언제 쓰나 | 주의 |
|---|---|---|---|
| 시장가 | 즉시 체결 지향 | 리스크 오프/급한 청산 | 스프레드 확대 시 비용↑ |
| 지정가 | 가격 우선 | 평온/대형주/대기 전략 | 미체결·부분체결 관리 |
| 스톱·스톱리밋 | 손절·추세 캡처 | 급락 방지/추세 추종 | 갭/점프 체결 리스크 |
| 트레일링 | 가격 추종 자동 스톱 | 수익 보호/추세 연장 | 턱 값·틱 사이즈 확인 |
| IOC/FOK/GTC | 유효기간/체결 정책 | 펌핑 구간 회피/정책 통일 | 브로커별 지원여부 상이 |
체결 가능성 모델 & 유동성 감지
체결확률을 0~1로 점수화해 주문 라우팅에 반영하면, 동일 전략이라도 실현 성과가 달라집니다.
- 스프레드/뎁스/체결속도·체결편향(매수/매도)을 피처로 사용
- 뉴스/공시·지수변경일·배당락 등 이벤트 플래그
- 대형주/소형주, 레귤러/애프터 정책을 분리
“집행은 과학이다. 측정되지 않으면 개선되지 않는다.”
배포/운영/알림 — 반복 가능한 안정성
Docker, cron/Airflow. 전략·집행·리포트 파이프라인을 별도 태스크로 격리.
환경변수/시크릿 매니저, 키 순환, 권한 최소화. 2단계 인증, IP 화이트리스트.
슬랙/텔레그램 봇, 하트비트(1~5분), 비정상 지연/오류 임계치 경보.
※ NTP 동기화는 필수. 타임스탬프가 어긋나면 체결·리스크 기록이 모두 무너집니다.
의사코드 — 주문 파이프라인의 뼈대
# 0) 프리플라이트: 세션/키/타임싱크/NAV 한도 점검
# 1) 시그널 수신 → 유효성 검사(심볼/세션/금지 종목)
# 2) 유동성 스냅샷: 스프레드/뎁스/체결속도/이벤트 플래그
# 3) 사이징: 계정 0.5~1.0% 리스크 캡, 섹터/종목 한도
# 4) 주문 생성: Type(지정/시장/스톱), TIF(DAY/IOC/FOK), 가격/수량
# 5) 제출 → 체결 폴링/스트림 → 부분체결 관리/수정/취소
# 6) 체결/슬리피지 기록, 포지션/잔고·P&L 업데이트, 알림
# 7) 예외/리트라이/롤백: 네트워크·거부·거래정지 대응
모니터링 — 숫자와 스냅샷을 함께 남기기
| 메트릭 | 의미 | 임계치/주기 |
|---|---|---|
| 주문→체결 지연(ms) | 집행 효율/슬리피지 단서 | p95/p99, 분단위 |
| 체결율(%) / 부분체결 비중 | 가격·유동성 일치성 | 장 구간별 |
| 스프레드/뎁스 | 유동성 환경 감시 | 틱/분단위 |
| 에러율/재시도 | 안정성/품질 | 실시간 경보 |
| 드로다운/한도 사용률 | 리스크 통제 | 분단위/이벤트 |
※ 운영 대시보드는 시각화만이 아니라, 원시 요청/응답과 호가 스냅샷을 함께 보관해야 사후 분석이 가능합니다.
- 프리장/레귤러/애프터를 구분하고, 장 시작/마감 5~10분 정책을 분리
- 실적/배당/지수변경일·연휴·서머타임 전후는 저위험 모드
- 네트워크 점검·브로커 유지보수 창(공지) 반영
장애 시나리오 런북 — 5분 내 안정화
- 알림 수신 → 킬스위치 조건 확인(드로다운/오류율/지연)
- 주문 정지 → 미체결 일괄 취소(or 지정가로 전환)
- 세션/네트워크 재연결, 타임싱크 검증
- 호가/체결 스냅샷 캡처 → 사건 타임라인 기록
- 원인 분석(브로커 응답/에러코드/리밋) · 재발 방지 액션
보안/컴플라이언스 — “한 번 뚫리면 끝”
- API 키 암호화/권한 최소화, 로테이션/접근 로그
- 주문/체결 감사 추적 보존, 개인정보 비저장 원칙
- 데이터 라이선스/지역 규정 준수, 거래정지/상·하한 제도 반영
체크리스트 — 실거래 전 최종 점검 14
- 키/세션/타임싱크 정상
- 모의 ↔ 실계정 완전 분리
- 주문 제한/리밋(분·일·계정) 반영
- 시장가·지정가·스톱 동작 검증
- 부분체결/취소/수정 루틴 검증
- 슬리피지/거래비용 기록 활성화
- 드로다운/포지션/섹터 한도 작동
- 알림/하트비트/지연 경보 작동
- 하루 시작/마감 체크리스트 운영
- 런북 최신화/훈련 로그 존재
- 데이터/주문 로그 보존·암호화
- 업데이트 롤백/블루그린 배포 준비
- 비상 수동 청산 계정/절차 준비
- 컴플라이언스/라이선스 확인
Q. 시장가만 쓰면 안 되나요?
A. 단순하지만 스프레드/갭 구간에서 비용이 커질 수 있습니다. 지정가/트레일링/스톱을 조합해 “체결 확률 vs 가격 개선”을 균형 있게 설계하세요.
Q. 어떤 브로커가 최고인가요?
A. 라우팅 품질·제한·수수료·API 안정성·시장 커버리지를 동선과 전략에 맞춰 비교하세요. 한 곳에 의존하지 않는 멀티 구성이 유리할 때가 많습니다.
Q. 운영 자동화의 최소 구성은?
A. 컨테이너 + 스케줄러 + 알림 + 로그/메트릭 + 킬스위치. 여기에 NTP 동기화와 비밀키 관리를 더하면 기본은 갖춰집니다.
요약 — 전략을 ‘시장’에 안전하게 연결하는 법
브로커 API는 다중 경로/재연결로, 주문 정책은 체결 확률 vs 가격 개선으로, 운영은 측정·알림·킬스위치로 설계하세요. 모의→소액→스케일업의 계단을 지키면, 전략의 진짜 성능이 현실의 마찰 속에서도 드러납니다.
※ 모든 투자는 원금 손실 가능성이 있습니다. 실제 거래 전 최신 약관·수수료·정책을 브로커 공식 페이지에서 확인하세요.
리스크/자금관리 & 성과평가/컴플라이언스
자동매매 시스템은 수익보다 먼저 생존을 설계해야 합니다. 본문은 포지션 사이징, 손절/손익비, 드로다운 한도, 리밸런싱 규율부터 샤프·소르티노·칼마 지표, 거래단위 기대값, 그리고 로그/감사/데이터 라이선스 등 컴플라이언스까지 “운영 가능한 규칙”으로 정리합니다. 본 문서는 정보 제공이며 투자/법률/세무 자문이 아닙니다.
- 거래당 리스크는 계정의 0.5~1.0%를 상한으로(변동성 높은 자산일수록 더 낮게).
- 손익비(Win/Loss multiple)와 승률 중 최소 하나는 구조적으로 유리해야 합니다.
- 전략·집행·리스크 엔진을 분리하고, 리스크 엔진이 최종 승인자가 되게 하세요.
포지션 사이징 & 한도 — 변동성으로 나누고, 상관으로 묶는다
사이징은 리스크 버짓을 가격 변동성(ATR/표준편차)으로 나누는 단순 공식에서 시작하고, 이후 상관관계·섹터 한도로 보정합니다.
포지션 수량 = (계정 가치 × 위험 비율) ÷ (ATR × k)
※ k는 스톱 폭(예: 2~3). 위험 비율은 0.5~1.0% 범위 권장.
- 종목당: 계정의 10% 미만, 거래당 1% 리스크 미만
- 섹터당: 노출 합계 30% 미만(동시 상관 쇼크 대응)
- 총 레버리지: 1.2× 이내, 현금 여유 10% 유지
손절·손익비·드로다운 — “회복 시간”이 전부다
절대 손절 규칙(가격·시간·상황)과 계정 단위 드로다운 한도(예: 10~15%)는 시스템을 지켜 주는 안전핀입니다.
| 구분 | 정책 | 주의 |
|---|---|---|
| 가격 기반 | ATR×k, 추세선 이탈, 전일 저가 종가 이탈 | 갭·점프 리스크 고려(스톱리밋/시장가 혼용) |
| 시간 기반 | N봉 내 기대 성과 미달 시 청산 | 과도한 턴오버 방지 |
| 상황 기반 | 실적/배당/지수 변경일의 저위험 모드 | 이벤트 캘린더 연동 필수 |
성과평가 — 포트폴리오/거래단위/집행 세 층위
성과는 “무엇을 샀는가(전략)”와 “어떻게 샀는가(집행)”의 합입니다. 포트폴리오 지표로 방향을 보고, 거래단위 지표로 습관을 고치고, 집행 지표로 마찰을 줄입니다.
| 층위 | 핵심 지표 | 목표/해석 |
|---|---|---|
| 포트폴리오 | CAGR, 변동성, Sharpe, Sortino, Calmar, MDD, 회복기간 | 위험 대비 효율/하방 리스크/회복 속도 측정 |
| 거래단위 | 승률, 평균 이익/손실, 기대값(Expectancy), 보유기간, 턴오버 | 습관 교정(손절 지연/익절 조급/과도한 교체 등) |
| 집행 | 체결율, 주문→체결 지연, 평균 슬리피지, 스프레드·뎁스 | 마찰 최소화, 브로커·정책 개선 |
지표 계산/리포팅 도구 예시: QuantStats, PyPortfolioOpt, MLFinLab (유료/무료 혼재, 유지보수 확인).
알파 분해 & 노출 관리 — “무엇이 수익을 만들었는가”
성과의 원천을 밝히기 위해 시장·섹터·스타일 팩터 노출을 분해하세요. 시장 랠리에 편승한 수익과 진짜 알파를 구분해야 합니다.
- 시장 베타·섹터 노출·스타일(모멘텀/밸류/퀄리티/사이즈) 노출 측정
- 익스포저 캡: 단일 팩터/섹터 30% 이내
- 상관/공분산 행렬의 안정성 점검(롤링 윈도우)
스트레스 & 시나리오 — “극단을 버텨야 일상도 산다”
백테스트 성과가 동일하더라도, 스트레스 테스트에서의 태도는 전략마다 다릅니다. 최악의 하루/주/월 손실과 회복 시간을 시나리오별로 기록하세요.
| 시나리오 | 충격 | 정책 |
|---|---|---|
| 갭다운 오픈 | 스톱 미스/시장가 청산 비용↑ | 프리장 모니터링·스톱리밋/시장가 혼용 |
| 연속 하락/급락 | MDD 급증·심리 압박 | 킬스위치·쿨다운·사이징 감속 |
| 체결 장애/지연 | 미체결 누적·슬리피지 폭발 | 재연결·롤백·대체 브로커 라우팅 |
리밸런싱 규율 — “무엇을, 언제, 어느 정도”
리밸런싱은 성과의 절반이자 비용의 절반입니다. 캘린더/트리거/하이브리드 방식을 전략 성격에 맞게 선택하세요.
- 캘린더: 월/분기(팩터·멀티팩터)
- 트리거: 조건 충족 시(추세/평균회귀)
- 하이브리드: 시간 창 내 트리거 발생 시 최소 교체
- 턴오버 상한(예: 월 20%)으로 과거최적화 억제
의사코드 — 리스크 엔진이 “최종 승인자”가 되게
# 입력: 제안 주문(심볼, 방향, 수량, 가격), 계정, 한도/노출, 시장 상태
def risk_gate(order, account, market):
# 1) 계정/섹터/종목 한도
if exposure_after(order) > limit.account or sector_exposure(order) > limit.sector:
return reject("limit_exceeded")
# 2) 사이징 캡(리스크 버짓)
if per_trade_risk(order) > 0.01 * account.nav:
order.size = downsize_to_budget(order)
# 3) 변동성 필터/이벤트 플래그
if market.is_opening_5m or is_event_day(order.symbol):
order = relax_to_safe_policy(order) # 지정가/사이즈 축소
# 4) 스톱/트레일링 부착
order.attach_stop(atr(symbol,14) * 3)
# 5) 드로다운/킬스위치
if account.dd >= 0.12:
return reject("cooldown_mode")
return approve(order)
운영/감사/컴플라이언스 — “증거가 없는 성과는 재현되지 않는다”
로그·감사·보안은 수익만큼 중요합니다. 문제는 항상 “나중에” 오며, 기록이 없으면 재현도 복구도 불가능합니다.
- 원시 요청/응답(주문/취소/수정)·호가 스냅샷·체결 스냅샷 저장
- 타임스탬프는 NTP 동기화, 타임존/서머타임 표시
- 암호화 보관·보존 기간 정책
- 시세/뉴스/대체데이터 사용권 확인, 2차 배포/공유 제한 준수
- 개인정보 미수집 원칙, 불가피 시 최소·익명·암호화
기술 스택 예시(선택): ELK 스택 for 로그/검색, Prometheus + Grafana for 메트릭.
리스크 리포트 — 매월 “같은 자리”에서 보는 페이지
월간 리포트는 포트폴리오 성과 + 거래단위 행동 + 집행 품질을 한 페이지에 요약해야 합니다.
| 섹션 | 포함 항목 |
|---|---|
| 성과 | CAGR, MTD/YTD, Sharpe/Sortino/Calmar, MDD/회복기간 |
| 행동 | 승률·평균 이익/손실·기대값, 손절 지연/익절 조급 지표 |
| 집행 | 체결율·지연·슬리피지·스프레드/뎁스 환경 |
| 리스크 | 노출 히트맵, 한도 사용률, 이벤트 캘린더, 킬스위치 기록 |
- 월 1회 “모의 장애” 훈련: 주문폭주/세션 끊김/가격 급변/데이터 누락
- 런북 갱신: 최근 사건 타임라인·조치·재발 방지 체크
- 알림/하트비트/지연 임계치 튜닝: 오탐/미탐 줄이기
Q. 손절 없이 평균단가 낮추기로 버티면 안 되나요?
A. 자동매매에서는 재앙이 됩니다. 리스크 캡과 스톱이 없는 전략은 언젠가 계정을 파괴합니다.
Q. 샤프/소르티노 중 무엇이 더 중요하죠?
A. 하방 리스크에 민감하면 소르티노, 총체적 효율을 보려면 샤프. 두 지표의 일관성을 함께 보세요.
Q. 로그/감사까지 개인이 꼭 해야 하나요?
A. 소규모라도 필수입니다. 오류 재현·세무/회계 근거·규정 준수 증빙까지 모두 로그에서 시작합니다.
요약 — “리스크 엔진이 승인을 내릴 때만 거래한다”
자금 관리는 사이징(0.5~1.0% 리스크 캡)과 한도(종목/섹터/총노출)에서 시작해, 스톱/드로다운/킬스위치로 완성됩니다. 성과는 포트폴리오·거래단위·집행 지표로 다층 분석하고, 알파 원천과 노출을 투명하게 분해하세요. 마지막으로 로그/감사/보안/라이선스로 컴플라이언스를 생활화하십시오. 자동매매의 진짜 경쟁력은 규율입니다.
※ 모든 투자는 원금 손실 가능성이 있습니다. 실제 거래 전 최신 약관·수수료·정책을 브로커/데이터 제공사 공식 페이지에서 확인하세요.
