ARTICLE DETAIL

资讯详情

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

【ptrade】网格交易 回测实录

【ptrade】网格交易 回测实录 05_网格交易 · 回测实录单标的沪深300ETF5格网格每格3%跌一格买一份、涨一格卖一份。策略类型震荡策略 / 网格回测批次2026-10-06本地 QuantStudio 回测引擎数据来源QuantStudio 本地行情库etf_daily/stock_daily一、策略思路网格交易是震荡市神器这一说法的原型。做法很机械先取沪深300ETF近60日收盘价的中位数当基准线上下各设5格、每格3%共11档价格首次运行时先建一半仓位的底仓保证手里有货可卖此后价格每跌破一格就买入一份约总资金的10%每涨过一格就卖掉持仓的20%。它不判断趋势、不预测方向只希望价格在区间内来回震荡好让它一格一格地把价差收进口袋。关键参数参数取值SECURITY510300.SSGRID_COUNT5GRID_PCT0.03BASELINE_LOOKBACK60EXPOSURE0.95二、回测设置项目设置策略文件05_网格交易.py回测区间2022-01-01 ~ 2026-09-01初始资金99999 元佣金费率0.0最低 5.0 元印花税率0.001过户费率1e-05滑点0.0撮合价格close基准000300交易日数1130三、回测结果这张图要看两件事一是净值曲线长期是平的还是向下的。本窗口的结果是略微亏损-3.09%——在一段既有大涨也有大跌的四年半里都赚不到钱说明震荡套利的收益被单边行情和交易摩擦吃掉了。二是回撤图中的坑网格策略的坑通常是缓慢加深、然后长期不回填的那种本图正是如此。绩效指标指标数值累计收益-3.09%年化收益-0.69%最大回撤17.52%年化波动率6.97%夏普比率-0.550索提诺比率-0.741卡玛比率-0.039回合胜率55.86%日胜率51.42%盈亏比79.3%盈利回合数81亏损回合数64平均持仓天数48.0成交笔数292「盈亏比」 平均盈利 ÷ 平均亏损 100%表示平均每笔赚的比亏的多。「回合」指一次完整的买入→卖出round_trips「成交笔数」是买卖双方分开计数的原始成交记录条数。注上表「盈利/亏损回合数」为引擎口径合计 145 笔其中包含回测末日尚未平仓的持仓「交易明细」中按已平仓成交统计的回合数为 142 笔。两者不影响收益率与回撤仅统计范围不同。⚠️本窗口基准数据不完整引擎的基准序列尾部为占位填充值据此算出的沪深300收益为 0.00%该数字不可信净值图中的基准曲线已截断至有效区间至 2026-07-31。因此本策略的α、β、超额收益、信息比率等相对指标一律不可引用只能用绝对收益与回撤来判断。分年度收益年份区间收益交易日2022-12.59%2422023-3.27%24220243.95%24220259.83%24320261.35%161四、交易明细完整交易回合数142个盈利 78 / 亏损 64单笔平均盈亏-40.18 元最大单笔盈利664.89 元最大单笔亏损-6966.51 元持仓天数平均48.0 天最长112 天最短1 天盈利最多的 5 个回合买入日卖出日标的盈亏(元)持仓天数2024-08-052024-09-27510300.SH664.89532024-07-302024-09-26510300.SH582.81582025-10-102025-11-06510300.SH561.35272025-09-042025-09-11510300.SH511.7472025-08-062025-08-22510300.SH495.4216亏损最多的 5 个回合买入日卖出日标的盈亏(元)持仓天数2022-01-282022-03-15510300.SH-6966.51462022-08-182022-11-01510300.SH-1084.48752022-08-032022-10-12510300.SH-995.93702022-01-052022-02-07510300.SH-880.15332022-01-142022-02-15510300.SH-737.8932五、完整回测代码文件名05_网格交易.py共 129 行引擎QuantStudio 本地回测全部为公开 API无平台专有调用。# -*- coding: utf-8 -*- 05_网格交易策略 (QuantStudio 本地回测版) 核心逻辑在固定价格区间内设置网格价格每下跌一格买入一份每上涨一格卖出一份。 震荡市神器单边市会被套牢或卖飞。 单标的沪深300ETF5格网格每格3%。 importnumpyasnp SECURITY510300.SSGRID_COUNT5# 网格数量GRID_PCT0.03# 每格幅度3%BASELINE_LOOKBACK60# 基准价回看天数EXPOSURE0.95definitialize(context):set_benchmark(000300.SS)g.baseline_priceNoneg.grid_levels[]g.last_grid_indexNonerun_daily(context,trade,time09:30)log.info(05_网格交易初始化: 标的%s, 格数%d, 每格%.0f%%,SECURITY,GRID_COUNT,GRID_PCT*100)def_calc_baseline(code):计算基准价60日收盘价中位数try:hget_history(BASELINE_LOOKBACK,1d,field[close],security_listcode,fqpre,includeFalse,is_dictTrue)ifhisNoneorcodenotinh:returnNoneclosesnp.asarray(h[code][close],dtypefloat)closescloses[np.isfinite(closes)]iflen(closes)20:returnNonereturnfloat(np.median(closes))exceptException:returnNonedef_get_current_price(code):获取当前价格用昨日收盘价代理日线模式下try:hget_history(1,1d,field[close],security_listcode,fqpre,includeTrue,is_dictTrue)ifhisNoneorcodenotinh:returnNoneclosesnp.asarray(h[code][close],dtypefloat)iflen(closes)0:returnNonereturnfloat(closes[-1])exceptException:returnNonedeftrade(context):# 每日重新计算基准价和网格baseline_calc_baseline(SECURITY)ifbaselineisNoneorbaseline0:returng.baseline_pricebaseline# 生成网格价格基准价上下各GRID_COUNT格g.grid_levels[]foriinrange(-GRID_COUNT,GRID_COUNT1):pricebaseline*(1.0i*GRID_PCT)g.grid_levels.append((i,price))current_price_get_current_price(SECURITY)ifcurrent_priceisNone:return# 确定当前价格在哪个网格current_index0foridx,priceing.grid_levels:ifcurrent_priceprice:current_indexidx# 首次运行记录当前网格ifg.last_grid_indexisNone:g.last_grid_indexcurrent_index# 初始建仓按当前网格位置建底仓posget_position(SECURITY)ifposisNoneorpos.amount0:# 底仓 总资金的50%target_valuecontext.portfolio.total_value*0.5order_target_value(SECURITY,target_value)log.info(网格初始建仓: 基准%.3f, 当前%.3f, 网格%d, 底仓%.0f,baseline,current_price,current_index,target_value)return# 网格变化下跌买入上涨卖出ifcurrent_indexg.last_grid_index:# 价格下跌买入grids_droppedg.last_grid_index-current_index cashcontext.portfolio.cashifcash1000:# 每下跌一格买入总资金的10%buy_valuecontext.portfolio.total_value*0.10*grids_dropped buy_valuemin(buy_value,cash*0.95)ifbuy_value100:order_value(SECURITY,buy_value)log.info(网格买入: 价格%.3f, 网格%d→%d, 买入%.0f,current_price,g.last_grid_index,current_index,buy_value)elifcurrent_indexg.last_grid_index:# 价格上涨卖出grids_risedcurrent_index-g.last_grid_index posget_position(SECURITY)ifposisnotNoneandpos.amount0:# 每上涨一格卖出持仓的20%current_valuepos.amount*current_price sell_valuecurrent_value*0.20*grids_rised sell_valuemin(sell_value,current_value*0.9)ifsell_value100:order_target_value(SECURITY,current_value-sell_value)log.info(网格卖出: 价格%.3f, 网格%d→%d, 卖出%.0f,current_price,g.last_grid_index,current_index,sell_value)g.last_grid_indexcurrent_indexdefhandle_data(context,data):pass六、风险提示这是本批里最需要警惕的一类。网格的收益结构是很多次小赚 一次大亏回合胜率高达55.9%但最大单笔盈利只有665元最大单笔亏损却有6967元——一次单边下跌就能吞掉十次盈利。更深层的问题在仓位方向上涨卖出后仓位越来越轻、下跌买入后仓位越来越重等于在下跌趋势里自动越亏越加仓与趋势跟踪的截断亏损正好相反。另外本回测的佣金费率被设为0只按每笔最低5元计四年半共1460元——由于本策略单笔金额小、笔数多最低5元其实比费率制更贵所以这次的亏损并非费用低估造成的真正的缺口在于未计入的冲击成本与滑点。免责声明本文所有数字来自本地历史回测回测收益不代表未来表现也不构成任何投资建议或个股/基金推荐。策略代码仅供研究学习实盘执行还需额外考虑滑点、冲击成本、流动性、涨跌停与平台差异等因素。投资有风险决策需谨慎。
返回列表