
金融市场机器学习入门
用于交易的监督学习、无监督学习与强化学习
在真实世界里赚到 $0 的那次回测
2018 年,一支量化团队向他们的基金展示了一个模型,它在回测中把 $100,000 变成了 $420 万。资金曲线几乎是一条完美的 45 度直线。夏普比率高达 4.0——比历史上几乎任何对冲基金都好。他们用真金白银把它上线了。
第一周就亏钱,接着失血了三个月,他们才把它关掉。那个在纸面上「赚」了 $420 万的模型,在现实里一分钱都没赚到。没有任何造假——没有欺诈,没有 bug。这个模型只是记住了过去,而没有学到任何关于未来的东西。
这个故事重复得如此频繁,以至于有了专门的名字:回测过拟合(backtest overfitting),它是机器学习基金失败的头号原因。Marcos López de Prado——管理过数十亿美元 ML 驱动策略的人——直言不讳地说:只要尝试的次数足够多,任何人都能在纯噪声上做出一条漂亮的回测曲线。市场才不在乎你的神经网络有多优雅。
机器学习确实正在改变市场的交易方式。但一个看起来很出色的模型,和一个在真实市场中存活下来的模型之间,差距是巨大的——而学会分辨二者,才是这场游戏的全部。本课会同时教你两件事:如何构建能找到真实优势的 ML 系统,以及如何避开那些专门坑害「跳过下半场」的人的陷阱。
什么是机器学习——以及为什么市场是最难的场景
机器学习是一门让计算机从数据中学习模式、而无需为每种场景显式编程的科学。你不必写一条像「当 RSI 跌破 30 时买入」这样的规则,而是把成千上万个历史样本喂给算法,让它自己发现哪些模式会先于盈利的交易出现。机器从经验中归纳——这正像一位资深交易员逐渐培养出直觉,只不过它处理的数据量远超任何人脑所能容纳的。
金融市场生成的数据量惊人:价格 tick、订单簿快照、资金费率、链上资金流、情绪评分、宏观数据发布。传统的基于规则的策略,只能捕捉其创建者已经想象到的那些关系。ML 模型则能一次性检测数百个特征之间的非线性、高维交互——这些关系是人类分析师压根想不到去验证的。
但在所有应用 ML 的领域里,市场是最恶劣的环境,我们值得诚实地说清原因。大多数 ML 突破——图像识别、语言模型——之所以有效,是因为底层规则不会变。无论照片拍摄于 2010 年还是 2026 年,猫看起来都是猫。市场恰恰相反:
- 数据是非平稳的。随着市场状态(regime)切换,市场的统计「规则」在不断变化。一个在平静牛市上训练出来的模型,在崩盘时可能反而很危险。
- 信噪比极其残酷。在图像识别中,几乎每个像素都携带信息。而在收益率里,绝大部分价格波动都是噪声。你是在一片轰鸣的随机性汪洋里,淘洗一丝微弱的信号。
- 你在与会适应的对手博弈。猫不会为了骗过你的分类器而改变自己的外观。但一旦某个真实的市场优势变得流行,其他交易员就会通过套利把它抹平。你模型的成功,会悄悄侵蚀掉它自己的优势。
好消息是:门槛已经不再是数据或算力的获取。像 GaiaEx 这样的平台提供 API,可访问 Hyperliquid L1 上的实时与历史市场数据,因此任何开发者都能采集到 ML 所需的数据集。剩下的门槛是知识——而这正是本课所要提供的。
三大范式:监督学习、无监督学习与强化学习
机器学习不是单一一种技术——它是一族方法,各自适用于不同的问题。在金融领域,三大主要范式都有真实的应用。
监督学习是主力。你给模型带标签的样本:历史特征向量(输入)与已知结果(目标)配成对,模型从中学习一种由输入到输出的映射。在金融应用中,有两个子类型占据主导:
- 分类(Classification)——预测一个类别。该资产在接下来一小时里会涨还是会跌?这笔交易是否为欺诈?输出是一个离散标签,通常还附带一个概率。
- 回归(Regression)——预测一个连续值。1 小时的收益率会是多少?公允的资金费率是多少?输出是一个数字,模型要最小化预测误差。
无监督学习在没有标签的数据中寻找结构。像 K-Means 这样的聚类算法,可以在你事先不定义这些状态的情况下,把交易日分组为不同的市场状态——趋势、均值回归、高波动。像 PCA 这样的降维方法,可以把数百个相关特征压缩成少数几个独立因子——当你的特征集比样本深度还要宽时,这一点尤为重要。
强化学习(RL)训练一个智能体,通过最大化累积奖励来做出一系列决策。智能体与一个环境(市场)交互,采取行动(买、卖、持有),并接收反馈(盈利或亏损)。RL 在投资组合配置和订单执行上很有吸引力,因为在这些场景中,最优行动取决于你当前的持仓、交易成本和市场冲击。DeepMind 的游戏对弈智能体激发了一波金融 RL 研究热潮——但实际成果依旧好坏参半,恰恰是因为市场是非平稳的,而这场「游戏」会在中途不断改变自己的规则。
特征工程:把原始数据变成有预测力的信号
在机器学习中,特征(features)是模型用来做预测的输入变量。原始 OHLCV 数据只是个起点,但把原始价格直接喂给模型,就像把生小麦而不是面粉递给厨师——你得先把它加工一遍。特征工程是领域专长与数据科学交汇的地方,而它决定一个模型是能用还是没用的程度,远比算法的选择更高。
金融 ML 常见的特征类别包括:
- 技术指标——RSI、MACD、布林带宽度、ATR、ADX。它们把动量、波动率和趋势强度编码为标准化、与尺度无关的输入。
- 滞后特征(lag features)——多个周期上的历史收益率(1 根、5 根、20 根、60 根 K 线),在不同时间尺度上捕捉动量与均值回归。
- 波动率度量——滚动标准差、Parkinson 波动率(基于最高/最低价)、Garman-Klass 估计量。波动率聚集是全部金融领域里最可靠的程式化事实之一。
- 成交量特征——成交量比率(当前 vs. 均值)、能量潮(OBV)、量价相关性。异常的成交量经常先于价格变动出现。
- 跨资产特征——在预测 ETH 时,把 BTC 的收益率作为输入。资产之间不断变化的相关性,常常会比价格更早地发出市场状态切换的信号。
下面是一个用 Python 做特征工程的实用例子:
import pandas as pd
import numpy as np
def engineer_features(df: pd.DataFrame) -> pd.DataFrame:
df["return_1h"] = df["close"].pct_change(1)
df["return_4h"] = df["close"].pct_change(4)
df["return_24h"] = df["close"].pct_change(24)
df["volatility_24h"] = df["return_1h"].rolling(24).std()
df["rsi_14"] = compute_rsi(df["close"], 14)
df["volume_ratio"] = df["volume"] / df["volume"].rolling(24).mean()
df["atr_14"] = compute_atr(df, 14)
return df.dropna()
有两条规则不容妥协。第一,绝不使用未来数据——每个特征都必须能仅凭预测时刻已有的信息计算出来。「发现」一个盈利策略最常见的方式,就是不小心让明天的数字泄漏进了今天的特征里。第二,对输入做归一化;当特征跨越天差地别的量级时(一个 60,000 的价格旁边放着一个 30 的 RSI),大多数 ML 模型都会卡壳。
最重要的一节:在时间序列上做验证
如果你只想从整节课里记住一件事,那就记住这条:标准的 ML 验证方法,用在金融市场上是灾难性地错误的。
在常规的机器学习中,你会把数据随机打乱,再切分成训练集和测试集。但如果你对时间序列价格数据这么做,你就等于让模型用未来去训练,来预测过去。你的准确率会看起来惊人。而你的实盘交易会是一场屠杀。这个唯一的错误——被称为前视偏差(look-ahead bias)——比任何市场崩盘都炸毁了更多量化策略。正确的做法永远尊重时间之箭:
按时间顺序的训练/验证/测试切分。按日期划分数据:在 2020–2022 上训练,在 2023 上验证,在 2024 上测试。测试集只能被碰一次——它是你对实盘交易的模拟。一旦你对着它去调超参数,它就不再是测试集,你也就失去了对样本外表现的任何诚实估计。
步进式验证(walk-forward validation)(扩展窗口或滑动窗口)更稳健。在第 1–12 个月上训练,预测第 13 个月。然后在第 1–13 个月(或第 2–13 个月)上训练,预测第 14 个月。如此重复。这会生成许多样本外预测,每一次都基于模型从未见过的数据,同时还能适应不断演变的市场条件——它精确地模拟了策略实际部署和再训练的方式。
清洗交叉验证(purged cross-validation)(由 Marcos López de Prado 提出)在训练折与测试折之间加入一个间隔,以阻止信息通过重叠的标签泄漏。如果你的目标是 24 小时的前向收益率,那么折边界附近的观测就会共享信息;清洗间隔(purge gap)能去除这种污染。在测试折之后再加一段「禁运期(embargo)」,可以防止序列相关性回渗进训练数据。
最后,用对钱有意义、而非对教科书有意义的指标来评判模型。单看准确率会误导人。一个准确率只有 51%、但在大行情上判断正确的模型,可能极其赚钱;而一个准确率 70%、却只押对小波动的模型,扣除手续费后可能是亏的。要追踪你方向判断的精确率(precision)、由此产生的策略的夏普比率,以及最大回撤——并且始终要扣除现实的交易成本和滑点之后再看。
随机森林、梯度提升,以及如何选对模型
对于表格型金融数据——也就是你从 OHLCV K 线、技术指标和工程化特征中得到的那种数据——基于树的集成模型始终优于深度神经网络。这不是一种观点,而是一个被充分确立的实证结果(参见 Grinsztajn 等人,2022,《Why do tree-based models still outperform deep learning on tabular data?》)。对于图像和语言,深度学习称王。而对于一张特征表,树模型获胜。
随机森林(Random Forests)会构建数百棵决策树,每棵都在行和特征的随机子集上训练,然后对它们的预测取平均。这种平均能降低方差和过拟合。它们很稳健,几乎不需要调参,还能直接给你一份内置的特征重要性排名——这对于理解到底是什么在驱动你的模型来说,价值连城。
梯度提升(Gradient Boosting)(XGBoost、LightGBM、CatBoost)按顺序逐棵构建决策树,每一棵都去纠正到目前为止整个集成的错误。它在准确率上通常胜过随机森林,但要求更仔细的调参。LightGBM 是大多数金融 ML 从业者的默认选择:训练快、原生处理缺失值,并且能轻松扩展到数百万行数据。
import lightgbm as lgb
from sklearn.model_selection import TimeSeriesSplit
model = lgb.LGBMClassifier(
n_estimators=500,
max_depth=6,
learning_rate=0.05,
subsample=0.8,
colsample_bytree=0.8,
min_child_samples=50,
)
tscv = TimeSeriesSplit(n_splits=5)
for train_idx, val_idx in tscv.split(X):
model.fit(X.iloc[train_idx], y.iloc[train_idx],
eval_set=[(X.iloc[val_idx], y.iloc[val_idx])])
深度学习仍有它的用武之地——但范围很窄。LSTM 和 Transformer 在原始序列数据上确实能创造价值:逐 tick 的订单流,或是把价格与新闻文本和社交媒体情绪融合起来——在这些场景里,顺序和上下文携带着扁平表格会丢弃的信息。只是别把它们当成默认选项。对于带有工程化特征的结构化数据,一个调好的、用从 GaiaEx API 拉取的数据训练的 LightGBM,几乎总能击败一个神经网络——而且它的训练只需几秒,而不是几个小时。
ML 在加密领域真正发挥价值的地方
价格预测吸引了所有的关注,但它恰恰是 ML 在市场中最难、最不可靠的用途。一些最有价值的应用,跟预测下一根 K 线毫无关系:
- 市场状态检测。无监督聚类把市场状况归类为不同状态——平静趋势、震荡均值回归、高波动恐慌。知道你身处哪种状态,能让你切换策略或减小仓位,而这往往比任何单一的方向预测都更值钱。
- 情绪分析。大语言模型能以人类无法企及的规模阅读新闻、X/Twitter 和 Discord,给市场情绪的变化打分。研究一致表明,把情绪信号与价格数据融合,能在仅用价格的基础上提升加密预测的准确率——情绪对加密的影响异常之大。
- 欺诈与操纵检测。这是 ML 默默发光的地方。模型通过识别那些先于协同抛售出现的异常成交量和订单簿模式,来标记对敲刷量、幌骗,以及经典的拉高出货骗局。异常检测模型(LSTM、Anomaly Transformer)在这里可靠地击败了经典 ML 和简单的统计阈值。
- 执行与滑点建模。ML 能预测一笔大单的市场冲击,帮助执行算法把它切分开来,从而最小化成本。在像加密这样 24/7 的交易场所,一笔笨拙的订单会把盘口推向对你不利的方向,而这能直接保护你的最终收益。
- 风险与强平管理。模型能在给定当前波动率的情况下,估计某个头寸突破风险阈值的概率,从而在级联爆仓之前而非之后帮你确定仓位大小、设置止损。
为什么大多数 ML 策略会失败——以及它教会你什么
诚实的教育意味着点明这件事是如何出错的,因为它通常都会出错。这些陷阱所摧毁的量化策略,比所有熊市加起来还要多:
- 过拟合。模型记住了训练数据,而不是学到任何可泛化的东西。解药是纪律,而不是小聪明:更简单的模型、更少的特征、正则化,以及无情的样本外测试。如果你的回测好得不像真的,那它就不是真的。
- 前视偏差。使用了决策时点尚不可得的信息——在切分前就在整个数据集上计算特征、使用了事后被修正过的价格,或者(比任何人愿意承认的都更常见)把目标变量留在了特征集里。
- 幸存者偏差。只在今天仍然存在的资产上训练。被下架的代币、卷款跑路的项目和死掉的币,都在你的数据集里悄无声息地缺席了,这会让每一个结果都向上偏移。在加密领域这一点尤为严重——成千上万的代币都归了零。
- 非平稳性。市场的分布会变。一个在 2021 年牛市上训练的模型,会在 2022 年熊市中失效,因为它学到的那套规则不再成立。你必须定期重新训练并监控分布漂移,而不是「设好就忘」。
- 多重检验陷阱。尝试 1,000 种策略变体,纯靠运气总会有几个看起来很出色。那个「$420 万」的回测就是这么来的。缩减夏普比率(Deflated Sharpe Ratio)之类的工具之所以存在,就是专门用来折算那些你只是「搜得够狠」才找到的表现。
- 研究到生产的鸿沟。回测假设无摩擦、即时成交。而真实市场会施加滑点、手续费、延迟和市场冲击,这些通常会从理论收益里削掉 30–70%——并且能把一个「盈利」的策略翻成负的。
这份清单里藏着一个更深的要点。市场是一个对抗性的、会适应的系统——每一个真实的优势都会吸引竞争者,他们会通过套利把它抹平。一个赢了一年的模型,可能就在它变得拥挤的那个月停止有效,而这并不是它代码的错。这就是为什么成功的量化机构不会去寻找一个完美的模型;他们构建的是一条流水线,随着市场演变,不断地寻找、验证并淘汰各种优势。
在 GaiaEx 上构建:你的第一个端到端项目
你读到的每一项量化技能,都首先依赖于一件事:干净、可靠的数据。这正是 GaiaEx 在你 ML 工作流中的位置。因为交易在 Hyperliquid L1 上执行,每一次成交、每一笔资金费率、每一次订单簿变动都被记录在链上,并通过 GaiaEx API 暴露出来——给你提供透明、细粒度、实时和历史的数据,而没有许多中心化数据源所固有的缺口和无声修正。
为什么链上数据对 ML 很重要:一个模型的诚实程度,不会超过它的输入。当你的训练数据来自一条透明的 L1,而不是一个黑箱式的内部数据库时,你就能信任:你正在学习的价格和成交量,就是真实成交的价格和成交量。这能在一整类微妙的数据完整性 bug 触及你的特征之前,就把它们消除掉。
你的第一个项目应该刻意保持简单。目标不是在第一次尝试就跑赢市场——而是要构建一条完整、无泄漏、可以反复迭代的流水线。这里有一份具体的路线图:
- 从 GaiaEx API 采集 BTC/USDC 的 1 小时 K 线数据——至少 6 个月。
- 工程化 10–15 个特征:滞后收益率、RSI、ATR、成交量比率、布林带宽度。
- 给每根 K 线打标签:如果接下来 4 小时的收益率为正,标 1,否则标 0。
- 用步进式验证训练一个 LightGBM 分类器——绝不要用随机切分。
- 评估精确率、召回率,以及一个简单策略的夏普比率——该策略在模型预测为 1 时做多,并且要在扣除现实手续费之后计算。
然后——这正是初学者会跳过的部分——试着去把它弄坏。加上一个清洗间隔,看看你的优势是否还能存活。检查是否有任何特征在偷偷泄漏未来。在一段不同的时间窗口上测试它。如果优势在严格审视下蒸发了,那你学到了真正有价值的东西:它从来就不是真的,而你是免费发现的,而不是用你的本金发现的。


