ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Python) 선형회귀 모델을 사용해서 주식 상승률 예측하기(초보)
    Programing Language/Python 2021. 7. 24. 13:19
    728x90
    반응형

    계속해서 공부해야지 해야지 했던 인공지능 관련 개발을 동빈나님 유튜브 채널을 통해서 처음 시작하게 되었다.

    처음 소개된 내용은 선형회귀 모델이다.

    자세한 이론 설명은 다음을 참고하면 좋다.

    https://www.youtube.com/watch?v=ve6gtpZV83E&list=PLRx0vPvlEmdAbnmLH9yh03cw9UQU_o7PO&index=20 

     

    이론을 제외하고 결론을 말하면 원인과 결과를 알면 해당 내용을 학습해서 학습 모델을 만들고 

    원인을 입력함으로써 결과를 예측하는 것을 말한다.

    해당 동빈나님의 강의는 여러가지 인자를 통해서 배추가격을 예측하는 인공지능 모델을 만들었다.

     

    나는 현재 TSMC 주주이기 때문에 간단하게 나스닥 상승률에 따른 TSMC 상승률로 인공지능 모델을 코드로 만들어 보기로 했다.

    자료는 인베스팅 홈페이즈를 통해서 2020.01.01 ~ 2021.07.23일의 나스닥, tsmc 데이터를 수집했다.

    https://www.investing.com/indices/nasdaq-composite-historical-data

     

    NASDAQ Composite Historical Rates (IXIC) - Investing.com

    Get free historical data for the NASDAQ Composite.

    www.investing.com

     

    코드는 다음과 같다. (Tensorflow 버전은 2.0입니다. 2.0 버전에서 1.0 버전 문법을 사용했습니다.)

    학습 모델 파일.py

    import os
    import tensorflow as tf
    import numpy as np
    from pandas.io.parsers import read_csv
    
    os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3'
    model = tf.compat.v1.global_variables_initializer()
    
    nasdac_data = read_csv('nasdac_data.csv', sep=',')
    tsmc_Data = read_csv('tsmc_data.csv', sep=',')
    
    nasdac_xy = np.array(nasdac_data, dtype=np.float32) 
    tsmc_xy = np.array(tsmc_Data, dtype=np.float32)  
    
    
    # nasdac의 상승률 저장
    x_data = nasdac_xy[:, [-1]]
    
    
    # TSMC 상승률 저장
    y_data = tsmc_xy[:, [-1]]
    
    
    for index in range(len(x_data)):
        x_data[index] = (x_data[index] * 100) # 엑셀로 1% -> 숫자로 변환하면 0.01이 나오기 때문에 배열 값에 100을 곱해줘서 값을 고쳐준다.
    
        
    for index in range(len(y_data)):
        y_data[index] = (y_data[index] * 100) # 상동
    
    
    # 플레이스 홀더를 설정합니다.
    tf.compat.v1.disable_eager_execution()
    
    X = tf.compat.v1.placeholder(tf.float32, shape=[None, 1])  # X 값으로 넣어줄 x_data가 2차원 배열(xy)에서 총 1개의 값을 가지기 때문에 1로 지정한다.
    Y = tf.compat.v1.placeholder(tf.float32, shape=[None, 1])  # 상동
    
    W = tf.Variable(tf.random.normal([1, 1]), name="weight") # placeholder의 2차월 배열과 같은 차원으로 값을 타입을 맞춰준다.
    b = tf.Variable(tf.random.normal([1]), name="bias")
    
    
    
    # 가설을 설정합니다.
    hypothesis = tf.matmul(X, W) + b
    
    # 비용 함수를 설정합니다.
    cost = tf.reduce_mean(tf.square(hypothesis - Y))
    
    
    
    # 최적화 함수를 설정합니다.
    optimizer = tf.compat.v1.train.GradientDescentOptimizer(learning_rate=0.000005)
    train = optimizer.minimize(cost)
    
    # 세션을 생성합니다.
    sess = tf.compat.v1.Session()
    
    
    
    # 글로벌 변수를 초기화합니다.
    sess.run(tf.compat.v1.global_variables_initializer())
    
    # 학습을 수행합니다.
    for step in range(100000):
    
        cost_, hypo_, _ = sess.run([cost, hypothesis, train], feed_dict={X: x_data, Y: y_data})
    
        if step % 500 == 0:
    
            print("#", step, " 손실 비용: ", cost_)
            print("- tscm 상승률: ", hypo_[0])
    
    
    
    # 학습된 모델을 저장합니다.
    saver = tf.compat.v1.train.Saver()
    save_path = saver.save(sess, "./tsmc_saved.cpkt")
    print('학습된 모델을 저장했습니다.')
    #'''

     

    결과 실행 파일.py

    import os
    import tensorflow as tf
    import numpy as np
    
    
    os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3'
    # 플레이스 홀더를 설정합니다.
    tf.compat.v1.disable_eager_execution()
    
    X = tf.compat.v1.placeholder(tf.float32, shape=[None, 1])
    Y = tf.compat.v1.placeholder(tf.float32, shape=[None, 1])
    
    W = tf.Variable(tf.random.normal([1, 1]), name="weight")
    b = tf.Variable(tf.random.normal([1]), name="bias")
    
    # 가설을 설정합니다.
    hypothesis = tf.matmul(X, W) + b
    
    # 저장된 모델을 불러오는 객체를 선언합니다.
    saver = tf.compat.v1.train.Saver()
    model = tf.compat.v1.global_variables_initializer()
    
    # 1가지 변수를 입력 받습니다.
    avg_temp = float(input('나스닥 상승률: '))
    
    
    with tf.compat.v1.Session() as sess:
        sess.run(model)
    
        # 저장된 학습 모델을 파일로부터 불러옵니다.
        save_path = "./tsmc_saved.cpkt"
        saver.restore(sess, save_path)
    
        # 사용자의 입력 값을 이용해 배열을 만듭니다.
        data = ((avg_temp))
        arr = np.array([[data]], dtype=np.float32)
    
    
        # 예측을 수행한 뒤에 그 결과를 출력합니다.
        x_data = arr[0:1]
        dict = sess.run(hypothesis, feed_dict={X: x_data})
        print("나스닥 상승률에 따른 TSMC 주가 상승률 : ", str(round(dict[0][0], 2)) + "%")

     

    결과

     

    전체적으로 나스닥 상승에 따른 TSMC 상승 결과 도출 가설 자체가 성립되지 않기에 이상한 값이 나온다.

    그럼 이만. 다들 즐코딩

    (재미로 만들어 본 것이니 예측 값에 대해서는 신뢰도는 0% 입니다.)

    728x90
    반응형
Designed by Tistory.