당신은 주제를 찾고 있습니까 “주식 예측 – 삼성전자 주식, 이더리움 시세 인공지능으로 예측해보자 – Python, Deep Learning“? 다음 카테고리의 웹사이트 https://you.maxfit.vn 에서 귀하의 모든 질문에 답변해 드립니다: https://you.maxfit.vn/blog/. 바로 아래에서 답을 찾을 수 있습니다. 작성자 빵형의 개발도상국 이(가) 작성한 기사에는 조회수 83,362회 및 좋아요 1,504개 개의 좋아요가 있습니다.
주식 예측 주제에 대한 동영상 보기
여기에서 이 주제에 대한 비디오를 시청하십시오. 주의 깊게 살펴보고 읽고 있는 내용에 대한 피드백을 제공하세요!
d여기에서 삼성전자 주식, 이더리움 시세 인공지능으로 예측해보자 – Python, Deep Learning – 주식 예측 주제에 대한 세부정보를 참조하세요
* 빵형처럼 되고 싶은 사람들을 위한 가장 쉽게 배우는 머신러닝 강의: http://bit.ly/mlbasic10
딥러닝(LSTM)을 사용하여 주식 가격과 암호화폐의 시세를 예측하는 인공지능을 만들거예요.
Source code(Github): https://github.com/kairess/stock_crypto_price_prediction
Dependencies:
– Python
– numpy
– Keras
– pandas
– matplotlib
Dataset
– Yahoo Finance: https://finance.yahoo.com
– CoinMarketCap: https://coinmarketcap.com
사업 및 개발문의: [email protected]
빵형의 개발도상국 후원: https://toon.at/donate/helloworld
주식 예측 주제에 대한 자세한 내용은 여기를 참조하세요.
(칼럼) 딥러닝 초보들이 흔히하는 실수 : 주식가격 예측 AI
딥러닝 입문자들이 LSTM 배우면 꼭 도전해보는 분야가 바로 주식가격 예측입니다. LSTM은 연속된 sequence 데이터를 다룰 때 좋은 레이어라고 하지 않았습니까. 그래서 …
Source: codingapple.com
Date Published: 2/23/2021
View: 9694
주식 종료 가격 예측 경진대회 – DACON
주식 종료 가격 예측 경진대회에 오신 것을 환영합니다. 코로나19 대유행으로 변동성이 높아져 주식 투자에 관심이 쏠리고 있습니다. 주식시장이 급락했던 3월 주식 …
Source: dacon.io
Date Published: 1/6/2022
View: 9922
Keras를 활용한 주식 가격 예측 – GitHub
이 문서를 통해 Keras를 활용하여 간단하고 빠르게 주식 가격을 예측하는 딥러닝 모델을 구현할 수 있습니다. 주식 예측. LSTM. Q-learning. 강화학습.
Source: github.com
Date Published: 6/16/2022
View: 9464
빅데이터를 활용한 인공지능 주식 예측 분석 – Korea Science
이를 위해, 본 연구에서는 주식예측 인공지능 프로그램으로 인공신경. 망(ANN), 심층 학습 또는 딥 러닝(DNN), k-최근접 이웃 알고리즘(k-NN), 합성곱 신경망(CNN), …
Source: www.koreascience.or.kr
Date Published: 9/27/2021
View: 9512
딥러닝을 이용한 주가 예측 – 인사이트캠퍼스
오늘 학습 할 알고리즘에 실제로 돈을 넣진 말자! 알고리즘 트레이딩은 주식 시장과 그 주변 산업에 혁명을 일으켰다. 현재 미국에서 일어나고 있는 모든 …
Source: insightcampus.co.kr
Date Published: 12/22/2021
View: 7406
빅데이터를 활용한 인공지능 주식 예측 분석 – 한국학술지인용색인
이를 위해, 본 연구에서는 주식예측 인공지능 프로그램으로 인공신경망(ANN), 심층 학습 또는 딥 러닝(DNN), k-최근접 이웃 알고리즘(k-NN), 합성곱 신경망(CNN), 순환 …
Source: www.kci.go.kr
Date Published: 2/13/2022
View: 3142
LSTM을 활용한 삼성전자 주가예측.ipynb
지난 주식 예측 튜토리얼에서는 삼성전자 주가데이터로 실습을 해봤으니,. 이번에는 글로벌 증시의 대장주인 Apple사의 주가데이터를 가져와서 예측해 보도록 …
Source: colab.research.google.com
Date Published: 4/13/2022
View: 4482
[논문]주식시세 예측을 위한 딥러닝 최적화 방법 연구 – ScienceON
본 연구에서는 딥러닝을 이용한 주가 예측 정확도를 높이기 위한 방법을 제시한다. 해당 주가 예측 플랫폼은 증권사 시스템 연계를 통한 주식시세 수집 및 예측 모델의 …
Source: scienceon.kisti.re.kr
Date Published: 9/15/2021
View: 9680
서울대 강유 교수, 주가 예측 AI로 탑컨퍼런스 발표…국내 최초 성과
인공지능(AI) 주가 예측은 AI 개발자는 물론 대중들도 크게 주목하는 주제다. 주식 투자 열풍이 사그라들지 않는 상황에서 AI 주가 예측이 가능해 …
Source: www.aitimes.com
Date Published: 9/5/2022
View: 8274
23. 주식시장은 예측 가능한가? – 브런치
주식투자자에게 영원한 화두가 있다면 “주식시장의 흐름은 예측 가능한가?”라는 것이다. 주식시장에 참여하는 모든 투자자들은 – 포트폴리오 매니저, …
Source: brunch.co.kr
Date Published: 6/21/2021
View: 8268
주제와 관련된 이미지 주식 예측
주제와 관련된 더 많은 사진을 참조하십시오 삼성전자 주식, 이더리움 시세 인공지능으로 예측해보자 – Python, Deep Learning. 댓글에서 더 많은 관련 이미지를 보거나 필요한 경우 더 많은 관련 기사를 볼 수 있습니다.
![삼성전자 주식, 이더리움 시세 인공지능으로 예측해보자 - Python, Deep Learning](https://i.ytimg.com/vi/sG_WeGbZ9A4/maxresdefault.jpg)
주제에 대한 기사 평가 주식 예측
- Author: 빵형의 개발도상국
- Views: 조회수 83,362회
- Likes: 좋아요 1,504개
- Date Published: 2018. 10. 31.
- Video Url link: https://www.youtube.com/watch?v=sG_WeGbZ9A4
(칼럼) 딥러닝 초보들이 흔히하는 실수 : 주식가격 예측 AI
(강의 전체 목록)
딥러닝 입문자들이 LSTM 배우면 꼭 도전해보는 분야가 바로 주식가격 예측입니다.
LSTM은 연속된 sequence 데이터를 다룰 때 좋은 레이어라고 하지 않았습니까.
그래서 주식가격 흐름도 일종의 sequence 데이터 같으니 거기다가 집어넣어보는 겁니다.
1일~20일의 주식가격 20개를 모아서 하나의 시퀀스로 만들어서 X데이터로 만들고
21일 주식가격을 Y데이터로 만들면 딥러닝으로 학습이 가능합니다.
(작곡 AI 만들 때랑 데이터셋 만드는 방법이 비슷합니다)
그래서인지 구글에 검색해보시면 주식가격 예측하는 딥러닝 AI 만드는 칼럼들이 수백개 나옵니다.
논문도 매우 많습니다.
아마존에서 AI/ML Solutions Architect 로 일하는 사람이 쓴 칼럼을 구경해봅시다.
https://towardsdatascience.com/aifortrading-2edd6fac689d
▲ 이 사람이 만든 주식가격 예측모델입니다.
얼핏보면 최신 딥러닝 기법들을 막 적용하고 그에 따라서 결과도 뛰어날 것 같지만
(솔직히 좀 많이 쓸데없고 과다한 것 같지만)
그냥 스크롤 쭉 내려서 예측 결과 그래프를 구경해보면
▲ 주황색이 예측가격, 파란색이 실제입니다.
“와우 정확도 지리네 부자될듯”
이라고 생각할 수 있겠으나 그러면 딥러닝 배운 사람들은 전부 부자가 되었어야합니다.
저렇게 정확한 그래프를 보면 의심부터 하셔야합니다.
그래프를 확대해보면 딥러닝 초보가 하는 전형적인 실수를 발견할 수 있습니다.
일단 학습하지 않은 새로운 test 데이터셋으로 검증안하고 올리는 것도 첫째 실수지만 더 중요한 설계상 실수가 있습니다.
흔한 실수
저런 뭔가 이상할 정도로 예측가격이 비슷한 그래프들은
살짝 확대해보면 진실을 알 수 있습니다.
▲ 다른 사람이 비슷하게 주식가격을 예측한 그래프를 가져왔는데
빨간색은 실제 가격, 파란색은 예측가격입니다.
파란색이 빨간색을 1일만큼 옆으로 이동한거랑 똑같죠?
그니까 컴퓨터에게 “28일의 주식가격 어떻게 될거같냐고” 물어보시면 “27일의 주식가격이랑 같습니다” 라고 답변한다는겁니다.
왜 이런 현상이 나온걸까요.
당연히 딥러닝돌릴 때 loss값을 최소화 하라고 시키죠?
loss값은 (예측값 – 실제값) 어쩌구를 사용하고요.
loss가 가장 적은 예측모델은
“내일 주식가격은 오늘 주식가격과 똑같을 것이다”
입니다. 컴퓨터가 딥러닝학습을 통해 이렇게 결론짓는 것입니다.
뭔가 잘못되거나 그런건 전혀 없습니다. 컴퓨터는 가장 loss가 적게나오는 효율적인 예측모델을 만들었을 뿐입니다.
근데 이런 모델은 실제 쓸모가 없을 뿐이고요.
▲ 그래서 위에 소개해드렸던 링크에서 진행한 딥러닝 과정은
여러가지 간지나는 분석기법을 사용했지만 결국은 실용성이 0인 모델을 만들었을 뿐입니다.
이상한 문제풀이 강의나 들으면서 딥러닝 테크닉만 주구장창 외우고 원리이해를 등한시하면 가끔 그렇습니다.
몇가지 해결책
1. 주식가격을 sequence 데이터로 LSTM에 집어넣는게 맞는지 고민해봅시다.
Q. 문장의 다음 단어를 예측하는 모델은 어떻게 만들죠?
▲ 당연히 앞의 단어들을 쭉 sequence데이터로 만들어서 LSTM에 집어넣으면 됩니다.
LSTM은 ‘자료간의 순서와 연관성이 있을것이다’ 라는 가정을 하고 사용하는 뉴럴네트워크 레이어니까요.
그러니 영어문장같은 경우 앞의 단어들을 분석하면 뒤에올 단어도 쉽게 추론할 수 있을 것입니다.
▲ 그럼 주식 가격은 어떨까요.
그니까 1~10일 주식가격이랑 11일 주식가격이랑 연관성이 있습니까?
아주 조금은 있을 것 같지만
제 생각엔 가격말고 다른 요소들이 더 영향을 끼칠 것 같습니다.
그래서 주식가격만으로 다음날 가격을 예측하는 것은 한계가 명확하다는 겁니다.
그래서 LSTM 레이어 도입이 도움이 될지 다시한번 판단해보시길 바랍니다.
또한
– 주식가격은 랜덤성이 짙어서 예측할 수 없는 random walk 이다.
– 이미 모든 주식관련 정보가 주식가격에 선반영이 되어있다.
라는 가설도 한번 고려해보시면 되겠습니다. 머신러닝 불신자들이 이런 말을 자주합니다.
2. 가격이 아니라 다른 결과를 예측하는 모델은 어떨까요.
금융 분야에선 모델의 성능을 수익률, return이 얼마나 나왔는지로 증명해야 합니다.
컴퓨터에게 가격이 아니라 Return이나 buy/sell 할지 여부를 예측하라고 시키면 어떻게될까요.
예를 들면 20일간의 가격추이를 집어넣고 다음날의 가격이 아니라 다음날 주식을 buy하는게 맞는지 sell하는게 맞는지 이것만 예측해보는겁니다.
그렇다면 컴퓨터가 위의 잘못된 예처럼 일종의 ‘컨닝’ 또는 overfitting 하는걸 막을 수 있겠죠.
이 경우 X 데이터는 20일간의 주식가격 sequence,
Y 데이터는 (21일 주식가격 – 20일 주식가격)해서 이게 +인지 -인지 구분해서 1과 0으로 라벨링하면 될 것 같습니다.
3. 가격말고 다른 것도 집어넣는건 어떨까요.
실제로 주식가격을 결정하는 요소는 전날 가격보다는 외부정보들이 더 중요하다고 생각합니다.
– 전날 거래량
– SNS 언급량
– 전날 나스닥지수 증감량
– 관련 업종 주가추이
등 여러가지 요소가 있을 수 있습니다.
특히 한국 주가는 전날 미국 나스닥 지수와 많은 관련이 있지않습니까. 전날 나스닥이 급락하면 한국장도 매번 시퍼렇던데
이런 외부 데이터들도 함께 집어넣어보십시오.
아니면 그냥 주식가격은 아예 배제하고 저런 것만 집어넣어보십시오.
저렇게 많고 다양한 인풋데이터를 어떻게 집어넣냐고요?
복잡한 레이어를 구성하고 싶으면 앞선 강의에서 설명드린 Functional API를 쓰거나
집어넣을 csv 데이터가 너무 종류가 다양하면 앞으로 배울 feature column을 이용하시면
인풋이 몇개든 몇종류든 쉽게 집어넣을 수 있습니다.
4. stationary 된 데이터를 사용하자
주식가격 데이터는 흔히말하는 시계열 (time-series) 데이터입니다.
(시계열 데이터는 그냥 시간에 따라 기록된 데이터를 의미합니다)
시계열 데이터를 통계적으로 분석하거나 예측모델을 만들고 싶을 땐 이 데이터가 stationary 데이터인지 확인해야합니다.
그게 아니면 너무 무작위의 값들이라 예측모델을 애초에 만들 수가 없다고 통계학에선 판단하기도 합니다.
stationary 데이터가 뭐냐면
평균, 분산, 공분산이 비교적 일정한 데이터를 말합니다.
분명 고등학교 때 통계를 배웠을 테지만
강의들을 중학교 레벨로 설명중이니 어려운 고딩통계용어보다는 그림으로 보도록 합시다.
초록색이 stationary, 빨간색이 non-stationary 입니다.
대부분의 주식가격 그래프도 non-stationary 특징을 가집니다.
▲ 이런 non-stationary 그래프들은 예측 모델을 만들기가 힘듭니다. (그리고 테슬라 주식 화성갈듯)
그래서 우리 주식가격을 대충 stationary로 변환해서 패턴을 조금 더 찾기 쉽게 만들 수 있는데
예를 들면 이렇습니다.
주식가격 데이터를 이렇게 변환하는겁니다.
일별 주식가격이 아니라 일별 주식가격 변화량으로 바꾸는겁니다.
만드는 법은 그냥 (오늘가격 – 전날 가격) 이거 하면 됩니다.
아니면 데이터 수집을 할 때 “3% 상승” 이런 변동폭을 직접 수집하셔도 되고요. 야후에선 그런것도 제공하던거 같은데
그러면 아까 봤던 그래프처럼 약간 stationary 느낌이나죠?
그럼 딥러닝 머신러닝을 이용해 주가의 패턴을 찾는데 약간 더 도움을 줄 수 있습니다.
실은 주식가격보다는 시즌 별로 가격 추이가 변화하는 농산물가격 이런거 예측할 때 더 쓸모가 있긴합니다.
내가 사용하는 시계열 데이터가 stationary인지 아닌지 검증하는 법도 있긴 있는데
Dickey-Fuller 검증이라는 간단한 것도 있습니다. 통계 변태라면 한번 살펴보시면 되겠습니다.
(평균값만 검증하기 때문에 참고만 합시다.)
(강의 전체 목록)
주식 종료 가격 예측 경진대회
1. 배경
안녕하세요 여러분! 🙌 주식 종료 가격 예측 경진대회에 오신 것을 환영합니다.
코로나19 대유행으로 변동성이 높아져 주식 투자에 관심이 쏠리고 있습니다.
주식시장이 급락했던 3월 주식거래 활동계좌는 3천만 계좌를 돌파했고,
올해 6월까지(6/24 기준) 약 275만 개의 활동계좌가 늘어나 2009년 이후 신규 투자자가 가장 많이 유입되었습니다.
또한 국내 상위 검색포털의 주식시장 관련 검색이 급격하게 늘어나는 등 사람들 사이에서 주식투자가 유행하고 있는 것으로 보입니다.
“코로나19 위기와 최근 주식투자 수요 증가에 대한 소고” 자본시장연구원 자료
국립중앙도서관에서 발표한 3년간 금융 관련 도서 대출 현황에 의하면 2018년 상위 50위 도서 중 6권이 주식 관련 도서였습니다.
COVID-19 이후에는 14권으로, 2배 이상 증가했습니다.
(국립중앙도서관, “공공도서관 금융 관련 도서 대출 현황 결과 발표”, 2021-04-23)
또한 최근 암호화폐 시장에서 다시 국내 주식 시장으로 모이는 분위기라고 합니다.
(강창욱, “코인에서 주식시장으로 투자자 돈 다시 몰린다”, 국민일보, 2021-06-07)
이런 상황 속에서, 주식의 종료 가격을 정확하게 예측할 수 있다면 어떨까요?
지금까지 실행된 다양한 시계열 대회를 참고해 자신만의 모델을 만들어 보세요!
2. 목적
KOSPI-200과 KOSDAQ-150의 주어진 기간 중 마지막으로 거래된 가격(종가) 예측
3. 주최 / 주관
주최: 국토교통부, 전라북도, 전북창조경제혁신센터
주관: 데이콘
4. 참가 대상
KEKOxTutorial/22_Keras를 활용한 주식 가격 예측.md at master · KerasKorea/KEKOxTutorial
Keras를 활용한 주식 가격 예측
이 문서는 Keras 기반의 딥러닝 모델(LSTM, Q-Learning)을 활용해 주식 가격을 예측하는 튜토리얼입니다. 유명 딥러닝 유투버인 Siraj Raval의 영상을 요약하여 문서로 제작하였습니다. 이 문서를 통해 Keras를 활용하여 간단하고 빠르게 주식 가격을 예측하는 딥러닝 모델을 구현할 수 있습니다.
주식 예측
LSTM
Q-learning
강화학습
모두 부자가 되고 싶지 않으세요? 부자가 되기 위해서는 일해서 얻는 근로 소득 외에도 일하지 않고 얻는 불로 소득(e.g. 투자 이윤)을 확보하는 것이 중요한데요. 프로그래밍을 할 수 있다면 자동화된 트레이딩 봇을 통해 불로 소득을 창출할 수 있습니다! 그것도 꽤 간단하게 몇 가지 단계만 거치면 자동화된 트레이딩 봇을 만들 수 있죠. 이 튜토리얼에서는 주식 가격을 예측하거나, 최적화된 거래 시기를 찾아주는 트레이딩 봇을 만드는 방법에 대해 알려드리고자 합니다.
이 튜토리얼은 같은 주제의 여러 영상을 통합하여 정리한 내용을 담고 있습니다. 튜토리얼에서 쓰인 코드와 주된 설명은 유명 유투버 Siraj Raval를 비롯한 개발자들에 의해 제작되었음을 밝힙니다. 원만한 이해를 돕기 위해 역자가 영상의 내용 및 코드를 적절히 편집하여 다시 작성했습니다. 역자의 개인적인 의견도 다수 포함되어 있습니다.
이 튜토리얼을 제작하는 데 참고한 원본 영상과 Github Repository는 이 문서의 하단에 정리되어 있습니다.
LSTM을 활용한 S&P 종가 예측
원본 코드와 데이터는 여기에서 확인할 수 있습니다.
유의: 이 코드는 python 2를 기반으로 작성되었습니다. 만약 python 3에서 실행하고 싶으시다면 lstm.py 코드 내의 print 와 xrange 함수만 적절히 수정해주시면 가능합니다.
사용할 데이터
우리는 S&P 500 지수 데이터를 사용하려고 합니다. S&P 500이란 국제 신용평가기관인 미국의 스탠다드 푸어스(Standard & Poors, 약칭 S&P)가 작성한 주가 지수로, 500개 대형기업(대부분이 미국 기업)의 주식을 포함한 지수입니다. 우리가 사용할 데이터는 sp500.csv 파일에 들어있으며, S&P 500의 2000년 1월부터 2016년 8월까지의 종가(장 마감 시점의 가격)로 구성되어 있습니다.
데이터 불러오기 및 전처리
from keras . layers . core import Dense , Activation , Dropout from keras . layers . recurrent import LSTM from keras . models import Sequential import lstm , time #도움을 주는 라이브러리들
lstm.py 에는 데이터를 불러오는 load_data 나 전처리를 해주는 normalise_windows 과 같은 유용한 함수들이 미리 작성되어 있습니다. 이런 함수들을 활용해 빠르고 간단하게 모델 생성과 전처리를 진행해봅니다.
#1단계: 데이터 불러오기 X_train , y_train , X_test , y_test = lstm . load_data ( ‘sp500.csv’ , 50 , True ) #데이터 확인 print ( X_train )
=> [[[0.][0.00751348][0.00370998]…,[0.02149596][0.01727155][0.02352239]]]]…
데이터를 불러온 후 출력해보면, 0부터 1사이의 값으로 이루어져 있다는 것을 알 수 있습니다.
이는 load_data 내의 normalise_windows 함수에서 먼저 정규화(normalization) 를 해주기 때문인데요. 신경망이 빠르고 수월하게 학습하려면 데이터들을 -1과 1 사이의 값으로 작게 만들어야 합니다. 그래서 우리가 다루려는 S&P 500 데이터의 경우 첫 데이터인 2000년 1월 첫 거래일의 종가를 기준으로 각 종가가 얼마나 증가했는지 그 비율을 구해줍니다. 이런 방법을 통해 주가 데이터의 정규화 를 할 수 있습니다. 코드와 수식으로 표현하자면 다음과 같습니다.
def normalise_windows ( window_data ): normalised_data = [] for window in window_data : normalised_window = [(( float ( p ) / float ( window [ 0 ])) – 1 ) for p in window ] normalised_data . append ( normalised_window ) return normalised_data
이 때 p_i는 변환하고자 하는 종가, p_0는 첫 거래일의 종가를 뜻합니다. 학습 후 예측한 값을 다시 비율이 아닌 원래 값으로 되돌리고 싶다면(denormalization), 다음과 같은 수식을 활용하면 됩니다.
모델 생성과 학습
다음은 모델을 생성해볼 차례입니다. 우리는 LSTM(Long Short Term Memory) 모델을 사용하려고 합니다. LSTM 을 사용하려는 이유는 주가 데이터가 순서가 있는 시계열(Time-series) 데이터이기 때문입니다.
LSTM 은 RNN(Recurrent Neural Network) 의 일종입니다. RNN 은 학습을 할 때 현재 입력값뿐만 아니라 이전에 들어온 입력값을 함께 고려하기 때문에 시계열 데이터 를 학습하기에 적합합니다. 신경망 중간에 있는 히든 레이어 의 결과값들이 다시 입력값으로 들어가기 때문에 순환(Recurrent) 신경망(Neural Network)이라는 이름이 붙었습니다.
그러나 RNN 은 만약 데이터가 너무 길어져 이를 표현하는 신경망이 깊어져야만 할 경우 문제가 발생합니다. RNN 은 역전파(Backpropagation) 라는 방법을 통해 학습하는데, 위와 같은 경우 그래디언트가 너무 작아져 학습이 잘 안 되는 문제(Vanishing Gradient Problem)가 발생하는 것입니다. 이 문제를 해결하기 위해 LSTM 이 만들어졌습니다.
LSTM 은 셀 스테이트(cell state) 라는 개념을 도입하여 그 내부에 있는 게이트(gate) 들을 통해 어떤 정보를 기억하고 어떤 정보를 버릴지 추가적인 학습을 가능하게 합니다. 이를 통해 RNN 이 가진 문제(Vanishing Gradient Problem)를 해결할 수 있었습니다.
LSTM 에 대한 보다 자세한 설명은 여기를 참고하면 좋을 것 같습니다.
그럼 다시 우리가 풀던 문제로 돌아가볼까요. 다음과 같은 코드로 LSTM 모델을 생성합니다.
#2단계: 모델 생성 model = Sequential () model . add ( LSTM ( input_dim = 1 , output_dim = 50 , return_sequences = True )) model . add ( Dropout ( 0.2 )) model . add ( LSTM ( 100 , return_sequences = False )) model . add ( Dropout ( 0.2 )) model . add ( Dense ( output_dim = 1 )) model . add ( Activation ( ‘linear’ )) start = time . time () model . compile ( loss = ‘mse’ , optimizer = ‘rmsprop’ ) print ‘compilation time : ‘ , time . time () – start
입력으로 들어가는 데이터는 1차원이기 때문에 이 에 따라 input_dim 을 설정합니다. 다음 LSTM 레이어로 들어가는 입력값을 설정하기 위해 output_dim 값을 정하고 return_sequences 을 True 로 설정해줍니다. 또 과적합(overfitting) 을 피하기 위한 드롭아웃(dropout) 을 20%로 설정합니다.
다음 LSTM 레이어에서는 노드를 100개, 그리고 마지막 Dense 레이어에 들어가기 전이므로 return_sequences 를 False 로 설정해줍니다. 마찬가지로 과적합(overfitting) 을 피하기 위해 드롭아웃(dropout) 을 20%로 설정합니다.
마지막으로 Dense 레이어와 linear 활성화 함수(activation function)을 통해 마지막 결과값을 계산해줍니다.
그리고 모델의 학습 과정을 정해주는데요. 회귀(Regression) 문제를 풀 때 가장 일반적인 손실 함수(loss function) 인 평균 제곱근 편차(Mean Squared Error, MSE) 를 설정하고, 최적화 방법(Optimization) 으로는 RMSProp 을 설정해줍니다.
그 후 다음과 같은 코드를 통해 모델을 학습합니다.
#3단계: 모델 학습 model . fit ( X_train , y_train , batch_size = 512 , nb_epoch = 1 , validation_split = 0.05 )
주가 예측 시각화하기
다음과 같은 코드를 통해 앞으로의 추세를 그려볼 수 있습니다.
#4단계: 주가 예측한 것을 그려보자! predictions = lstm . predict_sequences_multiple ( model , X_test , 50 , 50 ) lstm . plot_results_multiple ( predictions , y_test , 50 )
=>
간단한 학습만으로도 비교적 잘 예측하는 모습을 보여줍니다. 자, 그럼 이제 돈을 벌러 가 볼까요?
강화학습 을 활용한 주식 가격 예측
자, 이번엔 강화학습 을 주식 시장에 적용해볼까요?
다만 강화학습 을 활용하기 전에, 먼저 지도학습(supervised) 으로 학습시킨 딥러닝 모델을 활용한 트레이딩 방법에 대해 알아보도록 하겠습니다. 그리고 나서 둘을 비교해보도록 하죠.
지도학습 모델을 활용한 트레이딩 방법
만약에 주식 가격이 올라갈 것이라고 예측한다면, 주식을 지금 산 뒤 오르고 나서 팔면 됩니다. 반대로, 주식 가격이 내려갈 것 같으면, 공매도(주식을 빌려서 팔고 일정 시간이 지난 뒤 다시 사서 돌려주는 것)를 해서 지금 팔고 나중에 가격이 내려간 뒤 사면 됩니다. 그렇다면 문제는, ‘어떻게 주식을 예측할 것인가’ 겠죠? 사실 주식 가격은 그렇게 쉽게 정해지는 것이 아닙니다. 우리가 어떤 주식을 검색했을 때 당장 보이는 가격, 그 하나의 가격에 우리가 원하는 모든 주식의 수량만큼 살 수는 없습니다. 우리가 실제로 사게 되는 주식의 가격은 지금 당장 시장에서 거래되는 주식의 거래량에 따라, 호가창에 나와 있는 매수/매도 잔량에 따라, 또 거래 수수료에 따라 달라지기 마련이죠.
그래서 우리는 지도학습 으로 주식 가격을 예측할 때는 호가창 내의 중간 가격(Midprice)을 예측하려고 합니다. 사실 이 가격은 우리가 주식을 주문했을 때 실제 체결되는 정확한 가격은 아니지만, 이론적으로 현재 매수와 매도 가격의 중간 가격이기 때문에 중요합니다. 현재 호가창의 상태가 어떤지에 따라 그 매수-매도 사이의 가격 스프레드(spread)는 크게 차이가 날 수 있습니다.
주의해야 할 점은, 우리가 지금 딥러닝 모델을 활용해 가격을 예측하려고 하지만, 이 모델은 네트워크 지연 시간(network latency), 수수료, 가장 유리한 호가 수준에서의 유동성 등을 고려하지 않는다는 점입니다. 그래서 이런 단순한 주가 예측 전략으로 돈을 벌기 위해서는 장기적으로 봤을 때의 큰 가격 변동을 예측하거나, 수수료 또는 매수/매도 주문 관리를 똑똑하게 하는 것이 필요합니다. 하지만 이것은 쉬운 문제가 아니죠.
그리고 만약 지도학습 으로 학습을 시켰다면, 전략의 변화가 없기 때문에 생기는 문제도 있습니다. 운이 좋게 우리가 예측한 대로 가격이 오르면 좋겠지만, 만약 그게 아니라 가격이 내려간다면 어떻게 해야 할까요? 혼란에 빠진 짐승처럼 주식을 가져다 팔아야 할까요? 만약 가격이 올랐다가 다시 내려가는 경우는 어떨까요? 또, 우리가 주식 매수/매도 주문을 넣기 위해서는 모델이 얼마 정도의 확신(certainty)를 가질 때를 기준으로 해야 할까요?
그래서 우리는 단순히 주식 가격을 예측하는 것 이상의 모델을 만들어야 합니다. 모델이 예측한 주식 가격을 입력받아 매수/매도 주문을 넣을지, 그냥 보유하고 있을지, 춤을 출지 등의 행동을 결정하는 규칙 기반의 정책(Rule based policy) 이 필요합니다. 하지만 어떻게 이 모든 정책에 필요한 파라미터(policy parameter)를 최적화할 수 있을까요? 휴리스틱이나 인간의 직관은 이런 것을 결정하는 데 약간의 도움만 될 뿐입니다.
강화학습 을 활용한 트레이딩 방법
그렇다면 이에 대한 해결책은.. 강화학습 을 활용한 트레이딩입니다. 다음과 같은 방식으로 강화학습 문제를 설계할 수 있는데요.
환경(Environment) 내에서 행동(action) 을 취하는 에이전트(agent) 가 있습니다.
이 에이전트 는 매 시간 단위(time step)마다 현재 상태(state) 를 입력으로 받고, 행동 을 취한 뒤 이에 따른 보상(reward) 과 다음 상태 를 받습니다.
이 에이전트 는 정책(policy) 에 따라 어떤 행동 을 할지를 결정하는데요.
우리의 목표는 주어진 기간 동안 누적 보상 을 최대한으로 얻는 정책 을 찾아내는 것입니다.
주식 시장에서의 강화학습이란?
주식 시장에서의 관점으로는,
에이전트 가 바로 우리가 만드려는 트레이딩 봇이고,
이것이 언제 주식을 사고 팔지를 결정하는 행동 을 하며,
환경 은 우리가 주식을 사고파는 시장이 됩니다.
이 환경의 상태 에 대해 설명하자면, 완전정보적(complete)이지 않습니다. 우리는 다른 에이전트 들에 대해서 자세히 알 수 없고, 계좌 잔액이나 그들이 넣은 대기 주문에 대해서도 알 수 없죠. 우리가 관찰할 수 있는 것은 환경 내의 정확한 상태 라기보다는 그것에서부터 파생된 제한적인 정보를 가진 상태 인 것입니다.
매 시간 단위마다 우리가 알 수 있는 것은 그때까지 체결된 거래 기록들과 우리의 계좌 잔액 정도입니다.
트레이딩 봇이 거래하는 시간 간격도 상당히 중요한데요, 며칠 간격으로 거래를 해야 할까요? 나노 초(ns) 단위는 어떤가요? 초단타매매용 트레이딩 봇은 나노 초 단위로 거래합니다.
딥러닝은 복잡한 문제를 풀 수 있는 것으로 잘 알려져 있습니다. 많은 데이터를 입력으로 받아 학습하여 패턴을 찾죠. 그러나 딥러닝은 상대적으로 느립니다. 나노 초 단위로 결정을 내릴 수는 없기 때문에, 초단타매매용 봇을 이길 수는 없죠.
그래서 우리는 사람이 데이터를 분석하는 것보다 빠르게 결정을 내리며 (물론 초단타매매매처럼 나노 초 단위까지는 가지 못하겠지만요), 대신 더 똑똑하여 초단타매매용 봇을 이길 수 있는 트레이딩 봇을 만들고자 합니다.
사실 강화학습 의 트레이딩 전략은 어떤 측면에서는 지도학습 방식의 트레이딩 전략보다 간단할 수도 있습니다. 지도학습 은 가격을 예측하는 모델 외에도 직접 수작업으로 만든 규칙 기반의 정책 (예-모델이 80% 이상의 확신을 할 때 사거나 팔기, 스카이넷 작동시키기 )이 필요합니다. 하지만 강화학습 은 그런 것이 모두 학습한 정책 내에 포함되어 있습니다. 그래서 더 강력하고 사람을 뛰어넘을 수도 있죠. 또 네트워크 지연이나 실수 같은 것까지 환경 내에서 시뮬레이션하여 트레이딩 봇을 학습시킬 수도 있습니다.
Q Learning을 활용한 트레이딩 봇 만들기
마르코프 결정 프로세스(MDP, Markov Decision Process)
트레이딩 봇을 만들기 위해, 주식시장을 강화학습 문제로 좀 더 정교하게 모델링해봅시다. 강화학습 문제를 풀기 위해서는 풀고자 하는 문제를 상태 , 행동 , 상태 전이 확률(State transition probability) , 보상 으로 정의하는 마르코프 결정 프로세스가 필요합니다. 주식시장에서의 상태 와 행동 등에 대해 위에서 간단하게 언급하기는 했지만, 이번에는 좀 더 자세히 들여다봅시다.
상태 : 상태 는 우리가 가진 주식의 개수 와 현재 주식의 가격 , 그리고 계좌의 잔액 으로 정의할 수 있습니다. 만약 우리가 구글 주식 50주(주당 $100)와 아마존 주식 20주(주당 $230) 가지고 있고 계좌 잔액으로 $1500이 있다면, 상태 는 [50, 100, 20, 230, 1500]과 같이 할 수 있습니다.
행동 : 주어진 상태에서 에이전트 는 매수 , 매도 , 보유 라는 3가지 행동 을 할 수 있습니다. 주식마다 3가지 행동 을 할 수 있기 때문에, 만약 우리가 포트폴리오 내에 n개의 주식을 가지고 있다면 에이전트 가 할 수 있는 행동 의 개수는 3^n 개입니다.
보상 : 보상 을 공식화하는 방법은 정말 많습니다. 그리고 좋은 보상 함수를 만드는 것이 좀 더 빠르게 학습하는 데 도움이 되죠. 다음과 같은 방법들 중에 뭐가 더 좋은 방법일까요? 현재 포트폴리오 가치가 처음 포트폴리오 가치보다 높으면 +1, 아니면 -1 현재 포트폴리오 가치가 처음 포트폴리오 가치보다 높으면 +1, 아니면 -1000 이전 시점과 현재 시점의 가치를 비교했을 때, 그 가치의 차이만큼 +/- 사실 여기에 정답은 없지만, 첫번째와 두번째 방법은 위와 같은 그래프의 경우 잘 학습하지 못하게 됩니다. 그래서 우리는 세번째 보상 방법을 선택할 것입니다.
그렇다면 상태 전이 확률 은 어떻게 정의할까요?
주의해야 할 점은, 위에서 얘기했듯 우리에게 관찰 가능한 상태 가 완전하지 않다는 점입니다. 주식시장에는 다양한 참여자가 있고, 우리는 그들의 결정 과정을 알지 못하기 때문에 ‘부분적으로만 관찰 가능’하죠. 따라서 우리가 풀고자 하는 주식 시장 문제에서 상태 전이 확률 은 주어지지 않습니다. 따라서 기존의 모델 기반(model-based) 강화학습 방법론에 따르면 우리는 이 상태 전이 확률 에 대한 함수를 직접 구해야 합니다.
Q Learning
강화학습 의 종류에는 모델 기반(model-based) 강화학습 과 모델 프리(model-free) 강화학습 이 있습니다. 여기서 모델이란 마르코프 결정 프로세스에서의 상태 전이 확률 에 대한 모델을 뜻합니다. 그래서 만약 모델 기반 강화학습 을 하고 싶다면, 상태 전이 확률 에 대한 함수를 추정하고 난 후에야 학습을 할 수 있습니다. 하지만 모델 프리 강화학습 방법을 사용한다면, 이 모델을 당장은 알지 못하더라도 학습이 가능합니다. 모델 프리 강화학습 에서는 에이전트 가 환경 내에서 행동 을 하고, 그 결과로 주어지는 보상 과 다음 상태 를 받아 학습에 활용하면 됩니다. 상태 전이 확률 에 대한 모델을 열심히 새로 찾아 학습하는 것보다 훨씬 간단한 과정이죠.
Q Learning은 이러한 모델 프리 강화학습 에서 가장 유명한 학습 방법입니다. Q Learning에서는 현재 상태 에서 어떤 행동 을 했을 때 보상 의 기대값을 계산하는 Q 함수, Q( 상태 , 행동 )값을 학습하고 추정합니다. 그리고 결국 강화학습 의 목적은 보상 을 최대한으로 얻는 정책 을 찾아내는 것인데, Q Learning의 경우 학습 과정이 진행됨에 따라 보상 을 보다 잘 계산하는 Q 함수를 찾게 됩니다. 그러므로 Q 함수에 따른 최대 보상 값을 주는 행동 을 따라가는 것이 바로 정책 이라 할 수 있죠.
Q Learning은 다음과 같은 순서로 이루어집니다.
먼저 임의로 Q 함수를 초기화합니다. 그리고 Q 함수와 정책 에 따라, 보상 을 최대화해주는 행동 을 선택합니다. 행동 을 한 뒤, 이에 따른 보상 과 다음 상태 를 관찰합니다. 이에 따라 Q 함수를 업데이트 해줍니다. 다시 2번, 행동 을 선택하는 단계로 돌아가 반복합니다. 이러한 하나의 반복을 에피소드 라 합니다. 학습이 끝나고 나면 행동 의 보상 값을 잘 예측해주는 새로운 Q 함수를 얻을 수 있습니다.
이러한 Q Learning에 있어, Q 함수를 Deep Neural Network로 구성하면 그게 바로 Deep Q Learning이 됩니다. 우리는 이러한 Deep Q Network를 활용해 트레이딩 봇을 만들 것입니다.
그럼 알고리즘에 대해서 이해했으니, 실제 데이터에 적용하러 가봅시다!
활용할 코드와 데이터
원본 코드와 데이터는 여기에서 확인할 수 있습니다. Python 2.7. 로 쓰여 있습니다.
agent.py : Deep Q Learning 에이전트 가 구현되어 있습니다.
: Deep Q Learning 가 구현되어 있습니다. envs.py : 3개의 주식에 대한 거래 환경이 구현되어 있습니다.
: 3개의 주식에 대한 거래 환경이 구현되어 있습니다. model.py : Q 함수로 쓰이는 Multi-layer Perceptron이 구현되어 있습니다.
: Q 함수로 쓰이는 Multi-layer Perceptron이 구현되어 있습니다. utils.py : 유용한 함수들이 포함되어 있는 파일입니다.
: 유용한 함수들이 포함되어 있는 파일입니다. run.py : 학습/테스트를 할 수 있는 메인 코드입니다.
: 학습/테스트를 할 수 있는 메인 코드입니다. requirement.txt : 의존성 파일입니다. pip install -r requirements.txt 로 필요한 라이브러리를 설치할 수 있습니다.
: 의존성 파일입니다. 로 필요한 라이브러리를 설치할 수 있습니다. data/ : 데이터는 data 폴더 내에 있는 3개의 csv 파일을 활용합니다. 각각 IBM, MSFT, QCOM의 주가 데이터로, 2000년 1월 3일부터 2017년 12월 27일까지 5629 거래일의 데이터가 포함되어 있습니다. 이 데이터들은 Alpha Vantage API를 활용해 받았습니다.
코드 실행시키는 방법
Deep Q 에이전트 를 훈련시키려면 python run.py –mode train 명령어를 실행합니다. 여러가지 추가 옵션이 있는데, 다음과 같습니다. -e , –episode : (기본값: 2000) 실행시킬 에피소드 의 수를 정해줍니다. -b , –batch_size : (기본값: 32) 배치 사이즈 를 정해줍니다. -i , –inital_invest : (기본값: 20000) 초기 투자 금액을 정해줍니다.
훈련된 모델의 성능을 테스트하려면 python run.py –mode test –weights
명령어를 실행합니다. 는 훈련된 모델의 weight 가 저장된 경로입니다. 이 명령어를 실행하면 테스트 데이터 포트폴리오의 에피소드 당 가치 변화가 저장됩니다. 코드 설명
모든 코드를 설명하기보다는 학습 메인 코드인 run.py 를 중심으로 설명하겠습니다.
import pickle import time import numpy as np import argparse import re from envs import TradingEnv from agent import DQNAgent from utils import get_data , get_scaler , maybe_make_dir if __name__ == ‘__main__’ : parser = argparse . ArgumentParser () parser . add_argument ( ‘-e’ , ‘–episode’ , type = int , default = 2000 , help = ‘number of episode to run’ ) parser . add_argument ( ‘-b’ , ‘–batch_size’ , type = int , default = 32 , help = ‘batch size for experience replay’ ) parser . add_argument ( ‘-i’ , ‘–initial_invest’ , type = int , default = 20000 , help = ‘initial investment amount’ ) parser . add_argument ( ‘-m’ , ‘–mode’ , type = str , required = True , help = ‘either “train” or “test”‘ ) parser . add_argument ( ‘-w’ , ‘–weights’ , type = str , help = ‘a trained model weights’ ) args = parser . parse_args () maybe_make_dir ( ‘weights’ ) maybe_make_dir ( ‘portfolio_val’ )
먼저 학습에 필요한 라이브러리와 다른 파일에 있는 함수들을 불러와줍니다.
그 후 argparse 를 활용해 학습 인자를 받을 수 있도록 설정해줍니다.
timestamp = time . strftime ( ‘%Y%m%d%H%M’ ) data = np . around ( get_data ()) train_data = data [:, : 3526 ] test_data = data [:, 3526 :] env = TradingEnv ( train_data , args . initial_invest ) state_size = env . observation_space . shape action_size = env . action_space . n agent = DQNAgent ( state_size , action_size ) scaler = get_scaler ( env ) portfolio_value = [] if args . mode == ‘test’ : # remake the env with test data env = TradingEnv ( test_data , args . initial_invest ) # load trained weights agent . load ( args . weights ) # when test, the timestamp is same as time when weights was trained timestamp = re . findall ( r’\d{12}’ , args . weights )[ 0 ]
get_data 함수를 통해 데이터를 불러온 후, 이를 학습/테스트 데이터로 나눠줍니다.
env.py 파일 내에 있는 TradingEnv 로 환경 을, agent.py 파일 내에 있는 DQNAgent 로 에이전트 를 생성합니다.
또 get_scaler 함수를 통해 데이터의 정규화 를 진행합니다.
만약 test 모드일 경우에는 훈련 데이터가 아니라 테스트 데이터를 가지고 환경 을 생성하며, 사전 훈련된 모델의 weight 를 불러와줍니다.
for e in range ( args . episode ): state = env . reset () state = scaler . transform ([ state ]) for time in range ( env . n_step ): action = agent . act ( state ) next_state , reward , done , info = env . step ( action ) next_state = scaler . transform ([ next_state ]) if args . mode == ‘train’ : agent . remember ( state , action , reward , next_state , done ) state = next_state if done : print ( “episode: {}/{}, episode end value: {}” . format ( e + 1 , args . episode , info [ ‘cur_val’ ])) portfolio_value . append ( info [ ‘cur_val’ ]) # 에피소드가 끝날 때의 포트폴리오 가치를 기록합니다. break if args . mode == ‘train’ and len ( agent . memory ) > args . batch_size : agent . replay ( args . batch_size ) if args . mode == ‘train’ and ( e + 1 ) % 10 == 0 : # weights를 중간중간에 저장합니다. agent . save ( ‘weights/{}-dqn.h5’ . format ( timestamp )) # 포트폴리오 가치 변화를 저장합니다. with open ( ‘portfolio_val/{}-{}.p’ . format ( timestamp , args . mode ), ‘wb’ ) as fp : pickle . dump ( portfolio_value , fp )
사용자가 입력으로 넘겨주는 에피소드 수에 따라 학습을 진행합니다. 각 에피소드 마다 에이전트 가 행동 을 하고 그 결과로 보상 과 다음 상태 를 받습니다. 만약 이렇게 쌓인 에피소드 데이터의 수가 배치 사이즈 만큼 많아지면 학습을 진행합니다. 10번의 학습을 진행할 때마다 weight 를 중간중간에 저장해줍니다.
그렇게 학습이 모두 끝나면, 포트폴리오의 가치를 기록한 파일을 생성합니다.
테스트 결과
모델을 훈련한 뒤 테스트 데이터에 대해 성능을 측정하면 다음과 같은 그래프가 나타납니다. 빨간 선($20,000)은 초기 투자 금액을 의미하고, 초록 선은 2000번 실행한 결과의 평균인 $23,788을 의미합니다. 1000일 동안 $3,788을 벌었네요! 그렇지만 우리가 이 에이전트 를 활용해 투자를 시작해도 될까요? 아마도 안 될 것 같습니다. 그래프에서 나타난 포트폴리오 가치가 상당히 변동성이 크다는 것에서도 알 수 있듯, 우리의 에이전트 는 상당히 불안정합니다.
앞으로 해야 할 것
평균 $3,788라는 꽤 괜찮은 수익을 확인했지만, 그럼에도 그 리스크가 너무 커서 사용할 수 없을 정도입니다. 또한 이것은 단지 이 아이디어가 실제로 먹힐까 시범적으로 시도해본 것이지 거래 비용과 같은 실제 현실을 완전히 반영하지는 못합니다. 또 지금 당장은 3개의 주식만 가지고 진행했기 때문에, 만약 주식의 수를 늘린다면 행동 과 상태 공간이 지수적으로 커져 학습이 어려울지도 모릅니다.
즉, 이 실험에서는 주식 시장에서 강화학습 으로 문제를 푸는 것이 불가능하지 않다라는 것을 보여준 정도입니다. 만약 좋은 특징(feature)들을 뽑아내 적절한 강화학습 알고리즘과 함께 섞어 학습할 수 있다면 상당히 효과적인 중기 트레이딩 시스템을 만들 수 있을 것입니다. 앞으로 할 수 있는 것들은(새로 뽑을 수 있는 특징의 관점에서 봤을 때) 다음과 같습니다.
회사에 대한 뉴스 (예-긍정/부정 트윗)
회사의 성과에 대한 정보 (시장 점유, 성장률, 시장 가치, 수입, 매출, 영업이익 등)
경쟁 회사의 뉴스나 성과
산업군의 뉴스
거시경제
정부 정책
주식의 수요와 공급
등등
역자 추가 코멘트: 원본 유투브에 댓글이 달리기도 했지만, 사실 Q Learning은 주식 시장에 적용하는 데 있어서 좋은 방법은 아닙니다. PPO(Proximal Policy Optimization)와 같은 Policy Gradient 방법이 좀 더 효과적이라고 알려져 있습니다. 그러나 이 튜토리얼의 경우 ‘주식 시장에 강화학습을 적용해보는 것’에 좀 더 초점을 맞추었기에, 가장 대중적인 강화학습인 Q Learning을 적용했다고 Siraj가 밝혔습니다. 만약 Policy Gradient 방법에 대해 좀 더 자세히 알고 싶으시다면 RL Korea에서 제작한 PG여행 페이지를 추천드립니다.
참고 자료
Siraj Raval의 유투브 채널
송호연 님의 LSTM 설명 번역 자료
Teach Machine to Trade
딥러닝을 이용한 주가 예측 – 인사이트캠퍼스
인간 투자가가 성공할 수 있다면, 기계도 가능하지 않을까?
* 이 글은 towardsdatascience에작성된 Yacoub Ahmed의 글을 번역하였습니다.
이 포스팅는 전적으로 연구 목적의 프로젝트이다. 필자는 딥러닝을 배우고 있는 학생일 뿐이고, 프로젝트는 진행 중인 작업이다. 오늘 학습 할 알고리즘에 실제로 돈을 넣진 말자!
알고리즘 트레이딩은 주식 시장과 그 주변 산업에 혁명을 일으켰다. 현재 미국에서 일어나고 있는 모든 거래의 70% 이상이 봇에 의해 처리되고 있다[1]. 전화기에 대고 소리치며 종이 한 장을 흔드는 실무자들로 이루어지는 증권 거래의 시대는 지났다.
이는 어떻게 하면 주식을 거래할 수 있는 나만의 알고리즘을 개발하거나 적어도 주가를 정확하게 예측할 수 있을까? 하는 생각을 하게 했다.
Machines are great with numbers!
결과는 나름 나쁘지 않았다.
MSFT 주식 2019년 9월 -10월 거래 알고리즘
여름 동안 신경망과 머신 러닝에 대해 많이 배웠으며, 가장 최근에 배운 적용 가능한 ML 기술 중 하나는 LSTM 셀[2]이다.
LSTM 셀. Credit: https://colah.github.io/posts/2015-08-Understanding-LSTMs/
롱숏텀 메모리 셀은 더 큰 신경망에서 메모리를 허용하도록 설계된 미니 신경망과 같다. 이는 LSTM 셀 내부의 반복 노드를 사용하여 달성된다. 이 노드는 무게가 1인 에지 루프 자체에서 되돌아온다. 즉, 모든 피드포워드 반복 시 셀은 이전 단계뿐만 아니라 이전의 모든 단계의 정보를 보유할 수 있다. 루프 연결의 무게가 1이기 때문에, 오래된 기억은 전통적인 RNN에서와 같이 시간이 지남에 따라 사라지지 않을 것이다.
결과적으로 LTSM과 반복 신경망은 과거를 기억하는 능력 덕분에 시계열 데이터를 잘 다룰 수 있다. 이러한 반복 노드에 이전 상태 일부를 저장함으로써, RNN과 LSTM은 현재 정보뿐만 아니라 네트워크가 1단계, 10단계 또는 1000단계 전에 보았던 정보에 대해서도 추론할 수 있다. 더 좋은 것은, LSTM 셀의 구현체를 직접 작성할 필요가 없다는 것이다. 텐서플로 케라스의 기본 레이어이다.
그래서 필자는 LSTM과 Keras를 주식시장을 예측하기 위해 사용하고, 돈을 벌기 위해 계획을 세웠다.
코드로 바로 들어가려면 GitHub repo를 확인해보자 🙂
데이터세트
주가 히스토리의 장점은 기본적으로 잘 표시된 데이터 세트라는 점이다. 몇 번의 구글 서치 끝에 AlphaVantage라는 서비스를 찾았다. AlphaVantage는 지난 20년 동안 나스닥 주식의 일일 가격 히스토리를 제공했다. AlphaVantage에는 오늘부터 1999년까지 매일의 시가, 고가, 저가, 종가, 거래량이 포함되어있다. 더 좋은 점은 서비스를 위한 파이썬 래퍼가 있다는 것이다. 필자는 웹사이트에서 무료 API 키를 받았고 마이크로소프트의 일일 주가 히스토리를 다운받았다.
AlphaVantage의 무료 API는 분당 5 콜(하루 최대 500 콜)만 허용하므로 데이터 세트를 다운로드하여 CSV 형식으로 저장하여 원하는 만큼 자주 사용할 수 있도록 하였다.
지난 20년 간 IPO 상장을 한 종목의 경우 거래 첫날이 거래량이 많아 이례적으로 보이는 경우가 많았다. 부풀려진 최대 거래량 값은 데이터를 정규화할 때 데이터 세트의 다른 볼륨 값이 어떻게 확장되는지에 영향을 미쳤기 때문에 모든 집합에서 가장 오래된 데이터 포인트를 삭제하기로 선택했다. 필자는 또한 모델이 거래가 언제 일어났는지 알 필요가 없기 때문에 날짜를 생략한다. 필요한 것은 주문된 시계열 데이터만 제대로 처리하면 된다.
필자는 또한 우리가 사용하고자 하는 {history_points}개의 숫자도 추적하고 있다. 그 모델이 예측을 기초로 삼을 수 있는 주가 히스토리 일수도 추적한다. 따라서 history_points가 50으로 설정되면 이 모델은 계속 학습되며 지난 50일 동안의 주식 히스토리가 다음날에 대한 예측을 하도록 요구된다.
이제 네트워크를 얼마나 빨리 통합하는지를 개선하기 위해 데이터를 0에서 1로 확장해야 한다. Sklearn은 이를 위한 훌륭한 사전 처리 라이브러리를 가지고 있다.
data_normalised는 정규화된 주가를 포함한다.
이제 모델을 사용할 수 있는 데이터 세트를 준비한다.
ohlcv_histories 리스트는 신경망 훈련 시 x 매개 변수가 될 것이다. 리스트의 각 값은 가장 오래된 값에서 최신 값으로 이어지는 50개의 시가, 고가, 저가, 종가, 볼륨 값을 포함하는 숫자 배열이다. 이 값은 슬라이스 작업 내에서 볼 수 있는 history_points 파라미터에 의해 제어된다.
따라서 각 x 값은 [i: i + history_points] 주가가 된다. 그러면 해당 값은 단수 [i + history_points] 주가여야 한다. 바로 다음날의 주가이다.
여기서 우리는 또한 우리가 예측하고자 하는 값이 무엇인지 선택해야 한다. 다음 날 시가를 예측하기로 결정했으므로 데이터의 모든 ohlcv 값의 0번째 요소를 구해야 한다. 따라서 data_scale [:,0].
또한 y_normaliser라는 변수를 보유할 수 있다. 이것은 예측의 마지막에 사용되며, 모델에서 정규화된 숫자를 0과 1 사이에 뱉을 때, 우리는 데이터 세트 정규화의 역방향을 적용하여 실제 값으로 다시 확장하고자 한다. 이후에는 또한 이를 사용하여 모델의 실제(비정상화) 오류를 계산할 것이다.
그런 다음 데이터를 Keras로 작업하기 위해 np.expand_dims()를 통해 y 배열을 2차원화한다. 그리고 마침내 필자는 나중에 결과를 모의할 수 있는 비균형적인 다음 날 시가를 얻을 수 있다.
데이터를 반환하기 직전에 x의 수 == y의 수를 확인한다.
이제 다음을 실행하여 csv 파일이 있는 모든 데이터 세트를 얻을 수 있다.
데이터 세트가 준비되어있다.
The Model
필자는 이 프로젝트를 순차적으로 Keras 코드를 작성하는 방법만 알고 시작했지만, 더 복잡한 네트워크 구조를 원했기 때문에 기능적인 API를 배우게 되었고, 결국 각 분기에 서로 다른 레이어 유형을 가진 두 개의 입력을 피쳐로 했다.
필자가 먼저 생각해 낸 가장 기본적인 모델도 검토해 보자.
Basic model architecture
각 입력 데이터 포인트는 [history_points × OHLCV]와 같은 배열이기 때문에 입력 레이어는 셰이프(history_points, 5)를 가진다. 이 모델에는 첫 번째 레이어에 50개의 LSTM 셀이 있으며, 과적합을 방지하기 위한 드롭아웃 레이어와 모든 LSTM 데이터를 결합하기 위한 일부 밀도가 높은 레이어가 있다.
이 네트워크의 중요한 기능은 선형 출력 활성화로, 모델이 자신의 최대 가중치를 정확하게 조정할 수 있다.
The Training
이것이 필자가 케라스를 사랑하는 이유이다. 말 그대로 3줄의 코드를 사용하면 모델이 데이터 세트에서 얼마나 잘 작동하는지 즉시 알 수 있다. 최종 평가 점수 0.00029를 받았는데, 이 점수가 너무 낮은 것 같지만 정규화된 데이터의 평균 제곱 오차임을 기억하자. 확장 후에는 이 값이 크게 증가하므로 손실에 대한 메트릭이 그리 크지 않다.
The Evaluation
모형을 보다 정확하게 평가하기 위해 검정 집합을 실제 값과 비교하여 예측하는 방법을 알아보자. 먼저 예측 값을 스케일업한 다음 평균 제곱 오차를 계산하지만, 이를 테스트 데이터의 ‘스프레드’ 즉 최대 테스트 데이터 포인트에서 최소값을 뺀 값으로 나눈 데이터 세트에 상대적인 오차를 만든다.
따라서 수정된 평균 제곱 오차는 7.17이다. 놀라운 것은 아니다. 평균적으로 예측된 선이 실제 선으로부터 7% 이상 이탈한다는 의미이다. 그래프에서 어떻게 보이는지 살펴보자.
Real and predicted daily opening stock price of MSFT from the last 500 days, basic network
나쁘진 않다! 예측 값이 실제 값보다 일관되게 낮은 이유는 잘 모르겠다. 테스트와 훈련 세트가 분할되는 방식과 관련이 있을 수 있다. 전체 데이터 세트의 결과는 다음과 같다.
Real and predicted daily opening stock price of MSFT since 1999, basic network
이 전체 그래프에서 알고리즘이 얼마나 잘 작동하는지 알기는 어렵지만, 예상대로 훈련 세트 전체에서 더 잘 맞는 것을 볼 수 있다.
The Improvements
우리는 모델을 더 복잡하게 만들고 데이터 세트의 크기를 늘릴 수 있다. 좀 더 복잡한 모델을 만드는 것부터 시작해보자.
주식 시장 애널리스트들이 흔히 사용하는 지표는 기술 지표[4]이다. 기술적 지표는 주가 역사에 대해 이루어지는 수학적 작업이며, 전통적으로 시장이 변화할 방향을 식별하는 시각적인 보조 수단으로 사용된다. 우리는 2차 입력 분기를 통해 이러한 기술적 지표를 받아들이도록 모델을 확장할 수 있다.
우선 간단한 이동 평균 SMA 표시기만 네트워크에 추가 입력으로 사용하자.
주식의 단순 이동 평균을 계산하려면 지난 n단계[5] 동안의 주식 종가 평균을 구하면 된다. 이는 주가 기록의 고정된 시간 블록을 이미 다루고 있기 때문에 우리에게 매우 효과적이다. SMA를 모델에 포함하려면 데이터 세트 처리 코드를 변경해야 한다.
이 문제는 ohlcv_history 및 next_day_open_values 배열을 정의한 직후에 발생한다. 우리는 모든 50 가격 블록의 데이터를 반복하여 3번째 열의 평균인 종가를 계산하고 그 값을 technical_ indicator 목록에 추가한다. 그런 다음 리스트는 나머지 데이터와 동일한 변환을 거치며 0 – 1의 값에 맞게 조정된다. 그런 다음 return 문을 변경하여 technical indicator와 이전에 반환한 다른 항목을 반환한다.
이제 모델을 확장하여 이 새로운 데이터 세트와 일치시킨다. 우리는 이전의 LSTM 구조를 사용할 수 있기를 바라지만 SMA technical indicator가 통합되기를 원한다. SMA는 시계열 데이터가 아니기 때문에 LSTM을 통해 전달하면 안된다. 대신에 우리는 최종 예측이 이루어지기 전에 혼합해야 한다. 끝에서 두번째의 64-노드 dense 레이어에 입력해야 한다. 따라서 우리는 두 개의 입력, 즉 연결 레이어와 하나의 출력을 가진 모델이 필요할 것이다.
Model architecture after augmentation to use technical indicators
technical_indicators.shape[1]을 tech_input layer의 입력으로 사용한 방법에 주목하자.
즉, 모델을 다시 컴파일할 때 추가되는 모든 새로운 technical indicator가 적합하다.
이 데이터 세트 변경과 일치하도록 평가 코드도 변경해야 한다.
[ohlcv, technical_indicators] 리스트를 모델에 입력으로 전달한다. 이 순서는 우리가 모델의 입력을 정의하는 방식과 일치한다.그리고 우리는 2.25의 수정된 평균 제곱 오차를 얻을 수 있다! 훨씬 더 낮고 예측은 그림으로 표시된 검정 집합에 훨씬 더 가까운 것으로 보인다.
Real and predicted daily opening stock price of MSFT from the last 500 days, using SMA
이 모델은 정해진 양만큼 지속적으로 떨어져야 하는 기존 문제를 겪지 않고 급점프를 잡지 못해 어려움을 겪는 것으로 보인다. x 좌표 120에서와 마찬가지로 실제 가격에서 큰 폭의 점프와 하강이 발생하지만 모델은 이를 효과적으로 포착하지 못한다. 하지만 점점 좋아지고 있다! 그리고technical indicator가 앞으로 나아갈 길이 될 수 있을 것 같다.
좀 더 발전된 기술 지표인 이동 평균 수렴 차이를 포함해보자. MACD는 12주기 EMA[6]에서 26주기 지수 이동 평균을 빼서 계산한다. EMA는 다음 공식을 사용하여 [7] 계산된다.
MACD 표시기를 포함하도록 technical indicator 루프를 업데이트하려면:
SMA 및 MACD 인디케이터를 사용하여 우리의 모델은 2.60의 수정된 평균 제곱 오차를 달성한다. SMA만 사용하는 경우보다 약간 높다. 아래 그래프를 보자.
Real and predicted daily opening stock price of MSFT from the last 500 days, using SMA and MACD
SMA를 사용할 때처럼 정확하게 맞지 않는다는 것을 알 수 있다. 모델에 데이터를 더 많이 제공하기 때문에 더 많은 레이어가 필요하다. 하지만 지금은 MACD technical indicator의 사용을 생략할 것이다.
우리는 더 큰 데이터 세트를 사용하여 실험할 수도 있다. 마이크로소프트 주식의 주식 예측에 적용된 기법이 모든 주식으로 일반화될 수 있다고 가정한다면, 우리는 많은 다른 주식 히스토리에 대해 csv_to_dataset() 함수의 결과를 결합할 수 있을 것이다. 예를 들어, 우리는 AMZN, FB, GOOGL, MSFT, NFLX의 주식 히스토리를 훈련하고 AAPL 주식의 결과를 테스트할 수 있다.
먼저 사용하고자 하는 모든 주식에 대해 이 포스팅의 처음부터 다시 save_dataset 메소드를 실행한다. 데이터 세트 생성 방법은 다음과 같다.
기본적으로 현재 디렉터리의 각 csv 파일이 test_set_name 파일이 아닌 경우 해당 파일에서 데이터 집합을 로드하여 전체 데이터 세트에 추가한다. 그런 다음 test_set_name csv 파일을 로드하고 이를 테스트 데이터 세트로 사용한다. AMZN, NFLX, GOOGL, FB, MSFT의 주가를 이용하여 우리는 19854개의 훈련 샘플을 얻는다. AAPL 주식을 테스트 세트에 사용하여 4981개의 테스트 샘플을 얻는다.
SMA 인디케이터로 50 epoch에 대한 새롭고 더 큰 데이터 세트를 사용하여 훈련한 후, 우리는 하나의 주식에서만 훈련했을 때보다 더 높은 12.97의 조정된 MSE 값을 얻을 수 있다. 주식 예측이 실제 심볼에 따라 다를 수 있다. 서로 다른 주식이 약간 다른 방식으로 움직일 수 있다. 네트워크가 서로 다른 주식에서 훈련하고 일반화할 수 있었기 때문에 기본적으로 모두 비슷하게 행동한다는 것은 분명하지만, 가장 정확한 예측은 주식의 히스토리만을 훈련하는 것이 최선일 것이다. 결국, 마이크로소프트 데이터셋은 그것을 알아내기에 충분한 훈련 데이터를 가지고 있는 것 같다.
The Algorithm
괜찮은 주식 예측 알고리즘으로 무장한 필자는 그 주식의 히스토리을 고려해 볼 때 오늘 주식을 사고 팔기로 결정하는 봇을 만드는 순진한 방법을 생각했다. 본질적으로 당신은 다음날 주식의 시가를 예측하고, 만약 그것이 임계치를 넘으면 당신은 주식을 살 것이다. 만약 그것이 한계치보다 낮다면, 주식을 팔 것이다. 이 간단한 알고리즘은 실제로 꽤 잘 작동하는 것 같았다. 적어도 시각적으로는.
좋아 보인다! 알고리즘은 정확히 낮은 가격에 사고 높은 가격에 팔고 있는 것으로 보인다. 이 모든 것이 테스트 데이터, 즉 네트워크가 이전에는 보지 못했던 데이터라는 것을 기억하자. 이 데이터가 실제로 존재할 수 없었을 이유는 없으며, 이러한 거래는 실제로 실현된다!
이러한 매수와 매도를 고려할 때, 매 ‘매수’마다 10달러어치의 주식을 사들이고, 매 ‘매수’마다 전 주식을 판다면 알고리즘은 38.47달러를 벌었을 것이다. 하지만 500일 이상이라는 것을 명심하자. 알고리즘의 수익을 계산하는 코드는 다음과 같다.
만약 우리가 30일 동안 동일한 $10 구매 금액과 임계값 레벨 0.2를 사용하여 이 알고리즘을 시도했다면, 알고리즘은 겨우 $1.55를 벌었을 것이다. 하지만 없는 것보다는 낫지!
Trading algorithm for the MSFT stock over the past 30 days
The Conclusion
필자는 아직 예측 알고리즘에 대한 개선의 여지가 있다고 생각한다. 즉, 사용된 technical indicator, history_points 하이퍼 파라미터, 매수/매도 알고리즘/하이퍼 파라미터 및 모델 아키텍처가 모두 필자가 미래에 최적화하고 싶은 것이다.
AlphaVantage에서 사용할 수 있는 각 시간 단계마다 LSTM 분기가 하나씩 더 많아져서 네트워크가 단기, 중기 및 장기 추세에 따라 결정할 수 있도록 모델에 더 많은 데이터를 제공하는 방안도 검토하고자 한다.
이 프로젝트의 전체 코드는 필자의 GitHub에서 사용할 수 있다. 페이지에 피드백/개선 사항을 남겨 주세요!
필자는 이 프로젝트를 좀 더 확장해서 주식 예측을 위한 수치 데이터만으로 달성할 수 있는 것의 한계를 실제로 밀어붙일 계획이다.
References
[1]: https://www.experfy.com/blog/the-future-of-algorithmic-trading [2]: https://colah.github.io/posts/2015-08-Understanding-LSTMs/ [3]: https://jovianlin.io/why-is-normalization-important-in-neural-networks/ [4]: https://www.investopedia.com/terms/t/technicalindicator.asp [5]: https://www.investopedia.com/terms/s/sma.asp [6]: https://www.investopedia.com/terms/m/macd.asp [7]: https://www.investopedia.com/ask/answers/122314/what-exponential-moving-average-ema-formula-and-how-ema-calculated.asp오늘 배운 딥러닝은 5월 29일(토)에 개설되는
[실시간 온라인] 파이썬과 케라스를 이용한 딥러닝/강화학습 주식투자강의를 통해 심화하여 학습할 수 있습니다.
번역 – 핀인사이트 인턴연구원 강지윤([email protected])
원문 보러가기>
https://towardsdatascience.com/getting-rich-quick-with-machine-learning-and-stock-market-predictions-696802da94fe
빅데이터를 활용한 인공지능 주식 예측 분석
저금리 시대의 도래로 인해 많은 투자자들이 주식 시장으로 몰리고 있다. 과거의 주식 시장은 사람들이 기업 분석 및 각자의 투자기법을 통해 노동 집약적으로 주식 투자가 이루어졌다면 최근 들어 인공지능 및 데이터를 활용하여 주식 투자가 널리 이용되고 있는 실정이다. 인공지능을 통해 주식 예측의 성공률은 현재 높지 않아 다양한 인공지능 모델을 통해 주식 예측률을 높이는 시도를 하고 있다. 본 연구에서는 다양한 인공지능 모델에 대해 살펴보고 각 모델들간의 장단점 및 예측률을 파악하고자 한다. 이를 위해, 본 연구에서는 주식예측 인공지능 프로그램으로 인공신경망(ANN), 심층 학습 또는 딥 러닝(DNN), k-최근접 이웃 알고리즘(k-NN), 합성곱 신경망(CNN), 순환 신경망(RNN), LSTM에 대해 살펴보고자 한다.
With the advent of the low interest rate era, many investors are flocking to the stock market. In the past stock market, people invested in stocks labor-intensively through company analysis and their own investment techniques. However, in recent years, stock investment using artificial intelligence and data has been widely used. The success rate of stock prediction through artificial intelligence is currently not high, so various artificial intelligence models are trying to increase the stock prediction rate. In this study, we will look at various artificial intelligence models and examine the pros and cons and prediction rates between each model. This study investigated as stock prediction programs using artificial intelligence artificial neural network (ANN), deep learning or hierarchical learning (DNN), k-nearest neighbor algorithm(k-NN), convolutional neural network (CNN), recurrent neural network (RNN), and LSTMs.
[논문]주식시세 예측을 위한 딥러닝 최적화 방법 연구
초록
▼
본 연구에서는 딥러닝을 이용한 주가 예측 정확도를 높이기 위한 방법을 제시한다. 해당 주가 예측 플랫폼은 증권사 시스템 연계를 통한 주식시세 수집 및 예측 모델의 생성 및 하이퍼 -파라미터 최적화를 통한 Model튜닝 및 관련 거래 시간 피쳐의 제공을 추가하여 주가 예측치의 보다 높은 예측 정확도를 제공 한다. 주가 예측에 사용 되는 알고리즘은 순차적인 입력 데이터로 부터 이후의 데이터를 예측하는 순환 신경망(RNN : Recurrent Neural Network)을 사용한다. 순환 신경망은 기본적으로 일련의 순차적인 데이터를 학습…
본 연구에서는 딥러닝을 이용한 주가 예측 정확도를 높이기 위한 방법을 제시한다. 해당 주가 예측 플랫폼은 증권사 시스템 연계를 통한 주식시세 수집 및 예측 모델의 생성 및 하이퍼 -파라미터 최적화를 통한 Model튜닝 및 관련 거래 시간 피쳐의 제공을 추가하여 주가 예측치의 보다 높은 예측 정확도를 제공 한다. 주가 예측에 사용 되는 알고리즘은 순차적인 입력 데이터로 부터 이후의 데이터를 예측하는 순환 신경망(RNN : Recurrent Neural Network)을 사용한다. 순환 신경망은 기본적으로 일련의 순차적인 데이터를 학습하는데 정확도를 떨어뜨리고 과적합 문제를 발생시키는 장기의존성문제를 가지고 있는데, 이를 개선하기 위해 고안된 LSTM(Long Short Term Memory) 을 사용하여 주가 예측을 수행 하였다. 주가의 패턴에 따른 튜닝점을 탐색 하고자 지수 기반의 Kodex ETF 류의 종목과 단타 매매가 많이 이루어지는 변동성이 큰 종목의 데이터 를 수집하여 각 하이퍼 -파라미터 의 자동 검사를 구현 하였고, 모델 튜닝 의 결과를 검토 하였다. 추가로 각 종목의 시간별 주식 거래 패턴을 피쳐로 선정하여, 시간 피쳐의 적용시 주가 예측의 정확도가 증가함을 확인 하였다.
키워드
주가 예측, RNN, LSTM, cross validation, model tuning, 하이퍼 파라미터 , trading 거래시간 feature
서울대 강유 교수, 주가 예측 AI로 탑컨퍼런스 발표…국내 최초 성과
강유 서울대 컴퓨터공학부 교수(사진=서울대·KDD, 편집=박성은 기자)
인공지능(AI) 주가 예측은 AI 개발자는 물론 대중들도 크게 주목하는 주제다. 주식 투자 열풍이 사그라들지 않는 상황에서 AI 주가 예측이 가능해진다면 주식 시장 판도는 완전히 바뀔 것이기 때문이다.
연구자들이 AI 기반 주가 예측에 관심을 가지는 이유는 조금 다르다. 이들 사이에서는 AI 기반 주가 예측이 실현 가능한지에 대해서부터 의견이 분분하다. 예상치 못한 수많은 변수가 관여하는 분야이기에 주가 예측은 AI에게도 불가능한 영역이라 단언하기도 한다.
서울대 컴퓨터공학부 강유 교수 연구팀은 국내 최초로 주가 예측 AI 연구를 국제학술대회에 소개했다. 강 교수팀은 오는 8월 열리는 데이터 마이닝 분야 최고 국제학술대회 KDD 2021에 4개 논문이 채택되는 성과를 거뒀다.
KDD 2021에 채택된 논문 234편 중 한 연구실에서만 2%가 나온 것. 채택 논문 4편은 모두 상위 1% 성과를 의미하는 오럴 세션에서 발표하게 됐다. 이 중 1편이 AI 기반 주가 예측 관련 연구다.
이번 연구 성과는 특별한 AI 기술이 아닌 메인 아이디어에서 나왔다는 것이 강유 교수 설명이다. 연구팀은 정확한 가격을 맞추는 것이 아니라 가격의 상승 혹은 하락 여부만 예측하는 것을 목표로 정했다. 특히 한 회사 주가를 예측하는데 다른 여러 종목 데이터를 함께 활용한 것이 핵심이다.
실험 결과, 강유 교수팀이 개발한 주가 예측 AI는 미국·중국·일본·영국 4개국 기존 모델 성능을 모두 뛰어넘었다. 연구팀이 주식 투자에 직접 사용해보니 AI를 사용하지 않았을 때보다 1년에 최대 13.8% 이상 수익을 낼 수 있었다. 특정 국가에 한정되지 않고 글로벌 시장에 모두 적용 가능한 모델이 등장한 것도 처음이다.
세간의 관심이 높은 기술인 만큼 연구실 밖으로 나갈 준비도 빠르게 진행 중이다. 강유 교수가 설립한 3년차 스타트업 딥트레이드에서는 증권사와 함께 AI 주식 종목 추천 서비스를 개발하고 있다.
◆AI계 난제 주가 예측, 왜 어려울까?
주가 예측은 AI 적용 과제 중 특히 어려운 것으로 손꼽힌다. 한 기업의 주가에는 해당 회사 행보뿐만 아니라 다른 종목 기업이나 해외 시장 움직임까지 영향을 미치기 때문이다. 이렇듯 다양한 변수들은 항시 변화하며 상관관계를 가질 수도 있다.
인간에게는 불가능한 일에 가까운 주가 예측이란 과제를 AI가 소화할 수 있을 지에 대해서는 전문가들도 각기 다른 견해를 보인다.
주가 예측 AI 개발 어려움에 대해 강유 교수는 “주식 가격 결정에는 우선 수많은 참여자가 개입한다. 몇만명 참여자들 사이의 복잡한 상호작용을 모델링하는 것은 불가능하다. 국가 간 주식 시장 영향과 같은 외부 변수도 있다. 나스닥과 코스닥이 관련되는 식”이라고 말했다.
그는 “이미지 분류와 같은 과제는 사용 데이터가 클린하다. 고양이 그림을 고양이라고 분명히 레이블링할 수 있다. 반면 주가 예측 데이터와 같은 것은 노이즈가 많다고 표현한다. 온갖 이유로 가격이 변한다”고 설명했다.
데이터 변동 가능성이 극도로 높은 만큼 학습데이터를 과하게 학습하는 과적합(overfitting) 문제가 발생하기도 한다. 기존 학습데이터에 대해서는 오차가 감소하지만 실제데이터, 변화가 일어난 새로운 데이터에 대해서는 오차가 증가하게 되는 것이다.
강유 교수는 “다수 AI 연구자들이 AI 주가 예측은 불가능한 과제라고 단언하는 이유다. 주가 예측 AI 연구가 국제학술대회에 등장한 것도 최근”고 말했다.
◆정확한 가격 아닌 상승·하락 여부만 판단…타 종목 데이터까지 소화
강유 교수팀의 주가 예측 AI가 주목받는 이유는 특별한 AI 기술이 아닌 메인 아이디어에 있다. 정확한 주가를 맞추는 것이 아닌 주가 상승 혹은 하락 여부만 예측하는 것을 목표로 정한 점을 먼저 꼽을 수 있다. 특정 기업 주가 예측을 위해 다른 여러 종목 기업 데이터를 함께 활용한 것도 중요한 아이디어였다는 설명이다.
강 교수는 “당장 내일 테슬라 주식 가격을 예측하는 것은 어렵다. 하지만 주가가 오르는지 혹은 내리는지 여부 정도는 맞출 수 있다. 정확한 가격이 아닌 이러한 움직임만 맞추는 것을 문제로 정의했다”고 말했다.
이어 “삼성전자 주가 예측에 삼성전자 데이터 이외 다른 여러 종목 데이터, 하이닉스 데이터와 같은 것을 함께 활용했다. 어떤 종목 데이터가 삼성전자 주가 파악에 도움이 되는지 동적으로 맞추도록 한 것도 성과”라고 전했다.
어떤 종목 데이터를 더 활용해야 하는지 판단하는 일에는 데이터축(Data-axis) 트랜스포머를 사용했다. 주가 예측 견고성(robustness) 확보를 위해서는 글로벌 시장 지수와 개별 종목 패턴을 결합하는 멀티레벨 컨텍스트 벡터(multi-level context vector) 생성 방법을 적용했다.
강유 교수는 “주가 예측 AI 연구에서 어떤 종목 정보를 활용해야 하는지에 대해서는 원래 어텐션을 많이 쓴다. 어텐션 활용 방법 중 하나가 트랜스포머다. 트랜스포머를 적용한 것도 도움이 됐지만 메인 아이디어가 핵심 역할을 했다”고 강조했다.
◆기존 모든 모델 정확도 능가…1년간 13.8% 수익 올렸다
강유 교수팀이 개발한 주가 예측 AI는 미국, 중국, 일본, 영국 4개국 내 기존 기술의 성능을 모두 능가했다. 기존 미국 모델이 53.8% 정확도를 보였다면, 강 교수팀 모델은 57.4%를 기록했다.
강 교수는 “일반적으로 주가 예측 모델 성과를 평가하기 위해 가격 상승 혹은 하락에 대해 얼마나 잘 맞추는지 정확도를 계산한다. 보통 50% 정도면 본전을 찾았다고 하며 55% 정도만 돼도 굉장히 잘하는 것”이라고 설명했다.
개발한 모델을 활용해 실제 주식 투자를 해보는 것도 평가 방법 중 하나다. 강 교수 연구팀이 AI를 사용해 주식 투자를 진행해본 결과 1년간 13.8% 수익이 올랐다. 기존 영국 모델은 4.7%, 일본은 13%, 중국은 10.3% 성과를 보인 바 있다.
특정 국가에 한정되지 않고 글로벌 주식 시장 어디에든 적용 가능한 것도 큰 성과다. 강유 교수는 “기존에는 모든 국가에 적용 가능한 주가 예측 AI 모델이 없었다. 한 국가 데이터에만 맞춰 결과를 만드는 식이었다. 과적합 문제가 있기 때문에 쉽지 않은 것”이라고 말했다.
◆상용화 준비 이미 시작…증권사와 AI 주식 종목 추천 서비스 개발 중
국제학술대회에서 이제 주목받기 시작한 분야이지만 이미 상용화 준비도 이뤄지고 있다. 강유 교수는 3년 전 주가 예측 AI 스타트업 딥트레이드를 창업했다. 이번 강 교수팀 연구 성과도 딥트레이드 기술 개발에 고스란히 반영된다. 딥트레이드는 현재 국내 금융사와 AI 주식 종목 추천 서비스를 개발 중이다.
강유 교수는 “우리나라에서도 금융 AI를 하려는 회사들이 많다. 신한은행은 최근 네오 AI 펀드를 만들었고 다른 여러 증권사에서도 AI 적용 사업을 논의 중이다. 탑컨퍼런스에 주가 예측 AI 논문이 나온 것이 더욱 의미있는 이유”라고 강조했다.
이어 “딥트레이드에서는 현재 AI 기반 주가 예측 서비스 X 퍼센트를 개발 완료하고 베타 서비스를 진행 중이다. 한 증권사와는 AI 주식 종목 추천 서비스를 함께 개발하고 있다. 증권사의 특정 서비스를 이용하는 고객에게 부가서비스로 AI 수익 예측 정보를 제공하는 식”이라고 말했다.
이번 연구 성과는 주가 예측 이외 온라인 커머스와 같은 다른 영역에도 적용 가능하다. 시계열 데이터 AI를 적용한다는 공통점을 지니기 때문이다.
강 교수는 “이미지 인식 태스크에서는 정확한 레이블이 주어지지만 일상 속 많은 데이터는 그렇지 않다. 이러한 데이터에 대해 레이블 없이 패턴을 분석하고 유용한 활용법을 찾는 것이 데이터 마이닝이자 내 연구 주제”라고 말했다.
그는 “AI라고 해서 꼭 사람처럼 말하고, 듣고, 볼 필요가 없다. 시계열 데이터를 보고 주가 움직임을 예측하는 것은 사람 눈, 귀, 입과는 관련이 없는 것이다. 다양한 데이터를 활용할 수 있어야 한다”고 전했다.
AI타임스 박성은 기자 [email protected]
[관련기사]김동진 씽크풀 대표 “AI 매매비서 ‘라씨’, 매도 타이밍 고민 해결해준다” [관련기사]’주린이’를 도와라… AI 투자 열풍, 국내 로보어드바이저 앱 5종 소개
23. 주식시장은 예측 가능한가?
주식투자자에게 영원한 화두가 있다면 “주식시장의 흐름은 예측 가능한가?”라는 것이다. 주식시장에 참여하는 모든 투자자들은 – 포트폴리오 매니저, 투자자문가, 증권 브로커, 금융 관련 언론, 개인투자자 등 – 주식시장의 흐름을 알고 싶어 하고, 끊임없이 주식시장의 흐름을 예측하고자 다양한 지식과 도구들을 동원한다.
그러나 가치투자의 창시자인 벤저민 그레이엄은 “주식시장은 불치의 감정적 문제를 가지고 있어서 정신분열적이고 비논리적인 행위를 매일 일삼는다. 주식시장의 변동성은 합리적인 기대를 가지고 있는 것이 아니라, 이러한 감정적인 변화에 따라 수시로 변덕을 부린다.”라고 했으며, 피터 번스타인은 그의 저서 『리스크』에서 “신이 인간을 창조할 때 놓친 것이 있다면 바로 미래에 대한 불확실성이다.”라고 했다. 한마디로 말하면 주식시장의 단기적인 흐름을 예측하는 것은 불가능에 가깝다는 것이다. 그럼에도 불구하고 투자자들은 끊임없이 주식시장을 예측하고 싶어 한다. 그러나 주식시장이 예측한 대로 맞아떨어진다면 큰 수익을 올릴 수 있겠지만, 역으로 예측이 빗나간다면 큰 손실을 입고 말 것이다.
미국의 뱅가드그룹을 창업한 존 보글은 그의 저서 『성공하는 투자전략-인덱스펀드』에서 시장 예측을 근거로 한 단기투자 전략의 문제점을 두 가지 측면에서 비판한다. 첫 번째가 시장의 상승, 하락에 맞추어 주식을 매수·매도하는 마켓타이밍 방법이다. 이 방법은 주가가 급락할 것이라고 기대했을 때에는 주식으로부터 채권 또는 현금으로 이동했다가, 주식시장이 상승할 때 채권이나 현금을 다시 주식으로 이동시키는 것이다.
그러나 이 전략을 사용하는 대부분의 투자자들은 기대와는 반대되는 결과를 겪는 경향이 있다. 그들은 급락 시에 주식을 보유하고 있고, 상승 시에 채권이나 현금을 보유하곤 한다. 투자자들에게 언제 시장에 들어가야 하고, 언제 시장에서 나와야 하는지를 알려주는 신호가 있다는 생각은 그리 믿을만한 것이 못 된다. 나는 이 업종에 50년간 종사하면서 이 전략을 성공적으로, 그리고 지속적으로 실행한 사람을 보지 못했다. 그런 사람을 알고 있는 사람조차 모른다.
두 번째 단기투자 전략은 포트폴리오의 회전율을 급격히 높인다는 것이다. 높은 회전율이 높은 수익률로 이어진다는 증거를 아직까지 보지 못했다. 오히려 비용만 높이는 결과를 초래하여 수익률에 악영향을 끼치는 경우가 많다.
이상은 투자 대가들이 시장을 바라보는 관점을 잘 설명해주고 있다. 우리는 시장이 예측 가능하다는 기대를 버려야 하며, 주식시장의 변동에 대하여 지나치게 민감하게 반응하는 것을 자제해야 성공하는 투자자로 시장에 살아남을 수 있음을 명심해야 한다. 주식시장의 변동성은 단기적인 시장 예측이 아니라 장기투자를 통하여 관리할 수 있다. 앞으로 왜 장기투자인지, 장기투자가 어떻게 성공적인 투자로 이끌어 주는지 살펴보기로 하겠다.
키워드에 대한 정보 주식 예측
다음은 Bing에서 주식 예측 주제에 대한 검색 결과입니다. 필요한 경우 더 읽을 수 있습니다.
이 기사는 인터넷의 다양한 출처에서 편집되었습니다. 이 기사가 유용했기를 바랍니다. 이 기사가 유용하다고 생각되면 공유하십시오. 매우 감사합니다!
사람들이 주제에 대해 자주 검색하는 키워드 삼성전자 주식, 이더리움 시세 인공지능으로 예측해보자 – Python, Deep Learning
- 개발
- 인공지능
- 파이썬
- python
- ai
- deeplearning
- machinlearning
- 주식
- stock
- 비트코인
- 이더리움
- 암호화폐
- cryptocurrency
- bitcoin
- etherium
삼성전자 #주식, #이더리움 #시세 #인공지능으로 #예측해보자 #- #Python, #Deep #Learning
YouTube에서 주식 예측 주제의 다른 동영상 보기
주제에 대한 기사를 시청해 주셔서 감사합니다 삼성전자 주식, 이더리움 시세 인공지능으로 예측해보자 – Python, Deep Learning | 주식 예측, 이 기사가 유용하다고 생각되면 공유하십시오, 매우 감사합니다.