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.