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

2019년 12월 16일 월요일

[퀀트자동매매] 개발 3. C# 에서 R 을 사용하자. R.NET 으로 퀀트 알고리즘 돌리기.

2015년 머신러닝을 R로 시작했다. R로 클러스터링도 하고, 랜덤포레스트도 돌리고, PCA도 하고 그걸 C# 에 접목시켜 분석 프로그램을 많이도 만들었었다. 알파고가 나오고 Tesorflow가 나오면서 머신러닝은 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'인 종목 중 내 계좌에 없는 것은 자동 매수 되게 코딩을 해야겠다. 그리고 한 종목당 최대 매수 금액도 정해야 하고... 최대 매수 종목 수도 제한하는 알고리즘을 넣어야 한다. 

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

*방구석지니와 자동매매가 궁금하신 분은 아래 강좌를 수강하시면 무료로 방구석지니를 제공해 드립니다.

https://cafe.naver.com/conerquant/336

댓글 없음:

댓글 쓰기

가장 많이 본 글