TensorFlow를 사용하여 재무 시계열 데이터 예측


10

ML과 TensorFlow를 처음 사용하고 (약 몇 시간 전에 시작) 시계열에서 다음 몇 가지 데이터 요소를 예측하는 데 사용하려고합니다. 나는 입력을 받고 이것을 사용하여 이것을하고있다 :

/----------- x ------------\
.-------------------------------.
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
'-------------------------------'
     \----------- y ------------/

내가하고 있다고 생각한 것은 x 를 입력 데이터로 사용하고 y 를 해당 입력에 대한 원하는 출력으로 사용하여 0-6이 주어지면 1-7 (특히 7)을 얻을 수 있습니다. 그러나 x 를 입력으로 사용하여 그래프를 실행할 때 얻는 것은 y 보다 x 와 비슷한 예측입니다 .

다음은 코드입니다 ( 이 게시물 및 이 게시물을 기준으로 함).

import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plot
import pandas as pd
import csv

def load_data_points(filename):
    print("Opening CSV file")
    with open(filename) as csvfile:
        print("Creating CSV reader")
        reader = csv.reader(csvfile)
        print("Reading CSV")
        return [[[float(p)] for p in row] for row in reader]

flatten = lambda l: [item for sublist in l for item in sublist]

data_points = load_data_points('dataset.csv')

print("Loaded")

prediction_size = 10
num_test_rows = 1
num_data_rows = len(data_points) - num_test_rows
row_size = len(data_points[0]) - prediction_size

# Training data
data_rows = data_points[:-num_test_rows]
x_data_points = np.array([row[:-prediction_size] for row in data_rows]).reshape([-1, row_size, 1])
y_data_points = np.array([row[prediction_size:] for row in data_rows]).reshape([-1, row_size, 1])

# Test data
test_rows = data_points[-num_test_rows:]
x_test_points = np.array([[data_points[0][:-prediction_size]]]).reshape([-1, row_size, 1])
y_test_points = np.array([[data_points[0][prediction_size:]]]).reshape([-1, row_size, 1])

tf.reset_default_graph()

num_hidden = 100

x = tf.placeholder(tf.float32, [None, row_size, 1])
y = tf.placeholder(tf.float32, [None, row_size, 1])

basic_cell = tf.contrib.rnn.BasicRNNCell(num_units=num_hidden, activation=tf.nn.relu)
rnn_outputs, _ = tf.nn.dynamic_rnn(basic_cell, x, dtype=tf.float32)

learning_rate = 0.001

stacked_rnn_outputs = tf.reshape(rnn_outputs, [-1, num_hidden])
stacked_outputs = tf.layers.dense(stacked_rnn_outputs, 1)
outputs = tf.reshape(stacked_outputs, [-1, row_size, 1])

loss = tf.reduce_sum(tf.square(outputs - y))
optimizer = tf.train.AdamOptimizer(learning_rate)
training_op = optimizer.minimize(loss)

init = tf.global_variables_initializer()

iterations = 1000

with tf.Session() as sess:
    init.run()
    for ep in range(iterations):
        sess.run(training_op, feed_dict={x: x_data_points, y: y_data_points})
        if ep % 100 == 0:
            mse = loss.eval(feed_dict={x: x_data_points, y: y_data_points})
            print(ep, "\tMSE:", mse)

    y_pred = sess.run(stacked_outputs, feed_dict={x: x_test_points})

    plot.rcParams["figure.figsize"] = (20, 10)

    plot.title("Actual vs Predicted")
    plot.plot(pd.Series(np.ravel(x_test_points)), 'g:', markersize=2, label="X")
    plot.plot(pd.Series(np.ravel(y_test_points)), 'b--', markersize=2, label="Y")
    plot.plot(pd.Series(np.ravel(y_pred)), 'r-', markersize=2, label="Predicted")
    plot.legend(loc='upper left')
    plot.xlabel("Time periods")
    plot.tick_params(
        axis='y',
        which='both',
        left='off',
        right='off',
        labelleft='off')
    plot.show()

아래 그래프에 표시된 결과 는 y 와 비슷해야하므로 왼쪽으로 이동하지 않고 오른쪽으로 예측 된 점을 포함하여 x 뒤에 오는 예측입니다 . 분명히 빨간 선이 가능한 한 파란 선에 가깝도록하는 것이 바람직하다.

그래프

이 모든 작업을 어떻게해야할지 모르겠으므로 ELI5를 참조하십시오.

또한, 내 데이터 포인트는 상당히 작은 숫자입니다 (0.0001의 순서). 1000000을 곱하지 않으면 결과가 너무 작아서 빨간색 선이 차트의 맨 아래에 거의 평평합니다. 왜? 피트니스 기능의 제곱으로 인한 것 같아요. 사용하기 전에 데이터를 정규화해야합니까? 그렇다면 어떻게해야합니까? 0-1? 내가 사용하는 경우 :

normalized_points = [(p - min_point) / (max_point - min_point) for p in data_points]

내 예측이 진행됨에 따라 더 크게 변동합니다. 변동하는

편집 : 나는 바보이며 500이 아닌 배울 수있는 하나의 예만 제공합니까? 그래서 500 포인트 샘플을 여러 개 주어야합니다.


RNN의 출력이 목표 (Y)가 아닌 입력 (X)을 따른다는 동일한 문제가 있습니다. 같은 RNN에 입력이 제대로 배운다 간단한 사인 시리즈가 이상하게 때, 즉는 Y.을 예측
— RYSZARD Cetnarski

dataset.csv 파일을 공유하십시오
— Ashwin Tomar

답변:


2

좋아, 부분적으로 가자 여기에는 네트워크의 편향을 고려하지 않은 부분이 꽤 있습니다.

입력 및 출력 선택

벡터 0-6이 결정되면 실제로 1-7을 출력 할 필요가 없습니다. 1-6은 이미 알려져 있으며 추가 출력을 추가하면 모델에 복잡성이 추가됩니다. 상당한 양의 데이터가없는 한 좋은 성능을 얻으려면 모델을 가능한 한 단순하게 유지하십시오. 따라서 나는 지속적인 가치를 가진 간단한 뉴런을 출력 할 것입니다. 신경망의 회귀 출력과 함께 RMSE를 손실 함수로 사용할 수 있습니다.

또한 추세선에 대한 정보가 포함되어 있다고 생각되는 추가 정보를 입력 공간에 넣은 샘플을 보충해야합니다. 예를 들어, 비트 코인과 금의 두 가지 제품이 있고 입력 벡터가 동일하면 금의 변동이 거의 없지만 비트 코인의 변동이 매우 클 것으로 예상 할 수 있습니다.

네트워크에 대한 입력 기능에는 네트워크가 배우는 모든 정보가 포함됩니다. 따라서 의미있는 예측을하기에 충분한 정보를 제공해야합니다.

딥 러닝은 배고프다

약 100,000 개 이상의 인스턴스가 필요합니다. 각 인스턴스는 기능 세트입니다. 이들은 독립적으로 그리고 동일하게 분배되도록 그려 져야합니다. 다시 말해, 네트워크를 사용하려는 다양한 데이터 소스에서 여러 추세선을 가져 오려면 임의로 0-6 점, 즉 기능, 7은 레이블이됩니다.

배우려는 데이터 배포를 고려하십시오. 네트워크가 고양이 / 개를 분류하기를 원한다면, 네트워크가이 두 클래스에 존재하는 분산을 식별 할 수 있도록 다양한 다른 고양이와 개를 제공해야합니다. 데이터 소스를 너무 많이 제한하면 바이어스가 높아지고 나중에 데이터를 제공 할 새로운 데이터로 일반화되지 않습니다.


이러한 것들을 시도하고 우리에게 무슨 일이 있는지 알려주십시오.


2

아마도 입력과 동일한 예측은 네트워크가 훈련되지 않았다는 것을 반영합니다. 시계열 예측을위한 소위 지속성 모델이라고도하며 종종 다른 모델의 기준선으로 사용됩니다. 지속성 모델은 마지막 관측치를 예측으로 사용합니다. 간단하고 종종 합리적인 정확도를 제공합니다. 내 추측에 따르면 네트워크는 지속성 모델을 배우는 것으로 시작하며 더 많이 훈련하고 더 나은 모델을 만들 수 있다면 그것을 배울 것입니다.하지만 많은 훈련이 필요합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.