AlgoLab Blog · 의뢰 전에 · 2026

자동매매 프로그램 수정 의뢰 — 남의 코드에서 보는 5곳

구매자 가이드 2026-10-24 · 약 8분 읽기 · 알고랩 AlgoLab
한 줄 요약

다른 개발자가 만든 자동매매 프로그램도 수정 의뢰가 됩니다. 단, "조건 하나만 바꿔 주세요"가 정말 작은 수정으로 끝날지는 코드 5곳을 보면 갈립니다. ① 키움 OpenAPI+(OCX) 기반이라 32비트 파이썬이 필요한가 ② 한국투자증권 KIS 주문 tr_id가 구 규격 TTTC0802U인가 ③ 2026-09-12에 삭제된 키움 ka10087·ka10098·trde_tp 62를 쓰는가 ④ appkey·appsecret가 코드에 박혀 있고 주문마다 토큰을 새로 받는가 ⑤ .py 소스가 아니라 PyInstaller exe만 남았는가. ①~④는 수정 범위를 넓히고, ⑤는 수정을 "새로 만들기"로 바꿉니다. 아래 점검 스크립트로 의뢰 전에 직접 확인할 수 있습니다.

목차

  1. "조건 하나"가 큰 작업이 되는 이유
  2. 의뢰할 때 보낼 것, 보내면 안 되는 것
  3. 코드에서 먼저 보는 5곳
  4. 의뢰 전 점검 스크립트 — 실제 실행 결과
  5. 수정·이전·재작성, 어떻게 갈리나
  6. 원래 개발자의 권리
  7. 자주 묻는 질문

1. "조건 하나"가 큰 작업이 되는 이유

상담에서 자주 듣는 말이 있습니다. "예전에 다른 분이 만들어 준 프로그램인데, 매수 조건에 거래량 필터 하나만 추가해 주세요." 매수 조건 한 줄은 정말 몇 줄이면 됩니다. 문제는 그 몇 줄을 돌려 볼 수 있느냐입니다.

예를 들어 2년 전에 키움 OpenAPI+로 만든 봇이라면, 수정한 코드를 테스트하려면 32비트 파이썬과 영웅문 설치 환경이 먼저 살아 있어야 합니다. 한국투자증권 KIS로 만든 봇이라면 주문 줄의 tr_id가 지금 규격인지부터 봐야 합니다. 조건 한 줄을 고쳐 놓고 실행했더니 주문이 안 나가면, 의뢰자는 "고쳤더니 고장 났다"고 느낍니다. 그래서 남이 만든 코드를 받으면 바꿀 줄보다 주변 다섯 곳을 먼저 봅니다.

2. 의뢰할 때 보낼 것, 보내면 안 되는 것

보낼 것왜 필요한가
프로그램 폴더 전체(zip).py 파일만이 아니라 설정 파일·requirements.txt·로그 폴더까지 있어야 실행 환경을 재현할 수 있습니다
마지막으로 정상 동작한 날짜와 증상2026-09-12 키움 TR 삭제처럼 날짜가 원인을 알려 주는 경우가 많습니다
바꾸고 싶은 것 한 문장"거래량이 20일 평균의 2배 이상일 때만 매수" 같은 구체적 조건
실행 화면 또는 오류 메시지 원문KIS rt_cd·msg_cd, 키움 return_code·return_msg 같은 원문이 진단을 줄입니다

보내면 안 되는 것 — 실제 키와 계좌번호. 코드에 appkey·appsecret·계좌번호(CANO)가 직접 적혀 있다면 그 줄을 지우거나 가짜 값으로 바꾼 뒤 보내십시오. 진단과 견적에는 실제 키가 필요 없습니다. 이미 메신저나 메일로 오간 적이 있는 키라면 KIS Developers·키움 REST API 포털에서 재발급하는 편이 안전합니다(API 키 보안 글).

3. 코드에서 먼저 보는 5곳

① 키움 OpenAPI+(OCX)인가 — 32비트 파이썬 문제

키움 OpenAPI+는 윈도우 OCX 컨트롤이라 32비트 파이썬에서만 불러올 수 있습니다. 코드에 QAxWidget, "KHOPENAPI.KHOpenAPICtrl.1", CommConnect, SetInputValue·CommRqData·OnReceiveTrData가 보이면 이 계열입니다. 이 PC는 OCX가 설치·등록돼 있는데도(HKCR\KHOPENAPI.KHOpenAPICtrl.1 존재), 64비트 파이썬에서 불러 보면 이렇게 됩니다(2026-10-24 실측, PyQt5 5.15.11).

from PyQt5.QAxContainer import QAxWidget
w = QAxWidget()
ok = w.setControl("KHOPENAPI.KHOpenAPICtrl.1")
print("python", sys.version.split()[0], struct.calcsize("P")*8, "bit / setControl ->", ok)

# 출력
python 3.10.4 64 bit / setControl -> False

주목할 점은 예외가 나지 않는다는 것입니다. setControl이 조용히 False를 돌려주고, 이상은 다음 줄 CommConnect에서 로그인 창이 안 뜨는 형태로 드러납니다. 의뢰자 PC에 파이썬을 새로 깔면서 64비트가 들어갔다면 "어제까지 되던 프로그램이 안 켜진다"의 원인이 이것일 수 있습니다. 반대로 서버나 64비트 환경으로 옮기고 싶다면, 수정이 아니라 키움 REST API로의 이전 작업이 됩니다. 로그인(au10001)·요청(api-id 헤더)·응답·연속조회(cont-yn·next-key)·실시간(WebSocket) 다섯 군데 구조가 바뀝니다(OpenAPI+ → REST 마이그레이션 글).

② KIS 주문 tr_id가 구 규격인가

한국투자증권 KIS Developers 국내주식 현금 주문의 현재 tr_id는 매도 TTTC0011U, 매수 TTTC0012U, 정정취소 TTTC0013U입니다(모의는 VTTC0011U·VTTC0012U·VTTC0013U). 블로그·강의에 널리 퍼진 TTTC0801U·TTTC0802U·TTTC0803U는 구 TR입니다.

headers = {"tr_id": "TTTC0802U", "authorization": f"Bearer {token}"}   # 구 규격 (매수)
headers = {"tr_id": "TTTC0012U", "authorization": f"Bearer {token}"}   # 현재 규격 (매수)

URL(/uapi/domestic-stock/v1/trading/order-cash)은 그대로라 눈으로 보면 차이를 놓치기 쉽습니다. 신 규격 공식 예제는 바디에 거래소 구분 EXCG_ID_DVSN_CD(KRX·NXT·SOR)를 넣습니다. 주문 함수가 여러 파일에 흩어져 있으면 이 교체만으로도 작업 범위가 커집니다(TTTC0012U 신·구 대조표).

③ 삭제된 TR·주문유형을 쓰는가 — 키움 2026-09-12

2026년 9월 14일 KRX 시간외단일가 시장이 폐지되고 애프터마켓이 열리면서, 키움 오픈API 공지 기준으로 9월 12일(토) 21시에 ka10087·ka10098 두 TR과 매매구분 trde_tp 62(시간외단일가), 실시간 FID 10010이 삭제됐습니다. 시간외단일가로 장 마감 후 물량을 정리하던 봇이라면 "조건 수정" 이전에 그 기능 자체를 어떻게 바꿀지부터 정해야 합니다(ka10087 삭제 글). 증권사 API는 이렇게 해마다 바뀌므로, 마지막으로 정상 동작한 날짜를 알려 주시면 원인을 훨씬 빨리 좁힐 수 있습니다.

④ 키가 코드에 박혀 있고, 토큰을 주문마다 받는가

남이 만든 코드에서 가장 흔하게 보는 모양입니다.

APP_KEY = "PSabcdEXAMPLEKEY000000000000"      # 키 하드코딩 (예시 값)
APP_SECRET = "EXAMPLE_SECRET_DO_NOT_USE"

def buy(code, qty):
    token = get_token()          # 주문할 때마다 /oauth2/tokenP 호출
    ...

키 하드코딩은 보안 문제이고, 주문마다 토큰을 받는 구조는 동작 문제입니다. KIS 공식 인증 예제(kis_auth.py) 기준 access_token은 유효시간 1일, 발급은 1분에 1회, 6시간 안에 다시 신청하면 같은 값이 돌아오고 발급할 때마다 알림이 갑니다. 하루 몇 번 주문하던 봇은 티가 안 나지만, 조건을 바꿔 주문 횟수가 늘면 1분 1회 제한에 걸립니다. 키움 REST도 au10001로 받은 토큰에 expires_dt가 있으니 저장해 두고 재사용해야 합니다. 수정 의뢰에 "토큰 캐싱 + 키를 .env로 분리"가 함께 들어가는 이유입니다(KIS 토큰 재발급 규칙).

⑤ 소스(.py)가 있는가, exe만 남았는가

예전 개발자가 PyInstaller로 묶은 bot.exe만 넘겨주고 소스는 안 준 경우가 있습니다. exe는 실행 파일이라 그 안의 매수 조건을 "고치는" 것은 정상적인 작업 경로가 아닙니다. 이때는 수정이 아니라 동작을 보고 새로 만드는 작업이 되며, 기존 exe의 매매 규칙을 정확히 알려면 의뢰자가 규칙을 문서로 설명해 주셔야 합니다. 처음 계약할 때 소스 인도 조건을 넣어야 하는 이유이기도 합니다(소스코드 소유권 글).

소스가 있어도 requirements.txt가 없으면 라이브러리 버전을 추정해야 합니다. 개발자 PC에서 아래 한 줄로 만들 수 있으니, 아직 연락이 닿는다면 받아 두십시오.

> python -m pip freeze > requirements.txt
> type requirements.txt | findstr "requests pandas PyQt5"
pandas==2.2.3
pandas-ta-classic==0.6.20
pandas_market_calendars==4.4.1
PyQt5==5.15.11
PyQt5-Qt5==5.15.2
PyQt5_sip==12.18.0
requests==2.32.3
requests-file==3.0.1
requests-oauthlib==2.0.0

알고랩 작업 PC에서 실제로 뽑은 결과입니다(2026-10-24). findstr는 글자가 포함된 줄을 모두 보여 주므로 pandas-ta-classic처럼 비슷한 이름도 같이 나옵니다. 이 목록이 있으면 "그때 그 버전"으로 실행 환경을 다시 만들 수 있습니다.

4. 의뢰 전 점검 스크립트 — 실제 실행 결과

위 다섯 곳을 파일을 읽기만 해서 찾아 주는 짧은 스크립트입니다. 아무것도 고치지 않고, 인터넷에 접속하지 않습니다. 프로그램 폴더 경로를 넣어 실행하면 됩니다.

"""남이 만든 자동매매 코드 인수 전 1차 진단 (읽기만 함)"""
import re, sys, pathlib

CHECKS = [
    ("32비트 OCX(키움 OpenAPI+)", r"KHOPENAPI\.KHOpenAPICtrl|QAxWidget|CommConnect"),
    ("KIS 구 주문 tr_id",        r"[TV]TTC080[123]U"),
    ("키움 삭제 TR(2026-09-12)", r"ka10087|ka10098"),
    ("키 하드코딩 의심",          r"(APP_?KEY|APP_?SECRET|appkey|secretkey)\s*=\s*[\"'][^\"']{8,}"),
    ("토큰 발급 엔드포인트",       r"/oauth2/tokenP|/oauth2/token\b|au10001"),
]

def scan(root):
    root = pathlib.Path(root)
    py = list(root.rglob("*.py"))
    print(f"[파일] .py {len(py)}개 · exe {len(list(root.rglob('*.exe')))}개 · "
          f"requirements.txt {'있음' if (root/'requirements.txt').exists() else '없음'}")
    for name, pat in CHECKS:
        hits = []
        for f in py:
            for n, line in enumerate(f.read_text(encoding="utf-8", errors="ignore").splitlines(), 1):
                if re.search(pat, line):
                    hits.append(f"{f.name}:{n}")
        print(f"[{'!!' if hits else 'ok'}] {name}: {', '.join(hits) if hits else '없음'}")

if __name__ == "__main__":
    scan(sys.argv[1] if len(sys.argv) > 1 else ".")

위 ①~④ 예시 코드를 담은 샘플 폴더(main.py·kis_order.py·after.py)에 돌린 실제 출력입니다(Python 3.10.4, 2026-10-24).

> python takeover_scan.py old_bot
[파일] .py 3개 · exe 0개 · requirements.txt 없음
[!!] 32비트 OCX(키움 OpenAPI+): main.py:3, main.py:5, main.py:8, main.py:9
[!!] KIS 구 주문 tr_id: kis_order.py:12
[!!] 키움 삭제 TR(2026-09-12): after.py:2
[!!] 키 하드코딩 의심: kis_order.py:2, kis_order.py:3
[!!] 토큰 발급 엔드포인트: kis_order.py:6

읽는 법은 간단합니다. !!가 0개면 정말 조건 수정에 가깝고, ①번 줄에 걸리면 실행 환경부터 확인해야 하며, ②③번에 걸리면 규격 교체가 함께 들어갑니다. 마지막 줄 "토큰 발급 엔드포인트"는 문제라는 뜻이 아니라 토큰 발급 코드가 어디 있는지 알려 주는 표시입니다. 그 함수가 주문 함수 안에서 매번 불리는지를 보면 됩니다. 정규식 기반이라 놓치는 경우도 있으니, 결과는 의뢰할 때 같이 보내 주시는 참고 자료로 쓰십시오.

5. 수정·이전·재작성, 어떻게 갈리나

.py 소스가 있나? 없음 (exe만) 재작성 OCX 32비트 환경 유지 가능? 아니오 / 서버 이전 키움 REST 이전 구 tr_id·삭제 TR· 키 하드코딩? 있음 규격 교체 + 수정 없음 조건 수정
왼쪽에서 걸릴수록 작업이 커진다. 오른쪽 끝까지 가야 "조건 하나"가 정말 조건 하나다.
진단 결과작업 성격의뢰자가 준비할 것
5곳 모두 문제 없음조건 수정 — 바꿀 로직만 고치고 모의투자로 확인바꿀 조건 한 문장
②③④ 중 하나 이상규격 교체 + 수정 — tr_id·TR 교체, 토큰 캐싱, 키 분리를 같이마지막 정상 동작 날짜, 오류 원문
① 해당 + 64비트·서버로 옮기고 싶음키움 REST 이전 — 구조 다섯 곳 교체지금 쓰는 TR·실시간 목록(SetRealReg 대상)
⑤ 해당(exe만)재작성 — 동작을 기준으로 새로 만듦매매 규칙 설명서, 기존 매매 기록

어떤 경우든 고친 뒤에는 KIS 모의투자(openapivts)나 키움 mockapi에서 먼저 돌려 보는 단계가 들어갑니다. 남이 만든 코드는 수정한 줄 바깥에서 무엇이 함께 움직이는지 처음에는 모르기 때문입니다. 범위와 비용이 정해지는 방식은 견적을 정하는 5가지에 정리해 두었습니다.

6. 원래 개발자의 권리

기술 문제보다 먼저 확인할 것이 하나 있습니다. 처음 개발 계약서에 소스코드 권리가 누구에게 있는지입니다. 의뢰자에게 소스 사용·수정 권리가 넘어왔다면 다른 개발자에게 수정을 맡기는 데 문제가 없습니다. 반대로 권리가 원 개발자에게 남아 있거나 "제3자 수정·재배포 금지" 같은 조항이 있다면 사전 동의가 필요할 수 있습니다. 계약서가 없거나 판단이 어려우면 법률 전문가에게 확인하십시오. 이 글은 법률 자문이 아닙니다.

참고로 증권사 API 규격과 제도는 이 글을 쓴 2026-10-24 기준입니다. KIS·키움 모두 공지로 TR과 주문유형을 바꾸므로, 실제 작업 전에는 각 증권사 공식 문서와 공지에서 현재 값을 확인합니다.

7. 자주 묻는 질문

다른 사람이 만든 자동매매 프로그램도 수정 의뢰가 되나요?

됩니다. 다만 파이썬 소스 파일(.py)이 있어야 하고, 실행 환경(키움 OpenAPI+ 32비트 여부)과 쓰는 API 규격(KIS 구 tr_id, 키움 삭제 TR 등)을 먼저 봐야 수정으로 끝날지 이전이나 재작성이 필요한지 판단할 수 있습니다. exe 파일만 있으면 수정이 아니라 새로 만드는 작업이 됩니다.

코드를 보낼 때 API 키도 같이 보내야 하나요?

보내지 마십시오. appkey·appsecret·계좌번호가 코드에 직접 적혀 있다면 그 줄을 지우거나 가짜 값으로 바꾼 뒤 보내고, 이미 외부에 공유된 적이 있는 키는 증권사 포털에서 재발급하는 것이 안전합니다. 진단과 견적에는 실제 키가 필요 없습니다.

키움 OpenAPI+로 만든 프로그램은 꼭 REST로 바꿔야 하나요?

반드시는 아닙니다. 32비트 파이썬 환경과 영웅문 OpenAPI+ 설치가 유지되면 그대로 수정할 수 있습니다. 다만 64비트 파이썬으로 옮기거나 서버(리눅스)에서 돌리려면 OCX가 동작하지 않으므로 키움 REST API로 이전하는 작업이 됩니다. 로그인·요청·응답·연속조회·실시간 다섯 군데 구조가 바뀝니다.

원래 개발자에게 허락을 받아야 하나요?

처음 계약서에 소스코드 권리가 누구에게 있는지 적혀 있다면 그 조항을 먼저 확인하십시오. 의뢰자에게 소스 사용·수정 권리가 넘어왔다면 다른 개발자에게 수정을 맡길 수 있지만, 권리가 원 개발자에게 남아 있거나 재배포 금지 조항이 있으면 사전 동의가 필요할 수 있습니다. 판단이 어려우면 법률 전문가에게 확인하십시오.

예전에 만든 봇, 고칠 수 있는지 먼저 봐 드립니다

키를 뺀 폴더와 바꾸고 싶은 것 한 문장만 보내 주시면, 수정·이전·재작성 중 어디에 해당하는지부터 알려 드립니다. 24시간 빠른 답변 가능합니다.

무료 상담 시작하기