티스토리 뷰

반응형

⚡ 실전 자동매매 완전 구축 가이드

— 키움·미래에셋·IBKR API 연결부터 주문 자동화까지, 개인이 만들 수 있는 “진짜 운용 시스템” 완결판

지난 글에서 우리는
나만의 AI 퀀트 전략을 설계 → AI가 튜닝 → 매월 적용
하는 수준까지 왔습니다.

이제 남은 단계는 단 하나입니다.

“AI가 만든 전략을 실제 계좌에 자동으로 집행하는 것.”

이번 글에서는
✔ 키움 OpenAPI
✔ 미래에셋 M-STOCK API
✔ 미국 브로커 IBKR
✔ 파이썬 자동매매 구조
✔ 주문 관리 & 오류 처리
✔ 포트폴리오 동기화

모든 걸 실전 수준으로 정리합니다.
(중간중간 나오는 코드는 실제로 돌아가는 코드 기준입니다.)


🎯 이번 글의 목표

“AI → 신호 생성 → 주문 → 체결 → 업데이트”
이 전체 루프를 완전 자동화하는 시스템을 만든다.


🧱 1. API 트레이딩 시스템 전체 구조

반응형

아래 그림은 실제 자동매매 엔진의 기본 프레임입니다.

[ AI 전략 엔진 ]
        ↓
[ Signal Manager ] — 신호 정제
        ↓
[ Order Manager ] — 주문 생성 & 전송
        ↓
[ Broker API ] — 체결
        ↓
[ Portfolio Sync ] — 잔고 업데이트
        ↓
[ Risk Manager ] — 비중 조절
        ↓
[ DB / Log ] — 기록 저장
        ↓
[ Dashboard ] — 실시간 모니터링

오늘은 여기서

  • Order Manager
  • Broker API
  • Portfolio Sync
    이 3가지를 완전히 설명합니다.

🔌 2. 한국 증권사 API 연결

한국은 자동매매 API에 제약이 있어서 3가지로 나눠서 설명해야 합니다.


✔ ① 키움증권 OpenAPI+ (파이썬 최대 활용 가능)

키움은 개인 자동매매의 “정석”입니다.
다만 Windows 환경 필수라는 제한이 있습니다.

🔶 로그인 코드 예시

from pykiwoom.kiwoom import Kiwoom

kiwoom = Kiwoom()
kiwoom.CommConnect(block=True)

🔶 현재 잔고 조회

account = kiwoom.GetLoginInfo("ACCNO")[0]
balance = kiwoom.block_request("opw00018",
                               계좌번호=account,
                               비밀번호="0000",
                               비밀번호입력매체구분="00",
                               조회구분=2)

🔶 주문 실행 코드 (실제로 체결됨)

kiwoom.SendOrder(
    rqname="order",
    screen_no="0101",
    accno=account,
    order_type=1,        # 1=신규매수, 2=신규매도
    code="005930",
    qty=10,
    price=0,
    hoga=3               # 시장가
)

✔ ② 미래에셋 M-STOCK (REST API 기반, Linux도 가능)

장점: REST API, 타 OS 가능, 서버 운영 최적화
단점: 인증 절차 복잡함

예시:

import requests

headers = {"authorization": f"Bearer {TOKEN}"}
url = "https://openapi.miraeasset.com:443/v1/stock/order"

payload = {
  "accNo": "12345678",
  "prdCode": "005930",
  "orderQty": 10,
  "orderPrice": 0,
  "orderType": "01",   # 01 시장가
}

res = requests.post(url, json=payload, headers=headers)
print(res.json())

✔ ③ IBKR (Interactive Brokers, 글로벌 자동매매 No.1)

장점:

  • 해외 ETF 자동매매 최강
  • 완전 REST 기반
  • 수수료 저렴
  • API 안정성 최고

IBKR 주문 예시

from ib_insync import *

ib = IB()
ib.connect("127.0.0.1", 7497, clientId=1)

contract = Stock("AAPL", "SMART", "USD")
order = MarketOrder("BUY", 5)

trade = ib.placeOrder(contract, order)
ib.sleep(1)

print(trade.orderStatus.status)

🛠 3. Order Manager 만들기 (실전 핵심부)

AI 전략이 만들어 낸 신호(signal)를
그대로 주문으로 넣으면 큰일 납니다.

엉뚱한 매수·매도, 중복 주문, 과매수 등 문제가 생김.

그래서 Order Manager가 필요합니다.


✔ 1) 신호 정제 (Signal Cleaning)

예시:

def clean_signal(target_weight, current_weight, threshold=0.02):
    diff = target_weight - current_weight
    return diff[abs(diff) > threshold]

→ 포트폴리오와 2% 이상 차이 나는 종목만 거래.


✔ 2) 주문 생성 로직

def create_orders(diff, portfolio_value, prices):
    orders = []
    for ticker, weight_diff in diff.items():
        cash = portfolio_value * weight_diff
        qty = int(cash / prices[ticker])
        if qty != 0:
            side = "BUY" if qty > 0 else "SELL"
            orders.append((ticker, abs(qty), side))
    return orders

✔ 3) 주문 전송 코드

for ticker, qty, side in orders:
    send_order(ticker, qty, side)

이 부분에서
send_order() 함수가 “API별 구현체”로 달라집니다.


📦 4. Portfolio Sync – 실제 잔고와 동기화

주문이 체결된 뒤에는 반드시 DB 업데이트가 필요합니다.

예시:

def update_portfolio(api):
    holdings = api.get_positions()
    df = pd.DataFrame(holdings)
    df.to_sql("portfolio", engine, if_exists="replace")

자동매매의 반은
"포트폴리오 동기화" 때문에 생기는 문제를 해결하는 과정입니다.


⚠️ 5. 자동매매에서 절대 필요한 보호 장치들

진짜 실전에서 가장 많이 발생하는 위험을 정리해 보면:


✔ 1) 중복 주문 방지

(연속신호 발생 시)

if recent_orders.iloc[-1]["ticker"] == ticker:
    continue

✔ 2) 매수 가능 금액 체크

if qty * price > available_cash:
    qty = available_cash // price

✔ 3) 주문 실패 재전송

API 오류는 자주 일어난다.

for i in range(3):
    if send_order():
        break

✔ 4) 리밸런싱 최대 횟수 제한

과도한 수수료 방지.


✔ 5) 변동성 급등 시 주문 중단

폭락장에서는 매수도 위험함.


🤖 6. 자동매매 전체 코드 예시 (정리)

signal = ai_model.predict(weights)
cleaned = clean_signal(signal, current_weight)
orders = create_orders(cleaned, portfolio_value, prices)

for t, q, side in orders:
    result = send_order(t, q, side)
    log_order(t, q, side, result)
    
update_portfolio(api)

실제로 이 정도면 완전한 자동매매가 가능합니다.


📺 7. Streamlit 실시간 모니터링

  • 오늘 주문 내역
  • 체결 여부
  • 현재 잔고
  • AI 추천 비중
  • 위험 레벨
st.subheader("오늘 주문")
st.dataframe(order_log.tail(10))

st.subheader("현재 비중")
st.bar_chart(current_weight)

🚀 8. 결론 – 개인도 “진짜 자동매매” 만들 수 있다

여기까지 오면, 개인도 다음과 같은 시스템을 만들 수 있습니다:

✔ AI 전략 생성
✔ 비중 자동 계산
✔ 주문 자동 생성
✔ 브로커 API 자동 실행
✔ 잔고 자동 업데이트
✔ 리스크 관리
✔ 대시보드 모니터링

이 모든 과정이 합쳐져

개인 버전의 완전 자동화된 AI 퀀트 트레이딩 시스템

이 완성됩니다.


📘 다음 글 예고

다음 편은 드디어 이 시리즈의 “핵심 질문”입니다.

🔥 “이 모든 AI 퀀트를 실제로 몇 백만~수천만 단위에서 어떻게 ‘안전하게’ 운용하는가?”

  • 포지션 사이징
  • 슬리피지 고려
  • 종목별 리스크
  • 인출/주입
  • 멀티 전략 분리 운영

실전 투자 운영의 핵심을 다룹니다.


 

자동매매,키움API,미래에셋API,IBKR,파이썬자동매매,AI트레이딩,포트폴리오관리,주문자동화,QuantTrading,Streamlit


 

※ 이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2026/02   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
글 보관함
반응형