🧑‍🏫 机器学习选股实战指南

金融数据获取 📅 第2章 · 数据基石

📌 使用 Tushare / AkShare 获取A股日线行情,完成数据清洗与预处理。本讲面向实战,所有代码均可直接运行。

📡 数据源对比 v0.1
库名称接口风格日线获取需注册?速率限制推荐场景
tusharepro API (token)daily / trade_cal是 (免费token)200次/分钟量化研究、因子分析
akshare函数式 (无需token)stock_zh_a_hist否较宽松快速原型、教学
🧩 数据清洗与预处理基础
🐍 实战代码 · AkShare 获取日线
# 安装:pip install akshare pandas
import akshare as ak
import pandas as pd

# 获取平安银行 (000001) 日线行情,2023年至今
df = ak.stock_zh_a_hist(symbol="000001", period="daily",
                        start_date="20230101", end_date="20250301",
                        adjust="qfq")  # 前复权

# 数据清洗基础
df.columns = ["日期", "开盘", "收盘", "最高", "最低",
              "涨跌幅", "涨跌额", "成交量", "成交额", "振幅", "换手率"]
df["日期"] = pd.to_datetime(df["日期"])
df.set_index("日期", inplace=True)
df.sort_index(inplace=True)

# 删除全空行 & 重复索引
df.dropna(how="all", inplace=True)
df = df[~df.index.duplicated(keep='first')]

# 生成收益率 (机器学习标签)
df["ret_1d"] = df["收盘"].pct_change()
df.dropna(subset=["ret_1d"], inplace=True)

# 查看清洗后数据
print(df.head(10))
print(f"数据范围: {df.index[0].date()} ~ {df.index[-1].date()}")
🚀 Tushare 获取日线 (pro版)
# 需要先注册获取 token (免费)
import tushare as ts
ts.set_token('你的token')
pro = ts.pro_api()

df_ts = pro.daily(ts_code='000001.SZ', start_date='20230101',
                  end_date='20250301', fields='trade_date,open,high,low,close,vol,amount')
df_ts['trade_date'] = pd.to_datetime(df_ts['trade_date'])
df_ts.set_index('trade_date', inplace=True)
df_ts.sort_index(inplace=True)
# 清洗:去空、复权可调用 pro.adj_factor 自行计算
print(df_ts.head())
⚙️ 数据流水线架构
📡 Tushare / AkShare 🧹 数据清洗 缺失值·异常值 复权·对齐 📐 特征构造 涨跌幅·动量 波动率·因子 🤖 选股 ML 模型 ⬆ 数据流水线 (每日更新)
🧪 常见清洗操作
操作函数/方法说明
缺失值填充df.ffill()用前一交易日数据填充
删除空行df.dropna()去除含有NaN的行
复权处理ak.stock_zh_a_hist(adjust='qfq')前复权,更符合回测
异常值过滤np.abs(zscore) < 3标准差过滤极端值
日期索引pd.to_datetime()统一时间序列

📌 中小学生色系 · 温馨提醒

  • 🔹 免费接口注意频率
  • 🔸 复权方式影响因子
  • 🔹 训练集避免未来信息
  • 🔸 数据量建议缓存