2. 认知偏差与决策:启发式简化、代表性偏差、可得性偏差、锚定效应
做量化策略这些年,我越来越觉得:市场不是数学题,而是心理学题。
你想想看,同样的数据,不同的人能得出完全相反的结论。为什么?因为我们的脑子天生就带“偷懒”模式。这就是所谓的启发式简化——大脑为了节省能量,会走捷径做判断。
说白了,我们不是理性的机器人。我们是带着各种偏见做决策的普通人。搞量化的人如果不理解这些,策略写得再漂亮,也容易在实盘里翻车。
核心观点:认知偏差不是“错误”,而是大脑的默认设置。理解它,才能利用它,或者避开它。
2.1 启发式简化:大脑的“快捷键”
什么叫启发式简化?我举个例子你就明白了。
你看到一只股票连续涨了三天,脑子里立刻蹦出一个念头:“这票要起飞了。” 然后你就买了。你并没有去查它的基本面、资金流向、行业周期。你只是用了“连续涨=好股票”这个快捷方式。
这就是启发式简化。它帮我们快速决策,但也经常带我们掉坑里。
我在做CTA策略回测时遇到过一件事。有个策略在历史数据上表现特别好,年化收益30%+。我当时差点就上线实盘了。但冷静下来仔细一看——这个策略本质上就是“追涨杀跌”的简化版,遇到震荡行情必死。果然,后来在样本外测试中直接腰斩。
我的建议:写策略时,多问自己一句:“这个逻辑是不是太‘顺理成章’了?” 如果答案是肯定的,那很可能就是启发式简化在作祟。
2.2 代表性偏差:看见“模式”就当真
代表性偏差,说白了就是“以貌取人”。
你看到一家公司连续五个季度利润增长,就觉得它是下一个茅台。你看到某个基金经理连续三年跑赢大盘,就觉得他是股神。但事实呢?可能只是运气,可能只是周期。
我记得有个经典的实验:让一群人判断一个人是工程师还是律师。描述是“他喜欢组装模型、听古典音乐”。大部分人猜他是工程师。但问题是,样本里工程师和律师的比例是50:50吗?不是。大家完全忽略了基础概率。
在量化里,代表性偏差最常见的坑就是过度拟合。
# 一个典型的“代表性偏差”策略代码
# 看到过去3个月涨得好的股票,就认为它会继续涨
def representative_bias_strategy(data):
top_performers = data.nlargest(10, '3m_return')
# 这里隐含的假设:过去表现代表未来表现
return top_performers.index.tolist()
# 实际上,你应该加入均值回归或动量衰减的判断
def better_strategy(data):
momentum = data['3m_return']
volatility = data['20d_volatility']
# 考虑风险调整后的动量
score = momentum / volatility
return score.nlargest(10).index.tolist()
避坑指南:我曾经因为代表性偏差,把一个短期动量策略当成了长期alpha来源。回测曲线漂亮得不像话,结果实盘三个月就崩了。后来我才明白:你看到的“模式”,可能只是数据里的噪声。
2.3 可得性偏差:最近发生的,就是最重要的
可得性偏差,意思是:我们更容易被最近发生的事、或者印象深的事影响判断。
比如,你刚看到一条新闻说“某科技股暴跌30%”,接下来几天你就会特别关注科技股的风险。但你可能忽略了,过去十年科技股的年化收益是15%。
在量化策略里,可得性偏差会导致过度反应。
- 现象:市场大跌后,策略模型会过度看空
- 原因:最近的下跌数据在模型里权重过高
- 后果:错过反弹,或者频繁止损
我个人的习惯是,在回测时故意把最近3个月的数据“降权”处理。不是不重视,而是防止被短期情绪带偏。
实操技巧:在构建因子时,对近期数据使用衰减权重。比如,用指数加权移动平均(EWMA)代替简单移动平均。
2.4 锚定效应:第一印象,决定一切
锚定效应,就是“先入为主”。
你第一次看到某只股票的价格是100元,后来它跌到80元,你觉得“便宜了”。但它的合理估值可能只有50元。那个100元就是你的锚。
在量化交易里,锚定效应最危险的地方是参数优化。
我记得有一次做策略优化,我一开始设了一个参数范围:移动平均线周期从10到60。结果优化出来最优参数是45。我特别高兴,觉得找到了“圣杯”。但后来换了个数据区间,最优参数变成了20。为什么?因为我一开始的“锚”设错了——那个10到60的范围本身就是主观的。
# 锚定效应的典型表现:参数优化时被初始范围限制
# 错误做法
param_range = range(10, 60) # 这个范围本身就是锚
best_param = optimize(data, param_range)
# 正确做法:多尺度搜索,打破锚定
param_range_1 = range(5, 30)
param_range_2 = range(20, 80)
param_range_3 = range(50, 200)
results = []
for r in [param_range_1, param_range_2, param_range_3]:
best = optimize(data, r)
results.append(best)
# 取多个范围的共识,而不是单一最优
我的经验:做参数优化时,至少用三个不同的初始范围。如果最优参数都在某个区间附近,那才可能是真的。如果每个范围的最优值都不一样,说明你被锚定效应骗了。
2.5 四种偏差的关系与应对
这四种偏差不是孤立的。它们经常一起出现,互相强化。
比如:你看到某只股票最近涨了很多(可得性偏差),你觉得它还会涨(代表性偏差),然后你参考它过去的高点来设定目标价(锚定效应),最后用“这票基本面不错”来合理化你的决策(启发式简化)。
一套组合拳下来,你亏钱是大概率事件。
2.6 量化策略中的应对框架
说了这么多问题,那怎么解决?我总结了一套自己的方法:
| 偏差类型 | 在策略中的表现 | 我的应对方法 |
|---|---|---|
| 启发式简化 | 用简单规则代替复杂分析 | 多因子验证,不依赖单一信号 |
| 代表性偏差 | 过度拟合历史模式 | 样本外测试、交叉验证 |
| 可得性偏差 | 对近期数据过度敏感 | 使用衰减权重、长周期参考 |
| 锚定效应 | 参数优化被初始范围限制 | 多尺度搜索、随机初始化 |
最后说一句:认知偏差不可怕,可怕的是你不知道自己有偏差。做量化的人,最应该做的不是追求完美的策略,而是先承认自己是个“有偏见的人”。
我每次回测完一个策略,都会问自己三个问题:
- 这个结果是不是太“完美”了?(警惕代表性偏差)
- 我是不是被最近的数据影响了?(警惕可得性偏差)
- 我的初始假设是不是有问题?(警惕锚定效应)
问完这三个问题,至少能避开一半的坑。