[Расширенный бой RNN] Научит вас предсказывать самую высокую точку акции в день

искусственный интеллект

Резюме

На Toutiao есть много людей, которые занимаются анализом фондового рынка и анализируют ежедневные взлеты и падения рынка. Я наблюдал за несколькими людьми, и их прогнозы не идеальны. Я всегда хотел использовать ИИ для прогнозирования взлетов и падений рынка. магазин. Данные фондового рынка представляют собой данные временного ряда, и RNN больше подходит.Сегодня я буду использовать GRU, чтобы научить вас, как реализовать этот алгоритм.
Отказ от ответственности
Результаты алгоритма не могут быть использованы в качестве основы для инвестиций! ! ! Если будете инвестировать по результатам алгоритма, не ждите, что я потеряю деньги!
在这里插入图片描述

получить необработанные данные

Адрес веб-сайта:quotes.money.163.com/trade/ Цепочка…
Здесь вы можете найти исторические данные большого объема рынка, мы можем выбрать все данные для загрузки.
Способ загрузки следующий:
在这里插入图片描述
Нажмите, чтобы загрузить данные, выберите все данные по умолчанию, а затем загрузите их.
在这里插入图片描述

Создание обучающих данных

Исходные данные нельзя использовать напрямую, нам нужно построить данные временных рядов. Моя идея состоит в том, чтобы использовать данные за предыдущие n-1 дней, чтобы предсказать самую высокую точку или цену закрытия за n дней. Таким образом, данные предыдущих n-1 дней составляют x, а наивысшая точка дня — y.
Конкретные идеи для создания данных:
Первым шагом является чтение данных, замена нескольких «Нет» на 0 и форматирование даты.Поскольку загружаемые данные по умолчанию находятся в обратном порядке даты, дата располагается в порядке возрастания.
Шаг 2 Удалите столбцы «Символ акции», «Имя» и «Дата».
Третий шаг — определить длину временного ряда n, где n представляет количество дней использования данных. Определите столбцы имени столбца, тип — список, определите данные и сохраните данные временных рядов.
Четвертый шаг - перебрать df, прочитать данные, построить данные временных рядов и сохранить их в данных.Этот процесс относительно медленный.Я не знаю, есть ли ярлык.Если есть, сообщите, пожалуйста.
Шаг 5. Сохраните данные в файл sssh.csv.
在这里插入图片描述
Конечным результатом является файл sssh.csv, который затем готов к обучению.
Примечание. Последняя строка файла — это тестовые данные, поэтому метки нет, я установил для нее значение 0.
Полный код выглядит следующим образом:

import pandas as pd
df = pd.read_csv("000001.csv", encoding='gbk')
df=df.replace("None", '0')
df["日期"] = pd.to_datetime(df["日期"], format="%Y-%m-%d")
df.sort_values(by=["日期"], ascending=True)
del df["股票代码"]
del df["名称"]
df = df.sort_values(by=["日期"], ascending=True)
df.to_csv("sh.csv", index=False, sep=',')
del df['日期']
n = 60
cols = []
for col in df.columns:
    for i in range(n):
        cols.append(col + str(i))
cols.append('y')
data = []
for k in range(n, len(df) + 1):
    onedata = []
    for ii in range(n, 0, -1):
        for colindex in range(len(df.columns)):
            onedata.append(df.values[k - ii][colindex])
    if k < len(df):
        onedata.append(df.values[k][1])
    else:
        onedata.append(0)
    print(onedata)
    data.append(onedata)
df_train = pd.DataFrame(data, columns=cols)
df_train.to_csv("sssh.csv", index=False, sep=',')

Построить модель

Модель использует GRU, для скрытого слоя установлено значение 64, а платформа использует pytorch, Код модели выглядит следующим образом:
RNN — это модель, а TrainSet — это логика чтения данных.

class RNN(nn.Module):
    def __init__(self, input_size):
        super(RNN, self).__init__()
        self.rnn = nn.GRU(
            input_size=input_size,
            hidden_size=64,
            num_layers=1,
            batch_first=True
        )
        self.out = nn.Sequential(
            nn.Linear(64, 1),
        )
        self.hidden = None

    def forward(self, x):
        r_out, self.hidden = self.rnn(x)  # None 表示 hidden state 会用全0的 state
        out = self.out(r_out)
        return out


class TrainSet(Dataset):
    def __init__(self, data, lables):
        # 定义好 image 的路径
        self.data, self.label = data.float(), lables.float()

    def __getitem__(self, index):
        return self.data[index], self.label[index]

    def __len__(self):
        return len(self.data)

разработка функций

Я занимаюсь разработкой функций:
1. Масштабируйте метку и масштабируйте метку в диапазоне от 0 до 1.
2. Используйте полиномы для расширения функций.
3. Масштабируйте данные x от 0 до 1.
код показывает, как показано ниже:

LR = 0.0001
EPOCH = 300
# 数据集建立

df = pd.read_csv("sssh.csv", encoding='utf-8')
scaler_y = MinMaxScaler(feature_range=(0, 1))
df['y'] = scaler_y.fit_transform(df['y'].values.reshape(-1, 1))
target = df['y']
del df['y']
polyCoder = PolynomialFeatures(degree=2, include_bias=True, interaction_only=False)
df = polyCoder.fit_transform(df)
df = pd.DataFrame(df, columns=polyCoder.get_feature_names())
cols = df.columns
scaler = MinMaxScaler(feature_range=(0, 1))
for clo in cols:
    df[clo] = scaler.fit_transform(df[clo].values.reshape(-1, 1))

Сегментация набора данных

Сначала вырежьте тестовый набор, тестовый набор — это последняя строка. Затем тестовый набор и проверочный набор делятся в соответствии с определенной пропорцией.Метод разделения использует train_test_split, а соотношение разделения обычно составляет 7:3. код показывает, как показано ниже:

data = df[:df.shape[0] - 1]
y=target[:df.shape[0] - 1]
test = df[df.shape[0] - 1:]
X_train, X_val, y_train, y_val = train_test_split(data, y, test_size=0.1, random_state=6)

проверка обучения

На первом этапе используется DataLoader для загрузки обучающих и тестовых наборов.
Модель второго шага, n — размер входных данных, оптимизатор использует Adam, потери — mse.
Тест третьего шага.
Четвертая проверка.
Весь процесс относительно прост.
код показывает, как показано ниже:

# 第一步
trainloader = DataLoader(trainset, batch_size=64, shuffle=True)
valloader = DataLoader(valset, batch_size=64, shuffle=True)

#第二步
rnn = RNN(n)
optimizer = torch.optim.Adam(rnn.parameters(), lr=LR)  # optimize all cnn parameters
loss_func = nn.MSELoss()
#第三步
for step in range(EPOCH):
    rnn.train()
    for tx, ty in trainloader:

        output = rnn(torch.unsqueeze(tx, dim=1))
        loss = loss_func(torch.squeeze(output), ty)
        optimizer.zero_grad()  # clear gradients for this training step
        loss.backward()  # back propagation, compute gradients
        optimizer.step()
    print(step, loss)
    if step % 10:
        torch.save(rnn, 'rnn.pkl')
    #第四步    
    rnn.eval()
    for vx, vy in valloader:
        output = rnn(torch.unsqueeze(vx, dim=1))
        loss = loss_func(torch.squeeze(output), vy)
        print("Val Loss {}".format(loss))

контрольная работа

Этот процесс относительно прост.
Протестируйте тестовые данные, выведите результаты, а затем выполните inverse_transform, чтобы восстановить результаты.

rnn.eval()
test = np.array(test)
test = torch.Tensor(test)
test=torch.unsqueeze(test, dim=1)
output=rnn(test)
print(output.data.item())
output=np.array(output.data.item())
inv_y = scaler_y.inverse_transform(output.reshape(-1,1))
inv_y = inv_y[0]
print(inv_y)

Прогнозируемая наивысшая точка на сегодня — 3597, но фактическая наивысшая точка — 3594, разница в три балла.
在这里插入图片描述
Полный код:download.CSDN.net/download/Хе-хе…