PCA带你探索比亚迪股票价格的秘密

引言:

不知不觉,我们的股票预测博客已经迎来了它的第三篇章。在前两期中,我采用了目前非常流行的卷积神经网络技术,针对2022至2024年比亚迪股票的价格数据进行了特征提取。随后,我利用了两种强大的预测模型——LSTM和XGBOOST——来对股票走势进行预测分析。

然而,近期我阅读了一些论文,它们探讨了机器学习算法在不同数据集上的表现,其中一些甚至显示出与传统方法相比的劣势。这激发了我尝试使用传统的PCA(主成分分析)方法来提取特征值的兴趣。在今天的分享中,我将向大家展示我最近完成的一个小型项目,并简要介绍PCA的基本概念,同时附上我编写的详细代码。

我希望通过这次分享,我们能够共同学习,共同进步,探索股票预测的更多可能性。

PCA

作用:

PCA通过选择新的特征(称为主成分),这些主成分是原始数据特征的线性组合。第一主成分是数据中方差最大的方向,即数据在该方向上的变异性最大。第二主成分是数据中方差次大的方向,并且与第一主成分正交。依此类推。 这种选择方法确保每个新特征(主成分)都尽可能多地捕捉数据的变异性。
数据变异性:我个人理解就是在该维度下的数据泛化能力,泛化能力越好,说明这个特征越重要。

解释:

方差最大化:

PCA的目标是找到那些解释最多方差的方向。通过选择这些方向,PCA可以在减少维度的同时最大限度地保留数据的变异性。换句话说,虽然数据的维度减少了,但大部分重要的信息(即方差)被保留下来了。

正交变换:

主成分是彼此正交的,这意味着它们不相关。这种性质确保每个主成分捕捉到的数据变异性是不重复的,进一步保证了数据的方差被有效地保留。

意义:

降维:

高维数据常常包含大量特征,有些特征可能是冗余的或无关紧要的。PCA可以通过减少特征的数量来简化数据,这不仅减少了计算成本,还可能提高机器学习模型的性能。
去噪:

数据中可能包含噪声。PCA通过选择方差最大的方向,有效地过滤掉了那些变异性小的噪声成分,从而提高数据的质量。
数据可视化:

在高维空间中,数据的可视化非常困难。PCA通过将数据降维到2维或3维,使得数据的可视化成为可能,帮助我们更直观地理解数据的结构和模式。
提高模型性能:

在高维数据中,模型可能会过拟合,因为有太多的特征。通过PCA降维,可以减少特征的数量,从而减少过拟合的风险,提升模型的泛化能力。
特征提取:

PCA可以帮助识别数据中最重要的特征,提供一种新的视角来理解数据的内在结构。这在数据预处理和特征工程过程中非常有用。特别是在今天这个项目中,使用PCA分解,获取股票相关性。

代码演示:

  • 导入必要包
import pandas as pd
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score
import matplotlib.pyplot as plt
import pandas as pd
from datetime import datetime, timedelta



  • 读取文件,以比亚迪的closed preice 作为目标
file_path = 'fin_sample.csv'
df = pd.read_csv(file_path)


byd_code = '002594.SZ'  # 比亚迪的股票代码
byd_data = df[df['Code'] == byd_code]


features = byd_data.drop(columns=['Code', 'Name', 'Date', 'Close'])
target = byd_data['Close']

# 标准化数据
scaler = StandardScaler()
scaled_features = scaler.fit_transform(features)
  • 进行PCA分解,并且进行可视化
# 进行PCA分解
pca = PCA()
pca_features = pca.fit_transform(scaled_features)

# 可视化前两个主成分的结果
plt.figure(figsize=(10, 6))
plt.scatter(pca_features[:, 0], pca_features[:, 1], c=target, cmap='viridis')
plt.colorbar(label='Close Price')
plt.xlabel('Principal Component 1')
plt.ylabel('Principal Component 2')
plt.title('PCA of BYD Stock Data')
plt.show()
  • 数据分割,保证测试集的纯净
# 分割数据为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(pca_features, target, test_size=0.2, random_state=42)

# 训练线性回归模型
model = LinearRegression()
model.fit(X_train, y_train)

# 进行预测
y_pred = model.predict(X_test)

# 评估模型
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)
  • 进行预测和真实值可视化
# 可视化实际值和预测值的结果

# 生成日期范围,从2023年12月5日开始
start_date = datetime(2023, 12, 5)
date_range = [start_date + timedelta(days=i) for i in range(len(y_test_inverse))]

plt.figure(figsize=(10, 6))
plt.plot(y_test.values, label='Actual Values', color='blue')
plt.plot(y_pred, label='Predicted Values', color='red', linestyle='--')
plt.xlabel('Sample Index')
plt.ylabel('Close Price')
plt.title('Actual vs Predicted Close Prices')
plt.legend(loc = 'upper right')
plt.show()

结果:

  • PCA可视化
    PCA分解特征可视化

  • 相关指标
    MSE: 2.8964607243768383
    R^2 : 0.9977263839204688

  • 股票预测结果:
    在这里插入图片描述

总结:

通过执行PCA(主成分分析)分解,我们成功地提取了数据的关键特征。在此基础上,我进一步应用了简单的线性回归模型,结果表明,即便在没有采用复杂神经网络的情况下,我们依然能够获得令人满意的预测效果。这一发现提醒我们,在某些问题上,传统的统计模型仍然具有其独特的优势和价值。

我们不应该盲目地认为神经网络在所有情况下都必然优于传统方法。实际上,对于特定的数据集和问题,传统统计模型可能因其简洁性和解释性而表现出色。因此,选择最合适的模型应当基于对问题本质的深入理解和对不同方法性能的全面评估。

  • 22
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值