초보자가 API문서로 맨땅에 개발 시작하기2

지난주에 한국투자증권 api 문서를 필요한 부분만 복사해서 붙여넣거나, gpt의 webpilot 플러그인으로 참조하거나, 아예 다운로드 받은 api문서를 압축해서 코드 인터프리터에 업로드하여 GPT로 하여금 접속키 발급 및 소켓 접속 등의 소스코드를 생성하는 것을 확인해 보았다.

이번에는 전체적인 자동으로 매매하는 프로그램의 구조를 GPT를 통해 만들어보려고 한다.

먼저 가장 단순한 구조의 프로그램 요건에 대해 아래와 같이 요청한다.

두 종목 정도에 대해 아침 8:50부터 오후 3:30까지 데이터를 누적하면서 주기적으로 매수매도 기준에 맞는지 체크하여 매매하라는 지시를 받고 GPT가 다음과 같은 코드를 제시했다.

기존에 api문서를 보고 소켓 접속하여 데이터를 수신하는 코드도 만들었던 GPT가 생각보다 허술하게 코드를 생성하였다. 제대로 만들어냈던 접속키 발급이나 소켓접속에 대한 코드도 틀렸거나 사라졌고, 심지어 api문서에 나와있는 호출url들도 임의의 url등으로 대체되어 있다.

이후 다양한 방법으로 api문서를 다시 제시하여 코드 생성을 요청하였으나 생성된 코드의 수준은 더이상 개선되지 않고, 한 부분이 고쳐지면 다른 부분이 흐트러지는 모습이 반복됐다.

결국 프로그램의 파일을 온전히 GPT를 통해 생성해보겠다는 생각은 일단 접고, 기본 골격을 잡은 뒤 부분부분 GPT의 도움을 받아 살을 붙이는 방식으로 전환하기로 했다.

한편, 자동매매를 하는 프로그램은 한편으로는 데이터를 수신받고 있어야 하고 또 다른 한편으로는 주기적으로 매매시점을 파악해야 하며, 이 외에도 상태를 모니터링 하기 위한 정보를 표시해야 하기도 하고, ‘긴급 중지’ 등의 외부의 입력도 받을 수 있어야 한다.

위에서 GPT가 제시한 프로그램은 기본적으로 while True: 형태로 무한반복하는 코드로 되어 있는데, 실질적으로 쓸만한 프로그램을 만들기 위해서는 소위 이벤트 드리븐 방식의 개발이 필요하고, GPT가 이 부분을 해결해 줄 수 있는지 확인차 다음과 같이 요청하였다.

예상보다 훨신 높은 수준의 코드를 제시했다. pyqt, flask, 웹소켓통신 등의 라이브러리들은 각기 이벤트 루프들을 가져야 하는데, 한 프로그램의 이벤트 루프는 기본적으로 하나만 가능하기 때문에, 여러가지 이벤트 루프를 조합하기 위해 다양한 기법이 나와 있으며 이와같은 이벤트 루프를 조합하는 기술은 초보자 수준을 넘어서는 부분이다. 하지만 이 글의 취지인 ‘초보자가 GPT도움으로 개발해보자’는 목적에 부합하는 결과가 나왔으며, 완성도가 높다기 보다는 생각하기 어려운 해결방안을 Thread나 Asyncio 등으로 해결하는 방안을 제시한 점이 고무적이다.

물론 제시한 코드를 바로 실행해보니 역시나 오류가 발생하였는데, GPT 서비스 특성상 본인이 산출한 데이터에 대해 다시 재귀적으로 정합성을 판단해서 완성도를 높이기에는 자원소모 대비 효능이 크지 않기 때문에 적정선에서 틀리더라도 결과를 제시하는 것으로 보인다.

오류 해결을 위해서 그 방법도 다시 GPT에게 수차례 질의하여 동작하는 완성된 코드를 받을 수 있었다.

(…생략…)

GPT가 제시한 코드를 실행해보고, 발생한 오류를 수정해달라고 요청하여 다시 코드를 받아 실행하는 것을 반복한지 1시간이 되지 않아, 상당히 쓸만한 프로그램의 틀이 만들어졌다.

  • 웹 소켓 접속을 가정하고 비동기 방식으로 1초 sleep과 함께 임의의 현재가 정보를 생성하여 메인 루프에 전달하여 df에 누적

  • 매수가능 상태에서만 매수가 실행되고, 매도가능 상태에서만 매도가 실행되며, 이 상태값은 flask의 http로 수신하는 루프를 thread로 실행

  • 추가적으로 flask http응답을 통해 현재 프로그램의 종목보유 여부 및 매매가능상태, 그리고 매매이력을 전달

  • 단순한 구조이지만 현재가가 특정 수치를 넘으면 매수, 이하면 매도하는 틀을 만들고, 매수와 매도의 함수도 적절한 인자를 가정하여 구성

  • 주기적으로 기존에 누적한 정보를 이용하여 매매여부를 판단하는 함수를 schudule 관련 별도의 라이브러리를 사용하지 않고 직접 이벤트 루프로 해결

지금까지 작성된 코드를 실행할 경우 다음과 같은 결과를 확인할 수 있다.

  • 프로그램 실행 직후에는 매수와 매도가 모두 불가능하도록 세팅되어 있기 때문에, 현재가가 100을 넘을때 매수, 미만일때 매도하는 로직이 동작하지 않는다.

  • http방식으로 매수와 매도 가능여부를 On으로 설정해주면 다음과 같이 매매가 이루어진다.

이제 기본적인 틀이 완성되었으므로, GPT를 통해 한국투자증권 API를 참조시킨후 매수함수와 매도함수를 만들고, 기존에 생성해두었던 웹소켓 접속으로 현재가를 누적하면서, 매매할 로직을 decide_trade 함수에 설정하면 초보적이지만 독립된 매매 프로그램으로 동작이 가능할 것으로 보인다.

ps.

async, await은 이번에 처음 사용해보는데, 메뉴얼 읽는 수고도 줄여줄수 있지 않을까 해서 학습차원에서 GPT에게 질의하니 원하던 '3줄 요약’식의 간단한 안내를 받을 수 있어서 좋았다.

4
1개의 답글

👉 이 게시글도 읽어보세요!

📚 AI 활용 사례 더 보기