Python数据清洗与股票价格预测:线性回归、CNN和时间序列模型实战
Python数据清洗与股票价格预测:线性回归、CNN和时间序列模型实战本文将使用Python实战数据清洗、归一化技术,并利用三种模型:线性回归、CNN和时间序列模型进行股票价格预测,包含代码示例和可视化图表。### 1. 数据清洗和预处理pythonimport pandas as pd# 读取数据data = pd.read_excel('E:/pythonProject5/深度学习/新建 XLS 工作表.xls')# 打印数据的列名print(data.columns)# 删除缺失值data.dropna(inplace=True)# 删除重复值data.drop_duplicates(inplace=True)# 处理异常值data = data[(data['涨跌幅'] >= -10) & (data['涨跌幅'] <= 10)]# 数据归一化# 最小-最大规范化def min_max_scale(data): return (data - data.min()) / (data.max() - data.min())# 对数据进行归一化data['涨跌幅'] = min_max_scale(data['涨跌幅'])# Z-score规范化def z_score_scale(data): return (data - data.mean()) / data.std()# 对数据进行归一化data['涨跌幅'] = z_score_scale(data['涨跌幅'])# 数据标准化from scipy.stats import boxcox# Box-Cox变换# 需要保证数据为正数,如果数据中存在负数,则需要先进行平移操作data['涨跌幅'] = data['涨跌幅'] - data['涨跌幅'].min() + 1data['涨跌幅'], _ = boxcox(data['涨跌幅'])# 对数据进行标准化data['涨跌幅'] = z_score_scale(data['涨跌幅'])from scipy.stats import yeojohnson# Yeo-Johnson变换# 需要保证数据为正数,如果数据中存在负数,则需要先进行平移操作data['涨跌幅'] = data['涨跌幅'] - data['涨跌幅'].min() + 1data['涨跌幅'], _ = yeojohnson(data['涨跌幅'])# 对数据进行标准化data['涨跌幅'] = z_score_scale(data['涨跌幅'])### 2. 股票价格预测模型#### 2.1 CNN模型pythonimport pandas as pdimport numpy as npfrom keras.models import Sequentialfrom keras.layers import Conv1D, MaxPooling1D, Flatten, Dense, Dropout# 加载数据data = pd.read_excel('E:/pythonProject5/深度学习/新建 XLS 工作表.xls')# 提取每日开盘价、收盘价、最高价和最低价open_prices = data['开盘'].valuesclose_prices = data['收盘'].valueshigh_prices = data['最高'].valueslow_prices = data['最低'].values# 将价格数据转换为二维数组prices = np.array([open_prices, close_prices, high_prices, low_prices])prices = np.transpose(prices)# 定义CNN模型model = Sequential()model.add(Conv1D(64, 3, activation='relu', input_shape=(prices.shape[1], 1)))model.add(MaxPooling1D(1)) # 修改池化窗口大小为1model.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()# 将数据转换为三维数组prices = np.expand_dims(prices, axis=2)# 编译模型model.compile(loss='mse', optimizer='adam')# 拟合模型model.fit(prices, close_prices, epochs=50, batch_size=16, verbose=1)# 提取特征features = model.predict(prices)print(features)#### 2.2 时间序列模型pythonimport pandas as pdimport numpy as npfrom sklearn.preprocessing import MinMaxScalerfrom tensorflow.keras.models import Sequentialfrom tensorflow.keras.layers import Dense, Conv1D, MaxPooling1D, Flatten# 读取Excel数据data = pd.read_excel('E:/pythonProject5/深度学习/新建 XLS 工作表.xls')# 提取股票价格列prices = data['收盘'].values# 数据归一化scaler = MinMaxScaler(feature_range=(0, 1))scaled_prices = scaler.fit_transform(prices.reshape(-1, 1))# 创建训练集和测试集train_size = int(len(scaled_prices) * 0.8)train_data = scaled_prices[:train_size]test_data = scaled_prices[train_size:]# 构建时间序列数据def create_sequences(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 = 10X_train, y_train = create_sequences(train_data, seq_length)X_test, y_test = create_sequences(test_data, seq_length)# 构建卷积神经网络模型model = Sequential()model.add(Conv1D(filters=64, kernel_size=3, activation='relu', input_shape=(seq_length, 1)))model.add(MaxPooling1D(pool_size=2))model.add(Flatten())model.add(Dense(50, activation='relu'))model.add(Dense(1))# 编译模型model.compile(optimizer='adam', loss='mse')# 训练模型model.fit(X_train, y_train, epochs=50, batch_size=16)# 使用模型进行预测predicted_prices = model.predict(X_test)# 反归一化predicted_prices = scaler.inverse_transform(predicted_prices)# 打印预测结果for i in range(len(predicted_prices)): print('Predicted:', predicted_prices[i], 'Actual:', test_data[i+seq_length])#### 2.3 线性回归模型pythonimport pandas as pdfrom sklearn.model_selection import train_test_splitfrom sklearn.linear_model import LinearRegressionfrom sklearn.metrics import mean_squared_error# 读取数据集data = pd.read_excel('E:/pythonProject5/深度学习/新建 XLS 工作表.xls')# 选择特征和目标变量features = data[['开盘', '涨跌额', '涨跌幅', '最低', '最高', '成交量', '成交金额']]target = data['收盘']# 划分训练集和测试集X_train, X_test, y_train, y_test = train_test_split(features, target, test_size=0.2, random_state=42)# 训练模型model = LinearRegression()model.fit(X_train, y_train)# 预测股票价格predictions = model.predict(X_test)# 对比实际价格进行验证mse = mean_squared_error(y_test, predictions)print('均方误差(MSE):', mse)# 输出预测结果和实际价格result = pd.DataFrame({'预测价格': predictions, '实际价格': y_test})print(result)import matplotlib.pyplot as pltplt.rcParams['font.sans-serif'] = ['SimHei'] # 指定使用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()### 3. 模型评估python#使用交叉验证方法对训练好的模型进行评估并计算准确率、精度等指标:from sklearn.datasets import load_irisfrom sklearn.linear_model import LogisticRegressionfrom sklearn.model_selection import cross_val_score# 加载数据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) # 5折交叉验证# 计算准确率、精度、召回率和F1分数的平均值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)## 总结本文介绍了使用Python进行数据清洗、归一化和三种不同模型进行股票价格预测的方法。线性回归模型简单易懂,CNN模型和时间序列模型能够捕捉数据中的复杂模式,可以根据实际需求选择合适的模型。
原文地址: https://www.cveoy.top/t/topic/f4en 著作权归作者所有。请勿转载和采集!