本文将深入分析2014年至2022年谷歌股票的历史数据,并运用尖端的异常检测技术来揭示隐藏的模式和洞察股票市场的动向。通过识别异常值和其他异常现象,旨在更好地理解股票市场趋势,并可能发现新的投资机会。有了Python和Scikit-learn库的强大支持,准备踏上一段激动人心的数据科学之旅,这可能会永远改变对股票市场的看法。所以,系好安全带,准备探索未知吧!
在这篇文章中,将:
在这个基于项目的博文中,将探索2014-2022年谷歌股票数据的异常检测。本项目使用的数据集来自Kaggle。可以从下载数据集。数据集包含106行和7列,包含2014年至2022年谷歌(Alphabet Inc.,股票代码:GOOGL)的每日股票价格数据。数据集包含多个特征,包括每天的开盘价、收盘价、最高价、最低价和交易股数。它还包括股票交易的日期。问题陈述是,本项目旨在分析2014-2022年的谷歌股票数据,并使用异常检测技术来揭示数据中的隐藏模式和异常值。将使用Python中的Scikit-learn库来构建和训练一个模型,以检测数据集中的异常数据点。最后,将分析和解释结果,以得出关于股票市场的有意义的结论。
缺失值是数据集中常见的问题。缺失值指的是在数据集的特定变量或列中缺失或未知的数据点。这可能由于多种原因发生,例如不完整的数据输入、数据损坏或在收集或处理过程中的数据丢失。让检查数据集中是否有任何缺失值。
import pandas as pd
data = pd.read_excel('Google Dataset.xlsx')
print(data.head())
print(data.isnull().sum())
发现数据点中有从上个月值变化为0.0%的情况:
data[data['Change %']==0.0]
有两个数据点,100和105,变化为0.0%。将‘开始月份’列转换为日期数据类型:
data['Month Starting'] = pd.to_datetime(data['Month Starting'], errors='coerce').dt.date
转换后,遇到了三个意外的缺失值。让解决这些缺失值。
# 交叉验证后替换缺失值
data['Month Starting'][31] = pd.to_datetime('2020-05-01')
data['Month Starting'][43] = pd.to_datetime('2019-05-01')
data['Month Starting'][55] = pd.to_datetime('2018-05-01')
数据现在已清理干净,准备进行分析。
探索性数据分析(EDA)是分析数据集的重要第一步,它涉及检查和总结数据的主要特征。数据可视化是EDA中最强大和广泛使用的工具之一。数据可视化使能够直观地探索和理解数据中的模式和趋势,它可以揭示关系、异常值和潜在错误。
多年来股价的变化:
import matplotlib.pyplot as plt
plt.figure(figsize=(25,5))
plt.plot(data['Month Starting'],data['Open'], label='Open')
plt.plot(data['Month Starting'],data['Close'], label='Close')
plt.xlabel('Year')
plt.ylabel('Close Price')
plt.legend()
plt.title('Change in the stock price of Google over the years')
自2017年以来,股价一直在上涨,2022年出现了峰值增长。
计算每日回报率:
data['Returns'] = data['Close'].pct_change()
计算回报的滚动平均值:
data['Rolling Average'] = data['Returns'].rolling(window=30).mean()
import seaborn as sns
plt.figure(figsize=(10,5))
sns.lineplot(x='Month Starting', y='Rolling Average', data=data)
上图显示,由于股价上涨,2019年滚动平均值有所下降。
变量之间的相关性:
相关性是统计度量,表明两个或更多变量之间的相关程度。它是数据分析中的有用工具,可以帮助识别模式和变量之间的关系,并理解一个变量的变化与另一个变量的变化在多大程度上相关。要找到数据中变量之间的相关性,可以使用内置的corr()函数。这将给一个相关性矩阵,值从-1.0到1.0。值越接近1.0,两个变量之间的正相关性越强。相反,值越接近-1.0,两个变量之间的负相关性越强。热图将直观地表示变量之间的相关强度,颜色越深表示相关性越强,颜色越浅表示相关性越弱。这可以是识别变量之间关系并快速指导进一步分析的有用方式。
corr = data.corr()
plt.figure(figsize=(10,10))
sns.heatmap(corr, annot=True, cmap='coolwarm')
使用StandardScaler缩放回报率:
为确保数据被标准化为零均值和单位方差,使用Scikit-learn库中的StandardScaler。首先导入StandardScaler类,然后创建该类的实例。然后使用fit_transform方法将缩放器拟合到数据集的Returns列。这将缩放数据,使其具有零均值和单位方差,这对于某些机器学习算法的正常运行是必要的。
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
data['Returns'] = scaler.fit_transform(data['Returns'].values.reshape(-1,1))
data.head()
处理意外的缺失值:
data['Returns'] = data['Returns'].fillna(data['Returns'].mean())
data['Rolling Average'] = data['Rolling Average'].fillna(data['Rolling Average'].mean())