Резюме
На 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/Хе-хе…