1. 案例01

案例01:从CSV读取股票日线数据并计算动量因子 学习卡片

任务说明

本案例从本地 CSV 读取股票日线数据,按日期排序后计算 20 日动量因子(当前收盘价 / 20 个交易日前收盘价 - 1),并输出因子值序列。CSV 需包含 date 与 close 两列。

环境与依赖

  • Python 3.8+
  • pandas(pip install pandas)

输入数据

在脚本同目录准备 stock_daily.csv,示例内容:

date,close
2024-01-02,10.00
2024-01-03,10.20
2024-01-04,10.10
2024-01-05,10.50
2024-01-08,10.80
2024-01-09,10.60
2024-01-10,10.90
2024-01-11,11.20
2024-01-12,11.00
2024-01-15,11.50
2024-01-16,11.80
2024-01-17,11.60
2024-01-18,12.00
2024-01-19,12.30
2024-01-22,12.10
2024-01-23,12.50
2024-01-24,12.80
2024-01-25,12.60
2024-01-26,13.00
2024-01-29,13.20
2024-01-30,13.50
2024-01-31,13.30

完整实现

import pandas as pd

def load_daily(csv_path: str) -> pd.DataFrame:
    df = pd.read_csv(csv_path, parse_dates=["date"])
    df = df.sort_values("date").reset_index(drop=True)
    return df

def momentum_factor(df: pd.DataFrame, window: int = 20) -> pd.Series:
    # 20日动量:当前收盘价 / N日前收盘价 - 1
    factor = df["close"] / df["close"].shift(window) - 1.0
    factor.name = f"momentum_{window}d"
    return factor

if __name__ == "__main__":
    df = load_daily("stock_daily.csv")
    factor = momentum_factor(df, window=20)
    result = pd.DataFrame({"date": df["date"], "close": df["close"], factor.name: factor})
    print(result.to_string(index=False))
    result.to_csv("momentum_20d.csv", index=False)

运行方式

python momentum.py

验证方法与通过条件

  • 控制台打印出含 date、close、momentum_20d 三列的结果表。
  • 前 20 行 momentum_20d 为 NaN(不足 20 个交易日无法计算),第 21 行起有数值。
  • 同目录生成 momentum_20d.csv,内容与打印结果一致。
  • 抽查一行:以示例数据第 21 行(2024-01-30,close=13.50)为例,20 个交易日前为 2024-01-02 的 10.00,因子值应为 13.50/10.00-1 = 0.35。

常见问题

  • 若 date 解析失败,检查 CSV 日期格式是否为 YYYY-MM-DD,或改用 parse_dates=["date"] 配合 dayfirst 参数。
  • 若数据存在停牌缺失交易日,shift(20) 按行位移而非自然日,需先确认数据为连续交易日序列。