@w568w
2020-08-04T15:24:43.000000Z
字数 2671
阅读 1521
采用LSTM*3 + Full-connected
为网络。
每次输入16天数据,输出接下来1天的收盘价格。
训练时使用Keras
作为框架,数据均已归一化。
以600001(浦发银行)
近14年数据为训练集和验证集。
使用Geforce GTX 1650
显卡、CUDA 10.1
环境,在与上轮流训练,总用时约 20 分钟。
经过若干轮训练,训练集上的Loss
稳定在左右,测试集上的Loss
稳定在左右,符合精度要求。
在随机抽取的两支股票中获取近14年数据,抽样验证,结果如下:
Figure 1:000998(隆平高科)
Figure 2: 600435(北方导航)
import os
from typing import List, Any
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '1'
from numpy.core._multiarray_umath import ndarray
from tensorflow.keras.layers import Dense
import csv
import numpy as np
import matplotlib.pyplot as plt
from tensorflow.python.keras import Sequential
from tensorflow.python.keras.layers import LSTM, Dropout
def train(m: Sequential):
for i in range(0, 5):
m.fit(Train_X, Train_Y, batch_size=BATCH_SIZE, epochs=EPOCHES,
validation_split=1 / 3)
m.fit(Train_X, Train_Y, batch_size=BATCH_SIZE, epochs=EPOCHES)
m.save_weights("lstm.mw")
def validate(m: Sequential, num=50):
plt.title("Validate Result")
plt.plot(range(1, num + 1), m.predict(Train_X[0:num]).flatten(order='C'), 'blue',
label='Prediction')
plt.plot(range(1, num + 1), Train_Y[0:num].flatten(order='C'), 'red', label='Real Value')
plt.legend()
plt.show()
def normalization(arr: ndarray):
return (arr - arr.min()) / (arr.max() - arr.min())
BATCH_SIZE = 5
TIME_STEP = 16
DATA_FRAME_NUM = 4
OUTPUT_NUM = 1
EPOCHES = 5
Train_X: ndarray = np.empty([1, 3, 2], dtype=float)
Train_Y = np.empty([], dtype=float)
with open('history_A_stock_k_test_data.csv', 'r') as f:
data_list: List[Any] = list(csv.reader(f))
Train_X = np.empty([0, TIME_STEP, DATA_FRAME_NUM], dtype=float)
Train_Y = np.empty([0, OUTPUT_NUM], dtype=float)
time_step_array: ndarray = np.empty([1, TIME_STEP, DATA_FRAME_NUM], dtype=float)
for i in range(1, len(data_list)):
time_step_array[0][i % TIME_STEP - 1] = data_list[i][1:5]
if i < TIME_STEP:
continue
if i % TIME_STEP == 0:
Train_X = np.append(Train_X, time_step_array, axis=0)
elif i % TIME_STEP == 1:
Train_Y = np.append(Train_Y,
np.expand_dims(np.asarray(data_list[i][4:5], dtype=float), axis=0),
axis=0)
Train_X = normalization(Train_X)
Train_Y = normalization(Train_Y)
model: Sequential = Sequential()
model.add(LSTM(128, return_sequences=True,
input_shape=(TIME_STEP, DATA_FRAME_NUM)))
model.add(LSTM(128, return_sequences=True))
model.add(LSTM(128))
model.add(Dropout(0.2))
model.add(Dense(OUTPUT_NUM, activation="linear"))
model.compile(loss='mse', optimizer='rmsprop')
model.load_weights("lstm.mw")
# 训练他妈的股票预测模型
train(model)
经过又一次将近 30 分钟的训练,达到了如下精度:
Figure 3: 300059(东方财富)
事实证明,在一定误差范围、一定时期内,股票的走向或许是可预测的。
当然这个模型非常烂,没有考虑外界因素(政策变化、市场走向等等),并且只是简单运用了LSTM
的预测能力。
PS:就我所知,股票预测是很多大学人工智能课程的入门教学示范...
这样的模型有很多人做过,我不是第一个,也肯定不是最后一个。
尽管我不懂炒股,但就我浅薄的经济学知识来看,股票真正难搞的不是走向,而是常常出现的、猝不及防的黑天鹅事件。而这一点,在相当程度内,都是机器学习无法预知的。
真指望用这个炒股还是算了...
0202年了,不会还有人炒股吧 不会吧不会吧