본문 바로가기
주식 자동 매매 프로젝트

[주식 자동 매매] 프로그램 개발 5: 기능 미리보기

by 카이로스의시간 2024. 11. 15.

제가 개발하려는 주식 자동 매매 프로그램의 기능을 정리합니다. 

첨부된 화면은 제가 조코딩님의 코드를 잽싸게 튜닝해서 개발한 프로토타입입니다. 아직 개발 중이라, 최종 개발된 프로그램의 작동 방식은 아래와 다를 수 있습니다. 참고만 하시길.

기본적으로 나열된 기능들은 제가 원하면 그대로 작동하고, 원치 않으면 작동하지 않게 제어할 수 있습니다. 

 

 

1. 정해진 시간 동안 주식 자동 매매 실행

제가 정하는 시간에 맞추어 특정 작업을 수행하도록 코드를 작성했습니다. 이 부분은 조코딩님 코드에도 구현돼 있는 부분이죠.

 

9시~9시 5분에는 잔고 정리,
9시 5분~15시 20분까지는 주식 매매,
15시 20분~15시 30분가지는 보유 주식 매도

 

 

이런 구조로 설계돼 있는데, 어떤 시간에 어떤 작업이 수행될지 제어할 수 있습니다.

또한 제가 프로그램(코드)을 실행해 놓고 회사에 가있는 동안 노트북이 '잠자기' 모드로 들어가면서 프로그램이 중단되면 안 되겠지요. 거기에 대한 대응 코드도 추가돼 있습니다.

 

 

2. 잔고 정리(보유 수량 전량 매매)

제 증권 계좌를 조회해 보유 주식이 있는 경우 전량 매도하는 기능도 구현돼 있습니다. 

이 기능이 특정 시간에, 특정 조건을 만족할 때 작동하도록 튜닝할 수도 있겠지요. 

 


조코딩님 코드에는 증시 개장 직후, 증시 폐장 전에 잔고 정리가 작동하도록 되어 있지만 제 매매 프로그램은 그런 식으로 동작하지 않습니다. 기계적으로 잔고를 전량 매도하는 로직은 포함 안 하려고요.

 

 

3. 종목 선별

조코딩님의 코드에는 매매 대상 종목을 사용자가 직접 지정하게 되어 있습니다. '삼성전자', '테슬라', '동국제약', ... 이렇게 사용자가 나열해두면 프로그램이 돌아가면서 해당 종목의 현재가가 특정 조건을 충족할 때 매수가 일어나도록 구현돼 있지요.

 

 

 

제가 튜닝한 코드는 사용자에게 선택권을 줍니다. 위와 같이 사용자가 직접 매매 종목을 지정할 수도 있고, 자동으로 매매 종목이 선정되도록 선택할 수도 있습니다.

사실 엄밀한 의미에서 자동 매매(조건 매매)는 전체 종목을 대상으로 특정 조건을 만족하는 종목을 발견해냈을 때 매수가 발생하는, 즉 '종목 선별+매매'가 한몸처럼 움직여야 하지만, 

증권사가 저 같은 일반 사용자에게 그런 기능을 구현할 정도로 API 호출량을 넉넉히 제공해주지 않습니다. 

결국 '조건을 만족하는지'를 판별할 종목의 수를 미리 제한해 놓고 만족할 경우 매매가 발생하도록 구현할 수밖에 없습니다. 

'어떻게 하면 수익 가능성이 높은 종목으로만 풀(pool)을 구성할 수 있을까?'를 고민해서 종목 선별 로직을 만들었습니다. 당연히 이 로직도 성능이 안 좋으면 다른 로직으로 변경할 수 있습니다.

 

 

4. 조건에 따라 매수 수행

선별된 종목들을 대상으로 '현재가가 특정 조건을 만족하는지'를 판별하는 로직이 작동합니다. 종목 선별할 때, 그리고 목표가를 결정할 때 익히 알려진 주식 단기 투자의 지표들이 활용됩니다. (이런 지표들에 대해서는 별도의 포스트로 다룰 예정입니다)

 

프로그램은 실시간에 가깝게 선정된 종목들이 목표가에 도달하는지를 주시하면서 목표가에 도달했을 때 자동으로 매수를 수행합니다. 

매수 수량(규모)도 사용자가 지정할 수 있습니다.

 

 

5. 주기적으로 잔고를 보고

제가 지정한 주기에 맞추어 증권 계좌 잔고를 정리해 디스코드 메시지로 보내줍니다. 

 

일단은 매 10분마다 잔고를 정리해 보내주도록 코딩했습니다.

 

 

6. 조건에 따라 매도 수행

제가 보유한 종목이 제가 지정한 수익률 조건을 만족할 때 매도가 발생하도록 코딩했습니다. 가령, 가격이 몇 % 이상 하락했다거나 몇 % 이상 상승했다고 할 때 매도를 수행하는 것입니다. 

아직까지는 전량 매도로만 구현했지만, 시뮬레이션해본 후에 매도 수량도 정교하게 조정할 필요(분할 매도 등)가 있다면 코드 수정을 하지 싶습니다.

/

일단은 이 정도입니다. 기능도 단순하고 그 안에서 작동하는 로직도 일단은 단순하게만 구현했습니다. 

제가 코딩 실력이 부족해서이기도 하지만 '오캄의 면도날', 즉 비슷한 수준의 효능을 제공한다면 최대한 단순한 게 항상 옳기 때문입니다.