기계 학습 및 딥 러닝 기술을 사용한 주가 예측(파이썬 코드 포함)

소개

주식 시장이 어떻게 수행 될지 예측하는 것은 가장 어려운 일 중 하나입니다. 예측에 관련된 많은 요인이 있습니다-물리적 요인 대 식물 학적,합리적이고 비이성적 인 행동 등 이러한 모든 측면은 높은 수준의 정확도로 예측하기 휘발성 및 매우 어려운 주가를 만들기 위해 결합.

이 영역에서 기계 학습을 게임 체인저로 사용할 수 있습니까? 조직에 대한 최신 공지 사항,분기 별 수익 결과 등과 같은 기능을 사용합니다.,기계 학습 기술은 이전에 보지 못했던 패턴과 통찰력을 발굴 할 수있는 잠재력을 가지고 있으며,이는 정확하게 정확한 예측을하는 데 사용될 수 있습니다.

주가 예측,기계 학습

이 기사에서는 상장 회사의 주가에 대한 과거 데이터와 함께 작업 할 것입니다. 우리는 평균화 및 선형 회귀와 같은 간단한 알고리즘으로 시작하여이 회사의 미래 주가를 예측하는 기계 학습 알고리즘의 혼합을 구현 한 다음 자동 아리마와 같은 고급 기술로 넘어갈 것입니다.

이 문서의 핵심 아이디어는 이러한 알고리즘이 어떻게 구현되는지 보여주는 것입니다. 나는 짧게 기술을 기술하고 필요에 따라 개념에 위로 솔질하기 위하여 타당한 연결을 제공할 것이다. 시계열의 세계에 새로 온 사람이라면 먼저 다음 기사를 살펴 보는 것이 좋습니다:

  • 시계열 예측을 만드는 포괄적 인 초보자 가이드
  • 시계열 모델링에 대한 완전한 자습서
  • 무료 코스:파이썬을 사용한 시계열 예측

시계열 예측 연습 프로젝트

시계열 예측&모델링은 데이터 분석에서 중요한 역할을합니다. 시계열 분석은 계량 경제학&운영 연구와 같은 분야에서 광범위하게 사용되는 통계의 전문 분야입니다.

시계열은 분석&데이터 과학에서 널리 사용되고 있습니다. 이것은 특별히 당신을 위해 시계열 문제를 설계하고 문제는 트래픽을 예측하는 것입니다.

지금 연습

데이터 과학 여행을 시작할 장소를 찾는 초보자입니까? 지식과 데이터 과학 학습의 전체 포괄적 인 과정을 제시,당신을 위해 큐레이터! 이 과정은 기계 학습의 기초부터 기계 학습,딥 러닝 및 시계열의 고급 개념에 이르기까지 모든 것을 다룹니다.

  • 인증된 인공지능&블랙벨트+프로그램

목차

    1. 문제 설명 이해
    2. 이동 평균
    3. 선형 회귀
    4. 케이-가장 가까운 이웃
    5. 자동 아리마
    6. 예언자
    7. 장기 단기 기억)

문제 설명 이해

우리는 곧이 문서의 구현 부분에 뛰어들 것입니다,하지만 먼저 우리가 해결하고자하는 것을 설정하는 것이 중요합니다. 대체로 주식 시장 분석은 기본 분석과 기술적 분석의 두 부분으로 나뉩니다.

  • 근본적인 분석은 현재의 비즈니스 환경과 재무 성과를 기반으로 회사의 미래 수익성을 분석하는 것을 포함합니다.
  • 반면 기술적 분석에는 차트를 읽고 통계 수치를 사용하여 주식 시장의 추세를 파악하는 것이 포함됩니다.

당신이 짐작할 수 있듯이,우리의 초점은 기술적 분석 부분에있을 것입니다. 우리는 콴들(여기에서 다양한 주식에 대한 기록 데이터를 찾을 수 있음)의 데이터 세트를 사용할 것이며,이 특정 프로젝트를 위해’타타 글로벌 음료’에 대한 데이터를 사용했습니다. 다이빙 할 시간!

참고:다음은 코드에 사용한 데이터 집합입니다.

다운로드 먼저 데이터 집합을 로드하고 문제의 대상 변수를 정의합니다:

#import packagesimport pandas as pdimport numpy as np#to plot within notebookimport matplotlib.pyplot as plt%matplotlib inline#setting figure sizefrom matplotlib.pylab import rcParamsrcParams = 20,10#for normalizing datafrom sklearn.preprocessing import MinMaxScalerscaler = MinMaxScaler(feature_range=(0, 1))#read the filedf = pd.read_csv('NSE-TATAGLOBAL(1).csv')#print the headdf.head()

데이터 집합에는 날짜,열기,높음,낮음,마지막,닫기,총 거래량 및 매출액과 같은 여러 변수가 있습니다.

  • 열기 및 닫기 열은 주식이 특정 일에 거래되는 시작 및 최종 가격을 나타냅니다.
  • 높음,낮음 및 마지막은 해당 요일의 최대,최소 및 마지막 가격을 나타냅니다.
  • 총 무역 수량은 하루에 구입 또는 판매 주식의 수와 회전율(락스)주어진 날짜에 특정 회사의 회전율이다.

주목해야 할 또 다른 중요한 점은 시장이 주말과 공휴일에 폐쇄된다는 것입니다.위의 표를 다시 확인하면 일부 날짜 값이 누락되었습니다(2/10/2018,6/10/2018,7/10/2018). 이 날짜 중 2 일은 공휴일이며 6 일과 7 일은 주말에 떨어집니다.

손익 계산은 일반적으로 하루 종가의 종가에 의해 결정되므로 종가를 목표 변수로 간주합니다. 대상 변수를 그려서 데이터에서 어떻게 형성되는지 이해합시다:

#setting index as datedf = pd.to_datetime(df.Date,format='%Y-%m-%d')df.index = df#plotplt.figure(figsize=(16,8))plt.plot(df, label='Close Price history')

곧 섹션에서,우리는 이러한 변수를 탐구하고 주식의 일일 종가를 예측하는 다른 기술을 사용합니다.

이동 평균

소개

‘평균’은 우리가 일상 생활에서 사용하는 가장 일반적인 것 중 하나입니다. 예를 들어,전반적인 성능을 결정하기 위해 평균 점수를 계산하거나,오늘의 온도에 대한 아이디어를 얻기 위해 지난 며칠의 평균 온도를 찾는 것-이 모든 것은 우리가 정기적으로하는 일상적인 작업입니다. 그래서 이것은 우리의 데이터세트에서 예측을 하기 위한 좋은 출발점입니다.

매일 예측된 종가는 이전에 관측된 값 집합의 평균이 됩니다. 단순 평균을 사용하는 대신 각 예측에 대한 최신 값 집합을 사용하는 이동 평균 기술을 사용합니다. 즉,각 후속 단계에 대해 예측된 값이 고려되고 세트에서 가장 오래된 관찰된 값이 제거됩니다. 여기 너가 명확성에 이것을 더 이해할것을 도울 것이다 간단한 숫자는 있는다.

이 기술을 데이터 세트에 구현할 것입니다. 첫 번째 단계는 날짜 및 마감 가격 열만 포함하는 데이터 프레임을 만든 다음 기차 및 유효성 검사 세트로 분할하여 예측을 확인하는 것입니다.

구현

모델 수행 방법을 이해 하는 데 도움이 되지 않습니다. 보다 직관적 인 이해를 얻기 위해 이것을 시각화합시다. 그래서 여기에 실제 값과 함께 예측 된 값의 플롯이 있습니다.

#plotvalid = 0valid = predsplt.plot(train)plt.plot(valid])

유추

유추 값은 105 에 가깝지만 결과는 그리 유망하지 않습니다(플롯에서 수집 할 수 있음). 예측된 값은 기차 집합에서 관찰된 값과 같은 범위입니다(처음에는 증가하는 추세가 있고 그 다음에는 느린 감소가 있습니다).

다음 섹션에서는 일반적으로 사용되는 두 가지 기계 학습 기술인 선형 회귀 분석 기술을 살펴보고 주식 시장 데이터에서 어떻게 수행되는지 확인합니다.

선형 회귀

소개

이 데이터에 구현할 수있는 가장 기본적인 기계 학습 알고리즘은 선형 회귀입니다. 선형 회귀 모델은 독립 변수와 종속 변수 간의 관계를 결정하는 수식을 반환합니다.

선형 회귀 방정식은 다음과 같이 쓸 수 있습니다:

여기,1 배,2 배,….독립 변수를 나타내는 반면 계수는 독립 변수를 나타냅니다. 예를 들어,가중치를 계산하려면 가중치를 계산해야합니다. 다음 문서를 참조하여 선형 회귀 분석을 보다 자세히 연구할 수 있습니다:

  • 선형,능선 및 올가미 회귀에 대한 포괄적 인 초보자 가이드.

우리의 문제 문,우리는 독립 변수의 집합이 없습니다. 대신 날짜 만 있습니다. 날짜 열을 사용하여 일,월,년,월/금 등과 같은 기능을 추출합시다. 그런 다음 선형 회귀 모델을 맞 춥니 다.

구현

먼저 데이터 집합을 오름차순으로 정렬한 다음 별도의 데이터 집합을 만들어 만든 새 기능이 원래 데이터에 영향을 주지 않도록 합니다.

#setting index as date valuesdf = pd.to_datetime(df.Date,format='%Y-%m-%d')df.index = df#sortingdata = df.sort_index(ascending=True, axis=0)#creating a separate datasetnew_data = pd.DataFrame(index=range(0,len(df)),columns=)for i in range(0,len(data)): new_data = data new_data = data
#create featuresfrom fastai.structured import add_datepartadd_datepart(new_data, 'Date')new_data.drop('Elapsed', axis=1, inplace=True) #elapsed will be the time stamp

이 같은 기능을 만듭니다:

‘년’,’월’,’주’,’일’,’주’,’일 년’,’월 끝’,’월 시작’,’쿼터 끝’,’쿼터 시작’,’연도 끝’및’연도 시작’.이 문제를 해결하는 데 도움이되는 몇 가지 방법이 있습니다. 당신이 그것을 설치하지 않은 경우,당신은 단순히 명령을 사용할 수 있습니다. 그렇지 않으면 파이썬에서 간단한 루프를 사용하여 이러한 기능을 만들 수 있습니다. 나는 아래의 예를 보여 주었다.

이 외에도 예측과 관련이 있다고 생각하는 자체 기능 세트를 추가 할 수 있습니다. 예를 들면,나의 가설은 주의 첫번째 그리고 마지막 일이 잠재적으로 다른 일 보다는 주식의 종가에 멀리 좀더 영향을 미칠 수 있었다 이다. 그래서 주어진 날이 월요일/금요일 또는 화요일/수요일/목요일인지 여부를 식별하는 기능을 만들었습니다. 이 작업은 다음 코드 줄을 사용하여 수행 할 수 있습니다:

new_data = 0for i in range(0,len(new_data)): if (new_data == 0 or new_data == 4): new_data = 1 else: new_data = 0

요일이 0 또는 4 인 경우 열 값은 1 이되고 그렇지 않으면 0 이됩니다. 마찬가지로 여러 기능을 만들 수 있습니다. 당신이 주가를 예측에 도움이 될 수있는 기능에 대한 몇 가지 아이디어가있는 경우,코멘트 섹션에서 공유하시기 바랍니다.

이제 데이터를 기차 및 유효성 검사 세트로 분할하여 모델의 성능을 확인합니다.

#split into train and validationtrain = new_datavalid = new_datax_train = train.drop('Close', axis=1)y_train = trainx_valid = valid.drop('Close', axis=1)y_valid = valid#implement linear regressionfrom sklearn.linear_model import LinearRegressionmodel = LinearRegression()model.fit(x_train,y_train)

결과

#make predictions and find the rmsepreds = model.predict(x_valid)rms=np.sqrt(np.mean(np.power((np.array(y_valid)-np.array(preds)),2)))rms
121.16291596523156

이는 선형 회귀 분석이 제대로 수행되지 않았음을 분명히 보여줍니다. 의 플롯을 살펴보고 선형 회귀 잘 수행하지 않은 이유를 이해하자:

#plotvalid = 0valid = predsvalid.index = new_data.indextrain.index = new_data.indexplt.plot(train)plt.plot(valid])

추론

선형 회귀는 간단한 기술이며 해석하기가 매우 쉽지만 몇 가지 명백한 단점이 있습니다. 회귀 알고리즘을 사용하는 한 가지 문제는 모델이 날짜 및 월 열에 너무 적합하다는 것입니다. 예측 시점의 이전 값을 고려하는 대신 모델은 한 달 전 같은 날짜 또는 1 년 전 같은 날짜/월의 값을 고려합니다.

위의 플롯에서 볼 수 있듯이,1 월 2016 1 월 2017,주가 하락이 있었다. 이 모델은 1 월 2018 에 대해서도 동일하게 예측했습니다. 선형 회귀 기술은 독립 기능이 목표 값을 결정하는 데 유용한 빅 마트 판매와 같은 문제에 대해 잘 수행 할 수 있습니다.여기서 사용할 수 있는 또 다른 흥미로운 알고리즘은 다음과 같습니다. 독립 변수를 기반으로 새 데이터 요소와 이전 데이터 요소 간의 유사성을 찾습니다. 나를 간단한 보기에 이것을 설명하는 시키십시요.

11 명의 신장과 나이를 고려하십시오. 주어진 기능(‘나이’및’높이’)을 기반으로 테이블은 아래 그림과 같이 그래픽 형식으로 나타낼 수 있습니다:

이 경우 가장 가까운 이웃의 가중치를 고려합니다. 신분증#11 의 무게는 이웃 사람의 평균이 될 것으로 예측됩니다. 우리가 세 이웃을 고려한다면(케이=3)지금,아이디#11 의 무게는 다음과 같습니다= (77+72+60)/3 = 69.66 킬로그램.

에 대한 자세한 이해를 위해 다음 문서를 참조 할 수 있습니다:

  • 케이-가장 가까운 이웃 소개: 단순화 된

  • 실제 소개 케이-회귀에 대한 가장 가까운 이웃 알고리즘

구현

#importing librariesfrom sklearn import neighborsfrom sklearn.model_selection import GridSearchCVfrom sklearn.preprocessing import MinMaxScalerscaler = MinMaxScaler(feature_range=(0, 1))

마지막 섹션의 동일한 기차 및 유효성 검사 세트 사용:

#scaling datax_train_scaled = scaler.fit_transform(x_train)x_train = pd.DataFrame(x_train_scaled)x_valid_scaled = scaler.fit_transform(x_valid)x_valid = pd.DataFrame(x_valid_scaled)#using gridsearch to find the best parameterparams = {'n_neighbors':}knn = neighbors.KNeighborsRegressor()model = GridSearchCV(knn, params, cv=5)#fit the model and make predictionsmodel.fit(x_train,y_train)preds = model.predict(x_valid)

결과

#rmserms=np.sqrt(np.mean(np.power((np.array(y_valid)-np.array(preds)),2)))rms
115.17086550026721

그러나 예측 값과 실제 값에 대한 플롯은 더 명확한 이해를 제공해야합니다.

#plotvalid = 0valid = predsplt.plot(valid])plt.plot(train)

추론

이 값은 선형 회귀 모델과 거의 유사하며 플롯은 동일한 패턴을 보여줍니다. 선형 회귀 분석과 마찬가지로 2018 년 1 월에도 하락이 확인되었는데,이는 지난 몇 년 동안의 패턴이었기 때문입니다. 우리는 안전하게 회귀 알고리즘이 데이터 세트에 잘 수행되지 않은 것을 말할 수있다.

이 주가 예측 도전에 직면했을 때 어떻게 수행되는지 알아보기 위해 시계열 예측 기술을 살펴 보겠습니다.

자동 아리마

소개

아리마는 시계열 예측에 매우 널리 사용되는 통계 방법입니다. 아리마 모델은 미래의 가치를 예측하기 위해 계정에 과거 값을. 아리마에는 세 가지 중요한 매개 변수가 있습니다:

  • 다음 값을 예측하는 데 사용되는 과거 값)
  • 큐(미래 값을 예측하는 데 사용되는 과거 예측 오류)
  • 디(차분 순서)

아리마에 대한 매개 변수 튜닝은 많은 시간을 소비합니다. 그래서 우리는 자동으로 최적의 조합을 선택 자동 아리마를 사용합니다(피,큐,디)그 최소한의 오류를 제공합니다. 자동 아리마 작동 방식에 대한 자세한 내용은 이 문서를 참조하십시오:

  • 자동 아리마를 사용하여 고성능 시계열 모델 구축

구현

from pyramid.arima import auto_arimadata = df.sort_index(ascending=True, axis=0)train = datavalid = datatraining = trainvalidation = validmodel = auto_arima(training, start_p=1, start_q=1,max_p=3, max_q=3, m=12,start_P=0, seasonal=True,d=1, D=1, trace=True,error_action='ignore',suppress_warnings=True)model.fit(training)forecast = model.predict(n_periods=248)forecast = pd.DataFrame(forecast,index = valid.index,columns=)

결과

rms=np.sqrt(np.mean(np.power((np.array(valid)-np.array(forecast)),2)))rms
44.954584993246954
#plotplt.plot(train)plt.plot(valid)plt.plot(forecast)

추론

앞에서 보았 듯이 자동 아리마 모델은 과거 데이터를 사용하여 시계열의 패턴을 이해합니다. 이 값을 사용하여 모델은 시리즈의 증가 추세를 포착했습니다. 이 기술을 사용하는 예측은 이전에 구현 된 기계 학습 모델보다 훨씬 낫지 만 이러한 예측은 여전히 실제 값에 가깝지 않습니다.

줄거리에서 알 수 있듯이 모델은 시리즈의 추세를 포착했지만 계절적 부분에는 초점을 맞추지 않습니다. 다음 섹션에서는 계열의 추세와 계절성을 모두 고려한 시계열 모델을 구현합니다.

예언자

소개

이 주식 예측 데이터 세트에 구현 될 수있는 시계열 기술의 수는 있지만,이러한 기술의 대부분은 모델을 장착하기 전에 데이터 전처리를 많이 필요로한다. 예언자,설계 및 페이스 북에 의해 개척,데이터 전처리를 필요로하지 않으며 구현하기가 매우 간단 시계열 예측 라이브러리입니다.. 예언자에 대한 입력은 날짜 및 대상(디에스 및 와이)의 두 열이있는 데이터 프레임입니다.

예언자는 과거 데이터의 계절성을 캡처하려고 데이터 집합이 큰 경우 잘 작동합니다. 여기에 간단하고 직관적 인 방식으로 선지자를 설명하는 흥미로운 기사입니다:

  • 페이스 북의 선지자를 사용하여 신속하고 정확한 시계열 예측을 생성합니다..

구현

#importing prophetfrom fbprophet import Prophet#creating dataframenew_data = pd.DataFrame(index=range(0,len(df)),columns=)for i in range(0,len(data)): new_data = data new_data = datanew_data = pd.to_datetime(new_data.Date,format='%Y-%m-%d')new_data.index = new_data#preparing datanew_data.rename(columns={'Close': 'y', 'Date': 'ds'}, inplace=True)#train and validationtrain = new_datavalid = new_data#fit the modelmodel = Prophet()model.fit(train)#predictionsclose_prices = model.make_future_dataframe(periods=len(valid))forecast = model.predict(close_prices)

결과

#rmseforecast_valid = forecastrms=np.sqrt(np.mean(np.power((np.array(valid)-np.array(forecast_valid)),2)))rms
57.494461930575149
#plotvalid = 0valid = forecast_valid.valuesplt.plot(train)plt.plot(valid])

추론

예언자(대부분의 시계열 예측 기술과 마찬가지로)는 과거 데이터에서 추세와 계절성을 포착하려고합니다. 이 모델은 일반적으로 시계열 데이터 집합에서 잘 수행되지만 이 경우 평판에 부응하지 못합니다.

그것은 밝혀,주가는 특정 추세 나 계절성이 없습니다. 그것은 매우 현재 시장에서 무슨 따라서 가격 상승 및가 따라 달라 집니다. 따라서 아리마,사리 마 및 예언자와 같은 예측 기술은이 특정 문제에 대해 좋은 결과를 보여주지 못합니다.

우리가 가서 또 다른 고급 기술을 시도하자–긴 단기 기억.

그들이 그렇게 잘 작동하는 이유는 엘에스트가 중요한 과거의 정보를 저장할 수 있고 그렇지 않은 정보를 잊을 수 있기 때문입니다. 세 개의 게이트가 있습니다.:

  • 입력 게이트: 입력 게이트는 셀 상태에 정보를 추가합니다
  • 잊어 게이트:모델에 더 이상 필요하지 않은 정보를 제거합니다

자세한 내용은 아래 문서를 참조하십시오:

  • 장기 단기 기억 소개

지금,우리는 블랙 박스로 리스트를 구현하고 우리의 특정 데이터에 그것의 성능을 확인하자.

구현

#importing required librariesfrom sklearn.preprocessing import MinMaxScalerfrom keras.models import Sequentialfrom keras.layers import Dense, Dropout, LSTM#creating dataframedata = df.sort_index(ascending=True, axis=0)new_data = pd.DataFrame(index=range(0,len(df)),columns=)for i in range(0,len(data)): new_data = data new_data = data#setting indexnew_data.index = new_data.Datenew_data.drop('Date', axis=1, inplace=True)#creating train and test setsdataset = new_data.valuestrain = datasetvalid = dataset#converting dataset into x_train and y_trainscaler = MinMaxScaler(feature_range=(0, 1))scaled_data = scaler.fit_transform(dataset)x_train, y_train = , for i in range(60,len(train)): x_train.append(scaled_data) y_train.append(scaled_data)x_train, y_train = np.array(x_train), np.array(y_train)x_train = np.reshape(x_train, (x_train.shape,x_train.shape,1))# create and fit the LSTM networkmodel = Sequential()model.add(LSTM(units=50, return_sequences=True, input_shape=(x_train.shape,1)))model.add(LSTM(units=50))model.add(Dense(1))model.compile(loss='mean_squared_error', optimizer='adam')model.fit(x_train, y_train, epochs=1, batch_size=1, verbose=2)#predicting 246 values, using past 60 from the train datainputs = new_data.valuesinputs = inputs.reshape(-1,1)inputs = scaler.transform(inputs)X_test = for i in range(60,inputs.shape): X_test.append(inputs)X_test = np.array(X_test)X_test = np.reshape(X_test, (X_test.shape,X_test.shape,1))closing_price = model.predict(X_test)closing_price = scaler.inverse_transform(closing_price)

결과

rms=np.sqrt(np.mean(np.power((valid-closing_price),2)))rms
11.772259608962642
#for plottingtrain = new_datavalid = new_datavalid = closing_priceplt.plot(train)plt.plot(valid])

추론

와우! 레이어의 수 변경,드롭아웃 값 추가 또는 에포크 수 증가 등과 같은 다양한 파라미터에 대해 튜닝할 수 있습니다. 그러나 주가가 증가 또는 감소 여부를 식별 할 수있는 충분한 예측이 있습니까? 확실히!

이 기사의 시작 부분에서 언급했듯이 주가는 회사에 대한 뉴스 및 회사의 수익화 또는 합병/합병과 같은 다른 요인에 의해 영향을받습니다. 사전에 예측하기 수시로 불가능할 수 있는 어느 무형 요인 마찬가지로 있는다.

끝 노트

시계열 예측은 작업 할 수있는 매우 흥미로운 분야입니다,나는이 기사를 쓰는 내 시간 동안 실현으로. 지역 사회에는 복잡한 분야라는 인식이 있으며,거기에 진실이 있지만,일단 기본 기술을 습득하면 그렇게 어렵지 않습니다.

답글 남기기

이메일 주소는 공개되지 않습니다.