数据清洗与预处理

数据清洗和预处理是机器学习和深度学习中不可或缺的一部分,它可以有效提高模型的性能和可靠性。本文将介绍一些常用的数据清洗和预处理方法,并结合代码示例说明如何应用于股票价格预测的场景。

1. 读取数据

首先,使用 Pandas 库读取 Excel 文件中的股票价格数据:

import pandas as pd

# 读取数据
data = pd.read_excel('E:/pythonProject5/深度学习/新建 XLS 工作表.xls')

# 打印数据的列名
print(data.columns)

2. 处理缺失值

在数据清洗中,处理缺失值是一个重要步骤。可以使用 dropna() 方法删除包含缺失值的行或列。

# 删除缺失值
data.dropna(inplace=True)

3. 处理重复值

使用 drop_duplicates() 方法删除重复的数据行。

# 删除重复值
data.drop_duplicates(inplace=True)

4. 处理异常值

异常值是指与其他数据值显著不同的数据点。异常值可能会对模型训练产生负面影响,因此需要进行处理。例如,可以根据业务逻辑或统计方法识别异常值,并将其替换或删除。

# 处理异常值
data = data[(data['涨跌幅'] >= -10) & (data['涨跌幅'] <= 10)]

5. 数据归一化

数据归一化是将数据缩放到特定范围内的过程,常用的方法包括最小-最大规范化和 Z-score 规范化。

5.1 最小-最大规范化

# 最小-最大规范化
def min_max_scale(data):
    return (data - data.min()) / (data.max() - data.min())

# 对数据进行归一化
data['涨跌幅'] = min_max_scale(data['涨跌幅'])

5.2 Z-score 规范化

# Z-score 规范化
def z_score_scale(data):
    return (data - data.mean()) / data.std()

# 对数据进行归一化
data['涨跌幅'] = z_score_scale(data['涨跌幅'])

6. 数据标准化

数据标准化是将数据转换为标准正态分布的过程,常用的方法包括 Box-Cox 变换和 Yeo-Johnson 变换。

6.1 Box-Cox 变换

from scipy.stats import boxcox

# Box-Cox 变换
# 需要保证数据为正数,如果数据中存在负数,则需要先进行平移操作
data['涨跌幅'] = data['涨跌幅'] - data['涨跌幅'].min() + 1
data['涨跌幅'], _ = boxcox(data['涨跌幅'])

# 对数据进行标准化
data['涨跌幅'] = z_score_scale(data['涨跌幅'])

6.2 Yeo-Johnson 变换

from scipy.stats import yeojohnson

# Yeo-Johnson 变换
# 需要保证数据为正数,如果数据中存在负数,则需要先进行平移操作
data['涨跌幅'] = data['涨跌幅'] - data['涨跌幅'].min() + 1
data['涨跌幅'], _ = yeojohnson(data['涨跌幅'])

# 对数据进行标准化
data['涨跌幅'] = z_score_scale(data['涨跌幅'])

7. 特征提取

特征提取是指从原始数据中提取出对模型预测有用的特征的过程。在股票价格预测中,可以提取的特征包括每日开盘价、收盘价、最高价、最低价、成交量、成交金额等。

# 提取每日开盘价、收盘价、最高价和最低价
open_prices = data['开盘'].values
close_prices = data['收盘'].values
high_prices = data['最高'].values
low_prices = data['最低'].values

# 将价格数据转换为二维数组
prices = np.array([open_prices, close_prices, high_prices, low_prices])
prices = np.transpose(prices)

8. 使用卷积神经网络进行股票价格预测

卷积神经网络(CNN)可以有效地从时间序列数据中提取特征,并进行股票价格预测。下面是一个使用 CNN 模型进行股票价格预测的示例:

import pandas as pd
import numpy as np
from keras.models import Sequential
from keras.layers import Conv1D, MaxPooling1D, Flatten, Dense, Dropout

# 加载数据
data = pd.read_excel('E:/pythonProject5/深度学习/新建 XLS 工作表.xls')

# 提取每日开盘价、收盘价、最高价和最低价
open_prices = data['开盘'].values
close_prices = data['收盘'].values
high_prices = data['最高'].values
low_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))  # 修改池化窗口大小为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()

# 将数据转换为三维数组
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)

9. 使用线性回归进行股票价格预测

线性回归模型可以用来预测股票价格,下面是一个使用线性回归模型进行股票价格预测的示例:

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from 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})
result = result.sort_index()  # 按照样本编号从小到大排序
print(result)

import matplotlib.pyplot as plt

plt.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()

10. 评估模型性能

使用交叉验证方法对训练好的模型进行评估并计算准确率、精度等指标。

from sklearn.datasets import load_iris
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import cross_val_score

# 加载数据
iris = load_iris()
X_train = iris.data
y_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)

总结

本文介绍了数据清洗和预处理的常用方法,以及如何将这些方法应用于股票价格预测的场景。内容涵盖了缺失值处理、异常值处理、数据归一化、数据标准化和特征提取等方面,并结合代码示例进行说明。希望本文能帮助读者更好地理解数据清洗和预处理的重要性,并将其应用于实际项目中。

附录

代码示例中使用的库:

  • Pandas
  • Scikit-learn
  • Keras
  • Matplotlib

注意事项:

  • 代码示例仅供参考,实际应用中可能需要根据具体情况进行调整。
  • 股票价格预测是一个复杂的领域,没有绝对的成功方法。
  • 在进行股票交易之前,请务必进行充分的调研,并谨慎操作。
数据清洗与预处理 - 股票价格预测数据处理方法

原文地址: https://www.cveoy.top/t/topic/fvFf 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录