1. 案例01
任务说明
本案例从本地 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)按行位移而非自然日,需先确认数据为连续交易日序列。