《量化交易入门》第 6 章:常见因子——动量、波动与量价
均线交叉只是一个具体策略。这一章我们往底层走一步,去认识量化研究里真正的”原材料”——因子。你可以把因子理解成一把把尺子:每把尺子从一个角度给资产量一个数。这一章先认识三把最常用的尺子:动量、波动、量价,全部用纯 Python 算给你看。
6.1 因子是什么
因子(Factor)= 一个可以被算出来的数,用来描述股票的某种特征。
每天收盘后,你都可以对任何一只股票问三个问题:最近涨得猛不猛?上下抖得厉不厉害?涨跌时成交量配不配合?每个问题,都对应一个因子。
因子和策略的区别要分清:
| 回答的问题 | 例子 | |
|---|---|---|
| 因子 | 这只股票”是什么样” | 近 20 日涨了 21% |
| 策略 | 我该”做什么” | 买入动量最强的 10 只 |
因子本身不直接下单,它先负责描述;怎么把这些描述变成买卖动作,是第 7 章”因子选股”的事。这一章我们先把三把尺子造出来。
6.2 动量因子:涨得猛不猛
动量(Momentum)= 过去一段时间的涨跌幅。
计算极简:今天的价格除以 N 天前的价格,再减 1。它描述的是”趋势的强弱”。第 4 章讲过的”价格有惯性”,落到数字上,就是动量这个因子。
closes = [ 10.0, 10.1, 10.3, 10.2, 10.4, 10.6, 10.5, 10.7, 10.9, 11.1, 11.0, 11.2, 11.4, 11.3, 11.5, 11.7, 11.6, 11.8, 12.0, 12.2, 12.1, 12.3, 12.5, 12.4, 12.6,]
# 20 日动量:今天相对 20 个交易日前的涨跌幅momentum_20 = closes[-1] / closes[-21] - 1print(f"20日动量: {momentum_20*100:+.2f}%")输出:
20日动量: +21.15%注意下标 closes[-21]:今天是 -1,往前数 20 个交易日,正好落在 -21。这个”差一”的细节和切片一样,新手最容易数错。
6.3 波动因子:抖得厉不厉害
波动率(Volatility)= 每天涨跌幅的标准差。
如果说动量看的是”方向”,波动看的就是”颠簸程度”。两只股票 20 天都涨了 20%,一只稳稳地小步上行,另一只今天涨停明天跌停——后者的波动率高得多,拿在手里也难受得多。
标准差你不用怕,它就三步:先算每天的涨跌幅,再求这些涨跌幅离平均值平均有多分散。
import math
# 最近 20 天的日涨跌幅rets = [closes[i] / closes[i-1] - 1 for i in range(len(closes)-19, len(closes))]mean_r = sum(rets) / len(rets)volatility = math.sqrt(sum((r - mean_r) ** 2 for r in rets) / len(rets))print(f"20日波动率(日): {volatility*100:.2f}%")输出:
20日波动率(日): 1.22%日波动 1.22% 大致对应年化百分之十几的水平(年化换算以后会遇到,这里先不展开)。波动率是后面第 8 章风险管理的核心输入:波动越大,仓位通常要越轻。
6.4 量价因子:成交量配不配合
量价因子衡量的是”价格变化”和”成交量变化”是不是同方向。
老手常说一句话:价格会骗人,成交量不太会。一只股票偷偷上涨却没什么人交易,这种上涨很可疑;如果上涨时成交量同步放大,说明是真金白银在推,更扎实。
怎么把”配合”变成数字?用相关系数:它衡量两组数是不是同涨同落,取值从 -1 到 1:
- 接近 +1:涨跌和成交量基本同向,配合
- 接近 0:两者没什么关系
- 接近 -1:反向,量价背离
volumes = [ 100, 105, 112, 98, 110, 125, 108, 119, 130, 142, 120, 133, 145, 128, 138, 150, 120, 148, 160, 172, 150, 150, 175, 158, 160,]
# 成交量的逐日环比变化vol_chg = [volumes[i] / volumes[i-1] - 1 for i in range(len(volumes)-19, len(volumes))]mean_v = sum(vol_chg) / len(vol_chg)
cov = sum((rets[i]-mean_r)*(vol_chg[i]-mean_v) for i in range(len(rets))) / len(rets)std_r = math.sqrt(sum((r-mean_r)**2 for r in rets)/len(rets))std_v = math.sqrt(sum((v-mean_v)**2 for v in vol_chg)/len(vol_chg))corr = cov / (std_r * std_v)print(f"量价相关系数: {corr:.2f}")输出:
量价相关系数: 0.910.91 说明这段时间里,涨跌幅和成交量变化高度同向,是典型的”量价齐升”。这段代码稍长,但逻辑就是把两组数各自标准化、再看协同——看不懂公式没关系,记住相关系数 +1/-1/0 三档含义就够用。
6.5 窗口选多长:5 日、20 日还是 60 日
上面三个因子都藏着同一个旋钮:回看多少天。这个数字叫窗口,选不同的窗口,量出来的结果可能完全相反。
- 短窗口(5 日):反应快,最近的风吹草动立刻体现,但也最容易被一两天的异动带偏,信号忽上忽下。
- 中窗口(20 日,约一个月):折中,既能跟上变化,又能滤掉部分噪声,是很多研究的起点。
- 长窗口(60 日、120 日):平稳,反映的是中长期的底色,但反应慢,等它转向时行情可能都走完了——和均线的滞后一个道理。
举个具体的场景:一只股票平时温吞,某天突然因为消息连涨两天。用 5 日动量一量,数字飙得很高,像是强势股;可用 60 日动量看,它仍然只是个平庸的家伙。同一个因子、不同窗口,讲的是两个故事。 所以看到一个因子的数值时,先问一句:这是用多长的窗口算出来的?
窗口同样没有”标准答案”,不能因为 20 日在某段历史上好看,就断定它永远最优——那又会掉进过拟合的坑(第 11 章)。务实的做法是:多试几个合理窗口、用回测比较,并且偏好那些换个窗口也依然成立的结论。
6.6 因子用起来的两个提醒
第一,单因子都有盲区。 动量高的股票可能已经涨到顶部(追高风险),波动低的股票可能是一潭死水没人交易,量价配合也可能是庄家对倒做出来的假象。所以真实研究往往几个因子一起看,而不是迷信某一个。
第二,因子要持续检验。 一个因子过去有用,不代表未来一直有用(第 5 章说的市场会变)。每隔一段时间,都要用回测重新确认这把尺子还灵不灵。
6.7 这一章你该记住的
- 因子 = 描述股票某种特征、可以算出来的数;因子负责描述,策略负责动作
- 动量:过去 N 日涨跌幅,看方向强弱
- 波动率:日涨跌幅的标准差,看颠簸程度
- 量价:涨跌幅与成交量变化的相关系数(+1/-1/0),看资金配不配合
- 单因子有盲区,实战多因子组合并持续回测检验
尺子有了,下一章就把它们组装成策略:因子选股——用排名代替押注,看看怎么给几千只股票打分、排序,挑出排名最靠前的一篮子,而不是赌其中一只。
📚 《量化交易入门》系列:零基础小白向量化交易,每章一个主题 + 可运行 Python 示例。第 6 章已读,下一章《因子选股:用排名代替押注》明天见。