주가를 scikit-learn으로 기계 학습해 보자 분류편

(주) 여기에서는 최종 결과뿐만 아니라 에러의 시행착오도 포함해 써 갑니다.
또, 어디까지나 참고를 위해, 전건으로 훈련해, 같은 데이터로 학습 결과를 확인합니다.

목적



과거 4일분을 참고로 닛케이 평균을 예측합니다.

주가 데이터 로드



마츠이 증권의 CSV에서 종가를 읽습니다.
#coding: UTF-8
import pandas as pd
stock_data = pd.read_csv('stockchart_20180909.csv')
owarine = stock_data[['終値']]

(메모)처음 「종가」의 표기로는 안 되었습니다. 왠지 다시 실행하면 OK. 이유는・・・왜일까요.
successive_data = []
answers = []
for i in range(4, count_s):
    successive_data.append([owarine[i-4], owarine[i-3], owarine[i-2], owarine[i-1]])
    answers.append(owarine[i])

successive_data:과거 4일분의 종가
answers: 당일 종가
clf = svm.LinearSVC()
n = len(successive_data)
m = len(answers)
clf.fit(successive_data, answers)

디버그



기계 학습시 오류가 발생했습니다.


"dim 3"은 3차원 배열로 되어 있다는 에러인 것 같습니다.

잘 보면 owarine이 이상합니다.


「[~],[~]」이 되어 있기 (위해)때문에, 1 개의 값의 배열의 1000 개 배열의 1 개의 리스트 취급의 모양입니다. 파이썬에서는 하나의 값의 배열이 가능합니다.
owarine = stock_data[['終値']]
↓
owarine = stock_data['終値']

여기 문제였습니다. pandas의 복수열용 샘플 그대로 사용한 것이 문제였던 것 같습니다.

다시 시도하면 다른 오류가 발생합니다.


구그라고 보면 y값은 정수가 아니면 안 되는 것 같다.
따라서 answers는 정수입니다.
answers.append(owarine[i])
↓
answers.append(round(owarine[i]))



fit이 통과했기 때문에 같은 데이터로 결과를 출력합니다.
predicted = clf.predict(successive_data)



일단 학습하고 숫자가 나왔습니다.
하지만 같은 숫자가 대량으로・・・이것은 SVM에서 학습했기 때문입니다.
SVM 어디까지나 분류 때문에 교사가 있는 경우의 어느 값에 가까운가
출력했기 때문입니다.
※SVM의 설명은 여기 가 간단하고 알기 쉽다고 합니다.

따라서 여기에서는 교사 데이터를 닛케이 평균이 아닌 전날과의 차이로 합니다.
그냥 전날에 비해 올랐다/내렸다는 상당히 많은 사람이하고 있기 때문에 조금 취향을 바꾼다
(닛케이 평균 당일 - 닛케이 평균 전날) ÷ 100을 반올림 한 값을 사용합니다.
(예) 전날부터 +180엔이라면 +2, -310엔이라면 -3, +30엔이라면 0등.
크기의 폭이 있던 쪽이 리얼 같아지는 것이라고 생각합니다.
방금 수정한 answers를 다시 수정합니다.
answers.append(round(owarine[i]))
↓
x1 = (owarine[i] - owarine[i-1]) / 100
x2 =round(x1)
answers.append(x2)

학습 결과



이대로 배우면


아무래도 2와 -1만으로 수상하지만 학습을 할 수 있었습니다.
※ 몇번이나 시험하면 결과는 바뀌었습니다.

요약



결과를 표시합니다.
from sklearn.metrics import accuracy_score
accuracy_score(answers, predicted)



별로 좋지 않은 것 같습니다.

출처

좋은 웹페이지 즐겨찾기