数据处理:NumPy 和 Pandas
金融数据几乎都是「一张表」:日期、价格、收益率、持仓。这一模块先把表算对。
要会什么
- 用 NumPy 数组做向量计算
- 用 Pandas 读 CSV,选列,筛行
- 处理空值,按某一列分组汇总
- 把计算结果写回文件
NumPy:不要先写循环
import numpy as np
prices = np.array([10.0, 10.5, 10.2, 11.0])
returns = prices[1:] / prices[:-1] - 1
print(returns)
print(returns.mean(), returns.std(ddof=1))
prices[1:] / prices[:-1] - 1 就是相邻两天的简单收益率。金融里很多公式都可以先写成数组运算。
Pandas:一张行情表
import pandas as pd
df = pd.DataFrame(
{
"date": ["2024-01-02", "2024-01-03", "2024-01-04"],
"close": [10.0, 10.5, 10.2],
"volume": [1000, 1200, 800],
}
)
df["date"] = pd.to_datetime(df["date"])
df = df.set_index("date")
print(df)
print(df["close"].pct_change())
pct_change() 是简单收益率。日期建议变成时间类型,并设为索引,后面画图、对齐多只股票都方便。
读本地文件
df = pd.read_csv("data/prices.csv", parse_dates=["date"])
df = df.sort_values("date")
print(df.head())
print(df.describe())
Excel:
df = pd.read_excel("data/prices.xlsx", sheet_name=0)
需要先安装 openpyxl。
清洗
df = df.dropna(subset=["close"])
df = df.drop_duplicates(subset=["date"])
df["close"] = df["close"].astype(float)
真实数据常有空行、重复日期、把价格存成了字符串。先检查再计算。
分组
df["month"] = df["date"].dt.to_period("M")
monthly = df.groupby("month", as_index=False)["volume"].sum()
print(monthly)
按月汇总成交量,是后面做报表的基本动作。
课堂练习
- 自己造 10 天收盘价,用 NumPy 算收益率均值。
- 读一份 CSV,找出收盘价最高的那一天。
- 把缺失的
volume填成 0,再按周汇总。
例子见 examples/fintech/returns.py。