IT개발

C#과 ChatGPT 연동을 통한 키움증권 자동매매 시스템 구현

HyochulLab 2025. 3. 11. 12:31

1. 전체 구성 아이디어

  1. 키움증권 OpenAPI+ (KOA Studio) 연동
    • C# 환경에서 COM(ActiveX) 기반으로 제공되는 Kiwoom OpenAPI+를 사용하여 주식 시세 조회, 주문, 잔고 조회 등 자동매매 기능을 구현합니다.
  2. ChatGPT 연동(OpenAI API)
    • OpenAI API(RESTful) 혹은 NuGet 패키지(OpenAI .NET 패키지 등)를 활용하여 ChatGPT(Model: GPT-3.5/GPT-4/등등)에 질의(Query)를 보내고 응답을 받습니다.
    • ChatGPT의 응답을 사용해 실시간 뉴스 해석, 종목 분석 요약, 간단한 종목 필터링 아이디어 등을 얻을 수 있습니다.
  3. 서버/클라이언트 구조 혹은 단일 데스크톱 프로그램
    • ChatGPT는 클라우드 API를 사용하므로, 반드시 인터넷이 연결되어야 합니다.
    • 자동매매는 키움증권 클라이언트(영웅문4) 실행 + OpenAPI 연결 상태를 유지해야 하므로, 보통 Windows 데스크톱 환경(WinForms, WPF 등)에서 진행합니다.
    • 필요한 경우 서버와 연동(서버 측에 백테스트 로직, DB를 둔 구조)하여 데이터를 주고받을 수도 있습니다.
  4. 자동매매 로직 + ChatGPT 로직 결합 방식
    • 사용자 질의/명령 기반: ChatGPT에게 “현재 시장 상황 분석 요약, 매수할 만한 업종은?” 등을 질의 -> 응답을 보고 사람이 의사결정 -> 자동매매 프로세스를 C# 측에서 실행.
    • 자동 트리거 기반: 예컨대 매 분/매 시간/종가 시점마다 ChatGPT API에 시장상황(뉴스/차트/지표 등 정리본)을 요약 요청 -> ChatGPT의 답변을 특정 기준으로 해석 -> 임계값 충족 시 자동주문.
    • 시장 뉴스 스크래핑 + ChatGPT 활용: 외부 경제지 뉴스나 증권 속보 문구를 가져와 ChatGPT에게 ‘기사 요약’이나 ‘심리/뉘앙스 분석’을 시켜 점수화 -> 거래 로직에 참조.

2. Kiwoom OpenAPI+ 연동 개념 정리

키움증권의 영웅문4(또는 영웅문S 등)에 로그인한 상태에서, 제공되는 COM 라이브러리를 이용해 프로그램에서 이벤트를 받고, 요청을 보내는 구조입니다.

  1. 환경 세팅
    • 키움증권 홈페이지에서 OpenAPI+ 사용신청 -> 개발가이드(KOA Studio) + ActiveX 설치.
    • Visual Studio(C#)에서 참조 추가(COM -> AxKHOpenAPILib, KHOpenAPILib).
    • WinForms 프로젝트를 생성한 뒤, ToolBox에서 ‘AxKHOpenAPI’를 Form에 드래그 앤 드롭해 배치.
  2. 로그인 및 이벤트 처리
    • axKHOpenAPI.CommConnect() 메서드로 로그인.
    • 로그인 완료 후 이벤트(“_OnEventConnect”) 핸들러에서 결과 확인.
    • 예:
      private void axKHOpenAPI_OnEventConnect(object sender, AxKHOpenAPILib._DKHOpenAPIEvents_OnEventConnectEvent e)
      {
          if (e.nErrCode == 0)
          {
              // 로그인 성공
          }
          else
          {
              // 로그인 실패
          }
      }
      
  3. 조회와 주문
    • 조회: axKHOpenAPI.SetInputValue("종목코드", "005930"); // 예: 삼성전자 처럼 파라미터 세팅 후 CommRqData(“RQName”, “OPT10001”, … ) 형태로 요청 -> 응답은 OnReceiveTrData 이벤트로 수신.
    • 주문: axKHOpenAPI.SendOrder(…) 메서드 사용(주문 이름, 주문 종류(신규매수/신규매도), 종목코드, 수량, 가격, 거래구분 등).
    • 응답 이벤트 OnReceiveChejanData(체결 정보) 를 활용해 체결 상황 모니터링 가능.
  4. 자동매매 구현 시 주의사항
    • 특정 시간(장 시작 전/장 중/장 마감)에만 가능한 작업이 있음.
    • 이벤트가 비동기로 들어오므로, UI 쓰레드에서 동작 시 Invoke/BeginInvoke로 쓰레드 처리 필요.
    • 실시간 시세 수신(주가 호가, 체결) 시 SetRealReg() 사용.
    • API 과도 조회 제한 존재(10초에 200건), 이 점 유의해서 요청 횟수 관리.

3. ChatGPT(OpenAI API) 연동 개념 정리

ChatGPT API를 사용하려면 OpenAI API 키가 필요합니다. NuGet에 있는 OpenAI .NET 라이브러리 또는 HTTP 클라이언트로 직접 REST를 호출할 수 있습니다.

  1. 예시 NuGet 패키지
    • “OpenAI” 혹은 “OpenAI-API-dotnet” 등.
    • 패키지 설치 후, 아래와 같은 방식으로 사용(패키지마다 인터페이스가 약간 다를 수 있음).
  2. 예시 코드
    • 실제로는 예외 처리, 메시지 토큰 관리, 비용(호출량) 관리 등이 필요합니다.
  3. using OpenAI_API; public class ChatGptService { private readonly OpenAIAPI _api; public ChatGptService(string apiKey) { _api = new OpenAIAPI(apiKey); } public async Task<string> GetChatGptResponse(string prompt) { var chatResult = await _api.Chat.CreateChatCompletionAsync(new ChatRequest { Model = "gpt-3.5-turbo", Messages = new List<ChatMessage> { new ChatMessage(ChatMessageRole.System, "You are a helpful assistant."), new ChatMessage(ChatMessageRole.User, prompt) }, MaxTokens = 500, }); // 답변 메시지 추출 var response = chatResult.Choices.FirstOrDefault()?.Message.Content; return response; } }
  4. 활용 예
    • 시장 뉴스 분석: 뉴스 원문(또는 요약본)을 ChatGPT에 전달하고, 요약+투자심리 분석을 응답받아 내부 점수화.
    • 종목 필터링: 자체 스크리너(재무 정보, 기술적 지표 등)로 추린 종목을 ChatGPT에게 “이 종목들 중 이런 조건에 부합하는 것을 설명해줘” 식으로 질의 -> 추가 분석 근거 마련.
    • ChatGPT를 UI 봇으로 사용: 매수/매도/검색 명령을 ChatGPT에게 “내 계좌 잔고 고려하여 005930 종목 10주 매수해줘” 식의 프롬프트 -> C# 측에서 해당 응답을 파싱해 실제 주문 로직으로 연결.

4. 구체적 예시 구조

(1) 메인 Form (WinForms 또는 WPF)

  • AxKHOpenAPI 컨트롤을 Form 상에 배치, 로그인/조회/주문 기능 구현.
  • ChatGPTService(OpenAI API를 부르는 클래스) 인스턴스 생성.
public partial class MainForm : Form
{
    private ChatGptService _chatService;

    public MainForm()
    {
        InitializeComponent();
        axKHOpenAPI.OnEventConnect += axKHOpenAPI_OnEventConnect;
        axKHOpenAPI.OnReceiveTrData += axKHOpenAPI_OnReceiveTrData;
        // ...
        _chatService = new ChatGptService("Your-OpenAI-API-Key");
    }

    private void btnLogin_Click(object sender, EventArgs e)
    {
        axKHOpenAPI.CommConnect();
    }

    private async void btnAskChatGPT_Click(object sender, EventArgs e)
    {
        // 예: 유저가 입력한 문장을 ChatGPT에게 보내보기
        string userPrompt = txtUserInput.Text;
        string response = await _chatService.GetChatGptResponse(userPrompt);
        txtChatGptOutput.Text = response;
    }

    // Kiwoom 이벤트 핸들러
    private void axKHOpenAPI_OnEventConnect(object sender, AxKHOpenAPILib._DKHOpenAPIEvents_OnEventConnectEvent e)
    {
        if (e.nErrCode == 0)
        {
            // 로그인 성공
        }
    }

    private void axKHOpenAPI_OnReceiveTrData(object sender, AxKHOpenAPILib._DKHOpenAPIEvents_OnReceiveTrDataEvent e)
    {
        // 조회 응답 처리
    }

    // 예: 버튼 클릭 시 매수
    private void btnBuy_Click(object sender, EventArgs e)
    {
        // SendOrder 호출
        // axKHOpenAPI.SendOrder("주문이름", "화면번호", "계좌번호", 1, "종목코드", 수량, 가격, "00", "");
    }
}

(2) 자동매매 로직(Service/Manager)

  • 실시간 시세나 지표 변화를 모니터링 → 조건 만족 시 매수/매도.
  • ChatGPT 결과(뉴스 요약, 감성 분석 등)를 받아 지표로 활용.
  • 예: AutoTradingManager 클래스에서 일정 주기로 다음 작업:
    1. (Kiwoom) 특정 종목 시세/재무/수급 자료 조회
    2. (ChatGPT) 해당 종목 관련 뉴스 헤드라인 요약 질의
    3. 결과 스코어를 종합하여 조건 충족 시 주문 실행
public class AutoTradingManager
{
    private AxKHOpenAPILib.AxKHOpenAPI _axKHOpenAPI;
    private ChatGptService _chatService;

    public AutoTradingManager(AxKHOpenAPILib.AxKHOpenAPI api, ChatGptService chatService)
    {
        _axKHOpenAPI = api;
        _chatService = chatService;
    }

    public async Task RunAutoTradingAsync()
    {
        // 1) 종목 정보 조회
        // _axKHOpenAPI.SetInputValue("종목코드", "005930");
        // _axKHOpenAPI.CommRqData("종목기본정보", "OPT10001", 0, "0101");
        // ... OnReceiveTrData 이벤트에서 응답 받음

        // 2) 뉴스 Headline이나 요약문을 ChatGPT에 전달
        var prompt = "삼성전자 관련 최신 뉴스를 요약하고 투자심리를 긍정도(0~100)로 표현해 주세요.";
        string chatResult = await _chatService.GetChatGptResponse(prompt);

        // 3) chatResult를 파싱(예: “긍정도: 70” 등) -> 숫자 추출
        int sentimentScore = ParseSentimentScore(chatResult);

        // 4) sentimentScore가 특정 값 이상이면 매수 로직 실행
        if (sentimentScore > 60)
        {
            // 예시
            _axKHOpenAPI.SendOrder("자동매수", "0101", "1234567890", 1, "005930", 10, 0, "03", ""); 
        }
    }

    private int ParseSentimentScore(string chatResult)
    {
        // 간단한 예시: “긍정도: XX” 찾기
        // 실제로는 정규표현식 또는 ChatGPT를 별도 포맷으로 응답하게 하여 처리
        return 70;
    }
}

5. 개발 시 고려할 사항

  1. 투자 판단 근거와 위험관리
    • ChatGPT는 언어모델로서, 숫자 연산이나 시세 예측 정확도가 부족할 수 있습니다.
    • 반드시 본인의 알고리즘(백테스트, 리스크 관리)을 주축으로 하고, ChatGPT는 ‘보조 분석’ 용도로 사용하는 것이 안전합니다.
  2. OpenAPI+의 한계
    • 과도한 조회 시도 시 차단(초당/10초당/분당 제한)
    • 장중 실시간 모니터링 시 PC에 영웅문4/ActiveX 실행 상태 유지 필수
  3. API Key 보안
    • OpenAI API 키를 코드에 직접 하드코딩하면 안 되고, 별도 설정파일/환경변수/Secret Manager 등에 보관.
  4. 데이터베이스/로그
    • 자동매매 과정에서 어떤 신호로 매매가 이뤄졌는지, 체결 내역, 시세 등을 로그/DB에 축적하면 사후 분석이나 리포팅에 유용합니다.
  5. API 이용 비용
    • ChatGPT API는 사용량에 따라 비용이 청구됩니다. 대량 호출 시 예산을 모니터링해야 합니다.
  6. 장중 재접속/장애 대비
    • PC 재부팅, 네트워크 장애, 키움영웅문4 재접속 등 상황이 발생할 수 있으므로, 비정상 종료 후 재기동 로직 고려(주문 중복 실행 방지 등).

6. 요약

  1. **Kiwoom OpenAPI+**를 C# WinForms/WPF에서 사용하여 자동매매 프로그램을 구성한다.
  2. **ChatGPT(OpenAI API)**를 REST or .NET 라이브러리로 연동하여 종목 분석, 뉴스 요약, 추가 보조 판단 등을 수행하게 한다.
  3. 자동매매 로직은 사람이 만든 “시세/재무/수급 기반 공식” + “ChatGPT 분석결과”를 결합해 최종 판단을 내리는 구조를 설계한다.
  4. 구현 시 이벤트(비동기) 처리, API 제한, 사용자 인증과 보안, 장애/재접속 대응 등을 꼼꼼히 챙긴다.

이상과 같은 큰 흐름으로 개발을 진행하시면, C# 환경에서 키움 증권 자동매매와 ChatGPT를 병행 활용하는 시스템을 구축해볼 수 있습니다.

  • 먼저 OpenAPI+ 환경에 익숙해지신 뒤(주문, 조회, 실시간 이벤트) -> ChatGPT API와의 연동(REST 호출, 응답 파싱)을 시도하고 -> 이를 통합한 자동매매 로직을 테스트해보시면 됩니다.
  • 실제 투자에 적용하실 때는 신중을 기하시고, 충분한 모의테스트로 전략을 검증한 다음에 운영에 들어가시는 것을 추천드립니다.