1. 数据准备

数据准备 学习卡片

任务目标

本案例完成AI选股流程的第一步:获取股票历史行情数据。我们将使用 yfinance 库下载A股(以贵州茅台 600519.SS 为例)的日线数据,保存为CSV文件,并验证数据完整性。

环境依赖

需要安装:pandas、yfinance。安装命令:pip install pandas yfinance

完整代码

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

# 配置参数
TICKER = "600519.SS"          # 贵州茅台(上交所)
START_DATE = "2020-01-01"     # 起始日期
END_DATE = datetime.now().strftime("%Y-%m-%d")  # 截止今天
OUTPUT_FILE = "stock_data.csv"

# 下载数据
df = yf.download(
    TICKER,
    start=START_DATE,
    end=END_DATE,
    auto_adjust=True,          # 自动调整复权价格
    progress=False
)

# 数据清洗:展平MultiIndex列(yfinance多股票下载时产生)
if isinstance(df.columns, pd.MultiIndex):
    df.columns = df.columns.get_level_values(0)

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

# 重命名列为标准格式
df.columns = [col.lower() for col in df.columns]
df = df.rename(columns={
    "date": "date",
    "open": "open",
    "high": "high",
    "low": "low",
    "close": "close",
    "volume": "volume"
})

# 删除可能的缺失行
df = df.dropna()

# 保存为CSV
df.to_csv(OUTPUT_FILE, index=False, encoding="utf-8-sig")

# 验证输出
print(f"数据已保存至: {OUTPUT_FILE}")
print(f"总记录数: {len(df)}")
print(f"日期范围: {df['date'].iloc[0]} 至 {df['date'].iloc[-1]}")
print("\n前5行数据预览:")
print(df.head())
print("\n数据统计信息:")
print(df.describe())

运行方式

将上述代码保存为 fetch_data.py,在终端执行:

python fetch_data.py

验证方法

运行后观察输出:

  1. 程序打印“数据已保存至: stock_data.csv”,说明文件已生成。
  2. “总记录数”应大于1000(约5年交易日),若为0或极小值,说明网络或代码问题。
  3. “日期范围”应覆盖2020年至今,且起始日期正确。
  4. “前5行数据预览”应包含date、open、high、low、close、volume六列,数值非空。
  5. “数据统计信息”中close列的最小值应大于0,volume列的最小值应大于0。

通过以上条件即可判定数据获取成功。若网络受限导致下载失败,可更换TICKER为美股(如 AAPL)验证代码逻辑,或稍后重试。