제목만 보고 낚여서 들어오신분이 휜이 보인다 ㅋㅋ
주가 예측 프로그램은 맞지만 그 예측의 정확도가 많이 떨어진다
이 프로그램을 만들게 된 계기는 ANN(인공 신경망)을 알고 나서부터다
인공신경망은 간단하게 말하자면 어떤 입력이 들어오면 사람의 신경망과 똑같은 매커니즘으로 작동하는 방식이다.
이에 대한건 나중에 써야 할 문서도 있어서 나중에 블로그에 올릴 생각이다.
하여간 이 인공신경망의 특징은 오류에 강하고 '학습' 이 가능하다는 것이다.
그래서 주식 몇년치를 학습시키고 '내일주식은?' 이런걸 물어볼 수 있다는 이야기
하여간 이게 허무맹랑해 보일지 모르겠지만 이에 대한 연구는 꽤 많았었다.
내가 봤던 논문중 가장 괜찮았던 것이 '판별분석, 인공신경망, SVM을 이용한 수익률 성능 비교 연구 : KOSPI 200지수' 이였다.
이 논문을 보면 인공신경망에 대해서도 간단하게 설명을 해주고 입력값으로 뭘 넣는지도 상세히 나온다.
논문에선 85개의 변수를 가지고 주식을 예측하여 6% 정도의 수익률을 냈다.
하지만 난 진짜 수익을 낼 목적보다는 그냥 인공신경망을 이렇게 활용하는 거다... 식으로 공부하는게 목적이여서 매우 간단하게 만들어 봤다.
활용 지표는 종가(비율),거래량(최대최소),거래회전율(거래대금/시가총액,최대최소) 이렇게 딱 3개만 썻다.
인공신경망은 bpnn 이라는 파이썬 라이브러리를 가져다 약간 수정해서 사용하였다.
결과는 매우 환상적(ㅋㅋㅋㅋㅋㅋ)
보면 알겠지만 대부분의 주가가 떨어진다고(그것도 하한선까지!) 예측한다. ㅋㅋㅋ
어떤건 내려갈수 있는 최대 값인 15%를 넘어 16~18%까지 떨어진다고 나온다. ㅋㅋㅋㅋ
고로 fail!
아래는 주가 얻어오는 소스와(http://www.krx.co.kr 에서 얻어옴) 그걸 해석하는 코드이다.
# -*- coding: cp949 -*-
import urllib
import re
import os
def parsing(a,b,c,d,e):
print 'start parsing:' + d
f = open(e+'\\stock_'+a+'_'+b+'_'+c+'.txt' ,'w')
get_url = 'http://www.krx.co.kr/por_kor/corelogic/process/sto/stc_d_011.xhtml?data-only=true&isu_cd='+ a +'&fr_work_dt=' + b + '&to_work_dt=' + c
data = urllib.urlopen(get_url).read()
data = data.replace('','\n')
data = data.replace('','')
data = data.replace('
','') #상승
data = data.replace('
','') #하락
#없는 데이터 data = data.replace('
','')
data = data.replace('
','') #상한
data = data.replace('
','') #하한
data = data.replace('','')
data = data.replace('','')
data = data.replace(',','')
data = data.replace('',',')
data = data.replace('','')
data = data.replace(' ','')
f.write(data)
f.close()
start_date = str(raw_input('start date: '))
end_date = str(raw_input('end date: '))
stock_list = str(raw_input('stock list: '))
folder = str(raw_input('folder: '))
f = open(stock_list,'r')
while 1:
line = f.readline()
if not line:
break
stock_info = line.split(',')
stock_name, stock_id = stock_info
stock_id = stock_id.replace('\n','')
parsing(stock_id,start_date,end_date,stock_name,folder)
# -*- coding: cp949 -*-
# 입력 형식: 날자,종가,대비,거래량(주),거래대금(원),시가,고가,저가,시가총액(백만),상장주식수(주)
# 출력 형식: 종가(비율),거래량(최대최소),거래회전율??(거래대금/시가총액,최대최소)
from bpnn import *
import os
import pprint
def WTF1(list_,n):
#최대 최소값 계산
min_ = float(list_[0][n])
max_ = float(list_[0][n])
for day in range(0,7):
if min_ > float(list_[day][n]):
min_ = float(list_[day][n])
if max_ < float(list_[day][n]):
max_ = float(list_[day][n])
return max_,min_
def WTF2(list_,n,m):
#거래회전율 계산
min_ = float(list_[0][n])/float(list_[0][m])
max_ = float(list_[0][n])/float(list_[0][m])
for day in range(0,7):
if min_ > float(list_[day][n])/float(list_[day][m]):
min_ = float(list_[day][n])/float(list_[day][m])
if max_ < float(list_[day][n])/float(list_[day][m]):
max_ = float(list_[day][n])/float(list_[day][m])
return max_,min_
def WTF4(list_,new,max_3,min_3,max_48,min_48):
#데이터 변환
for day in range(1,8):
new[day-1] =[(float(list_[day][1])/float(list_[day-1][1])*10/3)-(0.85*10/3),(float(list_[day][3])-min_3)/(max_3-min_3),(float(list_[day][4])/float(list_[day][8])-min_48)/(max_48-min_48)]
#pprint.pprint(new)#debug
def join(l_input,l_output):
tmp = []
for n in range(6,-1,-1):
tmp.extend(l_input[n])
return [[tmp,l_output]]
dir_stock = raw_input('stock folder: ')
stock_num = int(raw_input('stock num: '))
stock_list = os.listdir(dir_stock)
ann = NN(3*7, 30, 1)
#print 'debug info [1]'#debug
for stock_file in stock_list:
#print 'start training at' + stock_file #debug
#raw_input()#debug
f_old = open(dir_stock +'\\'+ stock_file,'r')
#print 'debug info [2]'#debug
trash = f_old.readline().split #예측할 날 버리기
day_result = f_old.readline().split(',') #숫자가 크면 오늘에 가깝고 작으면 과거에 가까움
day_7 = f_old.readline().split(',')
day_6 = f_old.readline().split(',')
day_5 = f_old.readline().split(',')
day_4 = f_old.readline().split(',')
day_3 = f_old.readline().split(',')
day_2 = f_old.readline().split(',')
day_1 = f_old.readline().split(',')
day_0 = f_old.readline().split(',')
day = [day_7,day_6,day_5,day_4,day_3,day_2,day_1,day_0,day_result]
day_new = [[],[],[],[],[],[],[]]
try:
#print 'debug info [3]'#debug
while 1:
if not day_0:
print stock_file + 'end'
break
#값 처리 시작
max_3,min_3 = WTF1(day,3)
max_48,min_48 = WTF2(day,4,8)
#print 'debug info [4]'#debug
#print max_3,min_3,max_48,min_48 #debug
WTF4(day,day_new,max_3,min_3,max_48,min_48) #계산! day_new에 처리한 값 들거가있음!
result = [(float(day[0][1])/float(day[1][1])*10/3)-(0.85*10/3)] #예측한 값(결과값)
trainer = join(day_new,result) #입력에 맞춤
#print trainer #debug
#print 'start training...' + day[0][0] #debug
####################################################################
ann.train(trainer,iterations=100,N=0.0001,M=0.00005) #오차 무지 큼
#ann.train(trainer,iterations=10,N=0.001,M=0.05) #더큼
#ann.train(trainer,iterations=2,N=0.0001,M=0.00005)
####################################################################
#값 처리 끝
day_result = day_7[:] #날자 이동하고...
day_7 = day_6[:]
day_6 = day_5[:]
day_5 = day_4[:]
day_4 = day_3[:]
day_3 = day_2[:]
day_2 = day_1[:]
day_1 = day_0[:]
day_0 = f_old.readline().split(',')
if not day_0:
print stock_file + 'end'
break
day = [day_7,day_6,day_5,day_4,day_3,day_2,day_1,day_0,day_result]
#pprint.pprint(day) #debug
#raw_input('pause') #debug
#print 'debug info [5]'#debug
except IndexError:
print 'err at' + day[0][0]
f_old.close()
#print 'save mattrix...'
#mat = open('C:\\Users\\USER\\Desktop\\stock\\mattrix', "w")
#mat.write(showMatrix(ann.wi))
#mat.write(showMatrix(ann.wo))
#mat.close()
print 'THE END!!!!!!!'
#테스트 시작
print 'start test\ngood luck!'
dir_stock = raw_input('test stock folder: ')
stock_num = int(raw_input('test stock num: '))
stock_list = os.listdir(dir_stock)
for stock_file in stock_list:
f_old = open(dir_stock +'\\'+ stock_file,'r')
day_result = f_old.readline().split(',') #숫자가 크면 오늘에 가깝고 작으면 과거에 가까움
day_7 = f_old.readline().split(',')
day_6 = f_old.readline().split(',')
day_5 = f_old.readline().split(',')
day_4 = f_old.readline().split(',')
day_3 = f_old.readline().split(',')
day_2 = f_old.readline().split(',')
day_1 = f_old.readline().split(',')
day_0 = f_old.readline().split(',')
day = [day_7,day_6,day_5,day_4,day_3,day_2,day_1,day_0,day_result]
day_new = [[],[],[],[],[],[],[],[]]
max_3,min_3 = WTF1(day,3)
max_48,min_48 = WTF2(day,4,8)
#print 'debug info [4]'#debug
#print max_3,min_3,max_48,min_48 #debug
WTF4(day,day_new,max_3,min_3,max_48,min_48) #계산! day_new에 처리한 값 들거가있음!
result = [(float(day[0][1])/float(day[1][1])*10/3)-(0.85*10/3)] #예측한 값(결과값)
tester = join(day_new,result)
ann.test_custom(tester,day_7[1],day_result[1],day_7[1])
#ann.test(tester)
'Data Mining & R' 카테고리의 다른 글
| AN INTRODUCTION TO BACKTESTING WITH PYTHON AND PANDAS (0) | 2016.05.09 |
|---|---|
| 오피니언마이닝에 기반한 주식 매매 시그널 - opinion mining, social mining (0) | 2016.05.04 |
| K-nearest Neighbors를 이용한 주식시장 예측 (0) | 2016.04.27 |
| K-means 예제 with R (0) | 2016.04.24 |
| K means Clustering in R example Iris Data (0) | 2016.04.24 |
주가예측.zip