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,上图为价格曲线,下图为对数收益率曲线。