기술연구

김경현 2019. 8. 21. 17:39

안녕하세요.


기술이 공유되지 않으면 미래의 사회는 지금보다 더욱 폐쇄적이고 불평등한 사회가 될 것입니다. 카피레프트(copyleft)는 개인의 지적재산권을 중시하는 기존의 카피라이트(copyright)에 대항해 사회적 공유를 강조하는 정신이자 운동입니다. DIY연구소는 카피레프트(copyleft) 정신과 4차 산업기술의 확산을 위하여 연구한 내용을 무료로 배포하고 있습니다. 2019년 12월 이후 텐서플로 2.0 이전 버전으로 작성된 프로그램들이 온라인 Colaboratory 에서만 작동되어 코드와 파일은 구글드라이브에 업로드후 사용해야 합니다. 오늘은 (현재주가 + 정보) 에 해당하는 인공지능 딥러닝 주식투자 프로그램 개발 내용을 공유합니다.


※ 다음주가 = (현재주가 + 정보) + (노이즈) 


[삼성전자] [LG전자] [현대자동차] [하이닉스] [바이오로직스] [셀트리온] [네이버] [아모레퍼시픽] [현대모비스[코로나-19 테마주] [셀트리온제약] [셀트리온헬스케어[씨젠] [진매트릭스] [신풍제약] [파미셀] [유비케어]








강의 : [미래창조부] [성남테크노과학고] [한양대학교] [덕이중학교] [동행숲] [경남창조경제혁신센터] [인천금융고[전남콘텐츠코리아랩1] [경북하이텍고] [경북기계금속고] [경북영천전자고] [경북포항흥해공고[경북영주동산고[경북구미정보고] [전남콘텐츠코리아랩2] [영동산업과학고] [경북공업고]



[교육내용]


☞ 30. 3D프린터 로봇제어를 위한 라즈베리파이

☞ 31. 3D프린터 로봇제어를 위한 AI 인공지능

☞ 32. 3D프린터 로봇제어를 위한 AI 스마트미러

 33. 3D프린터 로봇제어를 위한 블루투스 앱

 42. 앱인벤터로 애니메이션 만들기 (이론)

 53. 3D프린터 로봇제어를 위한 교육앱 (대기오염, 리스트)

 54. 3D프린터 로봇제어를 위한 교육앱 (로봇 음성제어)

 55. 3D프린터 로봇제어를 위한 딥러닝 (인공지능)

☞ 56. 3D프린터 로봇제어를 위한 텐서플로 (인공지능) 




[주식투자 AI 예측 알고리즘 (Tensorflow)]


☞ 코딩자료 : 다운로드

☞ 인공지능(AI) 급등급락 주가예측 프로그램

☞ 인공지능(AI) 주가예측 투자 임상실험 : 결과



■ 코로나 19 바이러스 이후 코스피 추이. 과거 하락과 비교


올해 코로나 19 바이러스로 인해 주가지수가 크게 하락했다가 반등 한 상태다. KOSPI 는 2020-1-22 에 2,267.25 을 고점으로 2020-03-19 에 1,457.64 을 저점을 찍었고 하락폭은 35.7% 였다. 코스피가 20% 이상 하락한 경우는 여러차례 있었지만, 이렇게 짧은시간에 급격하게 하락한 적은 드물었다. 고객예탁금은 큰 폭으로 늘었다. 2019-1-16 일 기준으로 23 조원이 최저점이었는데, 45.2 조원까지 올라왔다. 이 정도로 급격하게 늘어나는 것도 이례적이다. 과거의 폭락사례를 추려보면 하락이 끝났을지 더 길어질지 알수 없기에 길게 보고 이성적으로 대응해야 한다. 







 온라인 Colaboratory 


기존 텐서플로 코딩 자동 업데이트


magic으로 1.15 사용 가능합니다.


%tensorflow_version 1.x

import tensorflow as tf

tf.__version__


==> 1.15.2


☞ Google Drive












□ 질문 & 답변





■ 종가 예측 프로그램 - 02 해석


'''

종가

12일, 에포크 1250, 학습률 0.01

'''

# 과거&현재 일별 주가와 거래량 (time series형태)을 이용하여 내일의 주가를 예측한다

# 실험적 경험 교훈

# 1) LSTM셀 활성화함수는 tanh보다 softsign가 조금 더 안정적이고 좋은 결과를 얻는다

# 2) LSTM은 AdamOptimizer 최적화 함수 추천

# 3) LSTM은 구조상 DropoutWrapper와 궁합이 안맞다

# 3) RNN에서 데이터 특성에 맞는 sequence length가 중요하다! 상황에 따라...

#    아마존 주가의 경우 대체적으로 긴 기간이 더 좋으나 너무 긴 것보다 28거래일이 더 좋게 나왔다

# 4) input_data_column_cnt(입력데이터의 컬럼 개수)가 적은 경우 stacked RNN을 사용하면 빠르게 Over Fitting된다

# 5) rnn_cell_hidden_dim(각 셀의 (hidden)출력 크기)가 많은 경우 너무 많으면 오래걸리고 추가 개선은 거의 없다


# TO-DO 리스트

# 조기종료(early stopping) 조건을 넣어 과적합발생 시 중단로직 추천

# 학습률(learning rate)을 상황에 따라 조정할 것


import tensorflow as tf  구글이 2011년에 개발을 시작하여 2015년에 오픈 소스로 공개한 기계학습 라이브러리.

import numpy as np  수학 및 과학 연산을 위한 파이썬 패키지로 넘파이라 읽는다.

import pandas as pd  파이썬 언어로 작성된 데이터를 분석 및 조작하기 위한 소프트웨어 라이브러리.

import datetime  # 파이썬 언어로 날짜 및 시간 조작을 위한 클래스 제공.

import matplotlib.pyplot as plt  파이썬에서 그래프 표시하는 라이브러리.


# 랜덤에 의해 똑같은 결과를 재현하도록 시드 설정

# 하이퍼파라미터를 튜닝하기 위한 용도(흔들리면 무엇때문에 좋아졌는지 알기 어려움)

tf.set_random_seed(777)  # 랜덤한 값을 다른 컴퓨터에도 동일하게 얻을 수 있게 하며 강의용으로 좋다.


# Standardization

def data_standardization(x):  # def 로 data_standardization 이름의 표준화 함수선언. x는 함수인자. 

  # 표준화를 하면 평균 0, 표준편차 1 이라는 데이터 분포로 재 생성된다.

    x_np = np.asarray(x)  # 입력을 배열로 변환한다.

    return (x_np - x_np.mean()) / x_np.std()  # 파이썬에서 mean(), std()로 데이터평균과 표준편차 찾는다.


# 너무 작거나 너무 큰 값이 학습을 방해하는 것을 방지하고자 정규화한다

# x가 양수라는 가정하에 최소값과 최대값을 이용하여 0~1사이의 값으로 변환

# Min-Max scaling

def min_max_scaling(x):  def 로 min_max_scaling 이름의 정규화 함수선언. x는 함수인자. 

  # MinMax Scaling 은 최대값 1, 최소값 0 으로 그 사이에 값들이 분포한다.

    x_np = np.asarray(x)  # 입력을 배열로 변환한다.

    return (x_np - x_np.min()) / (x_np.max() - x_np.min() + 1e-7) # 1e-7은 0 으로 나누는 오류 예방차원


# 정규화된 값을 원래의 값으로 되돌린다

# 정규화하기 이전의 org_x값과 되돌리고 싶은 x를 입력하면 역정규화된 값을 리턴한다

def reverse_min_max_scaling(org_x, x):   def 로 reverse_min_max_scaling 이름의 역정규화 함수선언. org_x, x는 함수인자.

  MinMax Scaling 변환 값들 이전의 원래 단위의 값으로 역정규화 한다.

    org_x_np = np.asarray(org_x)  # 입력을 배열로 변환한다.

    x_np = np.asarray(x)  # 입력을 배열로 변환한다.

    return (x_np * (org_x_np.max() - org_x_np.min() + 1e-7)) + org_x_np.min()  # MinMax Scaling 을 역산해 원래 단위로 환원.




# 하이퍼파라미터

input_data_column_cnt = 6  # 입력데이터의 컬럼 개수 (Variable 개수)

output_data_column_cnt = 1 # 결과데이터의 컬럼 개수


seq_length = 12            # 1개 시퀀스의 길이 (시계열데이터 입력 개수)

rnn_cell_hidden_dim = 20  # 각 셀의 숨겨진 (hidden) 출력 크기

forget_bias = 1.0           # 망각편향 (기본값 1.0)

num_stacked_layers = 1   # Stacked LSTM Layers 개수

keep_prob = 1.0            # Dropout 할 때 Keep 할 비율


epoch_num = 1250        # 에폭횟수 (학습용 전체 데이터를 몇 회 반복 (Iteration) 해서 학할 것인가 입력)

learning_rate = 0.01       # 학습률


# 데이터 전처리

print("---------------------------------------------------------------")

print("DIY 연구소 인공지능 주가 예측 프로그램 (http://cafe.daum.net/diylab)")

print("현대모비스 주식 2019.11.6. 내일 종가")

print("---------------------------------------------------------------\n")


# 출력


# 데이터를 로딩한다.

stock_file_name = 'Hyundai Mobis-data-test.csv' # 현대모비스 2000년부터 현재까지 주가데이터 파일

encoding = 'euc-kr' # 문자 인코딩

names = ['Date','Open','High','Low','Close','Adj Close','Volume']

raw_dataframe = pd.read_csv(stock_file_name, names=names, encoding=encoding) #판다스이용 csv파일 로딩

raw_dataframe.info() # 데이터 정보 출력



# 출력


# raw_dataframe.drop('Date', axis=1, inplace=True) # 간열을 제거하고 dataframe 재생성하지 않기

del raw_dataframe['Date'] # 위 줄과 같은 효과

stock_info = raw_dataframe.values[1:].astype(np.float) # 금액&거래량 문자열 (2번째~끝)부동소수점형으로 변환한다

print("stock_info.shape: ", stock_info.shape)  금액&거래량 문자열 (2번째~끝)의 형태출력

print("stock_info[0]: ", stock_info[0])  금액&거래량 문자열 (2번째~끝)첫번째 출력


# 출력


# 데이터 전처리

# 가격과 거래량 수치의 차이가 많아나서 각각 별도로 정규화한다

# 가격형태 데이터들을 정규화한다

# ['Open','High','Low','Close','Adj Close','Volume']에서 'Adj Close'까지 취함

# 곧, 마지막 열 Volume를 제외한 모든 열

price = stock_info[:,:-1]  # 마지막 열 Volume 만을 제외한 모든 열을 price 변수로 생성 

norm_price = min_max_scaling(price)  가격데이터 price 변수를 min_max_scaling 함수로 정규화 norm_price 변수생성

print("price.shape: ", price.shape)  # 정규화 price 변수형태 출력

print("price[0]: ", price[0]# 정규화 price 변수 첫째행 출력

print("norm_price[0]: ", norm_price[0])  # 정규화후 norm_price 변수 첫째행 출력

print("="*100)  # 화면상 구분용 출력


# 출력


# 거래량형태 데이터를 정규화한다

# ['Open','High','Low','Close','Adj Close','Volume']에서 마지막 'Volume'만 취함

# [:,-1]이 아닌 [:,-1:]이므로 주의하자! 스칼라가아닌 벡터값 산출해야만 쉽게 병합 가능

volume = stock_info[:,-1:]  마지막 열 Volume 만을 volume 변수로 생성 

norm_volume = min_max_scaling(volume# 거래량데이터 volume 변수를 min_max_scaling 정규화 norm_volume 변수생성

print("volume.shape: ", volume.shape)  # 정규화 volume 변수형태 출력

print("volume[0]: ", volume[0])  # 정규화 volume 변수 첫째행 출력

print("norm_volume[0]: ", norm_volume[0])  # 정규화후 norm_volume 변수 첫째행 출력

print("="*100)  # 화면상 구분용 출력


# 출력


# 행은 그대로 두고 열을 우측에 붙여 합친다

x = np.concatenate((norm_price, norm_volume), axis=1)  # 정규화후 norm_price, norm_volume axis=1 세로합친 x 변수 생성

print("x.shape: ", x.shape)  # 정규화후 x 변수형태 출력

print("x[0]: ", x[0])    # 정규화후 x 변수의 첫째행 출력

print("x[-1]: ", x[-1]# 정규화후 x 변수의 마지막행 출력

print("="*100)  # 화면상 구분용


# 출력


y = x[:, [4]# 정규화후 데이터 x 변수의 전체행, 5 열은 주식 종가로 y 변수 생성

print("y[0]: ",y[0])  # 정규화후 y 변수의 첫째행 출력

print("y[-1]: ",y[-1])  # 정규화후 y 변수의 첫째행 출력


# 출력


dataX = []  # dataX입력으로 사용될 Sequence Data 리스트 객체다.

dataY = []  # dataY출력(타겟)으로 사용될 리스트 객체다.


for i in range(0, len(y) - seq_length): # for in range 는 필요한 만큼 숫자를 만드는 반복 함수다. 입력으로 주어지는 인수가 2개시

# 시작과 끝 숫자를 의미한다. 단, 끝 숫자는 해당범위에 포함되지 않는다. 1개 시퀀스의 길이 (시계열데이터 입력 개수), seq_length = 12

    _x = x[i : i+seq_length# 시작 i 가 0 이면 _x = x[0:12]로 0 인 첫번째 행부터 11인 열두번째 행의 x 데이터들이 입력된다.

    _y = y[i + seq_length]  # 다음 나타날 주가(정답)로 시작 i 가 0 이면 _y = y[12]로 12인 열세번째 행의 y 데이터가 출력된다.

    if i is 0:  # 시작 i 가 0 이면

        print(_x, "->", _y)  # 첫번째 행만 출력해 봄


# 출력

 

    dataX.append(_x) # dataX 리스트에 추가

    dataY.append(_y) # dataY 리스트에 추가

        

# 학습용/테스트용 데이터 생성

# 전체 70%를 학습용 데이터로 사용

train_size = int(len(dataY) * 0.7)

# 나머지(30%)를 테스트용 데이터로 사용

test_size = len(dataY) - train_size


# 데이터를 잘라 학습용 데이터 생성

trainX = np.array(dataX[0:train_size])

trainY = np.array(dataY[0:train_size])


# 데이터를 잘라 테스트용 데이터 생성

testX = np.array(dataX[train_size:len(dataX)])

testY = np.array(dataY[train_size:len(dataY)])


# 텐서플로우 플레이스홀더 생성

# 입력 X, 출력 Y를 생성한다

X = tf.placeholder(tf.float32, [None, seq_length, input_data_column_cnt])

print("X: ", X)

Y = tf.placeholder(tf.float32, [None, 1])

print("Y: ", Y)


# 출력


# 검증용 측정지표를 산출하기 위한 targets, predictions를 생성한다

targets = tf.placeholder(tf.float32, [None, 1])

print("targets: ", targets)


predictions = tf.placeholder(tf.float32, [None, 1])

print("predictions: ", predictions)


# 출력


# 모델(LSTM 네트워크) 생성

def lstm_cell():

    # LSTM셀을 생성

    # num_units: 각 Cell 출력 크기

    # forget_bias:  to the biases of the forget gate 

    #              (default: 1)  in order to reduce the scale of forgetting in the beginning of the training.

    # state_is_tuple: True ==> accepted and returned states are 2-tuples of the c_state and m_state.

    # state_is_tuple: False ==> they are concatenated along the column axis.

    cell = tf.contrib.rnn.BasicLSTMCell(num_units=rnn_cell_hidden_dim, 

                                        forget_bias=forget_bias, state_is_tuple=True, activation=tf.nn.softsign)

    if keep_prob < 1.0:

        cell = tf.contrib.rnn.DropoutWrapper(cell, output_keep_prob=keep_prob)

    return cell


# num_stacked_layers개의 층으로 쌓인 Stacked RNNs 생성

stackedRNNs = [lstm_cell() for _ in range(num_stacked_layers)]

multi_cells = tf.contrib.rnn.MultiRNNCell(stackedRNNs, state_is_tuple=True) if num_stacked_layers > 1 else lstm_cell()


# RNN Cell(여기서는 LSTM셀임)들을 연결

hypothesis, _states = tf.nn.dynamic_rnn(multi_cells, X, dtype=tf.float32)

print("hypothesis: ", hypothesis)


# [:, -1]를 잘 살펴보자. LSTM RNN의 마지막 (hidden)출력만을 사용했다.

# 과거 여러 거래일의 주가를 이용해서 다음날의 주가 1개를 예측하기때문에 MANY-TO-ONE형태이다

hypothesis = tf.contrib.layers.fully_connected(hypothesis[:, -1], output_data_column_cnt, activation_fn=tf.identity)



# 손실함수로 평균제곱오차를 사용한다

loss = tf.reduce_sum(tf.square(hypothesis - Y))

# 최적화함수로 AdamOptimizer를 사용한다

optimizer = tf.train.AdamOptimizer(learning_rate)

# optimizer = tf.train.RMSPropOptimizer(learning_rate) # LSTM과 궁합 별로임


train = optimizer.minimize(loss)


# RMSE(Root Mean Square Error)

# 제곱오차의 평균을 구하고 다시 제곱근을 구하면 평균 오차가 나온다

# rmse = tf.sqrt(tf.reduce_mean(tf.square(targets-predictions))) # 아래 코드와 같다

rmse = tf.sqrt(tf.reduce_mean(tf.squared_difference(targets, predictions)))



train_error_summary = [] # 학습용 데이터의 오류를 중간 중간 기록한다

test_error_summary = [] # 테스트용 데이터의 오류를 중간 중간 기록한다

test_predict = ''           # 테스트용데이터로 예측한 결과


sess = tf.Session()

sess.run(tf.global_variables_initializer())


# 학습한다

start_time = datetime.datetime.now() # 시작시간을 기록한다

print('\n학습을 시작합니다...')


# 출력


for epoch in range(epoch_num):

    _, _loss = sess.run([train, loss], feed_dict={X: trainX, Y: trainY})

    if ((epoch+1) % 100 == 0) or (epoch == epoch_num-1): # 100번째마다 또는 마지막 epoch인 경우

        # 학습용데이터로 rmse오차를 구한다

        train_predict = sess.run(hypothesis, feed_dict={X: trainX})

        train_error = sess.run(rmse, feed_dict={targets: trainY, predictions: train_predict})

        train_error_summary.append(train_error)


        # 테스트용데이터로 rmse오차를 구한다

        test_predict = sess.run(hypothesis, feed_dict={X: testX})

        test_error = sess.run(rmse, feed_dict={targets: testY, predictions: test_predict})

        test_error_summary.append(test_error)

        

        # 현재 오류를 출력한다

        print("epoch: {}, train_error(A): {}, test_error(B): {}, B-A: {}".format(epoch+1, train_error, test_error, test_error-train_error))

        

# 출력


end_time = datetime.datetime.now() # 종료시간을 기록한다

elapsed_time = end_time - start_time # 경과시간을 구한다

print('elapsed_time:',elapsed_time)

print('elapsed_time per epoch:',elapsed_time/epoch_num)


# 출력


# 하이퍼파라미터 출력

print('input_data_column_cnt:', input_data_column_cnt, end='')

print(',output_data_column_cnt:', output_data_column_cnt, end='')


print(',seq_length:', seq_length, end='')

print(',rnn_cell_hidden_dim:', rnn_cell_hidden_dim, end='')

print(',forget_bias:', forget_bias, end='')

print(',num_stacked_layers:', num_stacked_layers, end='')

print(',keep_prob:', keep_prob, end='')


print(',epoch_num:', epoch_num, end='')

print(',learning_rate:', learning_rate, end='')


print(',train_error:', train_error_summary[-1], end='')

print(',test_error:', test_error_summary[-1], end='')

print(',min_test_error:', np.min(test_error_summary))


# 출력


# 결과 그래프 출력


%matplotlib inline

plt.figure(1)

plt.plot(train_error_summary, 'gold')

plt.plot(test_error_summary, 'b')

plt.xlabel('Epoch(x100)')

plt.ylabel('Root Mean Square Error')


# 출력


plt.figure(2)

plt.plot(testY, 'r')

plt.plot(test_predict, 'b')

plt.xlabel('Time Period')

plt.ylabel('Stock Price(Hyundai Mobis Close)')

plt.show()


# 출력


# sequence length만큼의 가장 최근 데이터를 슬라이싱한다

recent_data = np.array([x[len(x)-seq_length : ]])

print("recent_data.shape:", recent_data.shape)

print("recent_data:", recent_data)


# 출력


# 내일 종가를 예측해본다

test_predict = sess.run(hypothesis, feed_dict={X: recent_data})


print("\n현대모비스 주식 2019.11.6. 내일 종가(정규화) test_predict", test_predict[0])

test_predict = reverse_min_max_scaling(price,test_predict) # 금액데이터 역정규화한다

print("현대모비스 주식 2019.11.6. 내일 종가(KRW) Tomorrow's stock price", test_predict[0]) # 예측한 주가를 출력한다. 


# 출력















■ 종가(%) 예측 프로그램 - 03 해석


인공지능 딥러닝 주식투자 프로그램


▣ ML lab12-6: RNN with Time Series Data




 RNN Stock Prediction


 lab-12-5-rnn_stock_prediction

☞ Stock Data Download

☞ 코딩 설명



RNN을 이용하여 Stock Market 과 같은 Time series 를 예측하는 방법을 알아보겠습니다. Time series data 란 어떤 시간에 따라 변화하는 값을 의미합니다. X축은 시간, Y축은 가격이 될 것입니다.




대표적인 예로 다음과 같은 주식시간의 데이터를 들 수 있습니다. 시작가, 최고가, 최저가, 거래량, 최종가들이 매일 기록되니 Time series data 라 할 수 있습니다.




RNN을 가지고 어떻게 분석할까요? 우리가 7일치의 데이터를 가지고 있다면 이 데이터들을 쭉 배열하고 8일째의 가격을 예측해 보는 것입니다. 이런 문제를 Many to one 이라고 합니다. 이런 형태의 예측은 7일의 데이터만 가지고 예측하는 것보다 이전의 데이터들을 연결해서 이전의 데이터들이 어떤 영향을 미친다는 것이 기본적인  Time series 의 가설입니다.




그러면 우리가 가지고 있는 데이터를 어떻게 넣어야 할까요? 우리가 알고싶은 값을 ? 라면 그 전까지의 데이터들을 넣어주어 값을 예측할 수 있습니다. 여기서 생각해볼 것이 입력의 Dimension 은 몇일까? Sequence의 길이는 몇일까? 출력의 Hidden size 는 얼마일까? 입니다. 다음 데이터에서 Open ~ Close 까지 5개의 컬럼을 가지고 있으므로 Input data 의 Dimension 은 5가 됩니다. 7일 동안의 데이터를 가지고 있으므로 Sequence 의 길이는 7이 됩니다. Output dimension 은 7일 동안의 데이터로 8일 데이터 하나를 구하기 때문에 1이 됩니다. 만약 Fully connected layer 를 사용한다면 Output dimension 을 마음대로 설정할수도 있습니다.













[ML Stock 01-1]













☞ RMSE (Root Mean Squared Error) : 고양이와 개를 분류하는 모델은 Classification 모델입니다. 그리고 상품의 판매량 혹은 주식의 가격을 예측하는 모델은 Regression 모델입니다. Regression 모델로 예측한 실수값 (Real number) 의 정확도를 측정하는 방법으로 Accuracy 대신 크기 의존적 에러 (Scale dependent Errors) 인 RMSE (Root Mean Squared Error) 를 사용한다. Python 으로 RMSE 를 구하는 방법은 아래와 같다.


RMSE = mean_squared_error(y y_pred)**0.5


[문의] ☞ Tensorflow Korea 



[답변]


1. 최재우 님 :


혹시 윗단에 %matplotlib inline 치셨나요. 주피터 노트북 브라우저상에 그림 띄우려면 필요하다고 알고 있습니다



주가도표의 파란색이 실제주가, 빨간색이 예상주가 입니다.  ☞ Matplotlib.org


[문의]  Tensorflow Korea


안녕하세요. 주식종가 예측 프로그램 'lab-12-5-rnn_stock_prediction.py' 을 jupyter notebook 에서 구동후 출력되는 주가도표의 Y축 Stock Price 단위가 0.0 ~ 1.0 범위로 표시됩니다. 그러나 실제 프로그램에 제공된 'data-02-stock_daily.csv 파일에는 Close (종가)가 831.659973 등의 USD(달러) 금액 단위로 제공되기에 도표상 Y축 Stock Price 를 USD(달러) 금액 단위의 실제 Close (종가) 로 환산 및 이해하기 어렵습니다. http://blog.daum.net/kimgyunghyun/2529 주가도표의 Y축 Stock Price 단위를 USD(달러) 금액단위로 환산하여 표시할수 있는 방법이 있는지요. 또한 코딩에는 실제값 Y 와 예상값의 선 색상 지정한 내용이 없는데 도표내 빨강, 파랑선중 어떤것이 예측값인지도 궁금합니다. ※ 실제적인 이해를 위하여 해결방법은 코딩을 수정하여 알려주시면 좋겠습니다. 아래에 기재한 기존 코딩을 [변경전 코딩]이라면, 문제 해결한 코딩을 [변경후 코딩] 방식으로 알려주시면 감사하겠습니다. 변경하려는 텐서플로 (Tensorflow) 코딩은 아래와 같습니다.



[답변]


1. 이승우 님 :


https://matplotlib.org/2.1.1/api/_as_gen/matplotlib.pyplot.plot.html#matplotlib-pyplot-plot


2. Yong Joon Moon 님 :


x = linspace(0,10);

y = x.^2;

plot(x,y)

yticks([0 50 100])

yticklabels({'y = 0','y = 50','y = 100'})


3. 윤성국 님 : 


빨강색이 예측값인데 보시는 바와같이 예측이 안되는 것을 볼 수 있습니다.

간단한 방정식입니다. (x-min)/(max-min) = normal 이라면 × = normal(max-min) + min 이겠죠


4. 임재덕 님 :


normalization 값인것 같은데 역정규화하면 나오지 않을까요


5. Sungchul Lee 님 :


주가데이타를 민멕스스케일러에 넣어서 0-1 사이로 조정했군요. 그 작업을 꺼꾸로하면 원래 스케일이 되겠죠. 네이버 성킴 코드에 비슷한걸 보았는데 실제주가가 빠진다음에 예측주가가 빠졌던 걸로 기억합니다. 이것도 같은 패턴이겠죠!


[구글 주식예측 적용]











[ML Stock 01-2]









주가도표의 빨간색이 실제주가, 파란색이 예상주가 입니다.



[삼성전자 주식예측 적용]


[계산]





[시작가]




[최고가]




[최저가]




[거래량]




[최종가]





[Rev. 1. 삼성전자 주식예측 적용]

























[시퀀스길이(Seq_length) : 7일]






[최적 시가, 고가, 저가, 거래량, 종가 : 최적조건: Day12*, 에포크 1250, 학습률 0.01]















[미래 4일간 예측]


1. 조건 : 주식거래량을 예측거래량 사용시







2. 조건 : 주식거래량을 최근 5일간 실제거래량 평균 사용시 (예 : 16,222,964 주)







3. 비교 : 예측거래량 사용하는것이 실제가격에 근접



[실제 투자]


1. 삼성전자 주식 4일후 예측 2019.9.30 (월) - 10.4(금) ※ 4일후 저가예측을 저가매수 기준으로 활용.



2. 삼성전자 주식 1일후 예측 2019.9.30 (월) - 10.4(금) ※ 1일후 고가예측을 고가매매 기준으로 활용.





[아마존 내일 주가 예측하기]


☞ 별도 주식 프로그램 참조

LSTM RNN을 이용하여 아마존 주가 예측하기


과거 현재 일별 주가와 거래량(Time series 형태)을 이용하여 미국 아마존의 내일 주가를 예측한다. 사용하게 될 LSTM에 대해 간단히 알아보자. 아래와 같이 망각 게이트가 있는 것이 특징이며 이전의 상태를 받아 구성된 것이 특징이다.


[LSTM 블록구조]



[BasicLSTMCell 구조]



참고로 활성화 함수는 사용자가 선택가능하다. 과거 아마존 주가 데이터를 다운받는다. 

(이 블로그의 첨부된 파일을 다운로드 받아도 된다.)


https://finance.yahoo.com/quote/AMZN/history?p=AMZN



[다운로드 받은 파일 앞 10줄]


 

1997년부터 약 10년간의 데이터가 존재한다.


[결과]


2017.12.11 (월) 아마존의 예상 종가는 1,138.68 달러이다. 실제결과는 1,168.92 나왔다. (오차)






데이터를 이용하여 모델을 생성하고 테스트한 결과 교훈은 아래와 같다.


[실험적 경험 교훈]


1) LSTM셀 활성화함수는 tanh보다 softsign가 조금 더 안정적이고 좋은 결과를 얻는다

2) LSTM은 AdamOptimizer 최적화 함수 추천

3) RNN에서 데이터 특성에 맞는 sequence length가 중요하다. 상황에 따라 아마존 주가의 경우 대체적으로 긴 기간이 더 좋으나 너무 긴 것보다 28거래일이 더 좋게 나왔다

4) input_data_column_cnt(입력데이터의 컬럼 개수)가 적은 경우 stacked RNN을 사용하면 빠르게 Over Fitting된다

5) rnn_cell_hidden_dim(각 셀의 (hidden)출력 크기)가 많은 경우 너무 많으면 오래 걸리고 추가 개선은 거의 없다

6) dropout를 사용할 때 keep_prob에 트레이닝할 때는 0.5~0.7, 테스트할 때는 1.0을 사용하는 것을 잊으면 안된다.


추가로 dropout을 적용했을 때 그래프를 붙임합니다. 

dropout 이용시 테스트할 때 keep_prob 값을 꼭 1.0 으로 지정해야합니다.


[keep_prob = 0.5 적용]



[keep_prob = 0.7 적용]



[keep_prob = 0.9 적용]



[아마존 주식 최종가 예측 코딩]










[아마존 주식 최종가 예측 결과]














[Rev. 1. 아마존 내일 주가 예측하기]




아마존 주식 종가 실제값 1,168.92(USD) 과 기존 예측값 1138.6881(USD) 편차가 커서 정확도 높이기 위하여 조건들 변경.

1. 개선된 변경조건 : seq_length = 28 을 7 로 변경1개 시퀀스의 길이로 시계열 데이터 입력개수 단축


[결과]


2017.12.11 (월) 아마존의 기존 예상 종가는 1,138.68 -> 1170,3107 달러로 개선되었다실제결과는 1,168.92 나왔다. (오차)




주식투자 AI 예측 (Tensorflow)


[3D프린터 로봇제어를 위한 딥러닝 (인공지능)]


Lec 00 - Machine/Deep learning 수업의 개요와 일정

ML lec 01 - 기본적인 Machine Learning 의 용어와 개념 설명

ML lab 01 - TensorFlow의 설치및 기본적인 operations (new)

ML lec 02 - Linear Regression의 Hypothesis 와 cost 설명








기존의 수십년 동안 개발되어 왔던 방법들보다 최근 수년 내에 개발된 딥러닝을 이용한 방법들이 우수한 결과를 내고 있습니다. 이공계의 모든 분야에서 딥러닝 기술이 접목되어 우수한 연구 결과들이 쏟아지고 있습니다. 현재 인공지능과 딥러닝은 모든 이공계 분야에 접목되어 엄청난 기술의 발전을 이끌며 4차 산업혁명의 시대를 열고 있습니다. 인공지능이 세상을 바꿔가는 중인데 주식투자도 인공지능으로 할수 없을까? 이런 자동매매 프로그램으로 수익율이 엄청나다던데 내가 프로그램을 작성해 매매해도 수익이 날까? 주식투자자이고, 인공지능에 관심있는 사람들이라면 비슷한 생각을 할겁니다. 저도 3D프린터 로봇제어를 위한 딥러닝 (인공지능) 공부후 관련 프로그램을 로봇에 적용하고자 계획하고 있습니다. 독일의 프리드리히-알렉산더대 연구팀의 크리스토퍼 크라우스 박사는 주식투자 인공지능(AI) 알고리즘을 개발후 엄청난 수익률로 화제가 되기도 했습니다. 딥러닝을 비롯한 총 세가지의 인공지능 학습방식을 복합적으로 사용해 컴퓨터에 주가변화 흐름을 학습시키고, 과거 시장 데이터를 토대로 미국 S&P 500 지수의 몇몇 종목에 대한 모의투자를 실시했습니다. 결과는 1992년부터 2015년까지의 기간동안 연평균 73%라는 수익률을 나타냈습니다. 실제 연간 지수 성장률은 9% 였는데 이보다 8배 이상의 엄청난 수익률 이었습니다. 2000년 이후에는 수익률이 다소 감소하긴 했지만, 실제 시장 수익보다 30% 앞선 결과를 보여주었습니다. 재미있는 결과는 시장이 혼란스러울 때 인간 대비 인공지능의 매매가 돋보였습니다. 인간 투자자들은 시장이 혼란스러우면 심리적인 요인에 영향을 많이 받았다고 합니다. 성과에 대한 집착이나 수익률 하락에 대한 불안감에 의한 심리적인 요인들이 매매에 영향을 주는 것입니다. 하지만 인공지능은 흔히들 말하는 '기계적 매매'로 꾸준히 수익을 올렸습니다. 2008년 세계금융위기에서는 681%라는 엄청난 수익률을, 닷컴 버블이 폭발했던 2000년에는 545%의 수익률을 보였다고 합니다. 인공지능은 이미 주식시장에서 널리 사용되고 있습니다. 홍콩의 자산관리업체 Aidyia Limited는 2015년 인공지능 기반의 헤지펀드를 출범시켰습니다. 이 펀드는 기존의 자동매매 프로그램처럼 단순히 최적의 조건들을 찾아서 거래하는 것이 아니라, 여러 나라의 언어로 된 뉴스나 소셜 미디어를 읽고 각종 경제 데이터를 분석하는 능력을 갖추었고, 이런 정보를 이용해 패턴을 인식하고 시장 흐름을 예측하여 투자를 진행합니다. 인간의 개입없이 독립적으로 작동할수 있다고 합니다. 그리고 회사 창립자는 앞으로 몇년 안에 대형 국부펀드나 연기금들도 인고지능 시스템을 이용하게 될것이라고 예측합니다. 미국의 유명한 투자은행 골드만 삭스에서는 600명에 이르던 주식 트레이더가 인공지능 소프트웨어에 밀려 현재 2명으로 줄었다고 합니다.




[인공지능(AI) 삼성전자 주가예측 프로그램]














[인공지능(AI) LG전자 주가예측 프로그램]














[인공지능(AI) 현대자동차 주가예측 프로그램]














[인공지능(AI) 하이닉스 주가예측 프로그램]















[인공지능(AI) 삼성 바이오로직스 주가예측 프로그램]















[인공지능(AI) 셀트리온 주가예측 프로그램]















[인공지능(AI) 네이버 주가예측 프로그램]















[인공지능(AI) 아모레퍼시픽 주가예측 프로그램]















[인공지능(AI) 현대모비스 주가예측 프로그램]




















사업자 정보 표시
| | | 사업자 등록번호 : -- | TEL : -- | 사이버몰의 이용약관 바로가기