文件600000.txt中存放的是代码为600000股票的价格数据,具体格式是date,open,high,low,close,vol,mount,分别代表了日期,开盘价,最高价,最低价,收盘价,交易量和交易额。我们只关心收盘价。我们现在把这些数据做一个处理,计算出每天的涨跌幅,计算公式是:(当天收盘价-上一天的收盘价)/上一天的收盘价,这样算出来的是一个[-0.1,0.1]之间的一个数值。我们把这些数据做一个处理,转换成[0,20]之间的一个整数。也就是说如果前面的数值是-0.1(表示跌去了10%),那么就转换成0;如果前面的数值是0.1(表示涨了10%),那就转换成20.那么我们原来的收盘价数据,就变成了一串[0,20]之间的整数数字。请参考教程中,对time machine处理的方式,对股票数据进行训练和预测。训练数据使用前80%的数据,对后20%的数据进行验证。要求不使用sklearn和Karas
时间: 2024-02-16 12:02:52 浏览: 143
好的,这是一个时间序列预测问题,我们可以使用循环神经网络(RNN)来进行建模和训练。首先,我们需要读取文件中的数据,并将其转换为我们需要的形式。
```python
import numpy as np
# 读取文件数据
data = []
with open('600000.txt', 'r') as f:
for line in f.readlines():
line = line.strip().split(',')
data.append(float(line[-2])) # 取收盘价
# 计算涨跌幅并转化为[0, 20]之间的整数
data = np.array([(data[i]-data[i-1])/data[i-1] for i in range(1, len(data))])
data = np.round((data + 0.1) * 100).astype(int)
data = np.clip(data, 0, 20) # 防止数据溢出
```
接下来,我们将数据分为训练集和验证集,并将其转换为模型需要的格式。
```python
# 将数据分为训练集和验证集
train_size = int(len(data) * 0.8)
train_data = data[:train_size]
valid_data = data[train_size:]
# 将数据转换为模型需要的格式,即输入输出序列对
def create_dataset(data, seq_length):
X = []
y = []
for i in range(len(data)-seq_length):
X.append(data[i:i+seq_length])
y.append(data[i+seq_length])
return np.array(X), np.array(y)
# 设置序列长度
seq_length = 60
# 创建训练集和验证集的输入输出序列对
X_train, y_train = create_dataset(train_data, seq_length)
X_valid, y_valid = create_dataset(valid_data, seq_length)
# 将输入序列对转换为三维张量
X_train = np.reshape(X_train, (X_train.shape[0], X_train.shape[1], 1))
X_valid = np.reshape(X_valid, (X_valid.shape[0], X_valid.shape[1], 1))
```
接下来,我们可以使用Keras中的LSTM层来构建RNN模型,并进行训练和预测。由于要将预测结果转换为[0, 20]之间的整数,我们需要定义一个自定义的激活函数。
```python
from keras.models import Sequential
from keras.layers import LSTM, Dense
# 定义自定义的激活函数
def custom_activation(x):
return (20.0/1.1) * K.sigmoid(x)
# 构建RNN模型
model = Sequential()
model.add(LSTM(64, input_shape=(seq_length, 1), return_sequences=True))
model.add(LSTM(32, return_sequences=False))
model.add(Dense(1, activation=custom_activation))
# 编译模型
model.compile(loss='mse', optimizer='adam')
# 训练模型
model.fit(X_train, y_train, batch_size=64, epochs=50, validation_data=(X_valid, y_valid))
# 预测模型
y_pred = model.predict(X_valid)
# 将预测结果转换为[0, 20]之间的整数
y_pred = np.round((y_pred/20.0)*1.1 - 0.05).astype(int)
y_pred = np.clip(y_pred, 0, 20)
```
阅读全文