第二章:认知偏差——交易者大脑里的“系统漏洞”

做量化这些年,我越来越觉得,交易最大的敌人不是市场,而是我们自己。你想想看,我们的大脑经过几万年的进化,是为了在草原上生存,而不是为了在纳斯达克交易。这就导致了一个问题——我们天生带着一堆“认知偏差”上战场。

这一章,我们来聊聊六个最常见的偏差。我敢说,每个交易者都中过招,包括我自己。

核心观点:认知偏差不是“性格缺陷”,而是大脑的“默认设置”。量化交易的价值,就是帮我们绕过这些默认设置。

六大认知偏差 过度自信 “我这次肯定对” 代表性偏差 “这次和上次一样” 锚定效应 “它之前值100块” 损失厌恶 “亏1块的痛 > 赚1块的乐” 确认偏差 “只找支持我的证据” 后见之明 “我早就知道会这样” 每个偏差都是大脑的“快捷方式”,但在交易中常常是“死胡同”

2.1 过度自信——交易者的“头号杀手”

过度自信,说白了就是觉得自己比实际水平强。我见过太多人,赚了两笔就开始觉得自己是“股神”。

为什么会这样?因为市场在大部分时间里是随机的。你连续猜对三次硬币正反面,不代表你有预测能力。但大脑不这么想——它会自动把运气归因于能力。

我的经验:我习惯在策略回测时,故意加入“随机交易”作为对照组。如果随机策略的收益和你的策略差不多,那说明你只是在赌运气。

量化里怎么治这个病?很简单——用数据说话。我建议每个策略都做严格的统计检验:

# 过度自信检测:夏普比率显著性检验
import numpy as np
from scipy import stats

def sharpe_significance(returns, rf=0.02, n_bootstrap=10000):
    """
    检验夏普比率是否显著大于0
    如果p值 > 0.05,说明你的策略可能只是运气
    """
    sharpe_actual = (np.mean(returns) - rf/252) / np.std(returns) * np.sqrt(252)
    
    # 打乱收益率序列,破坏时间序列结构
    bootstrap_sharpes = []
    for _ in range(n_bootstrap):
        shuffled = np.random.permutation(returns)
        s = (np.mean(shuffled) - rf/252) / np.std(shuffled) * np.sqrt(252)
        bootstrap_sharpes.append(s)
    
    p_value = np.mean(np.array(bootstrap_sharpes) >= sharpe_actual)
    return sharpe_actual, p_value

# 使用示例
daily_returns = np.random.normal(0.001, 0.02, 500)  # 模拟数据
sharpe, p = sharpe_significance(daily_returns)
print(f"夏普比率: {sharpe:.2f}, p值: {p:.3f}")

注意:p值小于0.05不代表策略一定好,但p值大于0.05基本可以断定——你被过度自信坑了。

2.2 代表性偏差——刻板印象的陷阱

代表性偏差,就是看到A和B有点像,就觉得A就是B。比如看到一只股票连续涨了三天,就觉得它“像”之前的牛股,然后追进去。

我曾经犯过这个错。2019年,我看到一只小盘科技股连续放量上涨,觉得它“像”当年的特斯拉。结果呢?它只是蹭了个热点,基本面一塌糊涂。我亏了15%才止损。

量化怎么解决?用统计代替直觉。我习惯做“相似度检验”:

特征 当前股票 历史牛股均值 是否显著差异
市盈率 85 35 是 (p=0.01)
营收增长率 12% 45% 是 (p=0.03)
换手率 8% 3% 是 (p=0.04)

你看,用数据一检验,所谓的“相似”根本不成立。这就是量化的力量——它不让你靠“感觉”做决定。

2.3 锚定效应——被“第一印象”绑架

锚定效应,就是太依赖第一个看到的信息。比如一只股票从100跌到80,你觉得“便宜了”。但凭什么100就是锚?也许100本来就是高估的。

我有个朋友,一直盯着某只股票的历史最高价。每次跌到那个价的60%,他就觉得“到底了”,然后抄底。结果呢?抄了三次,套了三次。

量化里怎么破锚?用动态估值模型:

# 动态锚定修正:基于基本面而非历史价格
def fair_value_anchor(eps, growth_rate, risk_free_rate, equity_premium):
    """
    用戈登增长模型计算合理估值
    替代历史价格锚定
    """
    required_return = risk_free_rate + equity_premium
    if growth_rate >= required_return:
        return float('inf')  # 高增长公司不适用此模型
    
    fair_price = eps * (1 + growth_rate) / (required_return - growth_rate)
    return fair_price

# 对比:历史锚定 vs 基本面锚定
historical_anchor = 100  # 历史最高价
fair_anchor = fair_value_anchor(eps=5.0, growth_rate=0.08, 
                                risk_free_rate=0.04, equity_premium=0.06)
print(f"历史锚定: ${historical_anchor}")
print(f"基本面锚定: ${fair_anchor:.2f}")

我的习惯:每次看股票前,先关掉K线图,只看财务数据。等估值算完了,再打开图表。这样能最大程度避免被历史价格锚定。

2.4 损失厌恶——亏1块的痛,需要赚2.5块来弥补

行为金融学有个经典发现:损失带来的痛苦,大约是同等收益带来快乐的两倍。具体数字是2.25倍左右。这意味着,你亏了10%,需要赚25%才能心理平衡。

这会导致什么?死扛亏损单,过早止盈。我见过太多人,亏了20%不卖,赚了5%就跑。结果呢?小赚大亏,账户慢慢缩水。

量化里怎么处理?用“期望效用”代替“期望收益”:

# 损失厌恶下的最优仓位计算
def kelly_with_loss_aversion(win_prob, win_loss_ratio, loss_aversion=2.25):
    """
    考虑损失厌恶的凯利公式变体
    loss_aversion: 损失厌恶系数,默认2.25
    """
    b = win_loss_ratio  # 盈亏比
    p = win_prob        # 胜率
    q = 1 - p           # 败率
    lambda_ = loss_aversion  # 损失厌恶系数
    
    # 标准凯利公式
    f_star = (p * b - q) / b
    
    # 考虑损失厌恶后的调整
    f_adjusted = (p * b - q * lambda_) / b
    
    return f_star, f_adjusted

p, b = 0.55, 1.5  # 55%胜率,1.5倍盈亏比
f_std, f_adj = kelly_with_loss_aversion(p, b)
print(f"标准凯利仓位: {f_std:.2%}")
print(f"损失厌恶调整后: {f_adj:.2%}")

重要提醒:损失厌恶不是“心理问题”,它是进化留下的生存机制。但在交易中,它会让你的仓位管理变得保守。我个人建议,用系统化的仓位管理规则来对冲这个偏差。

2.5 确认偏差——只看到你想看到的

确认偏差,就是只找支持自己观点的证据,忽略反面信息。比如你买了某只股票,就会特别关注它的利好新闻,对利空视而不见。

我早期做策略时也犯过这个错。回测时,我反复调整参数,直到结果符合我的预期。后来才发现,那只是过拟合——我“确认”了一个根本不存在的规律。

量化里怎么防?用“对抗性检验”:

# 对抗性检验:主动寻找反面证据
def adversarial_backtest(strategy_func, data, n_permutations=1000):
    """
    打乱数据标签,看策略是否还能赚钱
    如果打乱后还能赚钱,说明策略有严重过拟合
    """
    original_return = strategy_func(data)
    
    shuffled_returns = []
    for _ in range(n_permutations):
        # 打乱收益率序列
        shuffled_data = data.copy()
        shuffled_data['return'] = np.random.permutation(shuffled_data['return'])
        shuffled_return = strategy_func(shuffled_data)
        shuffled_returns.append(shuffled_return)
    
    # 计算策略在随机数据上的表现
    mean_shuffled = np.mean(shuffled_returns)
    std_shuffled = np.std(shuffled_returns)
    
    # 如果原始收益在随机分布的2个标准差内,说明策略可能只是运气
    z_score = (original_return - mean_shuffled) / std_shuffled
    
    return original_return, z_score, mean_shuffled

我的做法:每次开发新策略,我都会找团队里最“杠精”的人来挑刺。如果他能找出我策略的漏洞,那说明这个策略还有救。如果连他都挑不出毛病...嗯,那可能是我太自信了。

2.6 后见之明——“我早就知道”的幻觉

后见之明,就是事情发生后,觉得自己“早就预料到了”。比如2020年疫情后股市暴跌,很多人说“我早就知道会跌”。但真让他们在暴跌前做空,没几个人敢。

这个偏差的危害在于——它会让你高估自己的预测能力。每次“我早就知道”之后,下次你就会更自信,然后亏更多。

量化里怎么治?用“预测日记”:

# 预测记录系统:对抗后见之明
class PredictionJournal:
    def __init__(self):
        self.records = []
    
    def record_prediction(self, date, symbol, direction, confidence, reasoning):
        """记录预测时的真实想法"""
        self.records.append({
            'date': date,
            'symbol': symbol,
            'direction': direction,  # 'long' or 'short'
            'confidence': confidence,  # 0-100%
            'reasoning': reasoning,
            'outcome': None
        })
    
    def update_outcome(self, symbol, date, actual_return):
        """事后更新结果"""
        for r in self.records:
            if r['symbol'] == symbol and r['outcome'] is None:
                # 判断预测是否正确
                if r['direction'] == 'long':
                    r['outcome'] = actual_return > 0
                else:
                    r['outcome'] = actual_return < 0
    
    def calibration_report(self):
        """校准报告:看你的自信程度和实际准确率是否匹配"""
        import pandas as pd
        df = pd.DataFrame(self.records)
        df['confidence_bin'] = pd.cut(df['confidence'], bins=[0, 30, 50, 70, 90, 100])
        report = df.groupby('confidence_bin')['outcome'].mean()
        return report

# 使用示例
journal = PredictionJournal()
journal.record_prediction('2024-01-05', 'AAPL', 'long', 80, '技术面突破')
journal.record_prediction('2024-01-05', 'TSLA', 'short', 60, '估值过高')
# ... 后续更新结果

关键洞察:我做了三年预测日记后发现,当我觉得“80%把握”时,实际准确率只有55%左右。这就是后见之明的威力——它让你事后觉得“我早就知道”,但事前你其实根本不知道。

小结:用系统对抗偏差

这六个偏差,每个都是大脑的“快捷方式”。在原始社会,它们帮我们快速决策。但在金融市场,它们只会让你亏钱。

量化交易的价值,不是让你变成“没有感情的机器”,而是给你一套系统,让你在冲动的时候停下来,用数据说话。

我个人最深的体会是:承认自己有偏差,是克服偏差的第一步。每次我发现自己“特别看好”某只股票时,我都会问自己——这是理性分析,还是认知偏差在作祟?

下一章,我们会把这些偏差量化成因子,看看怎么用数据捕捉市场的非理性行为。嗯,到时候你会发现,别人的偏差,就是你的超额收益。


公众号:蓝海资料掘金营,微信deep3321