尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

gs-quant 回测中的交易成本建模:把市场冲击算进你的策略里

gs-quant 回测中的交易成本建模:把市场冲击算进你的策略里 gs-quant 回测中的交易成本建模把市场冲击算进你的策略里【免费下载链接】gs-quantPython toolkit for quantitative finance项目地址: https://gitcode.com/GitHub_Trending/gs/gs-quant回测夏普 2.1实盘一年差出 40bp 的换手成本——差距多半出在你按收盘价成交的假设上。gs-quant 回测模块把订单成交拆成了可替换的执行引擎和订单模型读完这篇你能自己把 TWAP 均价、滑点和交易成本算进策略绩效。架构速览gs-quant 回测里成本相关的模块执行引擎gs_quant/backtests/execution_engine.py —— SimulatedExecutionEngine 维护订单队列按回测时钟推进并生成成交事件订单模型gs_quant/backtests/order.py —— OrderTWAP、OrderAtMarket 等子类决定成交价怎么取成本配置gs_quant/api/gs/backtests_xasset/response_datatypes/backtest_datatypes.py —— TradingCosts / TransactionCostConfig 定义开仓与平仓成本策略入口gs_quant/backtests/strategy_systematic.py —— StrategySystematic 把交易参数和成本配置打包提交报告调度gs_quant/markets/portfolio_manager.py —— PortfolioManager 按 months_per_batch 分批跑历史报告核心机制拆解订单填充时成交价怎么算执行引擎如何把订单变成成交引擎本身很薄ping()按回测时钟推进把所有到期的订单一次性换成成交事件而成交价由订单自己说了算。# gs_quant/backtests/execution_engine.py L45-L49fill FillEvent( orderorder, # 订单自带计价逻辑 filled_priceorder.execution_price(self.data_handler), filled_unitsorder.execution_quantity(), ) fill_events.append(fill)关键在execution_price()是委托给订单实现的所以想改成交假设改订单类而不是引擎。TWAP 成交价为什么不含冲击OrderTWAP的成交价就是窗口内价格 fixings 的简单均值——它假设你的量不会影响价格这正是回测好看、实盘打折的来源之一。# gs_quant/backtests/order.py L87-L93def _execution_price(self, data_handler): if self.executed_price is None: fixings data_handler.get_data_range( self.window.start, self.window.end, self.instrument, ValuationFixingType.PRICE) # 窗口内全部成交价 self.executed_price np.mean(fixings) # 简单均值 零冲击假设 return self.executed_price 可扩展方向继承 OrderTWAP 覆写_execution_price加上impact_factor * quantity / ADV一类的冲击项同文件的OrderTwapBTICL208-L216就是现货价 BTIC 均价的定制例子。交易成本模型从哪里注入走服务端回测时成本不走成交价而是走独立的成本模型TradingCosts分 entry/exit 两边各支持 Fixed / Scaled / Aggregate 三种。# gs_quant/api/gs/backtests_xasset/response_datatypes/backtest_datatypes.py L299-L305class TradingCosts: entry: Union[FixedCostModel, ScaledCostModel, AggregateCostModel] # 开仓成本 exit: Optional[Union[FixedCostModel, ScaledCostModel, AggregateCostModel]] # 平仓成本在StrategySystematic里通过transaction_cost_config传入即可strategy_systematic.py L88。实操路径给 gs-quant 回测加上交易成本准备数据用 DataHandlergs_quant/backtests/data_handler.py确认标的在回测区间内价格序列完整TWAP 窗口里别出现空档定义订单选 OrderTWAP 并传入 TimeWindowgs_quant/backtests/core.py L43-L45本地回测中交易费用可另用 OrderCost 注入order.py L129配置成本模型服务端回测构造TransactionCostConfig(trade_cost_modelTradingCosts(entry..., exit...))运行回测StrategySystematic(underliers..., transaction_cost_config...).backtest(start, end)读取结果BacktestResult 的 portfolio 里逐日有 positions / transactions / cost 三类数据strategy_systematic.py L241-L267对比验证同一策略分别跑有成本与无成本两版看夏普与累计 cost 的差即为换手成本对绩效的侵蚀参数作用建议取值TimeWindow 起止TWAP 均价的采样区间覆盖一个完整交易日quantity单笔订单规模不超过该标的 ADV 的 5%entry / exit 成本模型每边固定或比例成本股票约 5-20bproll_frequency再平衡滚动频率与策略调仓周期一致months_per_batchschedule_reports 历史报告分批粒度3-6 个月避坑与调优⚠️误区用 OrderAtMarket 按收盘价成交冲击全部留在结果之外 → 改用 TWAP 窗口 成本模型或自定义_execution_price叠加冲击项⚠️误区拿 months_per_batch 当订单拆分工具降冲击——它只是报告调度粒度portfolio_manager.py L131-L163→ 拆单靠 TimeWindow 窗口长度或多笔小额 TWAP⚠️误区OrderCost 的成交价恒为 0就以为成本没生效order.py L141-L144→ 成本通过 quantity 进现金流看 BacktestResult 的 cost 字段验证⚠️误区自定义订单只覆写_execution_price却改了数量口径导致 filled_price × filled_units 的名义金额对不上 → 价格与数量必须同源一致延伸阅读gs_quant/documentation/04_backtesting/ —— 官方回测教程与示例 notebookgs_quant/backtests/order.py —— 四种订单实现的完整源码gs_quant/content/events/00_gsquant_meets_markets/02_optimizing_equity_trading/ —— 股票交易优化与流动性成本的材料gs_quant/markets/portfolio_manager.py —— 组合报告分批调度实现下一步挑一个你现有策略先把 entry/exit 成本各加上 10bp 跑一版看换手成本能吃掉多少年化收益。【免费下载链接】gs-quantPython toolkit for quantitative finance项目地址: https://gitcode.com/GitHub_Trending/gs/gs-quant创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表