ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

gs-quant 实战:3 行核心代码跑通商品期货跨期价差回归套利回测

gs-quant 实战:3 行核心代码跑通商品期货跨期价差回归套利回测 gs-quant 实战3 行核心代码跑通商品期货跨期价差回归套利回测【免费下载链接】gs-quantPython toolkit for quantitative finance项目地址: https://gitcode.com/GitHub_Trending/gs/gs-quant2024 年 3 月某商品近月合约被现货抢购推高对远月的溢价从 1% 拉到 5% 后迅速回落。价差回归策略赚的就是这段弹回的钱。这篇用 gs-quant 做一个商品期货套利的均值回归量化回测价差信号、触发器、回测引擎核心只有三行。概念拆解价差为什么倾向于回中跨期价差可以想象成一根橡皮筋。近月和远月合约底层是同一件商品季节性供需、交割成本变化会把两根价格拉开但只要两边基本面没有永久分叉价差迟早缩回去。水位回中也是同一个道理偏离足够远的时候进场赌的是回归而不是方向。策略逻辑不依赖代码就能说清楚信号到动作的映射如下z 分数价差偏离滚动均值多少个标准差。超过 ±2 就视为橡皮筋拉过头。拿到近远月合约数据安装、认证、拉价格三步走Step 1安装一条命令装好依赖pip install gs-quant --upgradeStep 2认证gs-quant 的数据和计算都走远程 API需要先初始化一个会话凭据在 Marquee 开发者平台申请from gs_quant.session import GsSession # 替换为你自己的凭据 GsSession.use(client_idyour_client_id, client_secretyour_client_secret, scopes(run_analytics,))Step 3构造合约对象并拉历史价格用FutureContract声明近月、远月两个合约再从DAILY_BASIS数据集取日线收盘from gs_quant.markets.securities import FutureContract from gs_quant.data import Dataset # 合约 ID 以证券主数据实际为准这里以黄金近月/远月为例 near_leg FutureContract(GD-12-25, COMMODITIES, 黄金近月) far_leg FutureContract(GD-06-26, COMMODITIES, 黄金远月) ds Dataset(DAILY_BASIS) start, end 2024-01-01, 2024-12-31 near_px ds.get_data(start, end, assetId(near_leg,))[close] far_px ds.get_data(start, end, assetId(far_leg,))[close]合约对象的字段定义见 gs_quant/markets/securities.py。构造价差 Z 分数信号一条命令跑通回测价差序列与 Z 分数先算价差比率再用 60 日滚动均值和标准差归一化。窗口长度决定均值代表什么60 约等于一个季度太长会迟钝太短会把正常波动也当异常from gs_quant.timeseries.statistics import mean, std spread near_px / far_px - 1 w 60 z (spread - mean(spread, w)) / std(spread, w) # Z 分数序列mean、std的实现见 gs_quant/timeseries/econometrics.py 所在的统计模块。触发器把规则交给内置的均值回归组件gs-quant 自带MeanReversionTrigger把价差序列喂给它它按 z 的正负自动决定方向——z 高于阈值进空价差低于阈值进多价差价差回到均值时自动平仓。这就是那三行核心中的关键一行from gs_quant.backtests.triggers import MeanReversionTrigger, MeanReversionTriggerRequirements from gs_quant.backtests.data_sources import GenericDataSource from gs_quant.backtests.actions import AddTradeAction, ExitAllPositionsAction src GenericDataSource(spread) trigger MeanReversionTrigger( # 核心 1 MeanReversionTriggerRequirements(src, 2.0, 60, 60), # z 阈值 2均值/标准差窗口 60 [AddTradeAction([near_leg, far_leg], namegold_spread), ExitAllPositionsAction()] )阈值2.0是进场的橡皮筋拉伸上限2.0偏保守、信号少而稳1.5更激进、容易被震荡打脸。触发与动作定义见 gs_quant/backtests/triggers.py 和 gs_quant/backtests/actions.py。回测把策略丢给引擎按日推进Strategy 初始组合 触发器初始组合传None表示空仓起步import datetime as dt from gs_quant.backtests.strategy import Strategy from gs_quant.backtests.generic_engine import GenericEngine strategy Strategy(None, trigger) backtest GenericEngine().run_backtest( # 核心 2 strategy, startdt.date(2024, 1, 1), enddt.date(2024, 12, 31), frequency1d, show_progressTrue ) summary backtest.result_summary # 核心 3: dict[str, DataFrame]GenericEngine走 gs-quant 的风险 API 做逐日计算是覆盖面最广的引擎见 gs_quant/backtests/generic_engine.py。读懂回测结果年化、夏普、最大回撤该看什么result_summary是按列名组织的 DataFrame 集合累计现金列可以近似当组合净值。把三个最关键的指标一次打出来from gs_quant.timeseries.econometrics import sharpe_ratio, max_drawdown cash summary[Cumulative Cash] ret cash.pct_change() print(f年化 {ret.mean()*252:.1%} 夏普 {sharpe_ratio(ret).iloc[-1]:.2f} f最大回撤 {max_drawdown(cash).iloc[-1]:.1%}) 单看数字没意义给个对照系指标怎么读参考阈值单品种套利年化收益价差策略靠回归吃饭别拿趋势策略的标准要求它10%~25% 属合理区间夏普比率每单位波动能换多少收益比绝对收益更可信1.0 及格2.0 优秀最大回撤最难受的那段跌了多少控制在 10% 以内如果夏普不低但回撤大多半是阈值太紧、进场太频繁反过来收益回撤都不动说明 2σ 对这个品种太保守。净值曲线一行代码就能画出来cash.plot(legendFalse, title价差回归策略净值曲线)避坑与调优让均值回归 量化策略 更接近实盘⚠️ 教学示例跑通不等于能上实盘四个最常见的坑坑处理办法手续费和滑点吃掉价差收益在AddTradeAction里传transaction_cost如ConstantTransactionModel进出场可分别设置价差策略对成本极度敏感固定 2σ 不适应波动率变化用滚动波动率校准z_score_bound或用timeseries.technicals里的指数波动率做动态边界单品种黑天鹅逼仓、政策多品种各挂一套触发器并行回测在组合层面看总风险而不是单策略收益近月临近交割价差序列跳变回测中处理换月在 roll 日重置价差基准或改用连续拼接头寸另外把窗口长度 30/60/120 各跑一遍做敏感性分析参数在合理范围内结论稳定策略才值得继续打磨换个窗口就变号说明赚的是噪音。策略价值与边界三行核心代码背后gs-quant 把数据、信号、触发器、引擎拆成了可替换的组件改阈值、换窗口、加新品种都是改参数而不是重写代码这是均值回归这类策略快速迭代的正确姿势。风险提示本文策略仅作教学示例不构成投资建议实盘需自行承担风险。商品期货还有流动性、保证金和交割制度等现实约束回测结果不代表未来表现。想继续深入建议看仓库内这两处回测入门教程gs_quant/documentation/04_backtesting/tutorials/文档总览docs/index.rst【免费下载链接】gs-quantPython toolkit for quantitative finance项目地址: https://gitcode.com/GitHub_Trending/gs/gs-quant创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表