10 分钟跑通你的第一条量化回测:gs-quant 快速上手指南
【免费下载链接】gs-quantPython toolkit for quantitative finance项目地址: https://gitcode.com/GitHub_Trending/gs/gs-quant
gs-quant 是一个 Python 量化金融工具包:行情数据、金融时序处理和量化回测引擎都在里面。今天不推导公式,就干一件事——用不到 40 行代码,把一个均值回归策略从头跑到绩效图,全程不用自己搭行情、撮合和绩效模块。
⚙️ 先决条件
三行讲完,不多聊:
| 项 | 说明 |
|---|---|
| Python | 3.9 及以上 |
| 安装 | pip install gs-quant --upgrade |
| API Key | 向服务商申请 client_id / client_secret,本文所有取数和回测都依赖它 |
📐 场景拆解:一条利率曲线上的均值回归
选一个够简单、逻辑一眼能看完的策略:10 年期互换利率围绕其 30 日均线波动,偏离超过 2 个标准差就进场,回归后离场。
- 盯什么:SWAPRATES 数据集里 10 年期互换利率的日线序列
- 怎么算:每天滚动 30 天窗口,算均线和标准差,得到当前价偏离均值几个标准差(Z 分数)
- 进场:Z > +2 说明利率偏贵,做空一份 10 年期互换;Z < -2 反向做多
- 离场:价格重新回到滚动均值那一边,反向对冲平仓,落袋
- 每天只决策一次,其余时间仓位纹丝不动
整个判断就是"偏离→进场,回归→离场"这一条线,没有别的分支。触发条件的实现可以直接翻 gs_quant/backtests/triggers.py 里的MeanReversionTrigger。
💻 从认证到绩效的最短链路
3 行完成认证
from gs_quant.session import GsSession # Auth: pass your own credentials GsSession.use(client_id='your_client_id', client_secret='your_client_secret', scopes=('run_analytics', 'read_product_data'))这一段只做一件事:把凭证交给GsSession单例,后面所有 API 调用都走这个会话,不用重复登录。认证参数怎么拼、scope 有哪些可选项,见 gs_quant/session.py。
取数 + 定义策略
from datetime import date from gs_quant.backtests.data_sources import GenericDataSource, MissingDataStrategy from gs_quant.backtests.actions import AddTradeAction from gs_quant.backtests.strategy import Strategy from gs_quant.backtests.triggers import MeanReversionTrigger, MeanReversionTriggerRequirements from gs_quant.data import Dataset swap_id = 'MA5WM2QWRVMYKDK0' # 10Y EUR swap in SWAPRATES_STANDARD data = Dataset('SWAPRATES_STANDARD').get_data(date(2021, 6, 1), assetId=[swap_id]) series = data[data['tenor'] == '10y']['rate'] # Trade the swap whenever the z-score blows past the bound ds = GenericDataSource(series, MissingDataStrategy.fill_forward) req = MeanReversionTriggerRequirements(ds, 2, 30, 30) # z=2, 30d rolling mean/std trigger = MeanReversionTrigger(req, AddTradeAction(swap_id, notional=1e4)) strategy = Strategy(None, trigger)前半段从数据集拉出利率序列,后半段把"数据源 + 进场边界 + 要做的交易"三样东西打包成一个Strategy对象,回测引擎只认这个对象。数据访问的入口在 gs_quant/data/core.py,Strategy本身就是一个普通 dataclass,定义在 gs_quant/backtests/strategy.py。
跑回测,读绩效
from gs_quant.backtests.generic_engine import GenericEngine bt = GenericEngine().run_backtest(strategy, start=date(2021, 6, 1), end=date.today(), frequency='1b') s = bt.result_summary # daily 'Cumulative Cash' + mark-to-market (Price) stats = bt.performance_stats() # annualized return / vol / Sharpe / max drawdown print(round(s['Cumulative Cash'].iloc[-1] + s[Price].iloc[-1], 2), stats)引擎按frequency每天看一眼触发器,命中就记账,最后给你一张逐日的result_summary表(累计现金 + 逐日盯市)。引擎入口在 gs_quant/backtests/generic_engine.py。
📊 看懂回测结果
不用把整张 summary 表念一遍,先看四个数:
| 指标 | 从哪读 | 它回答的问题 |
|---|---|---|
| 年化收益 | performance_stats()['Annualized Return'] | 平均每年赚多少 |
| 夏普比率 | performance_stats()['Sharpe Ratio'] | 每承担一分风险换多少收益 |
| 最大回撤 | performance_stats()['Max Drawdown'] | 最惨的时候账户缩水多少 |
| 交易次数 | len(bt.trade_ledger()) | 策略是真的在交易,还是常年空仓 |
再画一条曲线兜底:pd.DataFrame({'cash': s['Cumulative Cash'], 'mtm': s[Price]}).plot(),看的是净值有没有平滑向上,以及回撤是不是集中在某几次事件里。数字会骗人,曲线不会——曲线形态比单个数字更能暴露策略性格。
🕳️ 常见坑
- 401/403 认证失败:多半是 token 缺权限。确认
GsSession.use带了('run_analytics', 'read_product_data')两个 scope 再试一次,缺哪个补哪个。 - frequency 传错:
run_backtest接受'1b'(每个交易日)、'1d'(自然日)、'1m'(每月末)这类字符串。日线策略传'1b',传成'1m'你会得到一条每月才动一次的曲线。 - 时区错位:
Dataset返回的索引是 UTC 业务日期,代码里全程只用date粒度,别混入带时分秒的datetime,否则某些交易日会对不齐,表现为数据突然断了一截。
🧭 往哪走
- 官方文档入口:docs/index.rst
- 回测官方示例(均值回归原文件):gs_quant/documentation/04_backtesting/
- 全部触发器与动作类型:gs_quant/backtests/triggers.py
风险提示:本文代码仅作教学演示,历史回测表现不代表未来收益,实盘前请自行评估数据质量与市场风险。
【免费下载链接】gs-quantPython toolkit for quantitative finance项目地址: https://gitcode.com/GitHub_Trending/gs/gs-quant
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考