跳到主要内容

量化研究的工作流与常见误区

直觉

量化研究最反直觉的一点是:「在历史上能赚钱」不等于「未来能赚钱」。 历史上赚钱太容易了——你总能找到一个恰好拟合了过去的规则。真正的功夫,在于分辨哪些规律是稳健的(可能持续),哪些只是偶然(过拟合)。

这一节先勾勒完整工作流,再讲三个最能坑死新手的陷阱

研究工作流

一个严谨的量化研究循环:

  1. 提出假设:先有经济学/行为学的「为什么」,再去找数据验证(而不是先看数据再编故事);
  2. 划分样本:把数据切成训练集(调参)和测试集(只看一次);
  3. 构造信号:在训练集上设计规则;
  4. 回测 + 稳健性:不止看总收益,还要看换样本、换参数、换时段是否还成立;
  5. 样本外验证:在「从未动过」的测试集上检验;
  6. 小仓位试错:实盘用极小资金验证,再逐步加码。

三大常见误区

1. 前视偏差(Look-ahead Bias)

用了当时还不可能知道的信息来做决策。例如:用「全年均价」在「年初」下单。我们的回测引擎用 持仓 = 信号.shift(1) 来防范——信号 tt 日收盘产生,t+1t+1 日才转为持仓。(模块 8 会深入讲。)

2. 幸存者偏差(Survivorship Bias)

只拿「今天还在上市的股票」做回测。那些中途退市的「失败者」被悄悄剔除了,于是历史收益被系统性高估。对策:用point-in-time 数据,包含已退市标的。

3. 过拟合(Overfitting)

规则太复杂,把历史噪音当成了规律。训练集表现神勇、测试集一塌糊涂是过拟合的典型症状。

可运行案例:亲眼看过拟合

下面这段代码演示过拟合:用多项式去拟合一段带噪音的数据,多项式次数越高,训练集拟合得越完美,但预测新数据的能力(测试误差)反而越来越差。

点运行,看「训练误差 vs 测试误差」如何背道而驰。

import numpy as np
import matplotlib.pyplot as plt

rng = np.random.default_rng(3)

# 真实关系: y = sin(x)(很平滑),加一点噪音
def true_fn(x): return np.sin(x)

# 训练集(15点) + 测试集(100点),都带噪音
x_tr = np.sort(rng.uniform(0, 7, 15))
y_tr = true_fn(x_tr) + rng.normal(0, 0.2, x_tr.size)
x_te = np.linspace(0, 7, 100)
y_te = true_fn(x_te) + rng.normal(0, 0.2, x_te.size)

degrees = [1, 3, 9, 15]
train_err, test_err = [], []

fig, axes = plt.subplots(1, len(degrees), figsize=(13, 3.2), sharey=True)
xx = np.linspace(0, 7, 200)
for ax, d in zip(axes, degrees):
  coef = np.polyfit(x_tr, y_tr, d)          # 在训练集上拟合
  fit_tr = np.polyval(coef, x_tr)
  fit_te = np.polyval(coef, x_te)
  train_err.append(np.mean((fit_tr - y_tr)**2))
  test_err.append(np.mean((fit_te - y_te)**2))
  ax.plot(xx, np.polyval(coef, xx), color="crimson", lw=1.5, label=f"次数={d}")
  ax.scatter(x_tr, y_tr, s=18, color="#2563eb", zorder=3)
  ax.plot(xx, true_fn(xx), color="gray", ls="--", lw=1, label="真实")
  ax.set_ylim(-2.5, 2.5); ax.set_title(f"degree={d}"); ax.legend(fontsize=7)
plt.tight_layout(); plt.show()

print("多项式次数 :", degrees)
print("训练误差(越小越'好'):", [round(e,3) for e in train_err])
print("测试误差(越小越真'好'):", [round(e,3) for e in test_err])
print("\n→ 次数=15 训练误差几乎为 0,但测试误差爆炸 = 典型过拟合")

注意 degree=15 的红线:它穿过了每一个训练点(训练误差≈0),却在点与点之间疯狂抖动,对新数据预测极差。策略参数过多、规则过细,会犯一模一样的错。

防范原则

  • 样本外验证:留一块「不许动」的数据最后才看;
  • 参数越少越好:能用 2 个参数解释的,别用 20 个;
  • 多重检验意识:试了 1000 个策略,哪怕全是随机的,也「可能」有 1 个看起来很好(见模块 9 的 Deflated Sharpe);
  • 经济学解释优先:能讲清「为什么该赚钱」的规律,比纯统计显著的更可信。

小结

  • 工作流:假设 → 切样本 → 信号 → 回测 → 样本外 → 小仓位实盘;
  • 三大坑:前视偏差、幸存者偏差、过拟合
  • 核心心法:历史表现≠未来表现,稳健性比纸面收益更重要。

打好这些「防坑」底子后,下一模块我们正式进入金融与统计的数学基础

小测验

1. 「用今日收盘价生成今日的持仓信号」犯了哪种错误?

2. 只用「至今仍存活的股票」做长期回测,结果会?

3. 试了 1000 个策略再挑夏普最高的,这个「冠军」最可能是?