Python深度学习: 股票价格预测实战
Python深度学习: 股票价格预测实战
股票价格预测一直是金融领域研究的热点和难点。本文将利用Python和深度学习技术,结合数据清洗、归一化、CNN模型构建和交叉验证等方法,实现股票价格预测,并提供完整代码和详细分析。
1. 数据预处理
数据预处理是模型构建的关键步骤,直接影响模型的准确性和稳定性。本案例中,我们首先需要对原始数据进行以下处理:
1.1 数据清洗
- 使用pandas库读取Excel格式的股票数据。- 删除数据集中存在的缺失值。- 去除重复数据,确保数据的唯一性。- 处理异常值,例如将涨跌幅限制在合理范围内(-10%到10%)。pythonimport pandas as pd
读取数据data = pd.read_excel('E:/pythonProject5/深度学习/新建 XLS 工作表.xls')
删除缺失值data.dropna(inplace=True)
删除重复值data.drop_duplicates(inplace=True)
处理异常值data = data[(data['涨跌幅'] >= -10) & (data['涨跌幅'] <= 10)]
1.2 数据归一化和标准化
- 使用最小-最大规范化和Z-score规范化方法对数据进行归一化,消除不同特征之间的量纲差异。- 使用Box-Cox变换和Yeo-Johnson变换对数据进行标准化,将数据转换为接近正态分布,提高模型的拟合效果。python# 最小-最大规范化def min_max_scale(data): return (data - data.min()) / (data.max() - data.min())
Z-score规范化def z_score_scale(data): return (data - data.mean()) / data.std()
对数据进行归一化和标准化data['涨跌幅'] = min_max_scale(data['涨跌幅'])data['涨跌幅'] = z_score_scale(data['涨跌幅'])
from scipy.stats import boxcox, yeojohnson
Box-Cox变换data['涨跌幅'] = data['涨跌幅'] - data['涨跌幅'].min() + 1data['涨跌幅'], _ = boxcox(data['涨跌幅'])data['涨跌幅'] = z_score_scale(data['涨跌幅'])
Yeo-Johnson变换data['涨跌幅'] = data['涨跌幅'] - data['涨跌幅'].min() + 1data['涨跌幅'], _ = yeojohnson(data['涨跌幅'])data['涨跌幅'] = z_score_scale(data['涨跌幅'])
2. 模型构建
本案例中,我们使用卷积神经网络(CNN)进行股票价格预测。CNN 是一种强大的深度学习模型,特别适用于处理序列数据。
2.1 构建CNN模型
- 使用Keras库构建CNN模型。- 输入层:使用Conv1D层提取股票价格的局部特征。- 池化层:使用MaxPooling1D层降低特征维度,减少计算量。- 全连接层:使用Dense层将特征映射到输出空间。- 输出层:使用线性激活函数预测股票价格。pythonimport numpy as npfrom keras.models import Sequentialfrom keras.layers import Conv1D, MaxPooling1D, Flatten, Dense, Dropout
提取特征open_prices = data['开盘'].valuesclose_prices = data['收盘'].valueshigh_prices = data['最高'].valueslow_prices = data['最低'].valuesprices = np.array([open_prices, close_prices, high_prices, low_prices])prices = np.transpose(prices)prices = np.expand_dims(prices, axis=2)
定义CNN模型model = Sequential()model.add(Conv1D(64, 3, activation='relu', input_shape=(prices.shape[1], 1)))model.add(MaxPooling1D(1)) model.add(Conv1D(32, 3, activation='relu', padding='same'))model.add(MaxPooling1D(2))model.add(Flatten())model.add(Dense(64, activation='relu'))model.add(Dropout(0.5))model.add(Dense(1, activation='linear'))model.summary()
编译模型model.compile(loss='mse', optimizer='adam')
拟合模型model.fit(prices, close_prices, epochs=50, batch_size=16, verbose=1)
提取特征features = model.predict(prices)
2.2 训练模型
- 使用历史股票数据训练CNN模型。- 设置模型的训练轮数、批次大小等参数。- 使用均方误差(MSE)作为损失函数,使用Adam优化器更新模型参数。python# 代码参考2.1节
3. 模型评估
使用交叉验证方法对训练好的模型进行评估。
3.1 交叉验证
- 将数据集划分为训练集和测试集。- 使用训练集训练模型,使用测试集评估模型的预测性能。- 使用准确率、精度、召回率和F1分数等指标评估模型的性能。pythonfrom sklearn.model_selection import cross_val_scorefrom sklearn.linear_model import LogisticRegression
加载数据iris = load_iris()X_train = iris.datay_train = iris.target
定义模型model = LogisticRegression(max_iter=1000)
使用交叉验证方法对模型进行评估scores = cross_val_score(model, X_train, y_train, cv=5)
计算评估指标accuracy = scores.mean()precision = cross_val_score(model, X_train, y_train, cv=5, scoring='precision_macro').mean()recall = cross_val_score(model, X_train, y_train, cv=5, scoring='recall_macro').mean()f1 = cross_val_score(model, X_train, y_train, cv=5, scoring='f1_macro').mean()
打印评估结果print('准确率:', accuracy)print('精度:', precision)print('召回率:', recall)print('F1分数:', f1)
4. 预测结果可视化
将预测结果和实际价格进行可视化对比,更直观地评估模型的预测效果。pythonimport matplotlib.pyplot as plt
... (预测代码参考之前的部分)
输出预测结果和实际价格result = pd.DataFrame({'预测价格': predictions, '实际价格': y_test})print(result)
绘制预测价格和实际价格的图像plt.rcParams['font.sans-serif'] = ['SimHei']plt.rcParams['axes.unicode_minus'] = False
plt.plot(result.index, result['预测价格'], label='预测价格')plt.plot(result.index, result['实际价格'], label='实际价格')plt.xlabel('样本编号')plt.ylabel('股票价格')plt.title('预测价格 vs 实际价格')plt.legend()plt.show()
总结
本文介绍了如何使用Python和深度学习技术进行股票价格预测。通过数据预处理、CNN模型构建、模型训练和评估等步骤,可以构建一个有效的股票价格预测模型。需要注意的是,股票市场受多种因素影响,预测结果仅供参考,不构成投资建议。
未来研究方向:
- 探索更复杂的深度学习模型,例如LSTM、GRU等,以捕捉更长期的市场趋势。- 结合其他数据源,例如新闻事件、社交媒体情绪等,提高预测模型的准确性。- 开发更完善的风险控制策略,降低投资风险。
原文地址: https://www.cveoy.top/t/topic/f4dY 著作权归作者所有。请勿转载和采集!