AI를 활용한 재밌는 것들을 개발합니다

2020년 5월 24일 일요일

키움증권 OpenAPI로 퀀트 주식 거래하는 방법

 정말 우연히 'R을 이용한 퀀트 투자 포트폴리오 만들기' 책을 접하게 되었다. 주가 데이터는 비교적 쉽게 수집할 수 있었는데, 제무제표 같은 것은 이 책을 통해서 수집하는 방법을 알게 되었다. 크롤링 방법도 배울 수 있었고, 퀀트 전략들이 그대로 R로 구현되어 있어서 응용하는데도 도움이 많이 되었다.

또 다른 퀀트투자 관련 책들을 읽으면서 진짜 이 전략이 먹힐까 궁금해서 시뮬레이션을 직접 해 보았다. 기본은 'R을 이용한 퀀트 투자 폴트폴리오 만들기'의 소스코드를 활용하였고, 수익률 계산 코드는 직접 만들었다. 1년 전 정보를 토대로 선정한 포트폴리오에 1년 전에 투자할 시 현재 수익률이 얼마일까를 계산하는 시뮬레이션이다.

이 블로그의 [퀀트]-[시뮬레이션] 메뉴의 글들을 보면 지금까지 한 시뮬레이션 결과 들이 있다. 아직도 계속해서 실험해 봐야할 전략들이 많지만 퀄리티 지표결합 전략으로 선정한 포트폴리오에 고가매수저가매도 전략 적용시 수익률이 가장 높게 나왔기 때문에 우선 이 방법으로 투자를 시작했다.

원금 170여만원을 2019년 12월 5일에 고가매수 전략 기준에 해당 된 9개 종목에 투자했고, 매일매일 저가매도 전략 기준에 해당되면 매도하고 다시 고가매수 전략에 해당되는 종목을 매수했다. R 코드를 돌리고 그 결과를 보고 스마트 폰에서 일일이 매도하고 매수하기를 반복한 것이다. 그래봤자 하루에 2~3종목 정도만 교체를 하는 수준이어서 지금은 휴직 중이라 여유롭게 시간 내서 할 수 있지만 복직 후에는 매일 수동으로 할 수는 없는 노릇이다.

먼저 투자 결과를 한번 보자.



최근 주식이 상승장이라 수익이 난 것이란 걸 알고 있지만... 내 주관을 일절 개입시키지 않고 전략에 따라 기계적으로 매매하며 스트레스 없이 투자 할 수 있어서 좋았다. 나중에 또 시뮬레이션을 해 보겠지만 하락장에서 수익을 방어하는 전략도 나중에 적용한다면 퀀트 투자를 통해 지속적인 수익을 낼 수 있지 않을까라는 생각이 강하게 들었다.

그래서 키움증권 OpenAPI를 이용한 퀀트 자동 매매 프로그램을 만들기로 했다.

프로그램은 아래와 같이...



프로그램 이름은 방구석지니다. 방구석에서 '돈주세요' 소원을 들어주는 램프의 요정이다. C#으로 껍데기를 만들거고, R.NET으로 R 코드를 C#에서 실행하고 결과를 받아와서, 키움증권 API를 통해 실제 매매를 실행 시킬거다. 자동매매 프로그램은 아니지만 옛날에 이런 방식으로 다른 프로그램을 만든 적이 있어서 한 일주일이면 다 만들지 않을까 싶다.

복직까지 한달도 안남았다. 내 휴직 중 마지막 결과물로 퀀트 지니 자동 매매 프로그램 방구석지니를 꼭 완성시키고 싶다.



먼저 키움증권에 비대면 증권 계좌는 개인적으로 만들어야 한다. 나는 카카오페이 이벤트 페이지 통해서 비대면 계좌개설 했는데 월 100만원만 거래하면 5만원인가 입금을 받았다.

암튼 키움증권 홈페이지에 가보면 아래와 같이 웹사이트 하단 쪽에 Open API 가 있다. 클릭해보자.



아래와 같은 화면에서 설명해주는 대로 절차에 따라 신청하면 된다.


신청이 다 완료됐으면... 이제 C#으로 어떻게 개발하지? 라고 맨땅에 헤딩 할 생각은 접으시라. 다행이 C#으로 구현한 샘플 코드가 있다! 땡큐!


자료실 탭에 가보면 11번 글에 C# 샘플코드가 있다. 다운 받아서 실행 시켜보자.


아래와 같은 기본적인 기능 들이 구현되어 있는 샘플 프로그램이라고 설명되어 있다. 

[기본기능] 로그인 / 로그아웃 / 접속상태 / 계좌조회 

[조회기능] 현재가 / 일봉데이터

[주문기능] 주문

[추가기능] 조건검색 / 실시간 등록 / 해제 / 자동주문

난 이 소스코드를 기본으로 해서 내가 구현하고자 한 기능들을 하나씩 구현해 나갔다. 어떻게 개발했는지 하나하나 설명해 드리고 싶지만... 너무 방대해서 어떻게 설명을 드려야 할지 모르겠다. 사실 어떻게 개발했는지 기억도 안난... 일단 옛날에 개발했던 상태의 프로그램은 아래와 같다.


추가된 기능은 아래와 같다.
- 내 계좌평가현황 불러오기
- 목표수익률 설정 / 자동 매도(손절포함)
- 매수 종목 설정시 자동 매수
- 주문 취소 기능

지금 보니 정말 기본 기능만 구현되어 있구만... 흠... 하지만 이 프로그램 개발 할 당시 자동 매수를 딥러닝 LSTM 모델을 사용해 구현했었다. 다음날 상승이라고 예측을 하면 전날 3시에 자동 매수 하게 설정해 놓았는데.... 수익이 나지 않았다 ㅎㅎㅎㅎㅎ 그래서 그냥 손놓고 처박아 놓았던 프로그램... 뜨거운 여름 2개월정도 이 프로그램에 매달렸었던거 같다. LSTM 학습을 CPU로 시키고... 너무 오래 걸려서 딥러닝 전용 서버를 살까 고민도 많이 했던... 그때 안사길 잘했지...

이제 이 프로그램을 기본으로 해서 R.NET을 이용해 R engine을 연결해 퀀트 전략 결과를 연산하고 결과를 받아오는 것을 구현할 것이다. 

2015년 머신러닝을 R로 시작했다. R로 클러스터링도 하고, 랜덤포레스트도 돌리고, PCA도 하고 그걸 C# 에 접목시켜 분석 프로그램을 많이도 만들었었다. 알파고가 나오고 Tensorflow가 나오면서 머신러닝은 python으로 통일되는 분위기에 나도 python으로 코딩을 많이 했었었다.

그러다 'R을 이용한 퀀트 투자 포트폴리오 만들기' 책에서 R로 모든 코드가 되어 있다보니.... 처음엔 이 책을 읽으며 R로 되어 있는 코드를 Python으로 변경해서 구현하려고 했었는데... 파이썬용 페키지를 일일이 찾아야되고 설치가 잘 안되는 거도 있고 쉽지가 않았다. 그래서 그냥 R을 그대로 사용하게 되었다.

R.NET을 사용 안 한지 오래되서... 다시 기억을 더듬으며 C#에 R을 연결시켜보자.


1. Nuget에서 R.NET 설치 ( R은 미리 설치되어 있어야 함 )

비주얼스튜디오에서 개발하고 있는 솔루션을 연 다음에 [프로젝트]-[NuGet 패키지 관리]를 클릭한다.



[찾아보기]에서 R.net을 검색해 제일 처음에 나오는 R.NET v1.8.2를 선택해 보자. 게시 날짜가 2019년 5월 20일... 개발 지원을 계속 해오고 있었구나... 다행이다. 설치해보자.

설치가 안된다.

'R.NET 1.8.2' 패키지를 설치할 수 없습니다. '.NETFramework,Version=v4.5'을(를) 대상으로 하는 프로젝트에 이 패키지를 설치하려 하지만 이 패키지에는 해당 프레임워크와 호환되는 어셈블리 참조나 콘텐츠 파일이 없습니다. 자세한 내용은 패키지 작성자에게 문의하십시오.

내 프로젝트 설정에 가서 보니 v4.5로 설정 되어 있는데.... R.NET의 깃헙 페이지에 가보니 아래와 같이 안내되어 있다.

On Windows, R.NET requires .NET Framework > 4.6.1 or .NET Core 2.0,

오호라... 4.6.1보다 높게 설정하면 기존 자동매매 프로그램이 잘 돌아갈까? 4.6.2로 일단 바꿔보자.


다행히 변경 후 기존 프로그램이 잘 실행되고, 패키지 설치도 성공했다.



2. C#에서 R 코드 실행하기


자 간단한 것부터 해보자.


먼저 소스코드에 R.NET 패키지를 추가하자.


using RDotNet;


using RDotNet.NativeLibrary;

다음 Form 함수 바로 밑에 아래와 같이 선언한다.


REngine rEngine = REngine.GetInstance();


string Rstring = string.Empty;

그리고 나같은 경우에는 버튼을 하나 만들어서 R code를 실행시키고 그 결과를 textBox1에 표시하려고 한다. 


Rstring = @"a = 30";

rEngine.Evaluate(Rstring);
var a = rEngine.GetSymbol("a").AsNumeric();

textBox1.Text = a[0].ToString();

위와 같이 코드를 작성하고 실행시키면 textBox1에 '30' 이라고 결과가 나오게 된다. 
Rstring에는 R script를 적으면 되고, 
rEngine.Evaluate(Rstring)은 Rstring에 저장된 script를 실행한다.
rEngine.GetSymbol 함수를 통해 R에서 실행된 결과의 변수에서 값을 가져 올 수 있다.

이제 좀 더 복잡한 R script를 실행시켜 보겠다.

'R을 이용한 퀀트 투자 포트폴리오 만들기' 책에서 나오는 예제 퀄리티 지표결합 전략으로 상위 30종목을 선정해 그 종목의 주가를 크롤링하고, 고가매수저가매도 전략으로 오늘 현재 주가에서 매수해야 하는지 매도해야 하는지 연산 결과를 나타내는 script를 Rstring에 그대로 저장한다. 그리고 R 실행 후 변수를 읽어서 datagridview에 보여주는 코드는 아래와 같다.


아래는 datagridview에 표시된 결과이다.


됐다. 그렇게 어렵지 않게 구현되었다. 매수/매도 의견에서 0은 보류라는 뜻이고, 2는 실행하라는 뜻이다.

일단 R과 연결을 위주로 기능 구현에만 신경쓰다 보니 UI가 엉망이다. 퀀트 투자에 맞게 UI를 새로 디자인하고, 매도의견 '2'인 종목 중 내 계좌에 있는 것은 자동 매도 되게, 매수의견 '2'인 종목 중 내 계좌에 없는 것은 자동 매수 되게 코딩을 해야겠다. 그리고 한 종목당 최대 매수 금액도 정해야 하고... 최대 매수 종목 수도 제한하는 알고리즘을 넣어야 한다. 

자동매매 프로그램 만들기로 작정하고 하루 만에 진도를 많이 뺀것 같아 흡족한 하루였다.

이제 자동 매도를 구현할 시간. 자동 매수 보다 매도를 먼저 구현하는 것은 매도를 해서 돈을 마련해야 매수를 할 수 있기 때문..

이전 개발했던 UI가 매도 따로, 매수 따로 탭을 다르게 구현했었지만, 지금 개발 컨셉은 R 퀀트 알고리즘에서 매수/매도 에 대한 정보가 한번에 넘어 오기 때문에 한 탭 안에서 매수/매도가 다 이루어지게 개발할 예정이다.

변경 전 UI


변경 전 자동 매도 화면


변경 전 자동 매수 화면

이제 디자인을 수정해보자.




한 화면에 매수/매도 관련 정보들을 다 합쳤다. 자동매매설정 에서 START 버튼을 누르면 설정할 수 있는 주기 300초 마다 한번씩 퀀트 알고리즘을 실행시키고 매도 할 종목 매도 하고, 매수 할 종목 매수하게 만들거다. 단타를 치는 것이 아니니 느긋하게 업데이트 주기를 5분으로 잡았다.



다 완성됐다. 오전에 매도할 종목은 수동으로 다 매도해버렸기 때문에 오후 3시경 실행시 매도할 종목은 없었다. 매수는 매수 추천 4종목이 자동 매수에 성공했다. 주문가능금액과 총매입금액을 합한 금액을 매수 종목수 제한 수로 나눈 가격으로 각 종목을 매수했다. 이제 이렇게 내버려 두기만 하면 알아서 사고 팔고 할 것이다. 


마지막으로 퀀트 투자 시작한 이후 오늘까지 누적 수익은 6% 정도.. 가진 돈이 없어서 작게 시작했지만 앞으로 목돈이나 월급이 들어오면 일정 금액을 증권계좌에 계속 넣으려고 생각 중이다. 투자는 내가 만든 '방구석지니' 프로그램이 알아서 할테니...

댓글 1개:

  1. 안녕하세요! 우연히 R 퀀트 검색하다가 방문했습니다! 방구석지니 그동안의 성과는 어떤지 궁금하네요!

    답글삭제

가장 많이 본 글