1. 金融时序数据加载与收益率计算

金融时序数据加载与收益率计算 学习卡片

任务说明

本案例用 pandas 读取一份股票日线 CSV(含日期、收盘价),计算对数收益率 ln(P_t / P_{t-1}),绘制价格与收益率时间序列图,并完成数据质量检查(缺失值、重复日期、非正价格、日期排序)。

环境与依赖

pip install pandas numpy matplotlib

数据文件

准备 stock.csv,两列:date,close。示例内容:

date,close
2024-01-02,100.0
2024-01-03,101.5
2024-01-04,100.8
2024-01-05,102.3
2024-01-08,103.1

完整实现

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

def load_and_check(path):
    df = pd.read_csv(path, parse_dates=["date"])
    df = df.sort_values("date").reset_index(drop=True)

    # 数据质量检查
    report = {
        "rows": len(df),
        "missing": int(df.isna().sum().sum()),
        "dup_dates": int(df["date"].duplicated().sum()),
        "non_positive_close": int((df["close"] <= 0).sum()),
        "date_sorted": bool(df["date"].is_monotonic_increasing),
    }
    print("质量检查:", report)

    # 对数收益率
    df["log_ret"] = np.log(df["close"] / df["close"].shift(1))
    return df

def plot_series(df, out="series.png"):
    fig, axes = plt.subplots(2, 1, figsize=(10, 6), sharex=True)
    axes[0].plot(df["date"], df["close"])
    axes[0].set_ylabel("Close")
    axes[0].set_title("Price")
    axes[1].plot(df["date"], df["log_ret"])
    axes[1].set_ylabel("Log Return")
    axes[1].set_title("Log Return")
    fig.tight_layout()
    fig.savefig(out, dpi=120)
    print("图已保存:", out)

if __name__ == "__main__":
    df = load_and_check("stock.csv")
    print(df.head())
    plot_series(df)

运行与验证

python main.py

通过条件:

  • 控制台打印质量检查字典,missing=0、dup_dates=0、non_positive_close=0、date_sorted=True 表示数据合格。
  • df.head() 中第一行 log_ret 为 NaN(无前一日价格),其余行有数值。
  • 当前目录生成 series.png,上图为价格曲线,下图为对数收益率曲线。

处理流程

读取 CSV 排序 + 去重检查 质量检查 对数收益率 绘图