812 字
4 分钟
第一部分:Python 与 pandas —— 写因子够用的最小集
原书用大量篇幅讲 Python 语法,本页只保留量化研究真正高频使用的那一小块——掌握这些,量化学堂第六课的因子你就能自己写。
心法:面向”表”编程,不写循环
量化研究的数据天然是表:行 = 交易日,列 = 股票,格子 = 价格/成交量/因子值。pandas 的核心价值是向量化——对整张表做运算,一行代码同时作用于几千只股票:
ret = close / close.shift(1) - 1 # 全市场所有股票的日收益,一行搞定新手最大的坏习惯是拿着 for 循环逐只股票算——慢几百倍,还容易错。看到循环先想想有没有表级操作能替代。
写因子的”三板斧”
本平台 13 个内置因子,几乎全部由这三个操作拼成:
1. shift(n):取 n 天前的值
momentum = close / close.shift(20) - 1 # 20 日累计收益shift(1) 是”昨天”。红线:shift(-n) 是”未来”——出现负数参数基本等于宣判未来函数。
2. rolling(n):滚动窗口
vol = ret.rolling(20).std() # 20 日波动率ma = close.rolling(20).mean() # 20 日均线窗口不足 n 天时结果是 NaN(新股上市初期)——这是正确行为,保留它。
3. pct_change():环比变化率
ret = close.pct_change(fill_method=None) # 等价于 close/close.shift(1)-1fill_method=None 明确不填充缺失值——停牌期间的价格空洞不该被”补”出收益来。
必须内化的四个习惯
- 对齐是自动的,但要心里有数:pandas 按行列标签对齐运算,两张表股票列表不同时会产生 NaN——知道 NaN 从哪来,才不会病急乱投医地
fillna; - NaN 是信息:“没有数据”本身是重要信息(停牌、未上市),用
fillna(0)抹掉它是新手最常见的自伤操作(第六课军规三); - 链式思维:因子 = 几个基本操作的组合。夏普动量 =
shift版动量 ÷rolling版波动,先在纸上写公式,再逐段翻译; - 检查中间结果:每写一步
.iloc[-5:, :3]看几眼形状和数值——90% 的 bug 在中间结果里一眼可见。
数据读写与可视化(了解即可)
原书还覆盖 read_csv/merge/groupby、matplotlib 画图等。本平台场景下这些被平台代劳了(数据从数据库来、图表前端画),但 groupby 值得会——“按行业分组算均值”这类需求早晚会遇到。
对应本平台
打开 src/alphaforge/research/factors.py 通读一遍——13 个因子全部是三板斧的排列组合,没有一个超纲。这是最好的”课后阅读材料”:真实、短小、你马上要模仿它写自己的因子。
动手:完成量化学堂第六课的
sharpe_momentum_20练习。写完你会发现:难的不是语法,是想清楚”公式里的每一项分别是哪个表操作”。
本页带走的三句话
- 面向表编程:一行向量化代码同时作用于全市场,看到 for 循环先怀疑自己;
- 三板斧
shift/rolling/pct_change够写绝大多数价量因子,shift(-n)是红线; - NaN 是信息不是垃圾——
fillna(0)之前先问一遍”这里为什么缺数据”。