五、股票市场历史数据探索

1. 目标定义和假设设定

案例名称:股票市场历史数据探索

数据集来源:Kaggle – Stocks Data

文件路径:./dataset/005/all_stocks_5yr.csv

1.1 背景与业务需求

股票市场是一个复杂的金融系统,价格变动受到多种因素的影响。通过对历史数据的分析,我们可以识别市场趋势、波动性和特定股票的表现,从而为投资者提供决策依据。

本次分析的主要目的是:

  1. 探索股票市场的历史价格趋势,观察不同股票的长期和短期走势。
  2. 分析股票价格的波动性,识别高波动和低波动的股票。
  3. 构建机器学习模型,预测股票的未来价格变化。
  4. 评估交易策略,如简单的均线策略是否能够帮助投资者做出更好的决策。

1.2 假设设定

在进行数据分析和建模之前,我们设定以下假设:

  1. 股票价格具有一定的时间序列特征,历史价格可能影响未来价格变化。
  2. 交易量可能对价格波动有影响,高交易量可能与价格剧烈变动相关。
  3. 不同股票的波动性差异明显,某些股票可能更稳定,而另一些则更加剧烈波动。
  4. 基于历史数据的机器学习模型可以在一定程度上预测短期股票价格,尽管市场可能存在随机性。
  5. 均线策略(如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]-五、股票市场历史数据探索-大赛人网
  • 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]-五、股票市场历史数据探索-大赛人网
  • 直方图显示了所有股票的收盘价分布情况。
  • 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]-五、股票市场历史数据探索-大赛人网
  • 该图展示了 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]-五、股票市场历史数据探索-大赛人网
  • 箱线图 用于展示不同股票的交易量分布,帮助识别极端交易日。
  • 如果某只股票的交易量波动过大,可能意味着市场关注度高。

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]-五、股票市场历史数据探索-大赛人网
  • 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]-五、股票市场历史数据探索-大赛人网
  • 展示了交易量与收盘价之间的关系,帮助我们判断交易活跃度是否影响价格。

2.6 小结

  • 数据已清洗:时间格式转换、缺失值填充、异常值处理、重复数据删除。
  • 通过数据可视化:
    • 股票价格整体呈现长期增长趋势,但存在短期波动。
    • 不同股票的走势不同,交易量的影响需要进一步分析。
© 版权声明
THE END
喜欢就支持一下吧
点赞12 分享
评论 抢沙发
头像-大赛人网
欢迎您留下宝贵的见解!
提交
头像-大赛人网

昵称

取消
昵称

    请登录后查看评论内容