在金融投资领域,股票价格波动、用户行为模式等数据都蕴含着时间维度上的规律。掌握时间序列分析技术,能帮助我们从数据中挖掘出隐藏的趋势、周期和异常。本文将以股票价格数据为例,通过Python实现从数据加载到可视化分析的全流程,用通俗易懂的方式拆解核心步骤。

bash1pip install pandas matplotlib seaborn statsmodels yfinancepandas:数据清洗与处理的核心工具matplotlib/seaborn:静态数据可视化statsmodels:时间序列模型构建yfinance:获取雅虎财经股票数据以贵州茅台为例,获取其近5年日线数据:
python1import yfinance as yf
2
3# 下载数据(参数:股票代码,时间范围)
4data = yf.download('600519.SS', start='2020-11-17', end='2025-11-17')
5# 提取收盘价作为分析对象
6close_prices = data['Close']
7print(close_prices.head())输出示例:
12020-11-17 1750.00
22020-11-18 1735.50
32020-11-19 1748.80
4...python1# 检查缺失值数量
2print(f"缺失值数量:{close_prices.isnull().sum()}")
3
4# 线性插值填充缺失值
5close_prices = close_prices.interpolate(method='linear')python1# 确保索引为datetime类型
2close_prices.index = pd.to_datetime(close_prices.index)
3
4# 重采样为周数据(可选)
5weekly_data = close_prices.resample('W').last()python1import matplotlib.pyplot as plt
2plt.figure(figsize=(14, 6))
3plt.plot(close_prices.index, close_prices.values,
4 label='贵州茅台收盘价', color='#1f77b4')
5plt.title('2020-2025年贵州茅台股价走势', fontsize=16)
6plt.xlabel('日期', fontsize=12)
7plt.ylabel('价格(元)', fontsize=12)
8plt.grid(True, linestyle='--', alpha=0.7)
9plt.legend()
10plt.tight_layout()
11plt.show()效果说明:通过折线图可直观看到股价的长期趋势和短期波动。2021年初的峰值和2024年的震荡区间清晰可见。
python1# 计算20日和60日移动平均
2ma_20 = close_prices.rolling(window=20).mean()
3ma_60 = close_prices.rolling(window=60).mean()
4
5plt.figure(figsize=(14, 6))
6plt.plot(close_prices.index, close_prices, label='收盘价', alpha=0.5)
7plt.plot(close_prices.index, ma_20, label='20日均线', linewidth=2)
8plt.plot(close_prices.index, ma_60, label='60日均线', linewidth=2)
9plt.title('股价与移动平均线对比', fontsize=16)
10plt.legend()
11plt.show()关键发现:当短期均线(20日)上穿长期均线(60日)时,常被视为买入信号;反之则为卖出信号。
python1from statsmodels.tsa.seasonal import seasonal_decompose
2
3# 按年周期分解(假设数据有年度季节性)
4result = seasonal_decompose(close_prices, model='additive', period=252) # 252个交易日≈1年
5
6result.plot()
7plt.suptitle('股价季节性分解', y=1.02)
8plt.tight_layout()
9plt.show()分解结果:
python1from statsmodels.graphics.tsaplots import plot_acf
2
3plt.figure(figsize=(12, 6))
4plot_acf(close_prices.dropna(), lags=60, alpha=0.05) # 显示60阶自相关
5plt.title('股价自相关图', fontsize=16)
6plt.xlabel('滞后阶数(交易日)', fontsize=12)
7plt.ylabel('自相关系数', fontsize=12)
8plt.show()解读技巧:
bash1pip install plotlypython1import plotly.graph_objects as go
2
3fig = go.Figure()
4fig.add_trace(go.Scatter(
5 x=close_prices.index,
6 y=close_prices,
7 name='收盘价',
8 line=dict(color='#1f77b4', width=2)
9))
10
11# 添加移动平均线
12fig.add_trace(go.Scatter(
13 x=ma_20.index,
14 y=ma_20,
15 name='20日均线',
16 line=dict(color='#ff7f0e', width=1.5, dash='dash')
17))
18
19fig.update_layout(
20 title='贵州茅台股价交互式图表',
21 xaxis_title='日期',
22 yaxis_title='价格(元)',
23 hovermode='x unified',
24 template='plotly_white'
25)
26
27fig.show()交互功能:
python1# 计算滚动均值和标准差
2rolling_mean = close_prices.rolling(window=20).mean()
3rolling_std = close_prices.rolling(window=20).std()
4
5# 定义异常阈值
6upper_bound = rolling_mean + 3 * rolling_std
7lower_bound = rolling_mean - 3 * rolling_std
8
9# 检测异常值
10anomalies = close_prices[(close_prices > upper_bound) | (close_prices < lower_bound)]
11
12# 可视化
13plt.figure(figsize=(14, 6))
14plt.plot(close_prices.index, close_prices, label='收盘价', alpha=0.7)
15plt.plot(upper_bound.index, upper_bound, 'r--', label='上界')
16plt.plot(lower_bound.index, lower_bound, 'r--', label='下界')
17plt.scatter(anomalies.index, anomalies, color='red', label='异常值', zorder=5)
18plt.title('股价异常值检测(3σ原则)', fontsize=16)
19plt.legend()
20plt.show()典型应用:2024年3月的异常下跌被成功标记,可能对应重大政策变动或市场恐慌事件。
Q1:如何处理非交易日数据缺失?
A:使用resample方法填充非交易日:
python1# 生成完整日期范围
2full_dates = pd.date_range(start='2020-11-17', end='2025-11-17', freq='B') # B表示工作日
3close_prices = close_prices.reindex(full_dates)
4close_prices = close_prices.interpolate(method='linear') # 线性插值填充Q2:如何选择合适的可视化周期? A:根据分析目标选择:
Q3:如何保存可视化图表? A:Matplotlib保存方法:
python1plt.savefig('stock_analysis.png', dpi=300, bbox_inches='tight')Plotly保存方法:
python1fig.write_html('interactive_chart.html') # 保存为HTML
2fig.write_image("interactive_chart.png", scale=2) # 需要安装kaleido库Q4:如何处理多只股票对比分析? A:使用子图或合并数据:
python1# 获取多只股票数据
2stocks = yf.download(['600519.SS', '000858.SZ', '601318.SH'],
3 start='2020-11-17', end='2025-11-17')['Close']
4
5# 绘制子图
6fig, axes = plt.subplots(3, 1, figsize=(14, 12))
7for i, code in enumerate(stocks.columns):
8 axes[i].plot(stocks.index, stocks[code], label=code)
9 axes[i].set_title(f'{code}股价走势')
10 axes[i].legend()
11plt.tight_layout()
12plt.show()statsmodels.tsa.arima.model.ARIMAfrom prophet import Prophet通过本文的实战案例,读者已掌握从数据获取到高级分析的完整流程。建议从简单案例开始实践,逐步尝试更复杂的模型和可视化技术。时间序列分析的核心在于理解数据背后的时间规律,而Python提供了从基础到高级的完整工具链,帮助我们高效完成这项工作。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。