1. 项目概述与核心问题拆解
做量化研究的朋友们,尤其是关注宏观事件对市场冲击的,应该都对“黑天鹅”事件不陌生。政策变动,特别是像关税这种直接影响国际贸易成本和公司利润的宏观变量,往往会在短期内引发市场剧烈波动。传统的做法是看新闻、拍脑袋,或者用一些基础的计量模型(比如ARIMA、GARCH)去拟合历史波动率。但说实话,在市场情绪和复杂非线性关系面前,这些传统模型常常力不从心,预测滞后、对突发事件的响应迟钝是通病。
最近我手头正好有一个挺有意思的案例:分析2025年初某大国宣布并实施新一轮关税后,对澳大利亚股市(S&P/ASX 200指数)的影响。这不仅仅是一个事件分析,更是一个绝佳的实战场景,用来检验不同机器学习回归模型在“压力测试”下的预测能力。核心问题很明确:当市场受到一个已知时间点(2025年4月2日)的外部政策冲击时,哪些回归模型能更准确、更稳健地预测后续的股价走势?我们能否量化比较不同模型的优劣?
这个项目的价值在于,它跳出了纯理论比较,把一个具体的宏观事件作为“试金石”。我们不仅要知道哪个模型在历史数据上回测表现好,更要看它在面对已知冲击时,预测的时序轨迹跟真实市场反应的贴合度。这对于构建事件驱动型交易策略或风险对冲模型,有直接的参考意义。
2. 数据基础与特征工程:从原始行情到模型输入
巧妇难为无米之炊,模型表现很大程度上取决于喂给它的数据质量。这个项目的数据源很清晰:澳大利亚S&P/ASX 200和美国S&P 500指数从2025年1月21日到7月25日的日度及周度行情数据(开盘、最高、最低、收盘价)。数据本身是干净的,但直接扔给模型肯定不行,我们需要从中“榨取”出对预测有用的信息。
2.1 核心特征构建思路
金融时间序列预测,尤其是日频或周频的,核心在于捕捉两种模式:趋势和波动。原始的价格序列非平稳、自相关性强,直接预测价格非常困难。因此,特征工程围绕“转化”展开:
基础价格衍生特征:
- 收益率序列:这是几乎所有金融预测的起点。我们计算日度或周度的对数收益率
Return_t = log(Close_t / Close_{t-1})。收益率序列通常更接近平稳,且其波动性本身就是重要的预测目标。 - 波动率代理:使用滚动窗口(例如过去5天、20天)计算收益率的标准差,作为历史波动率的估计。在关税事件窗口,这个特征的突变会非常显著。
- 技术指标:虽然原始研究可能未深入,但在实战中我会加入一些经典指标。例如:
- 滚动均线(MA):比如5日均线和20日均线,以及它们的差值(均线发散),用于捕捉趋势强度。
- 相对强弱指数(RSI):14日RSI,用于度量市场超买超卖状态。
- 布林带(Bollinger Bands):利用价格与上下轨的关系,构造宽度(Band Width)和百分比(%B)特征,反映波动率扩张与收缩。
- 收益率序列:这是几乎所有金融预测的起点。我们计算日度或周度的对数收益率
事件驱动特征:
- 这是本项目的关键。我们需要创建一个或多个二元变量(Dummy Variable)来标记关税事件。
Tariff_Announcement:在宣布日(假设为2025年4月2日)及之后一段时间(如5个交易日)设为1,否则为0。用于捕捉“消息冲击”。Post_Tariff_Period:在实施日之后的所有日期设为1。用于捕捉政策的持续影响期。
- 市场联动特征:由于澳大利亚市场与美国市场高度相关(从数据中也能看出强正相关性),将S&P 500的收益率、波动率作为特征加入,能显著提升模型对全球情绪和资本流动的感知能力。
- 这是本项目的关键。我们需要创建一个或多个二元变量(Dummy Variable)来标记关税事件。
时序依赖特征(Lag Features):
- 这是让模型“记忆”过去的关键。我们创建滞后变量,例如
Return_{t-1},Return_{t-2},Return_{t-3},以及Volatility_{t-1}等。这相当于让模型自己学习时间序列的自回归(AR)结构。在代码实现上,使用Pandas的shift()函数可以轻松完成。
- 这是让模型“记忆”过去的关键。我们创建滞后变量,例如
滚动统计特征(Rolling Statistics):
- 除了波动率,还可以计算滚动窗口内的平均收益率、收益率偏度、峰度等。这些特征能捕捉市场状态的局部变化,例如,在事件前市场是否已经处于高波动、高偏度的脆弱状态。
实操心得:特征工程的“度”特征不是越多越好。特别是对于kNN这类基于距离的模型,无关特征会稀释有效信息的浓度,导致“维度灾难”。我的经验是,先从经济学和金融学逻辑出发,构建核心特征(收益率、波动率、事件哑变量、滞后项)。然后通过特征重要性分析(如随机森林提供的)或递归特征消除(RFE)进行筛选。对于线性模型和SVR,务必进行特征标准化(StandardScaler),否则模型会被量纲大的特征主导。
2.2 数据预处理与探索性分析(EDA)
在构建特征后,必须进行严格的EDA,这不仅是了解数据,更是发现模型潜在问题的过程。
- 缺失值处理:创建滞后和滚动特征后,序列开头会产生NaN。通常直接删除这些行,确保训练集完整。
- 异常值检测:在极端市场行情(如关税宣布后的大跌)中,会出现“异常值”。但这些往往是真正的信号而非噪声,不能简单剔除。我们需要用模型(如随机森林)的鲁棒性去适应它们,或者考虑使用对异常值不敏感的损失函数。
- 相关性分析:计算所有特征与目标变量(如下一期的收益率或收盘价)的相关系数,并绘制热力图。这能直观看到哪些特征与预测目标线性相关性强。更重要的是,检查特征之间的多重共线性。高共线性会影响线性回归和SVR的系数稳定性。可以用方差膨胀因子(VIF)来诊断,对于VIF > 10的特征需要考虑剔除或合并。
- 时序可视化:将关税事件日、实施日在价格和收益率时序图上用竖线标出。观察事件前后市场模式是否发生结构性变化(如波动率剧增、趋势反转)。这能帮助我们判断,是否有必要对事件前后数据分别建模,或引入交互项特征(如
Tariff_Dummy * Return_{t-1})。
通过以上步骤,我们就把原始的OHLC价格数据,转化成了一个包含历史信息、市场状态、外部事件标签的特征矩阵(Feature Matrix)。这个矩阵才是机器学习模型真正的“食物”。
3. 模型选型、原理与实战调参
项目对比了四种回归模型:线性回归、支持向量回归(SVR)、k近邻回归(kNN)和随机森林回归。我们不仅要会用,更要懂它们在这个场景下的“脾气”。
3.1 线性回归:稳健的基线模型
- 原理:试图用一条直线(或超平面)
y = βX + ε来拟合数据,通过最小化残差平方和(OLS)求解参数β。它假设特征与目标呈线性关系,且误差独立同分布。 - 在本场景的适用性:线性回归是完美的基线模型。如果市场对关税的反应是简单、线性的(例如,关税每提升1%,大盘指数固定下跌某个点数),那么线性模型就足够了。它的优势是极度透明,系数可以解释为特征对价格的边际影响。例如,
Tariff_Dummy的系数直接估计了事件导致的平均价格变化。 - 实战调参与陷阱:
- 共线性:如前所述,必须检查VIF。高共线性下,系数估计会不���定且难以解释。
- 异方差性:金融数据中,大波动常聚集出现,导致误差项方差不等。这会影响系数显著性检验的可靠性。可以绘制残差图查看,或使用稳健标准误。
- 非线性:这是线性回归最大的软肋。如果关税的影响是随时间衰减的,或者与市场情绪有交互作用,线性模型就无法捕捉。这时,它的表现会显著差于其他模型,但这个“差”本身就是一个重要的结论:市场对关税的反应是非线性的。
3.2 支持向量回归(SVR):寻找最优间隔带
- 原理:SVR不追求最小化所有点的误差平方和,而是试图找到一个函数
f(x),使得大部分样本点都落在以f(x)为中心、宽度为2ε的“间隔带”内,同时让f(x)尽可能平坦(即权重向量范数小)。落在带外的点才计入损失。通过核技巧(Kernel Trick),它能将数据映射到高维空间,从而拟合非线性关系。 - 在本场景的适用性:SVR(特别是带RBF核的)非常适合捕捉市场中复杂的、非线性的模式。关税冲击可能先引发恐慌性抛售(非线性下跌),随后情绪修复(非线性反弹),SVR有能力刻画这种复杂轨迹。
- 实战调参核心:
- 核函数选择:线性核(
kernel='linear')退化为线性模型。RBF核(kernel='rbf')最常用,能拟合复杂曲线。多项式核(kernel='poly')也可尝试,但更容易过拟合。 - 关键超参数:
- C(惩罚系数):C越大,模型对间隔带外样本的惩罚越重,越倾向于拟合所有数据点,可能过拟合。C越小,模型容忍更多点落在带外,可能欠拟合。在波动大的市场,C不宜过大。
- ε(间隔带宽度):ε越大,间隔带越宽,模型越简单。在噪声大的金融数据中,设置一个合理的ε可以增强模型鲁棒性。
- γ(RBF核参数):γ定义了单个样本的影响范围。γ越大,样本影响范围越小,决策边界越曲折,容易过拟合;γ越小,影响范围越广,边界越平滑。
- 调参策略:使用网格搜索(GridSearchCV)或随机搜索(RandomizedSearchCV),结合时间序列交叉验证(TimeSeriesSplit),寻找
(C, ε, γ)的最优组合。切记:必须对特征进行标准化!SVR对特征尺度非常敏感。
- 核函数选择:线性核(
3.3 k近邻回归(kNN):基于局部相似性的预测
- 原理:对于一个新样本,在特征空间里找到它的k个“最近邻”(通常用欧氏距离),然后用这k个邻居目标值的平均值(或加权平均)作为预测值。这是一种“懒惰学习”,没有显式的训练模型过程。
- 在本场景的适用性:kNN的逻辑很直观:寻找历史上与“当前时刻”最相似的市场状态(特征组合),然后用那时的结果来预测现在。如果关税事件后的市场状态,与历史上某次贸易摩擦时期的状态相似,那么kNN可能会给出不错的预测。它对数据分布没有假设,能适应各种不规则模式。
- 实战调参与致命弱点:
- k值选择:k太小(如k=1),模型对噪声极度敏感,预测结果波动剧烈。k太大,模型过于平滑,会忽略局部细节(比如关税冲击的尖锐拐点)。通常通过交叉验证选择。
- 距离度量:欧氏距离是默认选择,但在金融数据中,曼哈顿距离或马氏距离(考虑特征相关性)有时更有效。
- 特征缩放与维度灾难:kNN必须进行特征标准化。最大的问题是“维度灾难”,当特征数量多时,所有样本点在空间中显得“ equally far apart”,距离失去意义。因此,kNN必须搭配严格的特征筛选,只保留最相关的几个特征。
- 计算成本:预测时需要计算与所有训练样本的距离,当数据量大时,预测速度慢。不适合高频交易场景。
3.4 随机森林回归:集成学习的王者
- 原理:构建多棵决策树,每棵树在随机抽取的样本子集和特征子集上训练。预测时,对所有树的输出取平均。通过“随机性”和“平均”来降低单棵决策树容易过拟合的方差。
- 在本场景的适用性:随机森林几乎是这类问题的“默认强者”。它能天然地处理非线性关系、特征交互(例如关税事件与市场波动率的交互影响),对异常值不敏感,还能给出特征重要性排序。对于关税这种复杂事件,市场各板块反应不一,随机森林通过多棵树可以捕捉到这种异质性。
- 实战调参核心:
- n_estimators(树的数量):越多越好,但计算成本增加。一般从100开始,增加到模型性能(OOB误差或交叉验证分数)不再显著提升为止。
- max_depth(树的最大深度):控制单棵树的复杂度。深度太大过拟合,太小欠拟合。通常不限制(
max_depth=None),让树生长,然后靠min_samples_split和min_samples_leaf来正则化。 - min_samples_split 和 min_samples_leaf:这是防止过拟合的关键。我常用的起点是
min_samples_split=5(节点至少5个样本才分裂),min_samples_leaf=2(叶节点至少2个样本)。在数据量不大时,可以设置得更大一些。 - max_features:每次分裂时考虑的最大特征数。常用
sqrt(n_features)或log2(n_features)。这是引入随机性的关键,能确保树之间的差异性。 - 特征重要性:训练后,通过
model.feature_importances_查看。这能验证我们特征工程的有效性,例如Tariff_Dummy和US_Return的重要性是否排在前列。
4. 模型训练、评估与结果深度解读
有了数据和模型,下一步就是训练和公平比较。这里的关键是避免数据泄露和选择正确的评估策略。
4.1 时间序列交叉验证与数据分割
金融数据具有强烈的自相关性,绝不能使用随机划分训练集和测试集。必须严格按时间顺序分割。
- 初始分割:我常用80%的数据作为初始训练集,20%作为最终测试集。测试集必须位于时间序列的末尾,用于模拟“未来”预测。
- 时间序列交叉验证(TimeSeriesSplit):在训练集上使用。例如,用5折TimeSeriesSplit,它会在不打乱顺序的前提下,依次用前几折训练,后一折验证。这能更好地评估模型在时序数据上的泛化能力,防止模型“偷看”未来信息。
4.2 评估指标的选择与解读
不能只看一个指标,要从多个维度评估模型。
- R²(决定系数):最直观的指标,表示模型解释的目标变量方差的比例。但要注意:在时间序列预测中,如果数据有很强的趋势,一个简单的滞后模型(如用昨天的价格预测今天)就能得到很高的R²,但这不代表模型好。因此,R²要结合其他指标看。
- MAE(平均绝对误差):我的首选指标。因为它对异常值不那么敏感,解释性极强:平均而言,模型的预测价格与实际价格相差多少“点”。例如,MAE=67.64点,意味着平均预测偏差约68个指数点。
- MSE/RMSE(均方误差/均方根误差):MSE会放大较大误差的影响。在金融预测中,我们往往更关心大的预测失误(因为它意味着更大的风险或亏损),所以MSE/RMSE也很重要。RMSE和MAE单位一致,便于比较。
- MAPE(平均绝对百分比误差):对于不同尺度的序列比较有用。但在股价接近零时(本项目不涉及)会失真。
4.3 结果分析与模型对比
根据项目报告中的结果(随机森林表现最佳),我们可以进行深度解读:
为什么随机森林赢了?
- 非线性捕获能力:关税冲击及其后续影响绝非线性。随机森林通过大量决策树,能够拟合出非常复杂的非线性函数,精准捕捉市场从恐慌到修复的整个动态过程。
- 特征交互:它能自动学习特征之间的交互作用。例如,“高波动率”和“关税事件期”同时出现时,市场下跌的幅度可能不是简单的相加,随机森林能捕捉这种联合效应。
- 抗噪声能力:通过Bootstrap抽样和特征随机选择,它对数据中的微小噪声(市场日常杂波)不敏感,更关注主要模式。
- 无需精细调参:相比SVR对 (C, γ, ε) 的敏感,随机森林的超参数相对鲁棒,更容易调到一个不错的水平。
SVR(非线性核)为什么表现最差?报告中的SVR(推测是RBF核)R²仅0.272,严重欠拟合或参数设置不当。可能原因:
- 参数未调优:SVR的性能极度依赖超参数。如果没有进行细致的网格搜索,默认参数在金融数据上很容易失败。
- 特征未标准化:这是新手常犯的错误。SVR基于距离计算,如果特征量纲不一(如价格几千点,收益率零点几),模型会被大数值特征完全主导。
- 样本量相对不足:SVR在样本量非常大时才能充分发挥其优势。在有限的数据窗口内,其表现可能不稳定。
kNN和Linear SVR的表现说明了什么?kNN(R²=0.834)和Linear SVR(R²=0.806)表现尚可,但不如随机森林。这说明:
- 市场对关税的反应存在较强的局部模式(kNN有效),也存在一定的线性成分(Linear SVR有效)。
- 但最全面的信息,还是需要通过能够建模复杂非线性+特征交互的集成模型(随机森林)来获取。
避坑指南:模型评估的视觉化永远不要只看数字指标。一定要绘制预测值 vs 真实值的时序对比图。好的模型,其预测曲线应该紧密围绕真实曲线波动,尤其是在关税事件点(2025年4月初)附近,预测曲线应该能捕捉到那个向下的“尖峰”。如果模型预测的曲线是一条平滑的直线,哪怕R²不低,也说明它完全错过了关键的事件响应,是失败的。
5. 从研究到部署:实操建议与进阶思考
做完回测和比较,如果想把模型用起来,或者做更深入的研究,还有以下几点需要考虑:
- 模型集成:既然不同模型各有优势,可以考虑集成学习。例如,用随机森林、梯度提升树(如XGBoost、LightGBM)和SVR进行投票或加权平均集成。这往往能获得比单一模型更稳定、更强大的预测性能。
- 在线学习与模型更新:市场在变,模型不能一成不变。对于线性模型、SVR,可以定期(如每月)用新数据重新训练。对于随机森林和kNN,可以考虑在线学习算法,或者定期增量更新模型。核心是建立一个模型性能监控和重训练的管道(Pipeline)。
- 预测的不确定性:点预测(一个具体数值)很重要,但知道预测的置信区间更重要。随机森林可以通过计算树之间的预测方差来估计不确定性。对于高风险决策,必须将“预测值±不确定性”一并输出。
- 从预测到策略:预测股价或收益率只是第一步。如何将预测信号转化为交易策略(例如,当预测明日收益率为负且置信度高时做空),涉及仓位管理、止损止盈、交易成本等一系列问题,那又是另一个庞大的课题了。
最后,这个项目清晰地展示了一点:在面对由具体宏观事件(如关税)驱动的市场波动预测时,能够灵活捕捉非线性关系和复杂交互的机器学习模型(如随机森林)具有显著优势。它不仅仅是一个更准确的“预测黑箱”,其提供的特征重要性分析,还能帮助我们定量理解哪些因素(是关税事件本身、美国市场联动,还是历史波动率)在驱动预测,为基本面分析提供了数据支撑。把机器学习的预测能力,与对市场机制的深刻理解结合起来,才是量化研究走向实战的关键。