강화학습을 이용한 주식 트레이딩 알고리즘 선배, 교수님, 친구들 모두가 컨퍼런스 주제로 주식만은 피하라고 말했다. 하지만 우리 팀은 청개구리다. 하지말라는 건 더 해보고 싶다. 실제 투자 회사에서 쓰이는 블랙박스 트레이딩 시스템은 정확히 어떻게 동작되는지는 모르지만 강화학습을 이용해 우리만의 수익이 나는 알고리즘을 만들어보았다.
4. ⅰ기존 주가 예측 방법
* 강화학습 사용하기 전, 사용했던 주가 예측 방법
Q. 기존에는 뉴스 데이터를 어떻게 활용했나?
Q. 왜 기존 방법을 사용하지 않기로 했나?
5. 데이터 크롤링
기존의 주가 예측 방법
데이터 전처리
- 다양한 변수 추
가
데이터 모델링 다음날의
주가 등락을 예측
6. 1) 데이터 수집 – 시가 총액 상위 300개 종목
01. 기존의 주가 예측 방법
1. 절차
네이버 금융
코스피 지수
1. 시가 총액 300위에 해당
하는 종목 리스트 크롤링
2. [날짜, 종가, 저가,고가,시
가, 거래량 ,종목 코드, 종
목 이름 etc.] 크롤링
1. 일자별 코스피 지수 크롤링
2. [일자, 체결가, 거래량, 거래 대금, 등락 etc.] 크롤
링
분석에 사용할 날짜
2010.08.06
~ 2018.09.12
7. ① 시계열 변수와 주가 관련 보조지표 계산
Þ Strength Index(RSI), MACD Oscillator, 스토캐스틱 오실레이터(Stochastic Oscillator)
Þ 이동평균(EMA, WMA, EVWMA, VWMA 등)
Þ Directional Movement Index(DMI), 볼린저 밴드(Bollinger Band) 등
Þ 다양한 보조지표들을 계산하여 데이터에 추가.
01. 기존의 주가 예측 방법
2) 데이터 전처리
1. 절차
8. • 보조지표 해석 방법 ( EX. Relative Strength Index(RSI) )
1. 과매수와 과매도를 알려주는 지표.
2. 생성되는 변수
RSI : 기간은 단기매매를 위해서는 보통 5일을 사용하고 중기매매는 보통 21일을 사용.
3. 일반적인 투자 방법
• 일반적 : 30과 70을 기준으로 봄.
• 70이상일 때는, 과매수 국면으로 보고 매수포지션을 취함.
• 30이하일 때는, 과매도 국면으로 보고 매도포지션을 잡는다.
RSI= 100 −
%&&
%'()
RS =
산출기간 동안 종가 상승분
산출기간 동안 종가 하락분
01. 기존의 주가 예측 방법
2) 데이터 전처리
1. 절차
이해
9. ② 거래 정지 이유 별 데이터 수정
- 액면 분할, 액면 병합, 차등 감자, 기업 분할, 기업 병합, 인적 분할 등
- 계산 방법
1) 액면 분할 및 병합 : 비율 만큼 계산
2) 기업 분할 및 병합, 인적 분할, 그 외 기업
=> 가격 0인 것만 제외하고 동일하게 진행
3) 제외 기업 : 전체 제외
③ Target : 다음 날의 주가 등락
- 일자 기준 다음날의 주가 등락 여부를 타겟 데이터로 생성.
• 액면 분할기업[10개] : 아모레퍼시픽,아모레G,삼성전자,삼성전자우,한온시스템,
한미사이언스,한미반도체, 녹십자홀딩스,대
웅,경동나비엔
• 액면병합 기업[3개] : 셀트리온,동원시스템즈,금호타이어
• 제외 기업 [16개] : 대한해운,대우조선해양,팬오션,현대상선,오리온홀딩스,
대한전선,HDC,NICE,[무림], SK디스커버리,효성,우리종금,
폴루스바이오팜,에이프로젠,KIC,제이준코스메틱, 쌍용양회
• 나머지 기업 [30개]
1:50
01. 기존의 주가 예측 방법
2) 데이터 전처리
1. 절차
가격변동
11. Þ DNN, SVM, Decision Tree, RandomForest 등 10개의 모델을 K-FOLD 적용
Þ 각 종목별로 평균 예측 정확도를 계산
Þ 기존의 주가 예측 방법을 사용한다면, 예측력 좋아야 60% 초반대..
Þ 이정도의 정확도에 투자를 맡기기에는 많이 부족하다고 생각 !!
01. 기존의 주가 예측 방법
3) 데이터 모델링
1. 절차
12. 2. 종목에 관한 뉴스 기사 데이터 추가 사용
01. 기존의 주가 예측 방법
* 종목에 관한 뉴스 기사들을 변수로 사용
* 다양한 형태소 분석기 사용하여 전처리
* 딥러닝 모델을 이용하여 등락 예측
13. 2. 종목에 관한 뉴스 기사 데이터 추가 사용
01. 기존의 주가 예측 방법
데이터 수집 및 정보 – ex) 아모레퍼시픽
- 네이트 뉴스 기사 크롤링
- 2013 1월 2일 ~ 2018 9월 11일
- 약 10만 개의 뉴스
- 제목, 내용, 날짜, 전일비(차트 데이터)
14. 2. 종목에 관한 뉴스 기사 데이터 추가 사용
01. 기존의 주가 예측 방법
형태소 분석 및 Word2Vec
- 기본적인 전처리 수행
- 조사, 숫자 제외
- Konlpy-okt(사전 기반)
- Soynlp(통계 기반)
- Khaiii(딥러닝 기반)
- Skip-gram Model 이용(Word2Vec)
15. 2. 종목에 관한 뉴스 기사 데이터 추가 사용
01. 기존의 주가 예측 방법
Result
* 형태소
- Okt, Soynlp, Khaiii
* Model
- TF-IDF, RNN, LSTM, GRU, CNN-RNN
형태소 분석기와 모델을 조합하여 등락 예측
-> 정확도 50% 전후
-> 사용할 수 없다!
50%
16. 3. 최종 결과
Q. 왜 기존 방법을 사용하지 않았나?
매일 크롤링을 해야한다는 비효율성
높지 않은 주가 등락 예측력
실시간성이 떨어진다
Q. 뉴스를 이렇게 활용하면 왜 안되나?
가장 큰 요인 : 등락 예측을 할 수 없다.
정확도가 낮고, Loss값이 떨어지지 않는다.
01. 기존의 주가 예측 방법
17. ⅱ 강화학습
* 예측이 핵심이 아닌,
상황에서의 최적의 행동을 수행
* 주식 종목별로 각각 강화학습 모델을 생성
* 안정적인 수익형 알고리즘이 목표
18. • HTS 이용
• 증권사 API 이용
데이터 수집
• 보조지표 계산
• 비율 계산
• 변수 추가
전처리
• 각 주식 종목별모
델링
강화학습
• 테스트 기간 수익
률 확인
백테스트
• 실제 투자 후 수익
률 확인
실전 트레이딩
Trading Process
뉴스 데이터
활용
폭락 방지
추가
옵션
19. 1) 데이터 수집
Þ 알고리즘 시스템을 만들기 위해서는 실시간으로 데이터를 주고 받아야하므로, 증권사 API를
이용.
Þ Ebest 증권사의 Xing API를 이용.
Þ API를 이용하기 위해서 Ebest의 비대면 계좌를 개설.
02. 강화학습
* 한 종목에 대한 일별 주가 데이터 * eBst의 HTS와 xing API
20. 2) 전처리 – 가격&거래량 수정, 변수 추가
02. 강화학습
* 거래 정지 이유 별 데이터 수정
- 액면 분할, 액면 병합, 차등 감자, 기업 분할, 기업 병합,
인적 분할 등
- 계산 방법
1) 액면 분할 및 병합 : 비율 만큼 계산
2) 기업 분할 및 병합, 인적 분할, 그 외 기업
=> 가격 0인 것만 제외하고 동일하게 진행
3) 제외 기업 : 전체 제외
* 각 종목별 변수 추가
- 종목별로 추가할 변수들을 다르게 정함.
- Ex)
메리츠화재: 코스피 지수 & BollingerBands 등의 변수 추가
KCC : ADX, DMI, BOX지표 등의 변수 추가
21. 3. 강화학습(Reinforcement learning)
* 강화학습이란?
Þ 강화학습은 머신러닝 기법 중 한 가지로서, 어떠한 환경에서 어떠한 행동을 했을 때 그것이 잘된 행동인지 잘못된
행동인지를 판단하고 보상(또는 벌칙)을 줌으로써 스스로 시행착오를 해 가며 학습하게 하는 분야이다.
행동(action)
에이전트
(agent)
환경
(environment)
보상(reward)
1. 에이전트가 행동을 결정
2. 환경은 보상을 제공
3. 환경과 에이전트의 상태 등을 입력값으로 넣으면,
신경망이 행동을 결정하고 보상이 있으면 이전의
입력값과 행동들을 긍정적으로 학습.
02. 강화학습
22. * 주식 모델링 강화학습 구조
행동(action) –> 매수, 매도, 관망
에이전트
[투자자]
환경
[데이터]
보상 -> 손익
1. 에이전트는 행동을 수행하는 주체인 투자자 역할을 함.
2. 행동은 매수(Buy), 매도(Sell), 관망(Hold) 으로 설정.
3. 행동은 정책 신경망으로 결정하고, 정책 신경망은 투자를
진행하면서 발생하는 보상과 학습 데이터로 학습함.
4. 환경은 차트 데이터, 즉 앞에서 만든 데이터.
5. 차트 데이터로 투자 손익을 계산.
6. 학습데이터는 인공 신경망을 학습할 목적으로 가공한
데이터임.
학습 데이터
1
주식 무작위 매입, 매도
2
성공(이익) -> 긍정적 보상
실패(손해) -> 부정적 보상
3
정책 신경망으로
매수,매도,관망 타이밍을
스스로 결정
* 간단 요약 *
02. 강화학습
23. * 거래 수수료와 거래세 - 일반적
거래 수수료와 거래세를 비용으로 고려 한다면.
• 매수 수수료 : 0.015%
-> 매수 거래 금액이 100만원일 경우 수수료는 150원
• 매도 수수료 : 0.015%
-> 매도 거래 금액이 100만원일 경우 수수료는 150원
• 거래세 : 0.3%
-> 매도 거래 금액이 100만원일 경우 거래세는 3,000원
02. 강화학습
24. * 용어 요약
- PV(Portfolio value) : 주식 잔고 x 현재 주가 + 현금 잔고 => 내 자산이라고 이해 ok
è PV가 초기 자본금보다 높으면 수익 발생, 낮으면 손실 발생. 투자의 목표는 PV를 높이는 것
- Exploration(탐험) : 무작위로 행동을 결정 : 한 에포크에서 경험을 얻기 위해서 무작위로 행동해야 함.
- Epsilon(탐험률) : Epsilon은 무작위로 행동을 결정하는 비율을 뜻함.
è 1000 epoch 진행한다면, 에포크 1에서는 엡실론을 50%로 시작하고, 점점 엡실론이 줄어서
1000번째 에포크에서는 0%가 되게 하면 에포크가 커질수록 무작위로 하는 행동이 줄어들게 됨.
- 보상규칙 : 강화학습을 진행하면서 학습 수행 여부를 결정할 기준임.
è 손익률 3%로 설정 : 이익률 3%에 달성하면 이전에 행했던 투자 행동들을 ‘긍정적이었다'라고 학습.
- Discount rate(할인율) : 먼 과거의 결정일수록 가치를 깎아 내림.
02. 강화학습
25. * 지연 보상 판단
- 지연 보상은 포트폴리오 가치의 등락률(profitloss)과 지연 보상 임계치를 수익으로 초과하는 경우 1, 손실로 초과하는 경우 -1,
그 외의 경우엔 0을 반환. 지연 보상이 0이 아닌 경우 학습을 수행.
- 즉, 지연 보상 임계치를 초과하는 수익이 났으면 이전에 했던 행동들이 잘했다고 보고 긍정적으로(positive) 학습.
- 지연 보상 임계치를 초과하는 손실이 났으면 이전 행동들에 문제가 있다고 보고 부정적으로(negative) 학습.
- 지연 보상 임계치를 높게 설정하면, 수익과 손실이 많이 나야 이익과 손실이라고 판단.
02. 강화학습
26. * 신경망
- 정책 신경망 클래스에서 사용하는 LSTM 신경망 구조
- 총 5개의 hidden layer으로 구성.
- 입력층은 학습 데이터 차원과 에이전트 상태(주식 보유 비율과 포트폴리오 가치 비율) 차원인 2차원을 합한 것.
- 출력층은 투자 행동인 매수(Buy), 매도(Sell), 관망(Hold) 3차원으로 구성.
- 정책 신경망의 출력은 매수, 매도, 관망했을 때의 포트폴리오 가치를 높일 확률을 의미.
02. 강화학습
27. * 신경망
- 강화학습 기법으로 정책 경사(Policy Gradient)를 사용.
è 이유 : 정책 경사는 어떤 행동이 현재 상태에서 가장 좋을지를 확률적으로 판단함.
Q 러닝과는 다르게 기대 손익을 예측하는 것이 아니라
단순히 현 상황에서 어떤 행동이 더 좋은지를 판단함.
- 기본 학습 알고리즘은 확률적 경사 하강법(SGD)을, 기본 학습 속도(Learning rate, LR)는 0.01, 0.001 등 종목별로 다르게
설정함.
- 세 개의 LSTM 층을 256차원으로 구성했으며 드롭아웃을 50%로 정하여 과적합을 피함.
- 각 종목에 대해 학습된 모델은 HDF5 파일로 저장.
02. 강화학습
28. * 학습 결과
1. 아모레퍼시픽 - 학습 기간 : 2016.01.01~2018.08.31
[Epoch 001/100]
Epsilon:0.5000 #Expl.:322/654 #Buy:146 #Sell:160 #Hold:348
#Stocks:102 PV:6,856,271 POS:12 NEG:11 Loss: 0.190002
[Epoch 100/100]
Epsilon:0.0000 #Expl.:0/654 #Buy:130 #Sell:112 #Hold:412
#Stocks:79 PV:14,732,704 Max PV: 16,915,424,
02. 강화학습
* PV : 내 자산
29. * 학습 결과
1. 동원산업 – 학습 기간 : 2017.01.01 ~ 2018.08.31
[Epoch 001/100]
Epsilon:0.5000 #Expl.:192/408 #Buy:91 #Sell:101 #Hold:216
#Stocks:32 PV:9,073,500 POS:15 NEG:9 Loss: 0.196476
[Epoch 100/100]
Epsilon:0.0000 #Expl.:0/408 #Buy: 19 #Sell: 10 #Hold: 379
#Stocks:79 PV:11,914,000 Max PV: 12,756,000
02. 강화학습
* PV : 내 자산
31. * 백테스트
04. 강화학습 모델링
1. 아모레퍼시픽 : 백테스트 기간 :2018.09.01~2019.01.15
테스트 기간에 정책 신경망 적용
[Epoch 1/1] Epsilon:0.0000 #Expl.:0/174
#Buy:89 #Sell:79 #Hold:6
#Stocks:20 # Win: 1
PV:11,086,000
6개월에 10.86% 수익이 나는
아모레퍼시픽 강화학습모델
32. * 백테스트
04. 강화학습 모델링
2. 동원산업 : 백테스트 기간 : 2018.09.01~2019.01.15
테스트 기간에 정책 신경망 적용
[Epoch 1/1] Epsilon:0.0000 #Expl.:0/89
#Buy:12 #Sell:5 #Hold:72
#Stocks:48 # Win: 1
PV:10,608,000
6개월에 6% 수익이 나는
동원산업 강화학습모델
33. * 추가
실전 트레이딩에 활용할
폭락 방지 알고리즘
* 본 알고리즘은 실험용으로 만들었습니다.
현재 테스트 중입니다.
* 20분마다 정해놓은 종목에 대해 알고리즘을 실행.
34. 1. 다음날 주가 등락 여부에 따른 긍부정 강도 생성
- khaiii, kkma, soynlp, okt 총 4개의 형태소로 뉴스 파싱.
- 주가 등락이 심했을 때, 그 등락 이전에 나온 뉴스들을 직접 모음.
- 각 뉴스마다 긍정/부정 뉴스로 분류하는 작업을 거침.
- 단어마다 긍정/부정 뉴스 등장 빈도수 count.
Diff =
긍정 뉴스 등장 수 – 부정 뉴스 등장 수
총 뉴스 등장 수
35. Strength1 = Diff의 합
Strength2 = Diff의 합 / 뉴스 총 단어 수
Pos_count1 = Diff > 0 단어 수
Pos_count2 = Diff > 0.2 단어 수
Pos_count3 = Diff > 0.2 이고, 빈도수가 100 이상인 단어 수
Neg_count1 = Diff < 0 단어 수
Neg_count2 = Diff < -0.2 단어 수
Neg_count3 = Diff < -0.2 이고, 빈도수가 100 이상인 단어 수
1. 다음날 주가 등락 여부에 따른 긍부정 강도 생성
37. 2. 시간대별 뉴스 처리
- 일별이 아닌 20분 별로 종목마다 알고리즘을 실행
- 시간대별 종목에 대한 긍부정 점수를 계산하여 부정 점수가 높아지는 시점을 포착.
- 부정 점수와 MACD 보조지표의 매도신호를 확인
=> 두 변수에서 위험이 함께 포착되면 시간과 상관없이 갖고 있는 종목을 매도.
- 테스트 용으로 아모레퍼시픽, 본느 두 개의 종목만 실행
=> 실제로 폭락이 잘 발생하는 두 종목을 가지고 테스트
38. ⅳ 실전 트레이딩
* 실전 트레이딩에서는 epoch를 1000으로 설정.
* 트레이딩 전략 사용
39. * 트레이딩 전략
04. 실전 트레이딩
* 매수, 매입은 하루에 한번(장후 시간외 종가)한다.
* 트레이딩은 중.장기 기준으로 한다. 단기는 부적절하다.
* 폭락 예상이 탐지된다면, 시간과 상관없이 매도한다.
* RSI 보조지표를 활용하여, 과매수와 과매도를 실시한다.
44. * 둘째 날
04. 실전 트레이딩
* 2019-10-17일 투자 현황
[2일차]
총 매입 금액 : 29,899,065
보유 주식 개수 : 10개(본느 OUT)
평가손익 191,470원 / 수익률 : 0.64
사실 강화학습 결과로서는, 팔아야 했지만, 폭락 방지 알고리즘을 테스트해보기 위해 팔지 않았다.
46. * 셋째 날
04. 실전 트레이딩
* 2019-10-18일 투자 현황
[3일차]
총 매입 금액 : 29,899,065
보유 주식 개수 : 10개
평가손익 324,760원 / 수익률 : 1.08
사실 강화학습 결과로서는, 팔아야 했지만, 폭락 방지 알고리즘을 테스트해보기 위해 팔지 않았다.
48. * 결론
04. 강화학습 모델링
1. 등락 예측이 목표인 기존 주식 방법은 사용하지 마라.
2. 주식 트레이딩에는 강화학습을 추천한다.
3. 학습기간이 길다고 무조건 좋은것이 아니다.
4. 백테스트의 수익률은 절대로 반복되지 않는다.
5. 투자를 할때, 강화학습의 결과를 참고로 사용하면 좋다.
* 한계점
1. 폭락 방지 알고리즘을 제대로 만들어야 한다.
-> 안정적인 수익이 우선이기 때문!
-> 폭락이 빠르게 감지가 안되는 점 보완.
-> 예시) 아모레퍼시픽 폭락임에도 신호 X