-
파이썬으로 하는 주식분석MACHINE LEARNING 2018. 2. 23. 07:42반응형
이 문서는 영문으로된 내용을 카카오 번역기를 활용하여 번역한 내용입니다.
개인적인 공부 및 추후 다시 볼 수 있도록 하기 위해 개인 블로그에 번역 내용을 옮겨 놓았습니다.
원문과 내용이 다를시 책임지지 않으며, 저작권 문제가 발생시 언제든 삭제 될 수 있습니다.원문보기 : https://towardsdatascience.com/stock-analysis-in-python-a0054e2c1a4c
객체 지향 프로그래밍 및 추가 모델을 이용한 재무 데이터 탐색
풍부한 데이터와 무료 오픈소스 도구를 이용해서 데이터 과학에 몰두하기는 쉽다. quandl financial library과 prophet modeling library에 약간의 시간을 할애한 후, 나는 간단한 주식 데이터 탐사를 해보기로 했다. 며칠 후 1000줄의 파이썬 코드를 작성한후, 나는 완벽한 주식 분석과 예측 도구를 갖게 되었다. 나는 개별 주식에 투자할 만큼 자신이 있는(또는 어리석은) 사람은 아니지만, 그 과정에서나 오픈소스의 정신으로 파이썬을 많이 배웠고, 다른 사람들이 혜택을 받을 수 있도록 내 결과와 코드를 공유하고 싶어 했다.
이 기사에서는 주식 분석과 예측을 위한 파이썬 클래스 기반 도구인 스토커를 어떻게 사용할 것인지를 보여줄 것이다(이 이름은 원래 임의적이었지만, 나는 그것이 ‘스톡 익스플로러’를 잘 나타낸다는 사실 이후에 결정했다). 나는 파이썬에서 객체 지향 프로그래밍의 기초인 수업을 정복하려고 여러 번 노력했지만, 대부분의 프로그래밍 주제와 마찬가지로 책을 읽을 때 결코 이해가 되지 않았다. 내가 이전에 해결하지 못했던 문제에 직면한 프로젝트에 깊이 빠져있을 때 마침내 그 개념이 이해되었다. 다시 한번 그 경험을 하는것은 이론적인 설명보다 낫다! 스토커를 탐사하는 것 외에 파이썬 클래스의 기본과 additive 모델 등 중요한 주제를 다루겠다. Stocker를 사용하고자 하는 모든 사용자의 경우 GitHub에서 사용 설명서와 함께 전체 코드를 찾을 수 있다. 스토커는 사용하기 쉽게 설계되어 있다(비록 파이썬이 처음 사용하는 사람들에게도). 이제 스토커의 분석 능력을 살펴보자!
스토커로 시작
필요한 라이브러리를 설치한 후 가장 먼저 해야 할 일은 스토커 클래스를 파이썬 세션으로 가져오는 것이다. 대화식 파이썬 세션이나 스크립트와 함께 디렉토리에서 시작된 Jupyter 노트북에서 이 작업을 수행할 수 있다.
from stocker import Stocker
이제 파이썬 세션에서 스토커 클래스를 사용하게 되고, 이를 사용하여 클래스의 인스턴스를 만들 수 있다. 파이썬에서는 클래스의 인스턴스를 객체라고하며 객체를 만드는 동작을 인스턴스화 또는 구성이라고한다. Stocker 객체를 만들기 위해서는 유효한 주식 시세 표시기의 이름을 전달해야한다.
microsoft = Stocker('MSFT')MSFT Stocker Initialized. Data covers 1986-03-13 to 2018-01-16.
이제, 스토커 클래스의 모든 속성을 가진 마이크로소프트 객체를 찾았다. Stocker는 quandl WIKI 데이터베이스를 기반으로하여 일일 가격 데이터 (전체 목록)로 3000 개 이상의 미국 주식에 액세스 할 수 있다. 이 예에서는 마이크로소프트의 데이터를 사용할 것이다. 마이크로소프트는 오픈소스와 정반대라고 생각할지 모르지만, 그들은 최근에 나를 낙천주의자로 만드는 몇 가지 변화를 일으켰고, 그들은 오픈소스 커뮤니티(파이썬을 포함해)를 포용하고 있다.
파이썬의 클래스는 속성과 메서드의 두 가지 주요 부분으로 구성된다. 간단하게 설명하면 속성은 클래스 전체 또는 클래스의 특정 인스턴스 (객체)와 관련된 값 또는 데이터다. 메서드는 해당 데이터에 대해 작동 할 수있는 클래스에 포함 된 함수다. Stocker 객체의 한 속성은 속성이 객체를 구성할 때 객체와 연결된 특정 회사의 주식 데이터이다. 속성에 액세스하여 다른 변수에 할당할 수 있다.
# Stock is an attribute of the microsoft object
stock_history = microsoft.stock
stock_history.head()파이썬 클래스의 이점은 메소드 (함수)와 그들이 작동하는 데이터가 동일한 객체와 연관되어 있다는 것이다. 우리는 주식의 전체 역사를 그리기 위해 Stocker 객체의 방법을 사용할 수 있다.
# A method (function) requires parentheses
microsoft.plot_stock()Maximum Adj. Close = 89.58 on 2018-01-12.Minimum Adj. Close = 0.06 on 1986-03-24.Current Adj. Close = 88.35.
표시된 기본값은 주식 분할을 설명하는 조정 종료 가격이다(하나의 주식이 여러 주식으로 분할 될 때, 예를 들어, 2, 각각의 새로운 주식은 원래 가격의 1/2에 해당한다).
이것은 구글 검색에서 찾을 수 있는 꽤 기본적인 플롯이지만, 몇줄의 파이썬으로 직접 만드는 것은 만족스러운 부분이 있다! plot_stock 함수에는 여러 가지 선택적 인수가 있다. 기본적으로 이 방법은 전체 날짜 범위에 대해 조정 종료 가격을 표시한다. 하지만 우리는 범위, 플롯할 통계, 플롯의 유형을 선택할 수 있다. 예를 들어, 일일 가격 변동을 거래되는 조정 볼륨 (주 수)과 비교하려면 함수 호출에 있는 가격을 지정할 수 있다.
microsoft.plot_stock(start_date = '2000-01-03', end_date = '2018-01-16', stats = ['Daily Change', 'Adj. Volume'], plot_type='pct')
Maximum Daily Change = 2.08 on 2008-10-13.Minimum Daily Change = -3.34 on 2017-12-04.Current Daily Change = -1.75.
Maximum Adj. Volume = 591052200.00 on 2006-04-28.Minimum Adj. Volume = 7425503.00 on 2017-11-24.Current Adj. Volume = 35945428.00.
y축은 통계량의 평균값에 대한 백분율 변화에 해당한다. 이 척도는 일일 부피가 원래 수억의 범위를 가진 주식에 있기 때문에 필요하며, 일일 가격 변화는 일반적으로 몇 달러이다! 백분율로 변환하면 비슷한 규모로 두 데이터 세트를 모두 볼 수 있다. 그래프는 거래되는 주식의 수와 일일 가격 변화 사이에 상관 관계가 없음을 보여준다. 이는 놀라운데, 사람들이 스윙을 이용하기 위해 서둘러서 더 많은 주가 변동이 있을 때 더 많은 주식이 거래될 것으로 예상했을 수도 있기 때문이다. 그러나 실제 추세는 거래량이 시간이 지남에 따라 감소한다는 것이다. 또한 2017년 12월 4일에 가격이 현저하게 하락한것은 마이크로소프트에 관한 뉴스 기사와 연관이 있을 수 있다. 12월 3 일에 대한 빠른 뉴스 검색은 다음과 같다.
마이크로소프트 주식이 다음 날 10년 만에 가장 큰 가격 하락한다는 어떠한 징후도 보이지 않는 것 같다! 사실 우리가 뉴스를 바탕으로 주식 시장을 장악하고 있었다면 NFL(두 번째 결과)과의 거래가 긍정적인 것처럼 들렸기 때문에 주식을 사고 싶은 유혹을 느꼈을 것이다.
plot_stock을 사용하면 날짜 범위에 걸친 데이터의 수량을 조사하고 실제 이벤트와의 상관 관계를 찾을 수 있다 (있을 경우). 지금은 Stocker의 더 즐거운 부분 중 하나인 가짜 돈을 벌기 위해 나아갈 것이다!
회사의 초기 공개 오퍼링 (IPO)에서 Microsoft의 100 주에 투자 할 생각이 들었던 순간을 가정 해 보자. 우리가 지금 얼마나 더 부자가 되어 있을까?
microsoft.buy_and_hold(start_date='1986-03-13',
end_date='2018-01-16', nshares=100)MSFT Total buy and hold profit from 1986-03-13 to 2018-01-16 for 100 shares = $8829.11
우리의 기분을 좋게하는 것 외에도 이러한 결과를 사용하면 이익을 극대화하기 위해 시간을 거슬러 여행 계획을 세울 수 있다.
우리가 너무 자신감이 있다면, 우리는 돈을 잃기 위해 결과를 조정할 수 있다 :
microsoft.buy_and_hold(start_date='1999-01-05',
end_date='2002-01-03', nshares=100)MSFT Total buy and hold profit from 1999-01-05 to 2002-01-03 for 100 shares = $-56.92
놀랍게도, 주식 시장에서 돈을 잃는 것은 가능하다!
Additive Models
Additive Model은 실제 데이터의 가장 일반적인 유형 중 하나인 시계열을 분석하고 예측하는 강력한 도구이다. 개념은 간단하다. 시계열을 다른 시간 척도와 전반적인 추세의 패턴 조합으로 나타낸다. 우리는 마이크로소프트 주식의 장기적인 추세가 꾸준히 증가하고 있다는 것을 알고 있지만, 매주 화요일마다 증가하는 것과 같이 매년 또는 매일 패턴이 있을 수 있다. 일일 관찰 자료 (예 : 주식)와 함께 시계열을 분석하기 위한 훌륭한 라이브러리는 Facebook에 의해 개발된 Prophet이다. 스토커는 모든 모델링 작업을 Prophet과 함께 수행하므로 간단하게 메서드 호출을 사용하여 모델을 만들고 검사할 수 있다.
model, model_data = microsoft.create_prophet_model()Additive Model은 데이터의 잡음을 부드럽게 처리하므로 모델링된 선이 관측치와 정확히 일치하지 않는다. Prophet 모델은 불확실성을 계산한다. 불확실성은 모델링에서 필수적인 부분이다. 실생활에서 변동하는 과정을 다룰 때 우리의 예측을 결코 확신 할 수 없기 때문이다. 우리는 미래에 대한 예측을 하기 위해 Prophet 모델을 사용할 수 있지만, 지금은 과거의 데이터에 더 관심이 있다. 이 메서드 호출은 변수에 할당한 두 개의 객체, 즉 모델과 일부 데이터를 반환했다. 이제 이러한 변수를 사용하여 시계열 성분을 표시한다.
# model and model_data are from previous method call
model.plot_components(model_data)
plt.show()전반적인 추세는 지난 3년간 증가이다. 또한 9 월과 10 월에 가격이 바닥을 치고 11 월과 1 월에 최고점에 도달하는 눈에 띄는 연간 패턴 (하단 그래프)이 있는 것으로 보인다. 시간 척도가 감소하면 데이터가 더 시끄럽게 된다. 보통 한 달은, 소음보다 신호가 더 많이 있다! 주간 패턴이 있을 수 있다고 믿는다면 Stocker 객체의 weekly_seasonality 속성을 변경하여 Prophet 모델에 추가할 수 있다.
print(microsoft.weekly_seasonality)
microsoft.weekly_seasonality = True
print(microsoft.weekly_seasonality)False True
weekly_seasonalityis 는 False가 기본값이지만, 우리는 모델에 주간 패턴을 포함하기위해 변경했다. 그런 다음 create_prophet_model을 다시 호출해서 결과 구성 요소를 그래프로 표시한다. 다음은 새 모델의 주간 패턴이다.
주말은 무시할 수 있다. 왜냐하면 가격은 일주일 동안만 변하기 때문이다(실제로 시간외 거래로 가격이 조금씩 변하지만 분석에는 영향을 미치지 않는다). 안타깝게도, 우리가 사용할 수 있는 한 주 동안의 추세는 없으며, 모델링을 계속하기 전에 우리는 주간 패턴을 껐다. 이 동작은 예상된다: 주식 데이터를 사용하면 시간 척도가 감소함에 따라 잡음으로 인해 신호가 소거되기 시작합니다. 주식의 움직임은 기본적으로 무작위적이며, 우리가 추세를 볼 수 있는 것은 연간 규모로 확대할때이다. 이것이 왜 일일 주식 게임을 하지 말아야 하는지를 상기시키는 좋은 신호가 되기를 바란다!
변화점
변화점은 시계열이 증가하는 것에서 감소하는 것 또는 그 반대로 진행될 때 발생한다 (더 엄격한 의미에서 시계열의 비율이 가장 큰 곳에 위치한다). 주식이 정점에 도달하거나 반등하려고 하는 시기를 알기 때문에 이러한 시기는 매우 중요하다. 변화점의 원인을 파악하면 주식 가치의 향후 변동을 예측할 수 있다. 스토커 개체는 자동으로 우리에게 가장 큰 10개의 변경점을 찾을 수 있다.
microsoft.changepoint_date_analysis()
Changepoints sorted by slope rate of change (2nd derivative):
Date Adj. Close delta
48 2015-03-30 38.238066 2.580296337 2016-05-20 48.886934 2.231580409 2016-09-01 55.966886 -2.05396572 2015-05-04 45.034285 -2.040387313 2016-04-18 54.141111 -1.936257
변화점은 주가의 봉우리나 계곡과 일치하는 경향이 있다. Prophet은 데이터의 처음 80%에서만 변경 점을 찾지만 그럼에도 불구하고 이러한 결과는 실제 이벤트와 상호 연관시킬 수 있기 때문에 유용하다. 우리는 앞서 했던 일을 반복해서 구글 뉴스를 수동으로 검색할 수 있지만, 나는 스토커가 우리를 위해 그렇게 한다면 더 나을 것이라고 생각했다. 구글 검색에서 검색어의 인기를 시간이 지남에 따라 볼 수 있는 구글 검색 트렌드 도구를 본 적이 있을 것이다. 스토커는 원래 데이터에 결과를 지정하고 표시하는 검색 용어에 대해 자동으로 이 데이터를 검색할 수 있다. 검색 용어의 빈도를 찾아 그래프로 표시하기위해 이전 메서드 호출을 수정한다.
# same method but with a search term
microsoft.changepoint_date_analysis(search = 'Microsoft profit')Top Related Queries:
query value
0 microsoft non profit 1001 microsoft office 552 apple 303 microsoft 365 304 microsoft office 365 20
Rising Related Queries:
query value
0 microsoft 365 1201 microsoft office 365 902 microsoft profit 2014 70
상대 검색 빈도를 그래프로 표시하는 것 외에도 Stocker는 그래프의 날짜 범위에 대한 상단 관련 쿼리와 상단 상승 쿼리를 표시한다. 그래프에서 y 축은 값을 최대 값으로 나누어 0과 1 사이에서 정규화되므로 두 변수를 다른 척도와 비교할 수 있다. 이 수치를 보면 ‘마이크로소프트 이익’ 검색과 마이크로소프트 주가 사이에는 상관관계가 없는 것으로 보인다.
만약 우리가 상관관계를 발견했다면, 인과관계에 대한 문제는 여전히 있을 것이다. 검색이나 뉴스가 가격을 변경했는지 아니면 가격 변경으로 인해 검색이 발생했는지 여부를 알 수 없다. 유용한 정보가 있을 수도 있지만, 많은 우연한 상관관계도 있다. (그런 무작위적인 관계에 대한 유머러스한 견해를 보려면 가짜 상관 관계를 확인하자.). 여러분이 흥미로운 트렌드를 찾을 수 있는지 알아보기 위해 몇 가지 다른 용어를 자유롭게 시도해 보길 바란다!
microsoft.changepoint_date_analysis(search = 'Microsoft Office')
사무실에 대한 검색이 감소하면 주가 상승으로 이어진다. 누군가 마이크로소프트에 알려야 할지도 몰라.
예측
우리는 스토커 능력의 전반부만을 탐구해 왔다. 후반은 미래의 주가를 예측하거나 예측하기 위해 고안되었다. 비록 이것이 쓸데없는 활동일 수도 있지만(적어도 보상을 받지 못할 수도 있다), 그 과정에서 배울 것은 여전히 많다! 예측에 관한 미래의 기사에 집중하거나, 스토커와 함께 예측을 시작하라(자세한 내용은 설명서를 확인하라). 우선은 한 가지 이미지를 더 남겨두겠다.
# specify number of days in future to make a prediction
model, future = microsoft.create_prophet_model(days=180)Predicted Price on 2018-07-15 = $97.67
스토커의 모든 역량은 이미 공개되어 있지만, 이 도구를 만드는 과정은 즐겁고 더 중요한 것은 데이터 과학, 파이썬, 그리고 주식 시장에 대해 대학 과정보다 더 많이 가르쳐 주었다. 우리는 누구나 프로그래밍이나 심지어는 공식적인 교육 없이 기계 학습과 같은 최첨단 분야에 대해 배울 수 있는 민주화된 지식의 놀라운 시대에 살고 있습니다. 프로젝트에 대한 아이디어가 있지만 충분히 알지 못하거나 전에도 이미 해본 일이 있다는 것을 알았다면, 그 아이디어가 당신을 멈추게 하지 마라. 더 나은 해결책을 개발할 수도 있고, 그렇지 않더라도, 당신은 처음부터 시작하지 않았던 것보다 더 나은 것을 알고 더 많은 것을 알게 될 것이다!
언제나처럼, 나는 건설적인 비판과 피드백을 환영한다. @koehrsen_will에서 트위터로 연락할 수 있습니다.
반응형'MACHINE LEARNING' 카테고리의 다른 글
간단하게 설명한 Random Forest (0) 2018.03.03 파이썬으로 하는 주식 예측 (0) 2018.03.01 법률문서의 주제 모델링과 요약을 위한 NLP (0) 2018.02.02 확률 개념 설명 : 매개 변수 추정에 대한 베이지안 추론 (0) 2018.01.18 확률 개념 설명 : 최대 우도 추정 (0) 2018.01.17