25 年市场经验写进了一个 Python 工具包,但高盛并没有把整套定价后台“打包送出”。弄清楚了边界,才是理解 gs-quant 的第一步。
很多人第一次看到 gs-quant,会理解成“开源版高盛定价系统”。这个说法很抓眼球,却不够准确。
开源的是 Python 客户端、金融产品的数据模型、时间序列工具、回测框架,以及连接高盛服务的接口层;大量专业定价、风险计算、市场数据和组合服务仍运行在高盛后端,并受机构账户权限控制。
所以,gs-quant 的真正价值不是让任何人在本地复刻一家投行,而是把机构级量化工作流拆成一组可以阅读、调用和扩展的 Python 对象。
读完这篇,会弄清四件事:
●哪些能力安装后就能用,哪些必须有高盛机构权限;
●一笔互换或期权,如何从“合同条款”变成价格和风险;
●PricingContext、Portfolio、HistoricalPricingContext 分别解决什么问题;
●gs-quant 的回测为何不只是“拿历史价格跑一个循环”。
先说结论:开放了什么,没有开放什么
官方把 GS Quant 定义为一个量化金融 Python 工具包。项目由高盛 Quant 团队维护,建立在其风险转移平台之上,背后沉淀了超过 25 年的全球市场经验。
需要拆成三层理解。
第一层:开源代码。
gs_quant 仓库采用 Apache-2.0 许可证。产品对象、会话管理、时间序列函数、部分统计模型、回测框架、结果类型和大量示例都能直接阅读。
第二层:受权限控制的服务。
衍生品定价、风险计算、部分数据集、证券主数据和组合分析,需要通过 GsSession 访问高盛 API。API 凭证主要面向高盛机构客户,并且具体能力还取决于应用的 scopes 和账户 entitlements。
第三层:没有随代码开源的后台。
市场数据、生产级定价服务、模型校准流程和机构权限体系并不包含在仓库里。拿到源码,不等于拿到高盛的完整模型、数据和计算集群。
一句话概括:
gs-quant 开放了“怎样描述问题、怎样发起计算、怎样组织结果”的 Python 工作流;许多最重的计算和数据能力,仍由远端服务提供。

GS Quant 开源代码与机构服务的边界
理解这个产品边界之后,安装和使用都会清楚很多。
安装:五分钟跑起来,先把环境隔离好
要求 Python 3.10 及以上。新项目直接使用 Python 3.10、3.11 或 3.12 更稳妥。
先创建独立虚拟环境:
●●●bash python3.11 -m venv .venv
source .venv/bin/activate
python -m pip install --upgrade pip
普通使用者直接从 PyPI 安装:
●●●bash pip install gs-quant
如果要运行 Notebook:
●●●bash pip install "gs-quant[notebook]"
如果准备阅读源码、改代码:
●●●bash git clone https://github.com/goldmansachs/gs-quant.git
cd gs-quant
pip install -e ".[develop]"
这里的 -e 是 editable install。修改本地源码后,不必每次重新打包安装,Python 会直接加载当前工作目录里的版本。
安装完成后做一个最小检查:
●●●bash python -c "import gs_quant; print(gs_quant.__version__)"
能输出版本号,说明 Python 包已经可用。此时还没有登录高盛服务,因此本地时间序列函数、对象构造和源码阅读可以继续;需要数据或定价 API 的代码,则会停在认证与权限这一关。
从一笔利率互换看懂 gs-quant
理解 gs-quant,不必先看完整模块列表。先看一笔最常见的固定利率对浮动利率互换。
●●●python from gs_quant.common import Currency, PayReceive
from gs_quant.instrument import IRSwap
swap = IRSwap(
PayReceive.Pay,
"10y",
Currency.USD,
fixed_rate="atm+25",
notional_amount=10_000_000
)
这几行代码不是在计算,而是在写一张电子化交易条款单:
●PayReceive.Pay:支付固定利率、收取浮动利率;
●"10y":合约期限 10 年;
●Currency.USD:名义本金以美元计;
●fixed_rate="atm+25":固定利率设为平价互换利率再加 25 个基点;
●notional_amount=10_000_000:名义本金 1,000 万美元。
这里的“名义本金”通常只是计算利息的基准,不代表双方一开始真的交换 1,000 万美元。
“基点”是利率市场常用单位:
1 bp = 0.01%,25 bp = 0.25%。
如果当时 10 年期平价互换利率是 4.00%,那么 atm+25 大致对应 4.25%。之所以写相对值,而不是直接写死 4.25%,是因为交易条款经常需要跟随估值日和市场惯例动态解析。
resolve():把交易员语言翻译成完整合同
●●●python swap.resolve()
print(swap.as_dict())
resolve() 会根据估值日、币种和市场惯例,把 "10y"、"atm+25" 这类相对描述转换成更完整的绝对条款,例如:
●实际起息日和到期日;
●固定端与浮动端的付息频率;
●计息天数规则;
●节假日日历和工作日调整;
●具体固定利率。
很像把“我要做一笔 10 年美元互换,票息比市场高 25 bp”翻译成法务、运营和定价系统都能识别的合同字段。
需要留意:resolve() 依赖定价服务和相应权限。没有机构凭证时,可以创建对象、查看字段和阅读实现,但无法凭空获得当日市场惯例与平价利率。
GsSession:不是普通登录,而是能力边界
访问高盛 API 前,需要初始化会话:
●●●python from gs_quant.session import GsSession
GsSession.use(
client_id="YOUR_CLIENT_ID",
client_secret="YOUR_CLIENT_SECRET"
)
GsSession 主要负责三件事:
●用 OAuth 应用凭证获取并复用访问令牌;
●把请求发往对应环境的 API;
●按应用 scopes 和账户 entitlements 控制可访问能力。
scopes 和 entitlements 不是一回事。
scopes 更像“这把钥匙被允许尝试打开哪些门”,例如读取金融数据或执行某类操作;entitlements 则决定“你的账户实际有权看哪些数据、使用哪些服务”。代码写对了但权限不足,照样会失败。
生产代码不要把 client_secret 写进 Notebook 或 Git 仓库。更合适的做法是从环境变量或密钥管理服务读取,并遵循最小权限原则,只申请应用真正需要的 scopes。
定价到底在算什么
衍生品的“价格”,本质上是未来现金流在今天的价值。
以利率互换为例,一边支付固定利息,另一边收取随参考利率变化的浮动利息。定价引擎会预测和折现两条现金流,再计算两边现值之差:
互换价值 ≈ 收取端现金流现值 − 支付端现金流现值

IRSwap 固定端、浮动端与现值计算示意图
如果合约刚按市场平价成交,两边现值通常接近,初始价值也接近零。市场利率变化后,原合同中的固定票息不再“刚好公平”,互换就会产生正或负的市场价值。
在 gs-quant 中,PricingContext 用来告诉系统“站在什么时间、使用哪组市场数据、按什么计算方式估值”。
●●●python import datetime as dt
import gs_quant.risk as risk
from gs_quant.markets import PricingContext
with PricingContext(
pricing_date=dt.date(2026, 7, 15),
market_data_location="LDN"
):
price_future = swap.dollar_price()
delta_future = swap.calc(risk.IRDelta)
price = price_future.result()
delta = delta_future.result()
上下文退出时,里面的多个计算会合并发出,减少重复通信。即使使用同步模式,上下文中的调用也会先返回 Future,因此要在退出 with 代码块后用 .result() 取值。
几个参数的含义:
●pricing_date:站在哪一天计算合约价值;
●market_data_location:使用伦敦、纽约或香港等地点对应的市场数据;
●is_async=True:请求提交后先返回,主程序可以继续做别的事;
●is_batch=True:适合长历史或大组合,避免受普通 HTTP 请求时限影响;
●csa_term:指定抵押品协议条款,它会影响贴现方式和估值。
最后一项很容易被非专业读者忽略。同一笔衍生品,在不同抵押品安排下可能采用不同贴现曲线,因此价格也可能不同。金融定价从来不只有“产品条款”,还包含交易对手和抵押品环境。
Delta、Gamma、Vega:把“风险”翻译成人话
价格只是一个结果,风险回答的是另一个问题:
市场动一点,这笔交易会亏多少或赚多少?

Delta、Gamma、Vega 与 Theta 风险指标图解
Delta:市场小幅变化时,价格先动多少
利率产品的 IRDelta 通常衡量利率曲线移动 1 bp 时,合约现值的变化。
假设某个期限点的 Delta 是 8,000 美元,可以粗略理解为:对应利率上升 1 bp,在其他条件近似不变时,组合价值约变化 8,000 美元。正负方向要结合风险结果的定义和头寸方向判断。
真实结果通常不是一个数字,而是一条按期限拆开的风险阶梯,例如 2 年、5 年、10 年各自贡献多少。这比“总 Delta 是多少”更有用,因为短端和长端利率可能朝不同方向变化。
Gamma:Delta 本身变化得有多快
Delta 是一阶敏感度,Gamma 是二阶敏感度。
如果 Gamma 很大,市场再多走一点,原来的 Delta 估计很快就会失真。这也是期权风险呈现非线性的原因:行情越剧烈,盈亏曲线越不像一条直线。
Vega:隐含波动率变化会怎样
Vega 衡量隐含波动率变化对价格的影响。
买入期权通常拥有正 Vega:市场预期未来波动更大时,期权的选择权更值钱;卖出期权通常相反。但实际风险会沿波动率曲面的不同期限、执行价分散,不能只看一个汇总数字。
Theta:时间流逝的成本或收益
Theta 描述其他条件近似不变时,时间过去一天对价格的影响。
期权买方常面对时间价值衰减,卖方则可能从衰减中受益。不过一旦市场发生大幅波动,Delta、Gamma 和 Vega 的影响可能远大于这一天的 Theta。
gs-quant 还提供现金流、隐含波动率以及权益、外汇、信用等资产类别的专用风险指标。指标名字相似,不代表冲击单位完全相同;阅读结果时要同时确认 measure 的官方定义、计价币种和聚合层级。
Portfolio:为什么组合风险不能只把价格相加
单笔交易解决后,下一步通常是组合。
●●●python from gs_quant.markets.portfolio import Portfolio
portfolio = Portfolio([swap], name="rates_book")
with PricingContext(is_batch=True):
pv_future = portfolio.dollar_price()
risk_future = portfolio.calc(risk.IRDelta)
portfolio_pv = pv_future.result().aggregate()
portfolio_delta = risk_future.result().aggregate()
价格层面,多笔交易的现值可以汇总;风险层面,更重要的是看它们如何相互抵消。
例如,一笔 10 年期收固定互换和一笔相近规模的付固定互换,总现值可能都不大,但 10 年利率风险可能明显对冲。与此同时,两笔交易的起息日、曲线、币种或抵押条款不同,又可能留下基差风险。
Portfolio 支持嵌套和路径切片,适合按交易台、策略、币种或账户组织头寸。PortfolioManager、PositionSet、SecurityMaster 等模块进一步连接高盛的组合、持仓和证券主数据服务,但同样受权限约束。
历史定价:不是查收盘价,而是把同一份合同放回过去
对股票而言,“历史价格”经常只是读取一列行情;对衍生品而言,事情复杂得多。
一笔期权在不同历史日期有不同的剩余期限、标的价格、利率和波动率曲面。历史定价需要把同一份交易条款放到过去的市场环境里,重新计算每一天的价值。
●●●python from gs_quant.markets import HistoricalPricingContext
start = dt.date(2026, 6, 1)
end = dt.date(2026, 6, 30)
with HistoricalPricingContext(
start,
end,
is_batch=True,
show_progress=True
):
history_future = swap.price()
price_series = history_future.result()
适合做:
●历史盈亏重估;
●风险随时间的变化分析;
●情景复盘;
●回测中的逐日估值。
但“历史重估”不等于真实可交易收益。要得到可信的策略结果,还要处理买卖价差、交易成本、滑点、流动性、融资、保证金和实际可成交规模。
数据与时间序列:最容易在本地发挥价值的部分
gs_quant.timeseries 提供大量面向 pandas.Series 的函数,包括收益率、波动率、相关性、Beta、夏普比率、最大回撤、日期对齐和插值等。
这部分适合没有机构权限的开发者学习和使用:只要输入是本地已有的时间序列,许多纯计算函数就能直接运行。
●●●python import pandas as pd
from gs_quant.timeseries import max_drawdown, volatility
prices = pd.Series(
[100, 102, 101, 98, 103],
index=pd.date_range("2026-01-01", periods=5)
)
vol = volatility(prices)
drawdown = max_drawdown(prices)
两个概念可以这样理解:
●波动率衡量收益“抖得有多厉害”,常被当作风险强度;
●最大回撤衡量从阶段高点跌到随后低点的最深幅度,更贴近投资者真实承受的亏损体验。
Dataset 则是另一回事。负责查询高盛及接入的数据集,通常需要有效 Session、数据订阅和对应 entitlement。不要把“timeseries 函数可以处理本地数据”误写成“所有 GS 数据都能免费获取”。
回测框架:把策略拆成触发器、动作和引擎
gs-quant 的回测不是一个固定模板,而是一套描述策略的语言。核心对象可以用交易系统的日常流程理解:
●Trigger:什么时候检查并触发规则;
●Action:触发后买什么、卖什么或如何对冲;
●Strategy:初始持仓加上一组触发规则;
●Engine:用什么计算方式把策略沿历史时间推进;
●Backtest:保存逐日持仓、风险和结果。

GS Quant 回测框架与路径依赖流程
假设策略是“每个工作日卖出一笔一个月后到期的美元利率跨式期权”,系统需要逐日回答:
1.今天是否到达触发日?
2.如果触发,新增哪一笔交易?
3.旧交易是否到期?
4.当前组合的价格、Delta、Vega 是多少?
5.如果风险超过阈值,是否执行对冲?
这是路径依赖:今天的持仓取决于过去发生过什么,不能只用一条静态价格序列代替。
官方框架提供 GenericEngine、PredefinedAssetEngine 和
EquityVolEngine 等实现。GenericEngine 覆盖面较广,并以 gs-quant 风险 API 作为默认计算来源;专用引擎则针对特定资产或任务优化。
回测结果可以用于研究,但不能直接视为可实现收益。衍生品策略尤其容易受到波动率曲面、估值惯例、交易成本和流动性的影响。一个没有费用、没有滑点、每天都能按理论价成交的回测,往往只是“理想实验”,不是可交易结论。
情景分析:比“预测明天”更实用
风险管理经常不问“明天一定会怎样”,而问:
●如果整条利率曲线上移 50 bp,会亏多少?
●如果短端利率上升、长端下降,会怎样?
●如果股价下跌 10%,同时隐含波动率上升 5 个百分点,会怎样?
OverlayMarket 和场景相关模块用于在基准市场之上施加冲击,再重新计算价格和风险。
和 Delta 的区别在于:
●Delta 主要描述局部、小幅变化下的一阶近似;
●情景分析可以组合更大、更复杂、甚至非平行的市场变化;
●对带期权的非线性组合,大幅冲击下重新定价通常比简单乘 Delta 更可靠。
从源码看,为什么像机构系统
gs-quant 的整体架构可以概括为“本地建模,远端计算,结果回到 Python”:
Instrument 合同对象 → PricingContext 估值环境 → GsSession 请求通道 → 定价/风险服务 → 带元数据的结果对象

GS Quant 从合同对象到风险结果的技术调用链
以下几个设计点尤其值得关注
1. 强类型的合同对象
金融工具使用 dataclass、枚举和统一基类描述经济条款。相比到处传字典,类型化对象更容易发现币种、日期、买卖方向和字段名称错误。
2. 上下文统一注入估值条件
估值日、市场位置、抵押条款、异步和批处理方式放在 PricingContext 中,不必在每一次 price() 或 calc() 调用里重复传递。
上下文还会收集同一代码块中的计算,统一派发。对大组合而言,减少请求次数通常比微调某一行 Python 更重要。
3. 序列化与传输层
本地对象会被序列化后发送给服务端。项目依赖中可以看到 dataclasses_json、msgpack、httpx、requests 和 websockets 等组件,分别服务于对象转换、紧凑数据传输、HTTP 请求和实时通信等场景。
4. 结果不只是一个浮点数
风险结果可能是标量、序列或 DataFrame,还会携带风险键、计价单位、市场信息和错误状态。FloatWithInfo、SeriesWithInfo、DataFrameWithInfo、PortfolioRiskResult 等类型,解决的是“这个数字从哪里来、用什么单位、对应哪笔交易和哪种冲击”。
在真实风控系统里,可追溯性和数值本身同样重要。
5. 批处理与可观测性
官方文档指出,普通 HTTP 计算请求存在时限;预计超过该时限的任务应使用 is_batch=True。项目同时引入缓存开关、进度显示和 OpenTelemetry 追踪,以便处理更长、更复杂的计算链路。
Skills 与 MCP:让 AI 调用能力,但不会绕过金融权限
较新的 gs-quant 版本加入了 gs_quant.skills 和 gs_quant.mcp。
Skills 提供面向编码助手的领域说明,可以安装到项目或全局环境:
●●●bash python -m gs_quant.skills install --global
MCP 相关依赖可以按需安装:
●●●bash pip install "gs-quant[mcp]"
作用是让 AI 工具更容易理解 gs-quant 的模块、发现可调用工具并组织工作流。需要强调的是:
AI 接入改变的是调用方式,不会改变数据许可、API scopes 和机构 entitlements。
没有定价权限的账户,不会因为接入 MCP 就突然拥有定价能力;没有数据订阅,也不能让 AI 绕过授权读取数据。
最容易踩的七个坑
1. 把“开源客户端”当成“高盛整套系统开源”。
开放仓库不包含全部后台模型、市场数据和生产基础设施。
2. 以为安装成功就能定价。
pip install 只安装 Python 包。定价、风险和受限数据还需要凭证与权限。
3. 混淆价格、美元价格和计价币种。
price()、dollar_price() 以及参数化币种转换不是同一件事,必须检查结果单位。
4. 在 PricingContext 内直接把 Future 当数字用。
上下文中的计算先返回 Future,应在代码块退出后调用 .result()。
5. 大组合仍走普通同步请求。
长历史或复杂风险计算应考虑 is_batch=True;需要主程序继续工作时,再配合 is_async=True。
6. 只看汇总风险,不看期限和因子分解。
总 Delta 接近零,不代表每个期限点都没有风险。
7. 把理论回测当成实盘收益。
交易成本、滑点、流动性、融资和保证金缺一不可。
适合谁,不适合谁
gs-quant 特别适合三类人:
●有高盛机构权限,需要在 Python 中接入定价、风险、数据或组合服务的团队;
●想研究机构如何抽象衍生品、风险和回测工作流的 Quant 与工程师;
●已有本地数据,希望复用其时间序列与统计工具的研究者。
如果目标是“完全离线、无需任何机构账户,就在本机复刻高盛的生产级跨资产定价平台”,gs-quant 并不符合这个预期。
更准确的定位是:
gs-quant是一套公开、可读、可扩展的机构级量化 Python 接口与工作流框架;当你拥有相应权限时,又是连接高盛定价、风险和数据服务的客户端。
建议的学习顺序
不要一上来就啃完整 API 索引。按下面的顺序更容易建立整体认识:
1.安装包,先运行本地 timeseries 函数;
2.阅读 instrument,理解交易条款如何对象化;
3.研究 resolve()、price() 和 calc() 的调用链;
4.用 PricingContext 一次提交多项风险计算;
5.把单笔交易放进 Portfolio,观察风险如何聚合和抵消;
6.再进入 HistoricalPricingContext、场景和回测;
7.最后阅读 session.py、markets/core.py、risk/results.py 与回测引擎源码。
gs-quant 最值得学习的,不是某一个函数,而是一套把金融合同、市场环境、计算任务和风险结果分开的设计方法。
当这四层被拆清楚,衍生品不再是一团神秘公式,代码也不再只是 API 调用。会看到一条完整链路:交易条款如何被标准化,市场数据如何进入估值,价格如何拆成风险,策略又如何沿历史路径演化。
这才是 gs-quant 真正开放出来的东西。
—— 如此才是
把复杂的技术,讲成你真正能用上的生产力
终端文件管理天花板!superfile 17.8k Stars 现代 TUI 神器:多面板·视频预览·插件扩展 + 高效使用 + 源码构建
软件实现多机键鼠+剪贴板共享,QUIC加密低延迟边沿切换,开源神器MyKVM
Rust版tmux来了!RMUX原生跨平台+类型SDK+浏览器加密共享
2026 开源设计工具最强黑马!OpenPencil 7MB AI 原生编辑器:全编程接口 + P2P 协作 + Figma 兼容深度测评
OpenTUI:Zig原生高性能终端 UI 框架如何用 Flexbox + Tree-sitter + React/Solid 声明式 API 重新定义 TUI 开发
Sniffnet v1.5.0 :Rust 打造的跨平台网络流量监控神器,完整功能 + 高阶实战技巧
ytDownloader:开源跨平台视频音频下载神器,深度技术解析 + 高效使用全指南(支持上百网站、硬件加速压缩、智能播放列表)
Paperclip:开源「AI agent公司操作系统」70k Stars爆火!自3月以来功能暴增、架构升级全记录 | 源码深度解析 + 高效部署与实战指南
40k+ Stars 开源神器 LosslessCut:无损视频音频剪辑的瑞士军刀 | 功能全解 + 高效用法 + 源码架构 + 实战指南
Clypra开源视频编辑器:Tauri+React专业多轨时间线实现CapCut付费功能免费替代,源码构建(含100级Undo与非破坏性剪辑)
glint:终端「信息中枢」!Rust + ratatui 打造的键盘驱动 TUI 仪表盘,一屏掌控股票/加密货币/邮件/日历/新闻/天气/图库/笔记/系统资源
把同声传译装进口袋,旅行、出差、跨境交流莫慌莫慌,Native式交流无障碍
零基础也能玩转卫星!开源Ground Station + SDR 打造个人地面站全攻略
OpenClaw & Hermes刷屏后,GitHub Mercury Agent如何打动用户? 灵魂驱动+权限铁闸+24/7永动 vs 两大竞品
苹果M系列芯片的福音!无需H100、无需云GPU,本地MacBook就能微调Gemma 4多模态模型
开源Minecraft终极杀手!12.7K星GitHub神器Luanti(原Minetest)完整中文攻略:零基础安装、2800+模组随便玩、服务器+源码编译
AI 直接操控 Unity/Godot/Unreal 编辑器!用 OpenClaw + TomLeeLive 插件,聊天就能把你的游戏梦想变成现实
夜雨聆风