NGMsoftware

NGMsoftware
로그인 회원가입
  • 매뉴얼
  • 학습
  • 매뉴얼

    학습


    딥러닝 삼성전자 주식 인공지능(?)으로 예측해보자 - Python, Deep Learning

    페이지 정보

    본문

    요즘 YouTube를 보다가 아주 공격적인 제목의 동영상을 하나 봤습니다. 제목은 "삼성전자 주식 인공지능으로 예측해보자"인데요. 제목과는 다르게 예측이 불가능할거라는건 누구나 다 예상하고 이 글을 보실겁니다. 국제적인 정세의 변화나 갑자기 나타나는 신생 회사들과 신소재 개발등등... 여러가지 변수들이 존재하기 때문입니다. 만약, 주식을 인공지능(?)으로 예측할 수 있다면~ 세계 경제가 어떻게될지는 여러분들의 상상에 맡기겠습니다^^;

     

    엔지엠 매크로를 이용해서 주식, 코인, 선물등등... 자동 매매에 이용하시는 분들이 계십니다. 이 분들은 나름대로 각자 노하우가 있고, 봉차트(캔들차트)를 분석하거나 어떤 룰에 의해 동작하는 매크로를 쓰고 있습니다. 하지만, 이런 타이밍(?)에 대한 룰이 없이 인공지능이라는 도구로 쉽게 주가를 예측할 수 있다는 동영상이었는데요. 내용은 흥미를 끌기에 충분해 보였습니다. 하지만, 통계적인 설명과 인공지능(?) 알고리즘에 대한 내용이 없다보니 개발자가 보기에는 다소 부족한 부분들이 많아 보였습니다.

     

    아래는 해당 동영상에서 설명하는 전체 코드입니다. 주피터가 아닌 Visual Studio Code에서 작성했으므로 약간 코드가 다를겁니다.

    import os
    os.add_dll_directory('C:\\Program Files\\NVIDIA GPU Computing Toolkit\\CUDA\\v11.0\\bin')
    
    import pandas as pd
    import numpy as np
    import matplotlib.pyplot as plt
    from keras.models import Sequential
    from keras.layers import LSTM, Dropout, Dense, Activation
    import datetime
    
    data = pd.read_csv('dataset/005930.KS.csv')
    
    high_prices = data['High'].values
    low_prices = data['Low'].values
    mid_prices = (high_prices + low_prices) / 2
    
    seq_len = 50
    sequence_length = seq_len + 5
    
    result = []
    for index in range(len(mid_prices) - sequence_length):
        result.append(mid_prices[index: index + sequence_length])
    
    normalized_data = []
    for window in result:
        normalized_window = [((float(p) / float(window[0])) - 1) for p in window]
        normalized_data.append(normalized_window)
    
    result = np.array(normalized_data)
    
    row = int(round(result.shape[0] * 0.9))
    train = result[:, :]
    np.random.shuffle(train)
    
    x_train = train[:, :-1]
    x_train = np.reshape(x_train, (x_train.shape[0], x_train.shape[1], 1))
    y_train = result[:, -1]
    
    x_test = result[row:, :-1]
    x_test = np.reshape(x_test, (x_test.shape[0], x_test.shape[1], 1))
    y_test = result[row:, -1]
    
    print(x_train.shape, x_test.shape)
    
    model = Sequential()
    model.add(LSTM(50, return_sequences=True, input_shape=(50, 1)))
    model.add(LSTM(64, return_sequences=False))
    model.add(Dense(1, activation='linear'))
    model.compile(loss='mse', optimizer='rmsprop')
    print(model.summary())
    
    model.fit(x_train, y_train, validation_data=(x_test, y_test), batch_size=10, epochs=20)
    
    pred = model.predict(x_test)
    final_price = (pred + 1) * float(window[0])
    true_price = (y_test + 1) * float(window[0])
    fig = plt.figure(facecolor = 'white', figsize=(10,10))
    ax = fig.add_subplot(1,1,1)
    ax.set(xlim=[0, 100], ylim=[0, 200000], title='samsung stock', xlabel='day', ylabel='prices')
    ax.plot(true_price, label='True')
    ax.plot(final_price, label='Prediction')
    ax.legend()
    plt.show()

     

    Visual Studio Code에서 작성했기 때문에 코드에 약간 수정된 부분들이 있습니다. 데이타는 야후 파이넨셜에서 삼성전자의 5년 전부터 현재까지의 데이타셋을 다운로드 받아서 null 데이타는 제거하고 학습에 사용했습니다. 최종 결과만 보면 인공지능이라고 부를수도 없는 내용인데요. 이미 공개된 데이타를 후행학습해서 그래프로 그려도 동일한 결과를 얻을 수 있을겁니다. 강화학습까지 가려면 예측한 데이타와 오늘의 종가를 비교해서 모델에 반영할 수 있어야 하고 이렇게 반영된 모델을 기반으로 예측할 수 있어야 합니다. 그리고, 대내외적인 변수들도 지표를 만들어서 가중치를 설정해야 하고, 이 가중치 또한 자동으로 보정이 될 수 있는 납득할만한 모델(R2R, APC)이 필요합니다. 

    B1BSAjG.png

     

     

    간단하게 학습 목적으로 테스트 해보기엔 좋은 강좌 내용이지만, 단순한 몇줄의 코딩으로 무언가를 하려는 생각은 안하는게 좋습니다. 벌써 20년동안 누적된 장비 데이타로 수율을 높이기 위해 빅데이타, 딥러닝, 인공지능등등... 연구하고 있지만 몇년째 뚜렷한 성과를 내지 못하고 있거든요. 위 내용은 아마도 50일치 데이타로 하루를 예측(제가 볼땐 그저 50일 데이타중에 난수 하나 뽑는것과 같은...)하기 때문에 변동성이 크지 않은 삼성전자 주가는 이쁘게 잘 표현해주는듯 보입니다. 주식을 잘 모르는 상태라서 더이상 분석은 무의미합니다. 주로 Java와 C#으로 개발하는 저로써는 "확실히 파이썬이 편리하구나" 정도로 만족하고 있습니다.

     

    제 글들을 보시면 아시겠지만~ 저는 강의나 강좌라는 용어를 잘 사용하지 않습니다. 어줍짢고 하찮은 지식으로 누군가에게 가르쳐준다는게 스스로에게 너무나 창피하기 때문입니다. 현업에 나와보면 정말 많은 고수분들이 계십니다. 말 몇마디 나눠보면 내공을 가늠할 수 있고, 이사람은 진짜구나라고 느낄때가 많습니다. 그렇다보니 점점 겸손해지는거 같기도 합니다. 현업 개발쪽은 그래도 무언가 물어보면 자신의 노하우를 아낌없이 나눠주는 분들이 많이 있습니다. 다 그렇지는 않지만요^^; 유튜브도 저같이 궁금한게 많은 개발자들에게는 정말 좋은 선생님입니다. 제가 모르는 분야나 궁금한 것들을 쉽고 빠르게 학습할 수 있도록 도와주기 때문이죠~ 엔지엠 매크로도 안정화가 되어서 어떤 기능을 더 추가해볼까~ 고민하면서 밴치마킹중입니다. 유튜브에는 정말 많은 고수분들이 자신의 지식을 나눠주기 위해 노력하고 있고, 선의로 배푸는 분들이 많습니다. 하지만, 잘못된 정보로 오해를 불러 일으킬만한 내용들은 공부하는 사람들이 잘 걸러서 들어야 할듯 합니다.

    ※ 코닥이 6월에 많이 올랐다가 다시 원래대로 돌아가고 있습니다ㅠㅠ;

    ※ 테슬라는 6월에 머스크 리스크로 바닥을 치고 다시 오르고 있네요^^

     

    개발자에게 후원하기

    MGtdv7r.png

     

    추천, 구독, 홍보 꼭~ 부탁드립니다.

    여러분의 후원이 빠른 귀농을 가능하게 해줍니다~ 답답한 도시를 벗어나 귀농하고 싶은 개발자~

    감사합니다~

    • 네이버 공유하기
    • 페이스북 공유하기
    • 트위터 공유하기
    • 카카오스토리 공유하기
    추천0 비추천0

    댓글목록

    등록된 댓글이 없습니다.