虽然生成式 AI 可用于创作巧妙的诗歌、酷炫的图像和柔和的声音,但仔细观察这些令人印象深刻的内容生成器背后的技术可以揭示概率学习者、压缩工具和序列建模者。当应用于量化金融时,这些方法可以帮助解开和学习金融市场中的复杂关联。
市场场景对于风险管理、策略回测、投资组合优化和监管合规性至关重要。这些假设数据模型代表了潜在的未来市场状况,有助于金融机构模拟和评估结果,并做出明智的投资决策。
具体方法可以证明您在各个领域的熟练程度,例如:
- 使用变分自编码器或降噪扩散模型生成数据
- 使用基于Transformer的生成模型对具有复杂依赖关系的序列进行建模
- 使用状态空间模型理解和预测时间序列动态
虽然这些方法可以以不同的方式运行,但也可以组合使用,以产生强大结果。
本文将探讨变分自动编码器 (VAE)、降噪扩散模型 (DDM) 和其他生成工具如何与大型语言模型 (LLM) 集成,以高效创建具有所需属性的市场场景。本文将介绍由 NVIDIA NIM 提供支持的场景生成参考架构,NVIDIA NIM 是一系列旨在加速生成模型部署的微服务,以便高效地创建具有所需属性的市场场景。
一个工具集,多个应用
生成式 AI 为以前通过不同方法解决的各种量化金融问题提供了一个统一框架。经过训练的模型可以学习其输入数据的分布,然后作为各种任务的基础模型。
例如,它可以生成用于创建模拟或风险场景的样本。它还可以确定哪些样本不分布,作为异常值检测器或压力场景生成器。当市场数据在不同频率下移动时,横断面市场快照存在差距。生成式模型可以以合理的方式提供与实际数据匹配的缺失数据,从而有助于即时预报模型或处理非流动点。最后,自回归下一个令牌预测和状态空间模型可以帮助预测。
对于利用此类生成式模型的领域专家而言,一个重大瓶颈是缺乏平台支持,无法将他们的想法和意图与部署这些模型所需的复杂基础设施联系起来。虽然 LLM 已在金融等各行各业中获得主流使用,但它们主要用于知识处理任务(如问答和总结)或编码任务(如生成代码存根以供人类开发者进一步增强),以及集成到专有库中。
将 LLM 与复杂模型集成可以弥合量化专家与生成式 AI 模型之间的沟通差距,如下所述。
市场场景生成
传统上,市场场景的生成依赖于多种技术,包括专家规范(‘将美国收益曲线向上移动 bp in parallel’)、因子分解(‘沿第一个 PCA 方向移动 bp 以调整欧元交换曲线’)以及方差协方差或引导等统计方法。虽然这些技术有助于生成新的场景,但它们缺乏对基础数据分布的完整了解,通常需要手动调整。隐式学习数据分布的生成方法能够轻松克服这一建模瓶颈。
LLM 可以通过强大的方式与场景生成模型相结合,以实现简化的交互,同时充当市场数据探索的自然语言用户界面。例如,如果市场行为与之前的事件(例如重大的金融危机、上次的美国选举、闪存崩溃或互联网泡沫破灭)中的行为类似,交易员可能希望评估其书籍的曝光率。根据此类事件的记录知识训练的 LLM 可以根据此类事件或历史时期找到并提取感兴趣的特征,并将其传递给生成式市场模型,以创建类似的市场条件,以便在下游应用程序中使用。
图 1 展示了生成市场场景的参考架构,将用户规格与合适的生成工具关联起来。’Sample Implementation’ 部分显示了由 NVIDIA NIM 提供支持的实现示例代码。
该过程从用户指令开始;例如,请求模拟类似于‘处于金融危机峰值’的利率环境。代理(或代理集合)首先将其路由到由LLM提供支持的解释器来处理此请求,该解释器会解释自然语言请求并将其转换为中间格式(在本例中,是JSON文件)。
然后,LLM 将‘金融危机峰值’转换为具体的历史时期(2008 年 9 月 15 日至 10 月 15 日),并将感兴趣的市场对象(例如美国掉期曲线和掉期波动表面)映射到各自的预训练生成模型(VAE、DDM 等)。可以通过数据检索器组件检索有关历史兴趣期的信息,并将其传递到相应的生成工具以生成类似的市场数据。
生成过程需要在根据市场数据预训练的生成模型上运行推理。图 2 和图 3 展示了使用对应于新冠肺炎(COVID-19)疫情开始的 VAE 模型生成的产量曲线场景示例。
表 1 展示了其他市场场景请求以及相应的 JSON 输出。在这种情况下,用户查询指示要用于说明目的的模型。在生产环境中,路由代理可以自动选择正确的模型。
查询 | 答案 | 模型和注释 |
‘使用 VAE 模型,输出的收益率曲线与 2020 年下半年相似。’ | {“scenarios”: [ { “method”: “VAE”, “object_type”: “yield curve”, “period”: { “start_date”: “2020-07-01”, “end_date”: “2020-12-31”} } ]} |
Llama3-70b-instruct 正确地找到 2020 年的下半年。 |
生成类似于post-COVID一年的产量曲线。 | {“scenarios”: [ { “method”: “VAE”, “object_type”: “yield curve”, “period”: { “start_date”: “2020-03-01”, “end_date”: “2022-12-31”} } ]} |
Llama3-70b-instruct 正确地选择‘VAE’作为默认方法,并识别新冠肺炎(COVID)后的时期。 |
使用 DDPM 生成 2024 年第一季度类似的隐含体积表面。 | {“scenarios”: [ { “method”: “DDPM”, “object_type”: “implied vol surfaces”, “period”: { “start_date”: “2024-01-01”, “end_date”: “2024-03-31”} } ]} |
mixtral-8x22b-instruct-v0.1 的正确日期为 2024 年的第一季度。 |
生成类似于 Flash Crash 两周周期的收益曲线。 | {“scenarios”: [ { “method”: “VAE”, “object_type”: “yield curve”, “period”: { “start_date”: “2010-04-30”, “end_date”: “2010-05-13”} } ]} |
Llama3-70b-instruct 正确地将 Flash Crash 日期定在 2010 年 5 月 6 日,约在其前后 2 周内。 |
模拟去年相似的通货膨胀曲线。 | {“scenarios”: [ { “method”: “VAE”, “object_type”: “inflation curve”, “period”: { “start_date”: “2022-01-01”, “end_date”: “2022-12-31”} } ]} |
Llama3-70b-instruct 注意:模型的知识截止日期是什么?从 NVIDIA 目录中的模型卡中找出答案。在这种情况下,是 2023 年 3 月,所以此模型的‘去年’是 2022 年。 |
模拟金融危机高峰时的收益曲线和swaption vol surfaces. | {“scenarios”: [ { “method”: “VAE”, “object_type”: “yield curve”, “period”: { “start_date”: “2008-09-15”, “end_date”: “2008-10-15”} }, { “method”: “VAE”, “object_type”: “swaption volatility surface”, “period”: { “start_date”: “2008-09-15”, “end_date”: “2008-10-15” }}]} |
meta/Llama3-70b-instruct 正确识别两种类型的市场对象,以及2008年9月15日Lehman Brothers崩溃后的金融危机峰值。 |
使用生成模型进行市场结构分析
金融市场本质上是复杂的,其特征是杂的高维数据,通常被视为多元时间序列。检测导致大规模财务收益的瞬息万变的模式需要智能建模和大量计算。
降低维度的一种方法是考虑数据中存在的内部结构:曲线、曲面和更高维的结构。这些结构传递的信息可以用于降低复杂性。它们还可以被视为要通过生成模型的潜在空间嵌入和分析的信息单元。在本节中,我们将回顾如何在此上下文中使用 VAE 和 DDM 的示例。
VAE 用于学习市场曲线的分布
可以将债券收益、掉期、通货紧缩和汇率视为具有一维术语结构,例如零息、即期、远期或基础曲线。同样,期权波动可视为 2D 或更高维空间中的(超)表面。一个典型的掉期曲线可能有多达 50 个张量。我们无需研究 50 个相应的时间序列如何相互关联,而是可以考虑掉期曲线的单个时间序列,并使用 VAE 来了解这些对象的分布情况,详情请参阅’Multiresolution Signal Processing of Financial Market Objects‘。
这种方法的优势在于能够集成先前隔离的数据:传统上按货币(例如USD、EUR、BRL)或任务(例如场景生成、即时预报、异常检测)单独建模的市场对象行为现在可以集成到反映市场互联性的单个生成模型的训练中。
图 4 展示了 VAE 在收益曲线等市场数据对象上的训练循环:编码器将输入对象压缩到具有高斯分布的隐空间中,解码器从该空间中的点重建曲线。隐空间是连续的、显式的,通常是较低维的,因此导航非常直观。不同货币或市场机制的曲线聚集在不同的区域,允许模型在这些集群内或之间导航,以根据所需的市场特征无条件或有条件地生成新曲线。
特别是,生成过程可以根据特定的历史周期来生成形状可能与历史周期相似的曲线,而不是精确的副本。例如,与新冠肺炎(COVID-19)大流行开始对应的美国库存收益曲线在图 2(左)中显示为 VAE 的 3D 隐空间中的圆,该 VAE 已根据收益曲线数据进行训练。由于 VAE 隐空间是连续的,它们自然会将自己呈现给定义兴趣点周围的邻域,并从这些邻域进行采样,以生成与历史相似(但不相同)的新型收益曲线场景,如图 2(右)中显示为三角形。
图 5 展示了用于训练 VAE 模型的更完整的收益曲线,以及按速率水平分组的聚类,以及对应于在美国财政部市场关闭时错误包含数据点的离群值(Good Friday,2017)。人们可以轻松想象场景生成之外的其他应用,包括非线性因子分解、异常检测等。
用于学习波动性表面的 DDM
DDM 通过可逆扩散的棱镜接近生成过程。如图 6 所示,它们的运作方式是逐步向数据中引入噪声,直到数据成为标准高斯。然后,它们学习反向此过程,从纯噪声开始生成新的数据样本。在前向通道中逐渐添加噪声,直到所得对象与高斯噪声无区别。在后向通道中,模型会学习重建原始表面所需的降噪。如果您想了解更多信息,请参阅生成式 AI 研究聚焦:揭秘基于扩散的模型。
为了了解隐含挥发性表面的分布情况,我们探索了 DDM (具体来说是 DDPM,或降噪扩散概率模型) 的能力。本示例使用由大约 20000 个挥发性表面组成的合成数据集,该表面由’Managing Smile Risk‘ 中描述的 SABR (随机 Alpha-beta-rho) 随机挥发性模型生成 (受初始条件 和 的限制)。
输入表面示例如图 7 所示。
我们的目标是评估此类模型恢复输入数据分布(在本例中为 SABR 分布)的能力。如果经验表面直接来自期权市场价格,则分布未知,并且拥有能够以非参数方式捕获分布的工具,可以为没有足够自由度来表示数据的稀疏参数模型提供宝贵的替代方案。然后,它可以用于生成波动表面场景,或以合理的方式填充缺失区域。
针对这项工作,我们调整了此架构的简化版本。输入是 隐含的挥发性网格,对应于各种期权货币对和到期时间对。其他类型的输入,例如挥发性立方体(moneyness-maturity-underlying)或其他变体,也可以以类似的方式处理。
图 8 展示了在波动面输入上训练 DDPM 模型的几个步骤。
图 9 显示了两个合成生成的表面,这些表面随后与 SABR 模型进行了匹配,以验证其形状是否与 SABR 相似。绿点表示与生成的表面匹配的 SABR 表面,以验证 DDPM 模型是否学习了类似于 SABR 的形状。
示例实现
本节展示了使用 NVIDIA 托管的 NIM 端点(包括 Llama 3.1 70B Instruct LLM)构建图 1 中参考架构的 LLMQueryInterpreter
组件的示例。请注意,许多其他 NVIDIA 以及开源 LLM 也可以通过 NIM 使用,包括 Nemotron、Mixtral、Gemma 等。通过 NIM 访问这些 LLM 可确保它们针对 NVIDIA 加速基础设施上的推理进行了优化,并提供了一种快速轻松的方法来比较多个模型的响应。
import openai
import os
from langchain_nvidia_ai_endpoints import ChatNVIDIA
# NVIDIA API configuration
NVIDIA_API_KEY = os.environ.get("NVIDIA_API_KEY") # click “Get API Key” at https://www.nvidia.com/en-us/ai/
if not NVIDIA_API_KEY:
raise ValueError("NVIDIA_API_KEY environment variable is not set")
NVIDIA_BASE_URL = "https://integrate.api.nvidia.com/v1"
client = openai.OpenAI(base_url=NVIDIA_BASE_URL, api_key=NVIDIA_API_KEY)
class LLMQueryInterpreter:
""" NVIDIA NIM-powered class that processes scenario requests from user."""
def __init__(self, llm_name="meta/llama-3.1-70b-instruct", temperature=0):
self._llm = ChatNVIDIA(model=llm_name, temperature=temperature)
# define output JSON format
self._scenario_template = """
{"scenarios": [
{
"method": <generative method name, e.g., "VAE">,
"object_type": <object type, e.g., "yield curve">,
"period": {
"start_date": <start date of event>,
"end_date" : <end date of event>
}
},
{
"method": <generative method name, e.g., "DDPM">,
"object_type": <object type, e.g., "volatility surface">,
"period": {
"start_date": <start date of event>,
"end_date" : <end date of event>
}
},
// Additional scenarios, as needed
] }
"""
# instructions for the LLM
self._prompt_template = """"
Your task is to generate a single, high-quality response in JSON format. \
Format the output according to the following template: {scenario_template}. \
Offer a refined, accurate, and comprehensive reply to the instruction. \
Every query has a structure of this form: \
"Use <method> to generate <market_object_type> similar to <period>". \
Valid methods are "VAE" or "DDPM"; use "VAE" by default, if no method is specified.\
If a different method is requested, return "invalid" as the method type. \
Answer the following query without any additional explanations, return only a JSON output:
{query}
"""
def process_query(self, query):
# query = "Using a VAE model, output yield curves similar to those in the second half of 2020"
llm_request = self._prompt_template.format(**{ "query": query, "scenario_template": self._scenario_template })
llm_answer = self._llm.invoke(llm_request)
return llm_answer.content
# Example usage
query = "Using a VAE model, output yield curves similar to the Flash Crash"
llm = LLMQueryInterpreter()
print(llm.process_query(query))
# Output
{
"scenarios": [
{
"method": "VAE",
"object_type": "yield curve",
"period": {
"start_date": "2010-05-06",
"end_date": "2010-05-06"
}
}
]
}
结束语
Quant、交易员和投资专业人士越来越多地与 AI 工具合作,使用它们进行建模和探索,这让人兴奋不已。这些先进工具的集成增强了金融建模和市场探索,有望推动市场参与者的能力和见解的发展。它们可以以创新的方式进行组合,并使用 NVIDIA NIM 轻松提供服务。