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
验证方法
运行后观察输出:
- 程序打印“数据已保存至: stock_data.csv”,说明文件已生成。
- “总记录数”应大于1000(约5年交易日),若为0或极小值,说明网络或代码问题。
- “日期范围”应覆盖2020年至今,且起始日期正确。
- “前5行数据预览”应包含date、open、high、low、close、volume六列,数值非空。
- “数据统计信息”中close列的最小值应大于0,volume列的最小值应大于0。
通过以上条件即可判定数据获取成功。若网络受限导致下载失败,可更换TICKER为美股(如 AAPL)验证代码逻辑,或稍后重试。