十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

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

4个动作块用 gs-quant 跑通z分数均值回归回测

4个动作块用 gs-quant 跑通z分数均值回归回测 4个动作块用 gs-quant 跑通z分数均值回归回测【免费下载链接】gs-quantPython toolkit for quantitative finance项目地址: https://gitcode.com/GitHub_Trending/gs/gs-quant利率台要回测一个10年掉期利率的逆势回归策略时第一个坑往往不在z分数公式而在时间上信号用t日收盘算出来仓位却不能在t日开盘就标记。gs-quant 是一款量化金融 Python 工具包它的回测引擎 GenericEngine 按天推进时钟每天取数、查触发器、执行交易、盯市仓位信号和执行共用同一个时间轴。本文以z分数均值回归回测为例过一遍准备数据、组装触发器、跑回放、读结果的动作。读完你可以自己拼出一个类似的触发器策略并完整跑通。先让回测引擎跑起来在谈策略之前先确认环境可用。用 pip 装好 gs-quant几行代码完成认证。下面这个例子是官方教程里最短的可运行回测每个交易日买一张 EURUSD 三个月 25 档 delta 看涨期权持有1周。pip install gs-quant --upgradefrom datetime import date from gs_quant.session import GsSession from gs_quant.instrument import FXOption from gs_quant.backtests.generic_engine import GenericEngine from gs_quant.backtests.strategy import Strategy from gs_quant.backtests.triggers import PeriodicTrigger, PeriodicTriggerRequirements from gs_quant.backtests.actions import AddTradeAction GsSession.use(client_id..., client_secret..., scopes(run_analytics, read_product_data)) opt FXOption(pairEURUSD, expiration_date3m, strike_price25d, option_typeCall, premium0) trigger PeriodicTrigger(PeriodicTriggerRequirements(start_datedate(2025, 8, 4), end_datedate(2025, 9, 4), frequency1b), AddTradeAction(opt, trade_duration1w)) backtest GenericEngine().run_backtest(Strategy(None, trigger), startdate(2025, 8, 4), enddate(2025, 9, 4), frequency1b) backtest.result_summary跑不通时按顺序检查GsSession.use的 scopes 是否带run_analytics和read_product_dataclient 凭据是否仍然有效回测区间是否都在过去引擎不会往未来跑。准备数据序列均值回归触发器只看一条时间序列。先从 Data Catalog 拉10年 EUR 掉期利率只留 10y 期限把 DataFrame 的列转成 Series再包一层GenericDataSource给引擎按日期取值。import pandas as pd from datetime import date from gs_quant.data import Dataset from gs_quant.backtests.data_sources import GenericDataSource, MissingDataStrategy ds Dataset(SWAPRATES_STANDARD) raw ds.get_data(date(2021, 6, 1), assetId[MA5WM2QWRVMYKDK0]) s pd.Series(raw.loc[raw[tenor] 10y, rate].to_dict()) data_source GenericDataSource(s, MissingDataStrategy.fill_forward)触发器与状态机的实现在 gs_quant/backtests/triggers.py所有触发器需求类也在这里注册。注意GenericDataSource按回测日期取值Series 里缺的那天会按 fill_forward 用前值顶替滚动均值和标准差会因此略偏数据起点若与回测起点相同前30天窗口内样本不足不产生信号拉数起点应至少比回测起点早一个滚动窗口。组装均值回归触发器内置的MeanReversionTrigger是个状态机空仓时 z 分数绝对值越过阈值就开仓偏离的正负号决定方向持仓时价格一回到滚动均值就平仓。开仓和平仓由同一个触发器负责不用自己再写退出条件。from gs_quant.common import Currency, PayReceive from gs_quant.instrument import IRSwap from gs_quant.backtests.actions import AddTradeAction from gs_quant.backtests.strategy import Strategy from gs_quant.backtests.triggers import MeanReversionTrigger, MeanReversionTriggerRequirements swap IRSwap(pay_or_receivePayReceive.Pay, termination_date10y, notional_currencyCurrency.EUR, notional_amount1e4, fixed_rateATM, nameswap_10y) trig_req MeanReversionTriggerRequirements(data_source, z_score_bound2, rolling_mean_window30, rolling_std_window30) strategy Strategy(None, MeanReversionTrigger(trig_req, AddTradeAction(swap)))注意方向不写在AddTradeAction里触发器通过 TriggerInfo 携带 1/-1 的 scaling引擎按符号给仓位翻号。若交易台账里方向反了先检查数据序列的符号约定利率序列 z 偏高代表利率贵逆势做的是 payer swap 这一侧。跑引擎回放引擎主循环就一行按交易日频率推进时钟每天查触发器、执行动作持仓按 Price 指标盯市。import datetime as dt from gs_quant.backtests.generic_engine import GenericEngine backtest GenericEngine().run_backtest(strategy, startdate(2021, 6, 1), enddt.date.today(), frequency1b, show_progressTrue)注意initial_value默认为 0result_summary 记的是增量损益而非总资产净值单看 Price 一列的绝对值没有意义净值曲线要取 Cumulative Cash Price 两列之和。 解读结果摘要回测结束后信息集中在两处result_summary按天的 DataFrame和trade_ledger()逐笔交易清单。实操看三个数就够。看什么在哪读当前参数下说明什么累计现金损益result_summary[Cumulative Cash]平仓兑现的部分长时间走平说明策略空仓观望持仓盯市result_summary[Price]当日未平仓头寸的盯市1e4 名义 × 利率波动绝对值波动属正常交易笔数与持有天数trade_ledger()校验触发频率若明显过密先怀疑30天窗口偏短nav backtest.result_summary[Cumulative Cash] backtest.result_summary[Price] nav.plot(title净值曲线) backtest.trade_ledger()说白了净值曲线应该呈小幅对称起伏损益主要兑现于平仓时刻持仓期间盯市来回摆是均值回归回测的正常形态。 走向生产要补的几件事如果要从这个 Demo 走向生产你大概率要补这几件事。执行价格与成本引擎默认按数据源价格成交约等于中价给 action 的transaction_cost挂一个按名义规模计费的ScaledTransactionModel定义在 gs_quant/backtests/backtest_objects.py官方教程里 0.5bp 成本对损益的侵蚀对比很直观。信号时点本文触发器当日取数当日成交是收盘确认的近似若要t日确认、t1日执行需要把数据整体后移一个交易日或用IntradayTriggerRequirements的时间窗口控制。头寸与现金AddTradeAction固定名义金额长回测里损益规模不随净值缩放可换AddScaledTradeAction按可用现金或风险缩放Strategy还接受cash_accrualCashAccrualModel给闲置现金计息直接影响绝对收益读数。节假日日历run_backtest的holiday_calendar参数用于过滤非交易日的触发检查。延伸与边界三处值得读官方通用引擎示例目录 gs_quant/documentation/04_backtesting/examples/03_GenericEngine/ 有15个例子040304 就是本文均值回归策略的完整代码回测核心 gs_quant/backtests/ 包含 GenericEngine、PredefinedAssetEngine、EquityVolEngine 三个引擎及全部触发器与动作定义时间序列函数库 gs_quant/timeseries/ 提供收益、滚动统计等计量函数适合组装自己的信号序列。本文未覆盖的边界示例标的为利率掉期不是商品期货跨期价差Catalog 里没有现成的商品价差序列需自行取两个合约价格构造价差后再喂给GenericDataSource成本模型是常数缩放没有流动性曲线与盘中滑点均值回归触发器的滚动窗口状态在整条策略实例内共享窗口分段回测后不能直接拼接结果。引擎负责时间、成交与损益归集策略逻辑收敛成一个触发器用这个库写触发器式回测时这条边界应该先想清楚。【免费下载链接】gs-quantPython toolkit for quantitative finance项目地址: https://gitcode.com/GitHub_Trending/gs/gs-quant创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表