본문 바로가기

퀀트

[퀀트 프로젝트] API를 통한 매매자동화

6. 목차

이번 파트에서는 Excel 파일에 담아둔 20개의 종목들을 증권사 API를 통해 자동매매를 해볼거예요 !


6.1 모의투자 계정 만들기

 

API(Application Programming Interface)는 서로 다른 소프트웨어나 애플리케이션 간의 정보 교환과 상호작용을 가능하게 하는 도구나 프로토콜입니다.

  • 간단히 말해, API는 다양한 시스템이나 애플리케이션이 서로 '대화'할 수 있도록 돕는 중간 매개체 역할을 수행합니다.
  • 이러한 API를 통해 증권사 시스템으로부터 데이터를 요청하고 계좌로부터 매매를 요청할 수 있는 거예요. 

저는 한국투자 증권의 API를 활용하여 매매를 자동화했으며, 실제 투자에 앞서 충분한 테스트를 위해 모의투자 계좌에서 작업을 진행했습니다.

 

저는  모의투자 MAX  5억원으로 신청했습니다!  포트폴리오 투자는 크게 크게 다뤄야죠!

 

모의투자와 API신청을 완료하셨으면 이러한 신청현황을 볼 수 있을 거예요

APP KEYAPP SECRET은 API를 통해 증권사 시스템 및 계좌에 접근할 수 있는 인증 정보로, 아이디와 비밀번호와 유사한 역할을 합니다.

  • 계좌번호와 함께 이 인증 정보가 있으면 매매가 가능하기 때문에, 이들은 절대로 타인에게 노출되어서는 안 되는 중요한 정보입니다.

인증 정보를 사용할 때는 keyring, JSON 파일, 환경 변수 등을 활용하여 노출 위험을 최소화하는 것이 중요합니다. 이 방법들은 중요한 인증 정보를 코드 내에 직접 작성하지 않고 안전하게 관리할 수 있도록 도와줍니다.

  • Keyring: 운영 체제의 보안 저장소를 사용하여 암호, 키, 인증 정보를 저장하고 관리합니다. 이 방식은 인증 정보를 코드나 파일에 직접 저장하지 않으므로 보안성이 높습니다.
  • JSON 파일: 인증 정보를 JSON 형식의 파일에 저장하고, 이 파일을 읽어서 인증 정보를 사용합니다. 파일을 안전한 위치에 저장하고, 접근 권한을 제한하여 보안성을 높일 수 있습니다.
  • 환경 변수: 운영 체제의 환경 변수를 사용하여 인증 정보를 관리합니다. 환경 변수에 인증 정보를 저장하면, 애플리케이션이 실행될 때 해당 정보를 불러와 사용할 수 있으며, 코드 내에 직접 노출되지 않습니다.

 

 

 

 
API가 제대로 작동하는지 확인하기 위해 한국투자증권의 HTS(홈 트레이딩 시스템)를 설치하겠습니다. 이를 통해 API를 통한 매매 명령이 실제로 증권사 시스템과 원활히 통신하고 실행되는지 직접 확인할 수 있습니다.
 

6.2 접근 토큰 및 해쉬 키 발급받기

 
  • App Key와 App Secret을 이용해 접근 토큰을 발급 받을 수 있으며, 이 토큰을 통해 계좌에 접근이 가능합니다.
  • 주문, 정정, 취소와 같은 작업에는 보안을 강화하기 위해 추가적으로 해시키가 필요합니다.

※ 이러한 보안 요소들은 App Key와 App Secret을 활용해 적절한 쿼리를 작성함으로써 얻을 수 있으며, 쿼리 작성 방법은 KIS Developers의 공식 문서에서 확인할 수 있습니다.

이제 필요한 모든 요소(계좌번호, App Key, App Secret, 접근 토큰, 해시키)를 갖추었으니, 매매를 시도해 보겠습니다.

 

API를 통해 테스트 목적으로 삼성전자 주식 10주를 매입해 보았습니다. 결과창에 "모의투자 매수주문이 완료되었습니다."라는 문구가 표시되어, 주문이 성공적으로 처리되었음을 확인할 수 있습니다.

 

시장가 주문으로 삼성전자 주식을 구매했는데, 왜 주문이 같은 체결평균가로 두 번에 나눠 체결된 걸까요?

 

시장가 매수 주문임에도 불구하고 같은 가격으로 두 번에 나눠서 체결된 이유는 모의투자 환경이기 때문입니다.

  • 매수 주문을 입력한 후, 실제 투자에서 누군가가 10주를 매입해야만 제 모의투자 계좌에서도 매입이 반영됩니다.
  • 주문을 입력한 시점부터 실제로 10주 이상이 매입되었다면, 제 계좌의 체결도 10주로 한 번에 이루어졌을 것입니다.
  • 하지만, 이 경우에는 제 주문 입력 후 8주와 2주로 나누어 체결된 것으로 보입니다.

 

자동매매 시스템을 구축하기 위해 인피니티 스톤으로 여러 핵심 함수들을 만들었습니다. 이중 주요 함수들을 살펴보면 다음과 같습니다:

  • 현재가 함수: 종목의 현재가를 구합니다. 이 함수는 예산 내에서 각 종목을 얼마나 매입해야 하는 지 계산하는 데 필요합니다.
  • 계좌잔고 조회: 포트폴리오를 리밸런싱하는 데 필수적인 기능으로, 포트폴리오에 포함된 종목을 매수하고 그 외 종목을 매도하는 결정을 내리기 위해 현재의 계좌 보유 종목 및 계좌 잔고를 확인합니다.
  • 주문 함수: 실제로 주문을 실행하는 함수입니다. 가격 변동을 최소화하기 위해 최유리 지정가 주문 방식을 사용합니다. 한 주씩 매매합니다.

 

 

 

이해를 돕기 위해 최유리 지정가에 대한 예시를 들겠습니다.

최유리 지정가, 저는 이번에 처음 알았습니다ㅎㅎ

 

  • 예를 들어, 왼쪽 그림에서 400주를 시장가로 매도할 경우 일반적으로 9800까지의 매물을 소화해 모두 체결됩니다. 
  • 하지만 최유리 지정가 매도를 사용하면 매도 창의 제일 위인 최우선 매수호가에 100주만 매도되고 나머지 300주는 대기 매도 물량으로 쌓이게 됩니다.
  • 이는 최유리 지정가가 가격 변동을 줄이는 한편, 전체 주문량이 한 번에 체결되지 않을 수 있다는 점에서 차이가 있습니다.
  • 프로그램 매매를 진행하면서도 최소한의 가격변동을 가하는 중요한 매매 방식인 것 같습니다! 

 


 

6.3 API를 통한 매매 자동화

매매 자동화 프로그램의 워크플로우는 다음 단계로 구성됩니다:

  1. 엑셀 파일에서 모델 포트폴리오를 불러옵니다.
  2. 현재 계좌의 보유 종목자산 정보를 확인합니다.
  3. 총 자산 5억 원의 98%인 4억 9천만 원을 투자 금액으로 설정하고, 이를 20개 종목에 균등하게 배분합니다. 이에 따라, 각 종목당 투자 금액은 약 2450만 원이 됩니다.
  4. 설정된 투자 금액을 바탕으로 각 종목의 목표 보유 수량을 계산합니다.
  5. 현재 보유 중인 종목 수량과 비교하여 필요한 투자 수량을 결정합니다. 이는 목표 수량에서 현재 보유 수량을 뺀 값으로 계산됩니다.
  6. 매매 시간을 오전 9시부터 오후 3시까지로 설정하고, 이 시간 동안 또는 모든 종목이 목표 수량에 도달할 때까지 매매 스케쥴을 실행합니다.

이 과정을 통해 프로그램은 자동으로 포트폴리오를 관리하고, 설정된 전략에 따라 매매를 진행합니다.

 

 

 

현재 보유하고 있는 잔고는 다음과 같습니다

  • 삼성전자 주식은 테스트용으로 매수된 종목.
  • 실수로 원주가를 기준으로 포트폴리오를 만들고 매수한 종목. (악! 또 PTSD가ㅎㅎ 주가데이터 크롤링편 참고...)

그래도 포트폴리오 리밸런싱을 테스트하는 데에는 좋은 환경인 것 같습니다!

첫째날 입니다 .5000 만원 어치의 주식을 매수했고  21 만원 어치의 주식을 매도했습니다 .

 

 

 

 

 

(비록 이날 늦게 돌리기 시작했다곤 하지만 그걸 감안해도 느린감이 있습니다.

그리고 당장 다음날이 프로젝트 마무리 날이여서)

 

 

 

한 주씩 매매하던것을 10주씩 매매하는 것으로 재설정하였습니다!!

 

 

 

4억원 어치의 주식을 매수했습니다!!!

 

 

  • 현재 계좌에 보유한 종목들을 모델 포트폴리오의 목표 수량과 비교해 본 결과, 대부분의 종목은 목표에 근접해 매입된 상태입니다.
  • 빨간 박스로 표시된 몇몇 종목을 6주씩 추가로 매도하면, 모델 포트폴리오에 맞춰 20개 종목만으로 구성된 포트폴리오를 완성할 수 있을 것으로 보입니다.
    • 마지막 거래일에 10주씩 매매를 시도하여서, 각각 6주가 매도되지 않은 상태로 남아있는 것 같습니다.
  • 초록 박스로 표시된 종목은 에스텍으로, 해당 종목은 약 1800주가 남아있는데, 이는 둘째 날의 실제 총 거래량이 1138주였기 때문에 1106주만 매입할 수 있었습니다... (근데 아무리 좋은 주식이라도 일일 거래량이 총 1138주 밖에 안되는 종목이 제 모델 포트폴리오 안에 있다는게 약간 무섭네요...ㅎㅎ)

 

 

일단 이렇게 해서 프로젝트가 마무리가 되었습니다!!

 

 

회고

이번 프로젝트를 통해 달성한 주요 목표입니다.

  1. 조엘 그린블라트의 마법 공식 활용: 국내 주식을 대상으로 마법 공식을 적용하여 포트폴리오를 구성하는 것은 성공적으로 이루어졌습니다. 이 경험은 유명한 공식을 활용해 실제 포트폴리오를 구성해보는 유익한 시도였습니다.
  2. 매매 자동화를 통한 패시브 인컴 실현: 매매 자동화를 통해 패시브 인컴을 얻는 것은 저의 장기적인 목표 중 하나입니다. 이번 프로젝트로 이 목표를 완전히 달성하기는 어렵지만, 최종 포트폴리오에 대한 백테스팅과 모의 투자 결과를 통해 자동화된 투자의 가능성을 앞으로 더 탐색해보려고 합니다!
  3. 퀀트 분석에 대한 깊은 이해: 이 프로젝트는 퀀트 분석에 대한 심층적인 이해를 높이는 데 크게 기여했습니다. 증권 데이터 분석 및 투자 종목 선별에 자신감을 가지고 접근할 수 있는 좋은 기회였습니다.

프로젝트를 진행하며 느낀 아쉬운 점입니다.

  1. 데이터 업데이트 시점: 최근 영업일 기준으로 데이터를 사용했으나, 실제로는 최근 영업일보다 2일 이전의 데이터를 활용했습니다. 이는 시간적 버퍼가 필요했던 부분이였으나, 데이터 소스의 업데이트 시간을 추적해서 개선해야겠습니다.
  2. 클라우드 컴퓨팅을 통한 완전한 자동화: 처음에는 완전한 자동화 프로세스 구축을 목표로 했으나, 연간 한 번의 리밸런싱과 완전 자동화의 필요성에 대한 고민으로 이 부분은 진행하지 않았습니다. 퀀트 트레이딩에서 완전한 자동화와 인간의 개입 사이의 균형이 중요하다는 점을 느꼈습니다. 그리고 트레이딩 전략에는 완전한 자동화 프로세스 구축이 필요할 수 있으나 개인이 진행하는 프로젝트 단위에서는 컴퓨터에 많은 부하가 오는 작업이 아니다 보니 클라우드 컴퓨팅보단 전용 노트북 하나 구비해서 돌리는게 바람직하다는 생각이듭니다.
  3. 미국 시장에서의 프로젝트 실행: 이 프로젝트를 미국 시장에서 진행하지 않은 것이 아쉽습니다. 미국 시장은 글로벌 자본을 대거 흡수하는 큰 시장이며, 한국 시장에서보다 가치 투자에 있어서 더 많은 기회를 준다고 생각하거든요.

블로그 작성을 여기서 마무리하고, 모의투자 결과는 1년 후에 확인할 예정입니다. 그 사이, 트레이딩 전략을 이용한 포트폴리오 설계를 기획해보도록 하겠습니다!!! 

 

 

 

추가 +)

 

 

 

포트폴리오 마무리한 날짜(3월 19일) 이후 현재 날짜(3월 28일)까지

코스피 상승률은 3.37%, 코스닥 상승률은 9.7%.

내 포트폴리오는 2.86%....

 

 

음....

 

 

 

 

...

 

 

 

아직 섣불리 판단할 수 없습니다!! 이제 겨우 1주일 반 지나간 것이죠!

 

 

그리고 포트폴리오 전략은 장기적인 것이니까요!

 

 

주식시장에서는 일희일비하지 말라는 유명한 격언도 있잖아요?ㅎㅎ

 

 

1년 뒤에는 분명 엄청난 수익률이 기다리고 있을 거예요!

 

 

 

지금까지 글 읽어주셔서 감사합니다. 모두들 담에 뵈요!!