Day 1:机器学习基础与评估指标
📋 目录
- 机器学习核心概念
- 过拟合与欠拟合详解
- 数据集划分(训练/验证/测试)
- 回归评估指标(MSE/MAE/R²)
- 分类评估指标(准确率/精确率/召回率/F1/AUC)
第一部分:机器学习核心概念(1.5小时理论)
1.1 什么是机器学习?
定义:机器学习是让计算机从数据中学习规律,而不需要显式编程每个规则。
三种主要类型:
| 类型 | 定义 | 量化交易应用 |
|---|---|---|
| 监督学习 | 数据有标签,学习输入到输出的映射 | 预测涨跌(分类)、预测收益率(回归) |
| 无监督学习 | 数据无标签,发现隐藏结构 | 股票聚类、市场状态识别 |
| 强化学习 | 通过奖惩学习决策策略 | 动态仓位管理、最优执行 |
1.2 监督学习的两个子类型
回归(Regression):预测连续值
- 例子:预测明天收盘价、预测波动率
- 输出:任意实数
分类(Classification):预测离散类别
- 例子:预测涨/跌、判断是否异常交易
- 输出:类别标签
1.3 核心术语
- 特征(Feature):输入变量,如过去5日收益率、成交量
- 标签(Label):输出变量,如次日涨跌(0或1)
- 样本(Sample):一行数据,包含特征和标签
- 模型(Model):学习到的映射函数 f: 特征 → 标签
第二部分:过拟合与欠拟合(核心概念)
2.1 定义
-
欠拟合(Underfitting):
训练集误差高 + 测试集误差高
原因:模型太简单,没学到规律
例子:用线性模型预测复杂的非线性关系
-
过拟合(Overfitting) :
训练集误差极低 + 测试集误差高
原因 :模型太复杂,记忆了噪声
例子:决策树不剪枝,记住每个训练样本 -
良好拟合(Good Fit) :
训练集误差适中 + 测试集误差接近训练集
2.2 量化交易中的过拟合陷阱
| 陷阱 | 说明 | 后果 |
|---|---|---|
| 前视偏差 | 使用了未来信息 | 回测完美,实盘崩溃 |
| 数据窥探偏差 | 反复测试同一数据 | 策略只适合历史 |
| 过度优化 | 参数过于精细 | 对微小变化敏感 |
2.3 如何诊断过拟合
学习曲线(Learning Curves):
- 训练误差持续下降,验证误差先降后升 → 过拟合
- 两个误差都很高且接近 → 欠拟合
- 两个误差都较低且接近 → 良好拟合
2.4 解决过拟合的方法
| 方法 | 说明 | 量化应用 |
|---|---|---|
| 增加数据量 | 更多样本 | 使用多年历史数据 |
| 降低模型复杂度 | 减少参数 | 限制树深度、减少特征 |
| 正则化 | 惩罚大参数 | Ridge/Lasso回归 |
| 早停 | 验证误差不再下降时停止 | 神经网络训练 |
| 交叉验证 | 充分利用数据 | 时间序列交叉验证 |
第三部分:数据集划分(训练/验证/测试)
3.1 三种数据集的作用
text
完整数据集
├── 训练集(60-70%):训练模型参数
├── 验证集(15-20%):调超参数、模型选择
└── 测试集(15-20%):最终评估(只能用一次!)
3.2 为什么不能只用训练集和测试集?
错误做法:训练 → 测试 → 调参 → 再测试(信息泄露!)
正确流程:
- 训练集训练模型
- 验证集调超参数(反复多次)
- 测试集最终评估(只做一次)
3.3 量化交易的特殊性:时间序列划分
错误做法:随机划分(会引入前视偏差)
python
# 错误:随机打乱
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, shuffle=True) # ❌
正确做法:按时间顺序划分
python
# 正确:保持时间顺序
split_date = '2023-01-01'
train = df[df['date'] < split_date]
test = df[df['date'] >= split_date] # ✅
**前世偏差(Look-ahead Bias)**是指在模型训练或回测过程中,无意中使用了未来时间点的数据来影响当前决策,导致模型表现被严重高估。
- 普通数据:样本之间相互独立,可以随机打乱
- 时间序列数据 :具有时间依赖性 和因果关系,过去影响未来
3.4 时间序列交叉验证
python
from sklearn.model_selection import TimeSeriesSplit
tscv = TimeSeriesSplit(n_splits=5)
for train_index, test_index in tscv.split(X):
# 训练集始终在测试集之前
pass
第四部分:回归评估指标
4.1 MSE(均方误差)
公式 :MSE=1n∑i=1n(yi−y^i)2\text{MSE} = \frac{1}{n}\sum_{i=1}^{n}(y_i - \hat{y}_i)^2MSE=n1∑i=1n(yi−y^i)2
特点:
- 对异常值敏感(平方放大误差)
- 量纲是原单位的平方
代码:
python
from sklearn.metrics import mean_squared_error
mse = mean_squared_error(y_true, y_pred)
4.2 MAE(平均绝对误差)
公式 :MAE=1n∑i=1n∣yi−y^i∣\text{MAE} = \frac{1}{n}\sum_{i=1}^{n}|y_i - \hat{y}_i|MAE=n1∑i=1n∣yi−y^i∣
特点:
- 对异常值更鲁棒
- 量纲与原数据相同
代码:
python
from sklearn.metrics import mean_absolute_error
mae = mean_absolute_error(y_true, y_pred)
4.3 R²(决定系数)
公式 :R2=1−∑(yi−y^i)2∑(yi−yˉ)2R^2 = 1 - \frac{\sum(y_i - \hat{y}_i)^2}{\sum(y_i - \bar{y})^2}R2=1−∑(yi−yˉ)2∑(yi−y^i)2
含义:模型解释了多少比例的方差
- R² = 1:完美拟合
- R² = 0:等于只用均值预测
- R² < 0:比均值预测还差
代码:
python
from sklearn.metrics import r2_score
r2 = r2_score(y_true, y_pred)
4.4 回归指标选择指南
| 场景 | 推荐指标 | 原因 |
|---|---|---|
| 异常值较多 | MAE | 更鲁棒 |
| 希望惩罚大误差 | MSE | 平方放大大误差 |
| 需要解释性 | R² | 标准化,便于比较 |
第五部分:分类评估指标
5.1 混淆矩阵(Confusion Matrix)
| 预测: 正类 | 预测: 负类 | |
|---|---|---|
| 实际: 正类 | TP | FN |
| 实际: 负类 | FP | TN |
- TP = True Positive(正确预测上涨)
- TN = True Negative(正确预测下跌)
- FP = False Positive(误报,预测涨实际跌)
- FN = False Negative(漏报,预测跌实际涨)
代码:
python
from sklearn.metrics import confusion_matrix
cm = confusion_matrix(y_true, y_pred)
5.2 准确率(Accuracy)
公式 :Accuracy=TP+TNTP+TN+FP+FN\text{Accuracy} = \frac{TP + TN}{TP + TN + FP + FN}Accuracy=TP+TN+FP+FNTP+TN
问题:类别不平衡时失效
- 例子:95%上涨,5%下跌,全预测上涨就有95%准确率
5.3 精确率(Precision)
公式 :Precision=TPTP+FP\text{Precision} = \frac{TP}{TP + FP}Precision=TP+FPTP
含义:预测为涨的里面,有多少真涨了
- 量化应用:减少误报,避免虚假买入信号
5.4 召回率(Recall)
公式 :Recall=TPTP+FN\text{Recall} = \frac{TP}{TP + FN}Recall=TP+FNTP
含义:真正上涨的里面,预测对了多少
- 量化应用:减少漏报,抓住上涨机会
5.5 F1分数
公式 :F1=2×Precision×RecallPrecision+RecallF1 = 2 \times \cfrac{\text{Precision} \times \text{Recall}}{\text{Precision} + \text{Recall}}F1=2×Precision+RecallPrecision×Recall
含义:精确率和召回率的调和平均
- 两者兼顾时的最佳指标
5.6 ROC曲线与AUC
ROC曲线:
- X轴:假阳性率(FPR)= FP / (FP + TN)
- Y轴:真阳性率(TPR)= TP / (TP + FN)
- 曲线下方面积越大,模型越好
AUC值:
- AUC = 0.5:随机猜测
- AUC = 0.7-0.8:可接受
- AUC = 0.8-0.9:优秀
- AUC > 0.9:可能过拟合
代码:
python
from sklearn.metrics import roc_auc_score, roc_curve
auc = roc_auc_score(y_true, y_pred_proba)
fpr, tpr, thresholds = roc_curve(y_true, y_pred_proba)
5.7 分类指标选择指南
| 场景 | 推荐指标 | 原因 |
|---|---|---|
| 类别平衡 | 准确率 | 简单直观 |
| 类别不平衡 | AUC或F1 | 不受不平衡影响 |
| 重视抓住机会 | 召回率 | 减少漏报 |
| 重视信号质量 | 精确率 | 减少误报 |
| 平衡考虑 | F1 | 综合两者 |