3. 获取股票历史数据

任务目标

使用 yfinance 下载某只股票(以贵州茅台 600519.SS 为例)近5年的日线行情数据,保存为 CSV 文件,并验证文件内容完整可读。

环境依赖

需要 yfinance 库,安装命令:

pip install yfinance pandas

完整代码


import yfinance as yf
import pandas as pd
from datetime import datetime, timedelta

# 参数配置
ticker = "600519.SS"          # 贵州茅台(上交所)
years = 5
end_date = datetime.now().strftime("%Y-%m-%d")
start_date = (datetime.now() - timedelta(days=years*365)).strftime("%Y-%m-%d")
output_file = "600519_5y_daily.csv"

# 下载日线数据
df = yf.download(ticker, start=start_date, end=end_date, interval="1d", auto_adjust=True)

# 数据清洗:展平多级列(若存在)
if isinstance(df.columns, pd.MultiIndex):
    df.columns = df.columns.get_level_values(0)

# 重置索引,将日期变为普通列
df = df.reset_index()

# 统一列名(英文→中文,便于阅读)
df.columns = ["日期", "开盘", "最高", "最低", "收盘", "成交量"]

# 保存为 CSV(UTF-8 with BOM,便于 Excel 直接打开)
df.to_csv(output_file, index=False, encoding="utf-8-sig")

# 验证输出
print(f"数据已保存至: {output_file}")
print(f"总行数: {len(df)}")
print(f"日期范围: {df['日期'].min()} 至 {df['日期'].max()}")
print("\n前5行预览:")
print(df.head())

运行方式

python download_stock_data.py

验证方法与通过条件

  • 文件生成:当前目录出现 600519_5y_daily.csv,文件大小应大于 100KB(约1200+行数据)。
  • 数据完整性:程序输出的总行数应大于 1200(5年约 1250 个交易日),日期范围覆盖最近5年。
  • 内容抽查:用 Excel 或文本编辑器打开 CSV,确认包含表头 日期,开盘,最高,最低,收盘,成交量,且日期列无空值、收盘价均为正数。
  • 可复现性:再次运行程序,CSV 文件会被覆盖更新,日期范围自动滚动至当前日期。

常见问题

  • 网络错误:yfinance 需要联网访问 Yahoo Finance,若失败请检查网络或稍后重试。
  • 股票代码格式:上交所股票代码后缀为 .SS(如 600519.SS),深交所为 .SZ(如 000001.SZ)。
  • 数据缺失:若某天停牌,该日不会出现在数据中,属正常现象。