Pandas 股票数据分析 - PANDAS教程

Pandas 股票数据分析

在股票数据分析中,pandas 是一个非常强大的工具,可以帮助我们处理和分析股票市场的数据。

在本章节我们使用 yfinance(雅虎财经库)下载历史股票数据,并进行各种分析,包括数据清洗、可视化、技术指标计算等。

yfinance 是一个 Python 库,可以轻松地从雅虎财经(Yahoo Finance)获取股票、基金、加密货币等资产的历史和实时数据。

通过 pandas,我们可以将这些数据存储为 DataFrame 并进行后续的分析。

  • 数据清洗 :处理缺失值、删除不必要的列等。
  • 数据可视化 :绘制股票的时间序列图、移动平均线、RSI 等。
  • 技术指标计算 :如移动平均线(SMA)、相对强弱指数(RSI)等。
  • 日收益率与累计收益率分析 :帮助评估股票的短期和长期表现。
  • 波动率分析 :衡量股票的价格波动性。

更多财经库及量化分析可以参考: Python 量化交易

安装 yfinance

首先,我们需要安装 yfinance 库,方法如下:


pip install yfinance --upgrade --no-cache-dir

安装 yfinance 时,pandas 通常会作为依赖项被自动安装。这意味着在使用 yfinance 时,你可以直接利用 pandas 提供的数据结构和功能来处理和分析数据。

导入所需的库:


import yfinance as yf

import pandas as pd

import matplotlib.pyplot as plt

import seaborn as sns

获取股票数据

使用 yfinance 库,我们可以轻松下载股票数据。

我们通常使用 yf.download() 函数从雅虎财经获取某个股票的历史数据。

茅台的股票代码为 600519.SS,其中 .SS 是上海证券交易所的后缀。

使用 yfinance 获取股票数据:

示例代码
importyfinanceasyf# 获取茅台(600519.SS)的股票数据,日期范围从 2020-01-01 到 2021-01-01stock_data=yf.download('600519.SS',start='2020-01-01',end='2021-01-01')# 查看数据的前几行print(stock_data.head())

输出数据如下所示:

返回的数据包含以下列:

  • Open :开盘价
  • High :最高价
  • Low :最低价
  • Close :收盘价
  • Adj Close :调整后的收盘价(考虑了股息、拆股等因素)
  • Volume :成交量

yf.download() 函数会返回一个 pandas.DataFrame,其中包含了指定股票的历史数据:

示例代码
importyfinanceasyf# 获取茅台股票(600519.SS)的数据stock_data=yf.download('600519.SS',start='2020-01-01',end='2021-01-01')# 检查数据类型print(type(stock_data))# 应该输出 <class 'pandas.core.frame.DataFrame'>

输出为:

[*********************100%%**********************]  1 of 1 completed

<class 'pandas.core.frame.DataFrame'>

数据清洗与处理

在分析股票数据时,我们通常需要做一些数据清洗和处理。

常见的步骤包括填充缺失值、删除无关列、数据类型转换等。

在一些版本的 yfinance 中,可以自动引入了 pandas,不需要再引入,所以在使用 yfinance 时,你可以直接利用 pandas 提供的数据结构和功能来处理和分析数据。

检查缺失值并填充:

示例代码
importyfinanceasyf# 获取茅台(600519.SS)的股票数据,日期范围从 2020-01-01 到 2021-01-01stock_data=yf.download('600519.SS',start='2020-01-01',end='2021-01-01')# 检查缺失值print(stock_data.isnull().sum())# 使用前向填充替换缺失值stock_data.ffill(inplace=True)# 或者使用后向填充# stock_data.bfill(inplace=True)# 检查缺失值是否已经处理print(stock_data.isnull().sum())

输出结果如下所示:

[*********************100%%**********************]  1 of 1 completed

Open         0

High         0

Low          0

Close        0

Adj Close    0

Volume       0

dtype: int64

Open         0

High         0

Low          0

Close        0

Adj Close    0

Volume       0

删除无关列:

示例代码
importyfinanceasyf# 获取茅台(600519.SS)的股票数据,日期范围从 2020-01-01 到 2021-01-01stock_data=yf.download('600519.SS',start='2020-01-01',end='2021-01-01')# 删除"Volume"和"Adj Close"列stock_data_cleaned=stock_data.drop(columns=['Adj Close','Volume'])print(stock_data_cleaned.head())

输出结果如下所示:


数据可视化:绘制股票价格曲线

使用 matplotlib 或 seaborn,我们可以对股票数据进行可视化,帮助我们识别趋势和波动。

绘制收盘价的时间序列图:

示例代码
importyfinanceasyfimportmatplotlib.pyplotasplt# 获取茅台(600519.SS)的股票数据,日期范围从 2020-01-01 到 2021-01-01stock_data=yf.download('600519.SS',start='2020-01-01',end='2021-01-01')# 删除"Volume"和"Adj Close"列stock_data_cleaned=stock_data.drop(columns=['Adj Close','Volume'])# 绘制茅台收盘价曲线plt.figure(figsize=(10,6))plt.plot(stock_data_cleaned['Close'],label='Close Price')plt.title('Maotai Stock Price (2020)',fontsize=14)plt.xlabel('Date',fontsize=12)plt.ylabel('Close Price (CNY)',fontsize=12)plt.legend()plt.grid(True)plt.show()

输出如下所示:


计算股票的技术指标

在股票分析中,技术指标(如移动平均线、相对强弱指数 RSI 等)经常被使用来辅助决策,pandas 可以帮助我们计算这些指标。

1、移动平均线(SMA)

简单移动平均线(SMA)是最常用的技术指标之一,表示过去 N 天的平均收盘价。

示例代码
importyfinanceasyfimportmatplotlib.pyplotasplt# 获取茅台(600519.SS)的股票数据,日期范围从 2020-01-01 到 2021-01-01stock_data=yf.download('600519.SS',start='2020-01-01',end='2021-01-01')# 删除"Volume"和"Adj Close"列stock_data_cleaned=stock_data.drop(columns=['Adj Close','Volume'])# 计算 50 日和 200 日的移动平均线stock_data_cleaned['SMA_50']=stock_data_cleaned['Close'].rolling(window=50).mean()stock_data_cleaned['SMA_200']=stock_data_cleaned['Close'].rolling(window=200).mean()# 绘制收盘价和移动平均线plt.figure(figsize=(12,6))plt.plot(stock_data_cleaned['Close'],label='Close Price')plt.plot(stock_data_cleaned['SMA_50'],label='50-Day SMA')plt.plot(stock_data_cleaned['SMA_200'],label='200-Day SMA')plt.title('Maotai Stock Price with Moving Averages',fontsize=14)plt.xlabel('Date',fontsize=12)plt.ylabel('Price (CNY)',fontsize=12)plt.legend()plt.grid(True)plt.show()

输出如下所示:

2、相对强弱指数(RSI)

RSI 是用来评估股票是否被过度买入或卖出的技术指标,一般来说,RSI 大于 70 表示过度买入,小于 30 表示过度卖出。

示例代码
importyfinanceasyfimportmatplotlib.pyplotasplt# 获取茅台(600519.SS)的股票数据,日期范围从 2020-01-01 到 2021-01-01stock_data=yf.download('600519.SS',start='2020-01-01',end='2021-01-01')# 删除"Volume"和"Adj Close"列stock_data_cleaned=stock_data.drop(columns=['Adj Close','Volume'])# 计算 RSI 指标delta=stock_data_cleaned['Close'].diff(1)gain=delta.where(delta>0,0)loss=-delta.where(delta<0,0)# 计算平均收益和损失avg_gain=gain.rolling(window=14).mean()avg_loss=loss.rolling(window=14).mean()# 计算相对强弱指数 RSIrs=avg_gain / avg_lossrsi=100-(100/(1+ rs))# 添加 RSI 到数据中stock_data_cleaned['RSI']=rsi# 绘制 RSI 曲线plt.figure(figsize=(12,6))plt.plot(stock_data_cleaned['RSI'],label='RSI')plt.axhline(y=70,color='r',linestyle='--',label='Overbought (70)')plt.axhline(y=30,color='g',linestyle='--',label='Oversold (30)')plt.title('RSI Indicator for Maotai Stock',fontsize=14)plt.xlabel('Date',fontsize=12)plt.ylabel('RSI',fontsize=12)plt.legend()plt.grid(True)plt.show()

输出如下所示:


股票数据分析的应用

在实际股票数据分析中,可以使用 Pandas 进行以下常见操作:

1、日收益率与累计收益率

计算股票的日收益率和累计收益率有助于评估其长期表现。

示例代码
importyfinanceasyfimportmatplotlib.pyplotasplt# 获取茅台(600519.SS)的股票数据,日期范围从 2020-01-01 到 2021-01-01stock_data=yf.download('600519.SS',start='2020-01-01',end='2021-01-01')# 删除"Volume"和"Adj Close"列stock_data_cleaned=stock_data.drop(columns=['Adj Close','Volume'])# 计算日收益率stock_data_cleaned['Daily_Return']=stock_data_cleaned['Close'].pct_change()# 计算累计收益率stock_data_cleaned['Cumulative_Return']=(1+ stock_data_cleaned['Daily_Return']).cumprod()# 绘制累计收益率plt.figure(figsize=(10,6))plt.plot(stock_data_cleaned['Cumulative_Return'],label='Cumulative Return')plt.title('Cumulative Return of Maotai Stock (2020)',fontsize=14)plt.xlabel('Date',fontsize=12)plt.ylabel('Cumulative Return',fontsize=12)plt.legend()plt.grid(True)plt.show()

输出如下所示:

2、股票的波动率

波动率是衡量股票价格波动的一个指标。

通常,我们可以使用收益率的标准差来衡量股票的波动率。

示例代码
importyfinanceasyfimportmatplotlib.pyplotasplt# 获取茅台(600519.SS)的股票数据,日期范围从 2020-01-01 到 2021-01-01stock_data=yf.download('600519.SS',start='2020-01-01',end='2021-01-01')# 删除"Volume"和"Adj Close"列stock_data_cleaned=stock_data.drop(columns=['Adj Close','Volume'])# 计算日收益率stock_data_cleaned['Daily_Return']=stock_data_cleaned['Close'].pct_change()# 计算累计收益率stock_data_cleaned['Cumulative_Return']=(1+ stock_data_cleaned['Daily_Return']).cumprod()# 计算日收益率的标准差(波动率)volatility=stock_data_cleaned['Daily_Return'].std()# 显示波动率print(f"Daily Volatility: {volatility:.4f}")

输出如下所示:

[*********************100%%**********************]  1 of 1 completed

Daily Volatility: 0.0181