레이블이 머신러닝인 게시물을 표시합니다. 모든 게시물 표시
레이블이 머신러닝인 게시물을 표시합니다. 모든 게시물 표시

도구로써의 Machine Learning

   최근 기술의 발달은 꿈의 기술이라 불리는 인공지능(AI)를 가까이서 체험할 수 있는 계기를 만들어 주었다. '무어의 법칙'으로 대변할 수 있는 컴퓨터의 발달은 이미 개인용 기기가 수십년 전 메인프레임급의 컴퓨팅 파워를 갖게했다. 그리고 그것을 넘어 직접 서버를 사지 않고도 클라우드 컴퓨팅을 통해 초고성능 컴퓨터를 어디에서나 사용할 수 있게됐다.

   뉴럴네트워크를 위시한 인공지능 알고리즘은 1943년 처음 모형이 등장했고, 1980년대 연결주의란 이름으로 뇌의 뉴런 연결을 모형화하기 이른다. 하지만 지금에 비하면 조악한 컴퓨팅 파워로 인해 큰 발전을 하지못했고, 2000년대 중반까지도 발전이 더딘 분야였다. 하지만 컴퓨터 자체의 연산 능력이 늘어남은 물론, 클라우드 컴퓨팅 모델이 발달하면서 큰 전기가 마련된다. 특히 클라우드 컴퓨팅은 저렴한 비용으로 고성능 서버의 묶음을 사용하게 한다. 그럼으로써 비용만 충분히 지불한다면 거의 원하는만큼의 컴퓨터를 이용하여 뉴런의 연결을 표현할 수 있다. 그로인해 더 다양한 알고리즘이 등장한다. 특히 2010년경 발표된 'Recursive Neural Network'은 자연어, 시계열 등의 처리에 있어 획기적인 전기를 마련한다. 게다가 구글에서 발표한 'Tensorflow'와 이를 쉽게 사용하기 위한 API까지 등장해 사용자 접근성 또한 획기적으로 높아졌다.

   이런 큰 발전에 힘입어 일반 사용자들도 그 혜택을 보기 시작했다. 개인이 집에 둘 수 있는 인공지능 스피커가 있다. 이 스피커는 사용자의 말을 받아들여 연결되어있는 서버에서 답변을 처리해 사용자에게 돌려준다. 아x존의 에x, SxT의 누x 등이 있다. 스마트폰은 이미 S사와 A사가 모두 인공지능 비서를 내부에 탑재하고 있다. 그 외에 바둑을 스포츠로 삼는 동아시아권에서 구x 알파고의 승전보는 매우 큰 충격을 안겨주었다. 이렇다 보니 각종 매체에서 인공지능으로 대체될 직업의 이야기가 심심치않게 보이고, 마치 터x네이터2에서 보던 종말이 다가온 것이 아닌가 하는 영화적 걱정도 보인다.

   내 의견은 그런 걱정이 너무 지나치다는 것이다. 인공지능의 사용 추세를 보면 이미 변혁을 일으키기 위한 임계치 근처에 와 있다는 판단은 든다. 이미 사람들이 알게 모르게 인공지능을 접하고 있고, 많은 산업이 인공지능을 도입하여 생산성을 높이려 하고있다. 아마 조금의 시간이 지나면 스마트폰이나 인터넷이 그랬듯이 인공지능도 당당하게 필수 도구의 한 자리를 차지할 것이다. 그렇다면 인터넷과 스마트폰에 빗대어 앞으로를 예상해볼 수 있을 것 같다.

   스마트폰이나 인터넷이 등장하고 기술이 발전하면서 사라지거나 힘이 약해진 직업들이 있다. 전화 교환원, 타자를 대신 쳐주던 타자원, 인쇄에 꼭 필요하던 식자공 등이 있다. 하지만 그에 반해 생긴 직업도 있다. 각 회사마다 상주하는 네트워크 관리를 하는 사람, 스마트폰을 파는 사람, 스마트폰 어플리케이션을 개발하는 사람 등 다양하다. 즉, 기술의 발전이 단순히 파괴적 상황만을 가져왔다고 보기 힘들다는 이야기다.
 
   아직 어떤 방향으로 흐를지 정확히 예측하긴 어려우나, 인공지능도 앞선 기술과 비슷하게 대체재와 보완재의 역할을 수행할 것으로 판단한다. 의료, 금융, 통신 등 이미 인공지능을 도입하고 있는 곳도 비슷한 양상일 것이다. 물론 골드만삭스가 트레이딩 데스크를 모두 IT 인프라로 갈아엎었다는 기사가 났으나, 이것이 성공적이라는 판단은 아직 섣부르다. 이미 잘 나가는 '켄쇼'의 경우 머신러닝으로 데이터를 분석하고 리포팅하는 것이지 시장을 예측해 직접 투자에 나서는 것은 아니다.
   인공지능은 사람이 할 수 있는 분석보다 더 많은 양의 분석을 수행함으로써 최종 결정을 더 탄탄하게 만들어줄 수 있으나 최종 결정권자는 아니다. 최종적으로 인간이 인공지능을 통해 나온 결과와 데이터를 이해하고 본인의 전문 지식과 연결해야한다. 예전의 망치와 못이 지금의 컴퓨터와 인공지능이라는 도구로 바뀌는 것이고, 그 도구로 무엇을 만들지는 결국 개인, 회사의 몫이다.

   결론적으로 자신의 현 분야의 전문성이 뛰어나고 다른 분야와 연결시켜보는 것을 좋아하는 사람이 주도권을 쥘 것이다. 그런데 이상하지 않은가? 이미 이런 사람들은 예전부터 성공가도를 달렸다. 결국 성공하는 인재상은 크게 달라질 것이 없다.

3줄 요약)
1) 인공지능 많이 발전 해 도구의 위치까지 오고있음
2) 없어지는 직업도 생기는 직업도 있는데, 이는 이미 예전에도 그랬음
3) 그래도 어차피 될놈 될

Machine Learning을 이용한 주가 패턴 분석(2) - Genetic Algorithm

   0.  회사일 짬짬히 하다보니 아무래도 진도가 빠르진 않다. 하지만 하나 하나 해보며 정리를 하다보면 언젠간 결과가 나올 것이다.
   일단 지난번에 Random Optimization을 가지고 테스트를 해봤다. 최적화라는 것이 어느정도 무작위성을 가지고 있는 것은 맞다. 아무래도 처음 답을 찍어서 이리저리 흔들어보며 더 나은 방향으로 나아가기 때문일 것이다. 하지만 너무 대놓고 무작위로 답을 찾아들어가면 작업을 많이 돌리면 돌릴수록 결과가 나아질 가능성이 높아지긴 하나 그 보장이 없으므로 무엇인가 안정적이면서 멋도 조금 나는 것들을 찾아보기로 했다.
   최적화의 기본적인 알고리즘인 Hill Climb의 경우 이웃 해답이라는 개념이 있어야 하는데, 내가 풀고자 하는 문제에서는 이웃 해답을 정의하기가 애매했다. 그래서 멋도 나고 쓸만한 것으로 유전자 알고리즘을 선택하기로 했다.

   1. 유전자 알고리즘은 일단 무작위로 임의의 갯수로 답을 찾는다. 그리고 이를 모집단으로 사용하여 가장 적은 비용을 갖는 몇 개의 해답을 골라내고(엘리트), 이 해답들을 약간 비틀어(변이를 일으켜) 다시 같은 작업을 반복한다. 이렇게 하면 좋은 답에서 얻어진 유전자를 바탕으로 더 좋은 답을 얻을 수 있다는 것이 유전자 알고리즘의 기본 사상이다.
   내가 풀고자 하는 문제는 찾아야 할 것이, 주가 추세 직선을 구성하는 점의 갯수와 그 점의 위치이다. 여기서 어떤 것을 변이시킬지 찾아야 한다. 여기서 점 자체를 변이시키면 변이에 대한 경우의 수가 너무 많다. 해서 점의 갯수를 변이 시키기로 하고, 그에 따라 현재 물려받은 점 들에 새로운 점을 추가하거나, 기존의 점을 삭제하기로 했다.
$$
 P_i = \{ (x_1, y_1), ... ,(x_n, y_n) | n \} \rightarrow P_{i+1} = \{(x_1, y_1), ... , (x_m, y_m)|m\},  m = n+1
$$
   위의 경우는 $i$에서 $i+1$로 세대가 넘어가면서 점이 하나 추가된 경우이다. 단 기존 세대에서 받아온 점은 그대로 유지하고 새로운 점만 하나 더 추가를 한다. 이 때 추가 또는 삭제 대상 점의 선정은 무작위로 하도록 했다. 이렇게 하면 엘리트 집단 안의 하나의 엘리트는 각자 두 개의 자손(더하기, 빼기)을 갖게 된다.
   앞서의 과정을 임의의 충분한 횟수만큼 돌리거나, 몇 세대동안 더이상 발전이 없을 경우(최선의 답이 바뀌지 않을 경우) 멈추는 방식으로 구현한다.

   2. 이 작업을 하면서 비용 함수를 조금 손을 봤다. 일단 점의 갯수에 패널티를 줄 때, 스케일을 고려하여 점의 갯수에서 전체 데이터 수를 나누어 일종의 비율로 나타내도록 했다. 즉, 다음과 같은 비용 함수를
$$
C = \sum_{i=1}^{n}(\hat{y}_i - y_i)^2 + \omega m
$$
다음과 같이 고쳤다.
$$
C = \sum_{i=1}^{n}(\hat{y}_i - y_i)^2 + m / n
$$
여기서 $n$은 전체 데이터의 갯수이다.
   그리고 여기다 하나 더 추가했다. 무릇 추세선이라고 하면 그럴싸하게 넓직하게 나와야 더 좋아보일 것이다. 그래서 점간 거리($x$의 거리)를 비용으로 추가하기로 했다. 그러면 아무래도 바로 옆 점을 추가하는데 부담을 느끼게 될 것이고 추세를 나타내는 점이 조금 더 넓게 퍼질 것으로 기대할 수 있다. 일단, 점 간거리를 다음과 같이 정의하자.
$$
D = \{x_i - x_{i-1}\}, i=2,...n
$$
   이 값을 비용으로 사용하기 위해서는 점 간거리가 가까울수록 비용 부과를 더 해야하니 위의 벡터의 요소들을 각각 역수를 취하자.
$$
\hat{D}=\{ \frac{1}{x_i - x_{i-1}}\}
$$
   비용은 $\hat{D}$의 각 요소의 제곱의 합으로 나타내면 되므로 $ \hat{D}^T\hat{D}$ 로 표현할 수 있다. 그래서 최종적으로 현재 구현한 비용 함수는 다음과 같다.
$$
C = \sum_{i=1}^{n}(\hat{y}_i - y_i)^2 + m / n + \hat{D}^T\hat{D}
$$
   이런 식으로 찾아낸 주가 패턴 두가지를 아래 그림으로 첨부한다.



   3. 이제 이런 방식으로 구해진 패턴 데이터를 어떻게 머신 러닝에 적용할 데이터로 만들지 고민해봐야 한다. 아마도 텐서플로를 기반으로 작업을 진행할 것 같으니, 앞으론 텐서플로를 정리해보도록 하겠다.

Machine Learning을 이용한 주가패턴 분석(1) - Cost Function, Random Optimization

0. 시작
   최근 AI가 화두인지라 귀가 얇은 나도 역시 관심을 갖게 되었다. 그리고 업 자체가 금융업이다보니 시장을 AI를 이용하여 분석한다면 무엇인가 괜찮은 프로젝트가 나올 것 같다는 생각이 들었다. 하여, 주가패턴을 분석하는 프로젝트를 시작하고자 한다. 앞으로 올릴 포스트들은 그 프로젝트를 진행하면서 진행 상황을 기록하기 위한 목적이다.

1. 방법론 선택
   일단 주가 차트를 분석하기 위해서는 일정 기간의 주가 차트를 일정한 패턴으로 만들어내야 한다. 결국 추세를 어떻게 표현할지가 관건이다. 추세를 나타내는 방법은 MA(Moving Average)를 그린다든가 어떤 Regression 기법을 이용하여 그리는 방법을 사용할 수 있을 것이다. 하지만 이 방법들은 추세 표현력은 좋으나 Machine Learning을 사용하기 위한 데이터로 전환할 수 있는 방법이 쉽게 떠오르지 않았다. 그래서 더 단순하고 직관적인 방법을 찾으려 했다.
   나의 멘토이신 C박사님의 아이디어는 주가 차트를 임의의 직선의 조합으로 나타내 보자는 것이었고, 이 방식이라면 패턴 분석용 데이터를 만드는데 더 수월할 것이라는 판단이 들었다. 직선의 경우 기울기, 시작점, 끝점으로 단순히 표현할 수 있기 때문이다. 그래서 최적화 기법을 이용하여 직선 및 점의 갯수를 찾아내고 그 데이터를 이용하여 패턴 분석을 하기로 했다.

2. 프로그래밍 언어
   일단 최적화를 구현하기 위한 언어는 R로 선택하였다. 처음에 python과 R을 모두 고민했으나, 내 손에 편하고 데이터 분석에 강점이 있는 R을 사용하기로 했다.

3. 데이터
   주가 데이터는 팀 내의 데이터베이스 또는 블룸버그 터미널을 이용하여 S&P500 주가를 다운받아서 사용하였다. 단, 주가 자체의 값을 그대로 데이터로 이용할 경우 Cost Function을 구현하는데 있어 어떤 가중치를 정하는데 지수마다 달라질 수 있으므로, 주가를 정규화(normalization)을 한다. 여기서는 나에게 매우 익숙한 로그 수익률을 사용하였다.

$ y_i = \ln(\frac{S_i}{S_0}), i=1, ..., n $

 여기서 $y_i$는 정규화한 수익률이고 $S_i$는 포인트의 주가, $S_0$는 시작 지점의 주가이다. 그리고 x축의 경우 휴일 등의 변수가 있으므로 날짜로 하기보단 1부터 n까지의 정수를 사용하기로 했다.

4. Cost Function(비용 함수)
   최적화를 하기 위해서는 비용 함수가 중요하다. 이는 내가 생각한 답이 어느정도의 오류를 가지고 있는지 표현하기 위한 함수이다. 최적화는 이 오류(비용) 값을 가장 적게 할 수 있는 답을 찾는 것이다. 비용 함수에서 비용은 '직선 추정치($\hat{y}$)과 실제 주가수익률($y$)의 차이'가 하나 있고, 추정을 위해 사용하는 점의 수가 너무 많을 경우 overfitting의 문제가 있으므로 점의 갯수도 비용으로 들어가야 한다.
   주가 추정에 의한 차이는 잘 알려진 Least square로 하고 점의 갯수에 의한 패널티는 간단하게 일정 가중치를 점의 갯수에 곱하여 더하기로 했다.

 $ C = \sum_{i=1}^{n}(\hat{y}_i - y_i)^2 + \omega m $

   여기서 $n$은 전체 점의 갯수이고, $m$은 직선을 구성하기 위한 점의 수이다. 그리고 $\omega$는 패널티를 주기 위한 가중치인데, 앞으로 이 값을 어떻게 조절하느냐가 꽤 중요할 것이다. 이제 이 비용 함수를 이용하여 최적화 기법을 구현해보도록 하자

5. 가장 단순한 Random Search
   Random Search는 말 그대로 무작위로 추정용 점의 갯수와 위치를 찾는 방법이다. 테스트를 할 때 1만번을 돌도록 구현했고, 이 방법은 추후 구현할 최적화 기법과의 비교 용도로 사용할 것이다. 아래 간단한 결과 그래프를 첨부한다. 푸른색이 실제 주가 수익률이고 붉은색이 추정한 수익률이다.


   확실히 뭔가 어중간한 느낌은 있으나 나름 잘 찾아낸 것 같다. 앞으로 다양한 최적화 알고리즘을 구현하면서 그 결과를 살펴볼 것이다.

인생논어 - 1

  0. 조형권님이 쓴 <<인생논어>> 를 읽고 필사한다는 생각으로 구문들을 옮겨 적으려 한다.  1. 나만의 속도를 유지하라.   子曰, 射不主皮 爲力不同科 古之道也 (자왈, 사부주피 위력부동과 고지도야)  해석: 활을 쏠 때 ...