05 重采样方法 (Resampling Methods)

核心问题:没有独立测试集时,如何评估模型?

在统计学习中,我们反复遇到同一个困境:

  • 模型评估:已训练好的模型,在新数据上表现如何?
  • 模型选择:多个候选模型中,哪个泛化能力最强?

重采样方法(Resampling Methods)的核心思想:

已有数据自身反复构造”伪新数据”,来估计模型在真正新数据上的表现。

本章介绍两大核心工具:交叉验证自助法

两大重采样方法概览

重采样方法概览 展示交叉验证和自助法两大重采样方法的对比关系图 重采样方法 (Resampling Methods) 从已有数据中反复抽样 交叉验证 (Cross-Validation) 目标:估计测试误差 / 模型选择 验证集法 LOOCV k折CV 时间序列CV(金融数据专用) 自助法 (Bootstrap) 目标:量化估计量的不确定性 标准误估计 置信区间 投资组合优化 · 回归系数 实战案例:海康威视 · 宁波银行 · A股数据
Figure 1: 重采样方法的两大分支:交叉验证用于模型评估与选择,自助法用于量化不确定性

验证集方法:最简单的思路

验证集方法示意图 将数据随机分为训练集和验证集两半的示意图 验证集方法 (Validation Set Approach) 原始数据集 (n个观测) obs₁, obs₂, obs₃, ... , obsₙ ↓ 随机分割 训练集 (约50%) 验证集 (约50%) 在训练集上拟合模型 将模型应用到验证集 计算验证集 MSE ✓ 简单直观 ✗ 高方差(依赖切分方式) ✗ 只用一半数据训练
Figure 2: 验证集方法:随机将数据一分为二,一半训练、一半验证

验证集方法的致命缺陷:高方差

Code
import numpy as np  # 导入数值计算库
import pandas as pd  # 导入数据处理库
import matplotlib.pyplot as plt  # 导入绑图库
import platform  # 导入平台检测模块
import os  # 导入操作系统模块
from sklearn.preprocessing import PolynomialFeatures  # 导入多项式特征生成器
from sklearn.linear_model import LinearRegression  # 导入线性回归模型
from sklearn.metrics import mean_squared_error  # 导入均方误差计算函数

# 根据操作系统自动选择数据路径
data_base_path = 'C:/qiufei/data' if platform.system() == 'Windows' else '/home/ubuntu/r2_data_mount/qiufei/data'  # 跨平台路径适配

# 读取海康威视前复权日度股价数据
stock_price_path = f'{data_base_path}/stock/stock_price_pre_adjusted.h5'  # 拼接股价文件路径
stock_price_data = pd.read_hdf(stock_price_path)  # 从本地h5文件加载股价数据
Figure 3
Code
# 提取海康威视的收盘价序列
if 'order_book_id' in stock_price_data.index.names:  # 判断是否为多层索引
    haikang_close_prices = stock_price_data.xs('002415.XSHE', level='order_book_id').sort_index()['close']  # 从多层索引提取
else:  # 普通索引分支
    stock_reset = stock_price_data.reset_index()  # 重置索引为普通列
    haikang_close_prices = stock_reset[stock_reset['order_book_id'] == '002415.XSHE'].set_index('date')['close']  # 按条件筛选

# 计算日收益率并取最近500个交易日
haikang_daily_returns = haikang_close_prices.pct_change().dropna().iloc[-500:]  # 计算百分比收益率并截取近500天
haikang_returns_array = haikang_daily_returns.values  # 转为NumPy数组方便后续运算

# 构造特征:用前一日收益率预测当日收益率
feature_x = haikang_returns_array[:-1].reshape(-1, 1)  # 前一日收益率作为自变量,reshape为列向量
target_y = haikang_returns_array[1:]  # 当日收益率作为因变量
Figure 4
# 10次不同随机切分,每次计算1-5阶多项式的验证集MSE
fig, ax = plt.subplots(figsize=(10, 5))  # 创建画布
polynomial_degrees = range(1, 6)  # 多项式阶数从1到5

for split_iteration in range(10):  # 循环10次不同的随机切分
    np.random.seed(split_iteration)  # 每次使用不同的随机种子
    total_samples = len(feature_x)  # 总样本数
    shuffled_indices = np.random.permutation(total_samples)  # 生成随机排列的索引
    split_point = total_samples // 2  # 对半分割点
    train_indices = shuffled_indices[:split_point]  # 前一半作为训练集索引
    validation_indices = shuffled_indices[split_point:]  # 后一半作为验证集索引
    mse_per_degree = []  # 存储各阶多项式的MSE
    for degree in polynomial_degrees:  # 遍历每个多项式阶数
        poly_transformer = PolynomialFeatures(degree=degree, include_bias=False)  # 构造多项式特征转换器
        x_train_poly = poly_transformer.fit_transform(feature_x[train_indices])  # 对训练集生成多项式特征
        x_val_poly = poly_transformer.transform(feature_x[validation_indices])  # 对验证集生成同样的多项式特征
        model = LinearRegression().fit(x_train_poly, target_y[train_indices])  # 拟合线性回归模型
        val_predictions = model.predict(x_val_poly)  # 在验证集上预测
        mse_per_degree.append(mean_squared_error(target_y[validation_indices], val_predictions))  # 计算并记录MSE
    ax.plot(list(polynomial_degrees), mse_per_degree, marker='o', alpha=0.6)  # 绘制当次切分的MSE曲线

ax.set_xlabel('多项式阶数 (Polynomial Degree)', fontsize=12)  # X轴标签
ax.set_ylabel('验证集 MSE', fontsize=12)  # Y轴标签
ax.set_title('验证集方法的高方差:10次随机切分结果差异显著', fontsize=14)  # 标题
ax.grid(True, alpha=0.3)  # 添加网格线
plt.tight_layout()  # 调整布局
plt.show()  # 显示图形

LOOCV:留一交叉验证,消除随机性

留一交叉验证(Leave-One-Out Cross-Validation)的思路:每次只留出1个观测做验证,其余所有数据做训练。

\[ \large{ \text{CV}_{(n)} = \frac{1}{n}\sum_{i=1}^{n}\text{MSE}_i } \tag{1}\]

  • 重复 \(n\) 次(\(n\) = 样本量),每次留出不同的观测
  • \(\text{MSE}_i\):第 \(i\) 个观测被留出时的预测误差
  • 训练集大小:每次用 \(n-1\) 个观测,偏差极小
  • 结果确定:没有随机性,每次运行结果完全相同

快捷公式(仅适用于线性回归 / 多项式回归):

\[ \large{ \text{CV}_{(n)} = \frac{1}{n}\sum_{i=1}^{n}\left(\frac{y_i - \hat{y}_i}{1 - h_i}\right)^2 } \tag{2}\]

其中 \(h_i\) 是帽子矩阵的第 \(i\) 个对角元素(杠杆值),衡量第 \(i\) 个观测对自身预测的影响力。

k折交叉验证:偏差与方差的最佳权衡

k折交叉验证示意图 5折交叉验证的数据划分方式,每次一折作为验证集 5折交叉验证 (5-Fold CV) 第1轮 第2轮 第3轮 第4轮 第5轮 验证 训练 训练 训练 训练 → MSE₁ 验证 → MSE₂ 验证 → MSE₃ 验证 → MSE₄ 验证 → MSE₅ CV₍₅₎ = (MSE₁ + MSE₂ + MSE₃ + MSE₄ + MSE₅) / 5
Figure 5: 5折交叉验证:数据分为5折,每折轮流作为验证集,最终取平均MSE

\[ \large{ \text{CV}_{(k)} = \frac{1}{k}\sum_{i=1}^{k}\text{MSE}_i } \tag{3}\]

k的选择:偏差-方差权衡

k值 偏差 方差 计算成本 评价
k=2 (验证集法) 最低 不推荐
k=5 适中偏高 推荐
k=10 适中偏低 适中 适中 推荐
k=n (LOOCV) 最低 最高 最高 特殊场景

核心直觉

  • \(k\) 越大 → 训练集越大 → 偏差越小(模型拟合得更充分)
  • \(k\) 越大 → 各折训练集重叠越多 → 预测误差之间相关性更强方差越大
  • 经验法则\(k=5\)\(k=10\) 是最优平衡点

实证:LOOCV与10折CV在海康威视数据上的对比

Code
from sklearn.model_selection import cross_val_score, KFold, LeaveOneOut  # 导入交叉验证工具

fig, axes = plt.subplots(1, 2, figsize=(14, 5))  # 创建1行2列子图布局

# 左图:LOOCV
loocv_mse_per_degree = []  # 存储LOOCV各阶MSE
for degree in range(1, 6):  # 遍历1到5阶多项式
    poly_transformer = PolynomialFeatures(degree=degree, include_bias=False)  # 多项式特征转换器
    x_poly_features = poly_transformer.fit_transform(feature_x)  # 生成多项式特征
    loocv_splitter = LeaveOneOut()  # 创建LOOCV分割器
    neg_mse_scores = cross_val_score(LinearRegression(), x_poly_features, target_y, cv=loocv_splitter, scoring='neg_mean_squared_error')  # 计算LOOCV负MSE
    loocv_mse_per_degree.append(-neg_mse_scores.mean())  # 取负得到正MSE并记录

axes[0].plot(range(1, 6), loocv_mse_per_degree, 'b-o', linewidth=2, markersize=8)  # 绘制LOOCV曲线
axes[0].set_xlabel('多项式阶数', fontsize=12)  # X轴标签
axes[0].set_ylabel('LOOCV MSE', fontsize=12)  # Y轴标签
axes[0].set_title('LOOCV(结果唯一确定)', fontsize=14)  # 标题
axes[0].grid(True, alpha=0.3)  # 网格线
Figure 6: LOOCV与10折CV的对比:左图为LOOCV曲线(确定性),右图为9次不同10折CV(展示低方差)
# 右图:9次不同随机种子的10折CV
for cv_iteration in range(9):  # 重复9次10折CV
    kfold_mse_per_degree = []  # 存储当次实验各阶MSE
    for degree in range(1, 6):  # 遍历1到5阶多项式
        poly_transformer = PolynomialFeatures(degree=degree, include_bias=False)  # 多项式特征转换器
        x_poly_features = poly_transformer.fit_transform(feature_x)  # 生成多项式特征
        kfold_splitter = KFold(n_splits=10, shuffle=True, random_state=cv_iteration)  # 10折分割器,每次不同随机种子
        neg_mse_scores = cross_val_score(LinearRegression(), x_poly_features, target_y, cv=kfold_splitter, scoring='neg_mean_squared_error')  # 计算10折CV负MSE
        kfold_mse_per_degree.append(-neg_mse_scores.mean())  # 取负得到正MSE
    axes[1].plot(range(1, 6), kfold_mse_per_degree, marker='o', alpha=0.6)  # 绘制当次曲线

axes[1].set_xlabel('多项式阶数', fontsize=12)  # X轴标签
axes[1].set_ylabel('10折 CV MSE', fontsize=12)  # Y轴标签
axes[1].set_title('10折CV(9次不同切分,方差远低于验证集法)', fontsize=14)  # 标题
axes[1].grid(True, alpha=0.3)  # 网格线
plt.tight_layout()  # 调节布局间距
plt.show()  # 显示图表
<Figure size 960x480 with 0 Axes>

金融数据的特殊陷阱:时间序列交叉验证

金融时间序列数据不能随机打乱! 随机切分会造成严重的数据泄露(Data Leakage)。

时间序列交叉验证 滚动窗口和扩展窗口两种时间序列CV方法示意图 时间序列交叉验证(Walk-Forward Validation) ⚠️ 金融数据严禁随机打乱!必须保持时间顺序 ⚠️ 过去 未来 滚动 窗口 扩展 窗口 训练窗口(固定长度) 训练窗口(不断增长) 测试窗口
Figure 7: 时间序列交叉验证的两种核心策略:滚动窗口与扩展窗口

分类问题的交叉验证

对于分类问题,交叉验证使用分类错误率替代MSE:

\[ \large{ \text{CV}_{(k)} = \frac{1}{k}\sum_{i=1}^{k}\text{Err}_i, \quad \text{Err}_i = \frac{1}{n_i}\sum_{j \in C_i} I(y_j \neq \hat{y}_j) } \tag{4}\]

其中 \(C_i\) 是第 \(i\) 折的验证集,\(I(\cdot)\) 是指示函数。

海康威视涨跌预测实例

  • 目标:预测海康威视次日涨跌(二分类)
  • 特征:Lag1(前1日收益率)、Lag2(前2日收益率)
  • 模型:逻辑回归(Logistic Regression)
  • 评估方法:10折交叉验证的分类错误率

此任务的训练误差往往远低于CV误差,因为模型会过度适配训练数据中的噪声。

自助法的核心思想:用”已有”模拟”未知”

自助法核心思想 自助法通过有放回抽样从原始数据中模拟重复实验的过程 自助法 (Bootstrap) 核心思想 原始样本 Z = {z₁, z₂, ..., zₙ} ↓ 有放回抽样 (同一观测可被多次抽中) Z*¹ → α̂*¹ Z*² → α̂*² ··· Z*ᴮ → α̂*ᴮ ↓ 收集B个估计值 {α̂*¹, α̂*², ..., α̂*ᴮ} → 经验分布 ↓ 从经验分布中提取 标准误 SE(α̂) 95%置信区间 Bootstrap 标准误公式: SE_B(α̂) = √[ 1/(B-1) · Σᵣ (α̂*ʳ - mean(α̂*))² ]
Figure 8: 自助法的完整流程:有放回抽样 → 计算统计量 → 构建经验分布 → 提取标准误和置信区间

投资组合优化案例:寻找最小方差配比

问题:将资金投资于海康威视(X)和宁波银行(Y),如何确定最优配比 \(\alpha\) 使投资组合风险最小?

\[ \large{ \alpha = \frac{\sigma_Y^2 - \sigma_{XY}}{\sigma_X^2 + \sigma_Y^2 - 2\sigma_{XY}} } \tag{5}\]

  • \(\sigma_X^2 = \text{Var}(X)\):海康威视收益率方差
  • \(\sigma_Y^2 = \text{Var}(Y)\):宁波银行收益率方差
  • \(\sigma_{XY} = \text{Cov}(X, Y)\):两资产收益率协方差
  • \(\alpha\):投资在海康威视上的比例,\(1-\alpha\) 投资在宁波银行

关键问题\(\hat{\alpha}\)不确定性有多大?仅凭100天数据估计的 \(\alpha\),置信区间是多少?

→ 这正是 Bootstrap 大显身手的场景!

Bootstrap实证:海康威视与宁波银行

Code
# 读取两只股票的收盘价序列并对齐交易日
if 'order_book_id' in stock_price_data.index.names:  # 判断多层索引
    haikang_prices = stock_price_data.xs('002415.XSHE', level='order_book_id').sort_index()['close']  # 提取海康威视收盘价
    ningbo_bank_prices = stock_price_data.xs('002142.XSHE', level='order_book_id').sort_index()['close']  # 提取宁波银行收盘价
else:  # 普通索引分支
    stock_reset = stock_price_data.reset_index()  # 重置索引
    haikang_prices = stock_reset[stock_reset['order_book_id'] == '002415.XSHE'].set_index('date')['close']  # 筛选海康威视
    ningbo_bank_prices = stock_reset[stock_reset['order_book_id'] == '002142.XSHE'].set_index('date')['close']  # 筛选宁波银行

# 对齐交易日期并计算日收益率
merged_prices = pd.concat([haikang_prices, ningbo_bank_prices], axis=1, join='inner').dropna()  # 内连接对齐并删除缺失值
merged_prices.columns = ['haikang_close', 'ningbo_close']  # 重命名列
daily_returns = merged_prices.pct_change().dropna()  # 计算日收益率
daily_returns.columns = ['X_haikang', 'Y_ningbo']  # X=海康威视收益率,Y=宁波银行收益率
sample_returns = daily_returns.iloc[-100:]  # 取最近100个交易日作为样本
print(f'样本量: {len(sample_returns)} 个交易日')  # 输出样本量
print(f'海康威视日均收益: {sample_returns["X_haikang"].mean():.6f}')  # 海康威视平均日收益
print(f'宁波银行日均收益: {sample_returns["Y_ningbo"].mean():.6f}')  # 宁波银行平均日收益
样本量: 100 个交易日
海康威视日均收益: 0.000397
宁波银行日均收益: 0.000020
Figure 9
# 定义最优投资比例α的计算函数(马科维茨最小方差公式)
def compute_optimal_alpha(returns_data, sample_indices):  # 定义计算最优α的函数
    '''根据给定索引的收益率子集,计算使投资组合方差最小的α值'''
    x_returns = returns_data.iloc[sample_indices, 0].values  # 海康威视收益率子集
    y_returns = returns_data.iloc[sample_indices, 1].values  # 宁波银行收益率子集
    variance_x = np.var(x_returns, ddof=1)  # 海康威视收益率方差(无偏估计)
    variance_y = np.var(y_returns, ddof=1)  # 宁波银行收益率方差(无偏估计)
    covariance_xy = np.cov(x_returns, y_returns, ddof=1)[0, 1]  # 两资产协方差
    optimal_alpha = (variance_y - covariance_xy) / (variance_x + variance_y - 2 * covariance_xy)  # 马科维茨最优配比
    return optimal_alpha  # 返回最优投资比例

# 用完整样本计算α的点估计
observation_count = len(sample_returns)  # 样本观测数
original_alpha_estimate = compute_optimal_alpha(sample_returns, range(observation_count))  # 原始样本的α估计
print(f'原始α估计值: {original_alpha_estimate:.4f}')  # 输出α的点估计
print(f'解读: 约{original_alpha_estimate*100:.1f}%配置海康威视,{(1-original_alpha_estimate)*100:.1f}%配置宁波银行')  # 配比解读
原始α估计值: 0.3322
解读: 约33.2%配置海康威视,66.8%配置宁波银行

1000次Bootstrap揭示α的不确定性

Code
np.random.seed(42)  # 固定随机种子确保可复现

# 执行1000次Bootstrap重采样
bootstrap_iterations = 1000  # Bootstrap重复次数
bootstrap_alpha_values = []  # 存储每次Bootstrap的α估计

for _ in range(bootstrap_iterations):  # 循环1000次
    resampled_indices = np.random.choice(range(observation_count), size=observation_count, replace=True)  # 有放回抽样100个索引
    bootstrap_alpha = compute_optimal_alpha(sample_returns, resampled_indices)  # 在重抽样数据上计算α
    bootstrap_alpha_values.append(bootstrap_alpha)  # 记录本次Bootstrap的α

bootstrap_alpha_values = np.array(bootstrap_alpha_values)  # 转换为NumPy数组
bootstrap_se = np.std(bootstrap_alpha_values, ddof=1)  # Bootstrap标准误 = α估计值们的标准差
print(f'Bootstrap标准误: {bootstrap_se:.4f}')  # 输出标准误
Bootstrap标准误: 0.0717
Figure 10
# 生成模拟"真实"分布作为对比基准(教学用途:假设已知总体参数)
simulated_alpha_values = []  # 存储模拟分布的α
population_mean = sample_returns.mean()  # 用样本均值近似总体均值
population_cov = sample_returns.cov()  # 用样本协方差近似总体协方差

for _ in range(1000):  # 从"已知总体"中模拟1000次抽样
    simulated_data = np.random.multivariate_normal(population_mean, population_cov, observation_count)  # 从多元正态分布抽取新样本
    simulated_df = pd.DataFrame(simulated_data)  # 转换为DataFrame
    sim_alpha = compute_optimal_alpha(simulated_df, range(observation_count))  # 计算模拟样本的α
    simulated_alpha_values.append(sim_alpha)  # 追加记录

simulated_alpha_values = np.array(simulated_alpha_values)  # 转换为NumPy数组
# 绘制三张对比图
fig, axes = plt.subplots(1, 3, figsize=(18, 5))  # 创建1行3列子图

# 左图:模拟的"真实"抽样分布
axes[0].hist(simulated_alpha_values, bins=40, alpha=0.7, color='#3498DB', edgecolor='black')  # 绘制直方图
axes[0].axvline(np.mean(simulated_alpha_values), color='red', linestyle='--', label=f'均值: {np.mean(simulated_alpha_values):.3f}')  # 标记均值
axes[0].set_xlabel('α', fontsize=12)  # X轴标签
axes[0].set_title('模拟抽样分布\n(上帝视角基准)', fontsize=13)  # 标题
axes[0].legend()  # 图例
axes[0].grid(True, alpha=0.3)  # 网格

# 中图:Bootstrap分布
axes[1].hist(bootstrap_alpha_values, bins=40, alpha=0.7, color='#E74C3C', edgecolor='black')  # 绘制直方图
axes[1].axvline(original_alpha_estimate, color='blue', linewidth=2, label=f'原始估计: {original_alpha_estimate:.3f}')  # 标记原始估计
axes[1].set_xlabel('α', fontsize=12)  # X轴标签
axes[1].set_title(f'Bootstrap分布\n(SE = {bootstrap_se:.3f})', fontsize=13)  # 标题
axes[1].legend()  # 图例
axes[1].grid(True, alpha=0.3)  # 网格

# 右图:箱线图对比
axes[2].boxplot([simulated_alpha_values, bootstrap_alpha_values], labels=['模拟分布', 'Bootstrap'], patch_artist=True, boxprops=dict(facecolor='lightblue'))  # 箱线图
axes[2].set_title('分布对比', fontsize=13)  # 标题
axes[2].grid(True, alpha=0.3, axis='y')  # Y轴网格

plt.tight_layout()  # 调整布局
plt.show()  # 显示图表

为什么Bootstrap有效?63.2%定律

每个Bootstrap样本大约包含原始数据的63.2%独特观测

数学推导:对于第 \(i\) 个观测点:

  • 单次抽取中未被选中的概率:\(1 - \frac{1}{n}\)
  • \(n\) 次抽取中始终未被选中:\(\left(1 - \frac{1}{n}\right)^n\)
  • \(n \to \infty\)\(\left(1 - \frac{1}{n}\right)^n \to \frac{1}{e} \approx 0.368\)

因此:

\[ \large{ P(\text{被选中}) = 1 - \left(1 - \frac{1}{n}\right)^n \approx 1 - \frac{1}{e} \approx 0.632 } \tag{6}\]

袋外数据(OOB):未被选中的约36.8%的观测可作为天然验证集,无需显式数据切分。

Bootstrap标准误的正式公式

Bootstrap标准误的计算公式如下:

\[ \large{ \text{SE}_B(\hat{\alpha}) = \sqrt{\frac{1}{B-1}\sum_{r=1}^{B}\left(\hat{\alpha}^{*r} - \overline{\hat{\alpha}^*}\right)^2} } \tag{7}\]

其中:

  • \(B\):Bootstrap重采样次数(通常 \(B = 1000\) 或更大)
  • \(\hat{\alpha}^{*r}\):第 \(r\) 个Bootstrap样本计算得到的统计量
  • \(\overline{\hat{\alpha}^*} = \frac{1}{B}\sum_{r=1}^{B}\hat{\alpha}^{*r}\):所有Bootstrap估计的均值

Bootstrap置信区间(百分位法):

\[ \large{ \text{CI}_{95\%} = \left[\hat{\alpha}^*_{(0.025)},\; \hat{\alpha}^*_{(0.975)}\right] } \tag{8}\]

即取1000个 \(\hat{\alpha}^*\) 值的第2.5百分位数和第97.5百分位数。

Bootstrap的适用范围与局限性

维度 说明
适用范围 几乎任何统计方法的标准误和置信区间
核心优势 不依赖强分布假设,实现简单
局限1:小样本 样本量过小时,经验分布不能很好代表总体
局限2:非iid数据 时间序列需用分块Bootstrap (Block Bootstrap)
局限3:极端统计量 对极值统计量(如最大值)效果不佳
局限4:计算成本 大数据集 + 复杂模型时计算开销显著

金融领域特别注意

  • 股票收益率存在自相关波动率聚集(GARCH效应)
  • 标准Bootstrap假设iid可能不成立
  • 建议使用移动分块Bootstrap野生Bootstrap (Wild Bootstrap)

本章知识体系总结

重采样方法知识体系 交叉验证和自助法的完整知识体系总结图 第5章 知识体系总结 交叉验证 (Cross-Validation) 验证集法 → 高方差 LOOCV → 低偏差高方差 k折CV → 最优平衡 时间序列CV → 金融专用 CV₍ₖ₎ = (1/k) Σ MSEᵢ 推荐 k=5 或 k=10 自助法 (Bootstrap) 有放回抽样B次 63.2%独特观测 标准误 SE(α̂) 百分位置信区间 SE_B = √[1/(B-1) Σ(α̂*ʳ - mean)²] 通常 B=1000 或更大 共同本质:用"数据自身"模拟"重复实验" 实际应用建议 模型选择 k折CV (k=5或10) 模型评估 独立测试集 / CV 不确定性量化 Bootstrap标准误 金融数据 时间序列CV 本章实证:海康威视多项式回归CV · 海康威视/宁波银行Bootstrap投资组合优化
Figure 11: 重采样方法知识体系总结:交叉验证用于模型评估与选择,自助法用于量化不确定性