Python数据分析实战:基于上证指数历史数据的时间序列与特征分析应用【数据集可下载】
[ 核心资源 ]
本文通过一个完整的实战案例,分享如何使用Python对上证指数历史数据进行时间序列分析。文末提供了本次分析所用的免费上证指数数据集及全部Python源代码,便于读者复现并扩展探索。
【数据集下载链接】 : 文章最后面获取
引言:从市场现象到数据驱动的分析框架
在开发者社区中,处理时间序列数据是常见需求,尤其在金融数据分析领域。当前上证指数重上4000点引发讨论,但本文不涉及任何主观判断,而是聚焦于技术层面:如何通过Python构建一个系统化的分析流程,来揭示数据中的周期性模式和量价关系。
我们以《上证综合指数历史数据2000-2025》为例,不仅演示代码操作,更强调分析思维:从历史数据对比入手,逐步探索量价动态,并构建自定义指标。无论你是量化初学者还是有经验的开发者,都能从中学习到可复用的时间序列处理套路。
一、数据加载与初步探查
任何分析的起点都是数据导入和基本了解。我们假设数据集已下载为CSV格式(字段包括日期、开盘、收盘等),使用Pandas加载并预览。
python
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns# 设置图表样式
plt.style.use('seaborn-v0_8-whitegrid')
plt.rcParams['font.sans-serif'] = ['SimHei'] # 支持中文显示
plt.rcParams['axes.unicode_minus'] = False# 加载数据集(假设文件名为'shangzheng_index_2000_2025.csv')
df = pd.read_csv('shangzheng_index_2000_2025.csv', parse_dates=['日期'])# 显示数据前5行,了解结构
print("数据集前5行预览:")
print(df.head())# 基本统计描述
print("\n数据集基本统计:")
print(df.describe())
运行后,.head() 会展示日期、开盘、收盘等字段的样本,帮助我们确认数据完整性。.describe() 则提供数值字段的均值、标准差等概览,例如收盘价的波动范围。
二、数据集关键字段说明
为确保分析逻辑清晰,我们先明确核心字段的含义和用途。这些字段构成了时间序列分析的基础。
| 字段名 | 数据类型 | 说明 |
|---|---|---|
| 日期 | datetime | 交易日期,用于时间过滤和序列分析。 |
| 开盘 | 数值型 | 当日开盘价,结合收盘可计算日内波动。 |
| 收盘 | 数值型 | 当日收盘价,核心指标,用于趋势计算和点位定位(如4000点)。 |
| 涨跌额 | 数值型 | 相比前日的价格变化,支持波动率分析。 |
| 涨跌幅 | 文本型 | 百分比变化,便于计算累计收益或识别极端事件。 |
| 最低 | 数值型 | 当日最低价,与最高结合计算振幅。 |
| 最高 | 数值型 | 当日最高价,用于技术指标如布林带。 |
| 成交量(手) | 数值型 | 成交股数,反映市场活跃度,常用于量价关系分析。 |
| 成交金额(万) | 数值型 | 成交金额,结合成交量分析资金流动强度。 |
这些字段覆盖OHLCV(开高低收量),是构建量化模型的标准输入。
三、核心议题:历史周期对比分析
我们直击一个技术问题:如何通过数据过滤和聚合,量化不同历史时期(如围绕4000点)的指标差异?通过计算平均值和波动率,并可视化对比。
python
# --- 数据预处理 ---
# 确保日期列为索引
df.set_index('日期', inplace=True)# 定义三次4000点时期窗口(示例:前后60个交易日;实际可调整)
periods = {'2007': df.loc['2007-09-01':'2007-11-30'], # 2007年时期'2015': df.loc['2015-05-01':'2015-07-31'], # 2015年时期'2025': df.loc['2025-09-01':'2025-10-28'] # 2025年时期
}# --- 计算关键指标 ---
comparison = pd.DataFrame({'Period': periods.keys(),'Avg_Close': [p['收盘'].mean() for p in periods.values()],'Avg_Volume': [p['成交量(手)'].mean() for p in periods.values()],'Volatility': [p['涨跌幅'].str.rstrip('%').astype(float).std() for p in periods.values()] # 波动率(标准差)
})print("\n三次时期关键指标对比:")
print(comparison)# --- 可视化:成交量对比 ---
plt.figure(figsize=(12, 6))
for name, data in periods.items():plt.plot(data.index, data['成交量(手)'], label=name)
plt.title('三次时期成交量对比', fontsize=16)
plt.xlabel('日期', fontsize=12)
plt.ylabel('成交量(手)', fontsize=12)
plt.legend()
plt.grid(True)
plt.show()
观察与发现:运行结果可能显示,2025年成交量均值与历史时期存在差异,波动率较低。这揭示了数据中的结构性模式,挑战了简单平均的假设。
四、深入钻取:量价关系分析
整体对比后,我们下钻到量价动态:价格变化与成交量的相关性。通过计算相关系数和构建标准化指标,量化关系。
python
# --- 量价相关性分析 ---
df['涨跌幅_num'] = df['涨跌幅'].str.rstrip('%').astype(float) # 转换为数值
correlation = df['涨跌幅_num'].corr(df['成交量(手)'])
print(f"\n涨跌幅与成交量的相关系数:{correlation:.2f}")# --- 构建简单指标:成交量Z-Score(标准化偏差) ---
df['Volume_Z'] = (df['成交量(手)'] - df['成交量(手)'].rolling(window=20).mean()) / df['成交量(手)'].rolling(window=20).std()# 筛选近期数据可视化
recent = df.loc['2025-01-01':]
plt.figure(figsize=(14, 7))
sns.lineplot(x=recent.index, y=recent['Volume_Z'], label='成交量Z-Score')
sns.lineplot(x=recent.index, y=recent['收盘'] / 1000, label='收盘价 (千点)', linestyle='--') # 缩放以匹配尺度
plt.title('2025年量价指标分析', fontsize=16)
plt.xlabel('日期', fontsize=12)
plt.ylabel('指标值', fontsize=12)
plt.axhline(1.5, color='red', linestyle='--', label='高偏差阈值')
plt.legend()
plt.grid(True)
plt.show()
分析与洞察:如果相关系数为正(e.g., 0.65),表明存在一定的量价关联;Z-Score可用于检测成交量异常。这提供了一个量化框架,帮助开发者从数据中提取模式。
五、创新视角:自定义指标生成
优秀分析不止描述数据,还能生成新特征。我们构建一个简单均线指标,结合成交量过滤,演示信号生成过程。
python
# --- 特征工程:计算移动平均线 ---
df['MA20'] = df['收盘'].rolling(window=20).mean()
df['MA60'] = df['收盘'].rolling(window=60).mean()# 生成示例信号:基于交叉和成交量条件
df['Signal'] = 0
df.loc[(df['MA20'] > df['MA60']) & (df['成交量(手)'] > df['成交量(手)'].rolling(20).mean()), 'Signal'] = 1 # 示例正信号
df.loc[df['MA20'] < df['MA60'], 'Signal'] = -1 # 示例负信号# 展示近期信号
recent_signals = df.loc['2025-09-01':, ['收盘', 'MA20', 'MA60', 'Signal']]
print("\n2025年近期信号示例:")
print(recent_signals[recent_signals['Signal'] != 0])
应用与延展:这个指标可作为时间序列处理的起点,读者可扩展加入其他特征,如RSI,用于更复杂的模型构建。
全文回顾
通过从历史对比到量价分析,再到指标生成的路径,我们对上证指数数据进行了一次系统剖析。这不仅仅是代码演示,更是培养假设-验证-迭代的分析思维。希望这个案例为你处理类似时间序列数据提供参考框架,在实际项目中应用时,可进一步集成机器学习模型如ARIMA进行扩展。
数据集位置:haidatas.com/dataset/shangzhengzonghezhishuriduhangqingshujuji2_99736d8c

如果这篇文章对你有帮助,欢迎点赞👍收藏⭐关注🔔
