1. 目标定义和假设设定
案例名称:股票市场历史数据探索
数据集来源:Kaggle – Stocks Data
文件路径:./dataset/005/all_stocks_5yr.csv
1.1 背景与业务需求
股票市场是一个复杂的金融系统,价格变动受到多种因素的影响。通过对历史数据的分析,我们可以识别市场趋势、波动性和特定股票的表现,从而为投资者提供决策依据。
本次分析的主要目的是:
- 探索股票市场的历史价格趋势,观察不同股票的长期和短期走势。
- 分析股票价格的波动性,识别高波动和低波动的股票。
- 构建机器学习模型,预测股票的未来价格变化。
- 评估交易策略,如简单的均线策略是否能够帮助投资者做出更好的决策。
1.2 假设设定
在进行数据分析和建模之前,我们设定以下假设:
- 股票价格具有一定的时间序列特征,历史价格可能影响未来价格变化。
- 交易量可能对价格波动有影响,高交易量可能与价格剧烈变动相关。
- 不同股票的波动性差异明显,某些股票可能更稳定,而另一些则更加剧烈波动。
- 基于历史数据的机器学习模型可以在一定程度上预测短期股票价格,尽管市场可能存在随机性。
- 均线策略(如5日均线 vs. 20日均线)可能有效,但需验证其在不同股票上的表现。
2. 数据探索
我们现在进行数据探索(EDA),包括数据加载、数据清洗、异常值处理、数据可视化等。
2.1 数据加载
2.1.1 导入库并加载数据
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from scipy.stats import zscore
# 设置 Seaborn 风格
sns.set(style="whitegrid", palette="pastel")
# 读取数据集
file_path = "./dataset/005/all_stocks_5yr.csv"
df = pd.read_csv(file_path)
# 显示前几行数据
df.head()
2.1.2 数据基本信息
# 查看数据集的基本信息
df.info()
# 查看数据的统计摘要
df.describe()
2.1.3 数据基本情况分析
- 数据类型
date(object,时间格式需要转换)open, high, low, close(float64,股票价格)volume(int64,交易量)Name(object,股票名称)
- 数据范围
- 价格数据从
open到close,包含每日最高、最低价 - 交易量
volume数值较大,需要检查分布
- 价格数据从
- 可能存在的问题
date需要转换为datetime类型- 需要检查是否有缺失值、异常值
2.3 数据预处理
3.3.1 处理时间格式
# 将 date 列转换为 datetime 格式
df["date"] = pd.to_datetime(df["date"])
# 检查转换后的数据类型
df.dtypes
3.3.2 处理缺失值
# 检查缺失值
missing_values = df.isnull().sum()
print("缺失值情况:\n", missing_values)
# 由于股票数据缺失值可能影响分析,采用前向填充填补缺失值
df.fillna(method="ffill", inplace=True)
3.3.3 处理异常值(如极端价格波动)
# 计算价格的 z-score 来检测异常值
price_columns = ["open", "high", "low", "close"]
# 计算每列的 z-score
df_zscore = df[price_columns].apply(zscore)
# 计算每行的最大 z-score 作为异常值指标
df["z_score"] = df_zscore.abs().max(axis=1)
# 设定阈值,识别异常值(通常 |z| > 3 认为是异常值)
threshold = 3
outliers = df[df["z_score"] > threshold]
print(f"发现异常值 {len(outliers)} 条")
# 处理异常值:这里我们选择用中位数替换
for col in price_columns:
median_value = df[col].median()
df.loc[df["z_score"] > threshold, col] = median_value
# 删除辅助列
df.drop(columns=["z_score"], inplace=True)
3.3.4 处理重复数据
# 检查重复值
duplicates = df.duplicated().sum()
print(f"重复数据行数:{duplicates}")
# 删除重复值
df.drop_duplicates(inplace=True)
2.4 数据可视化
2.4.1 股票价格趋势
我们选择 AAPL(苹果公司)绘制其 close 价格趋势。
# 选择 AAPL 股票数据
df_aapl = df[df["Name"] == "AAPL"]
# 绘制收盘价趋势
plt.figure(figsize=(12, 6))
plt.plot(df_aapl["date"], df_aapl["close"], label="Close Price", color="dodgerblue")
plt.xlabel("Date")
plt.ylabel("Price")
plt.title("AAPL Stock Closing Price Trend")
plt.legend()
plt.grid(True)
plt.show()
![图片[1]-五、股票市场历史数据探索-大赛人网](https://www.dsrw.com/wp-content/uploads/2026/10/image-279-1024x528.png)
AAPL的收盘价趋势图显示了股票的长期变化情况。- 我们可以观察价格的上升或下降趋势,识别关键的市场波动点。
2.4.2 价格分布情况(直方图)
plt.figure(figsize=(10, 5))
sns.histplot(df["close"], bins=50, kde=True, color="royalblue")
plt.xlabel("Stock Closing Price")
plt.ylabel("Frequency")
plt.title("Distribution of Closing Prices")
plt.show()
![图片[2]-五、股票市场历史数据探索-大赛人网](https://www.dsrw.com/wp-content/uploads/2026/10/image-280.png)
- 直方图显示了所有股票的收盘价分布情况。
kde=True添加了平滑曲线,可以更直观地看到数据的集中趋势。
2.4.3 不同股票价格走势对比
plt.figure(figsize=(12, 6))
# 选择几个股票
selected_stocks = ["AAPL", "GOOG", "AMZN", "MSFT"]
for stock in selected_stocks:
stock_data = df[df["Name"] == stock]
plt.plot(stock_data["date"], stock_data["close"], label=stock)
plt.xlabel("Date")
plt.ylabel("Price")
plt.title("Stock Price Trends of Selected Companies")
plt.legend()
plt.grid(True)
plt.show()
![图片[3]-五、股票市场历史数据探索-大赛人网](https://www.dsrw.com/wp-content/uploads/2026/10/image-281-1024x530.png)
- 该图展示了
AAPL、GOOG、AMZN和MSFT四只股票的历史收盘价变化趋势。 - 这可以帮助我们发现不同公司的股票价格走势是否具有相似性。
2.4.4 交易量分布
plt.figure(figsize=(10, 5))
sns.boxplot(x="Name", y="volume", data=df[df["Name"].isin(selected_stocks)], palette="Set2")
plt.xticks(rotation=90)
plt.xlabel("Stock")
plt.ylabel("Trading Volume")
plt.title("Trading Volume Distribution of Selected Stocks")
plt.show()
![图片[4]-五、股票市场历史数据探索-大赛人网](https://www.dsrw.com/wp-content/uploads/2026/10/image-282.png)
- 箱线图 用于展示不同股票的交易量分布,帮助识别极端交易日。
- 如果某只股票的交易量波动过大,可能意味着市场关注度高。
2.5 相关性分析
2.5.1 计算相关性矩阵
# 计算价格与交易量之间的相关性
corr_matrix = df[["open", "high", "low", "close", "volume"]].corr()
print("相关性矩阵:\n", corr_matrix)
# 可视化相关性矩阵
plt.figure(figsize=(8, 6))
sns.heatmap(corr_matrix, annot=True, cmap="coolwarm", fmt=".2f")
plt.title("Correlation Matrix of Stock Prices and Volume")
plt.show()
![图片[5]-五、股票市场历史数据探索-大赛人网](https://www.dsrw.com/wp-content/uploads/2026/10/image-283.png)
open、high、low和close价格之间的相关性非常高(接近 1.0),说明它们之间有强相关性。volume与价格的相关性相对较低,说明交易量对价格的直接影响可能有限。
2.5.2 交易量与价格的关系
plt.figure(figsize=(10, 5))
sns.scatterplot(x=df["volume"], y=df["close"], alpha=0.5, color="blue")
plt.xlabel("Trading Volume")
plt.ylabel("Closing Price")
plt.title("Trading Volume vs. Stock Closing Price")
plt.show()
![图片[6]-五、股票市场历史数据探索-大赛人网](https://www.dsrw.com/wp-content/uploads/2026/10/image-284.png)
- 展示了交易量与收盘价之间的关系,帮助我们判断交易活跃度是否影响价格。
2.6 小结
- 数据已清洗:时间格式转换、缺失值填充、异常值处理、重复数据删除。
- 通过数据可视化:
- 股票价格整体呈现长期增长趋势,但存在短期波动。
- 不同股票的走势不同,交易量的影响需要进一步分析。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END













请登录后查看评论内容