资讯详情

资讯详情

如何用 Python 回测抛物线 SAR 翻转策略?

一句话回答SARStop And Reverse天生是「翻转」信号——价格升破 SAR 做多、跌破 SAR 平仓A 股无法裸做空只做多头段。用 AlphaFeed 取回前复权日线算 SAR用「当日出信号、次日开盘成交」避免未来函数扣手续费几十行就能回测出收益、最大回撤与交易次数并和买入持有对比检验它值不值。为什么会有这个问题 / 传统做法的痛点SAR 常被当「移动止损 趋势跟踪」用但「按 SAR 翻转做多做空到底赚不赚钱」要回测验证。两个常见错误一是未来函数当日出信号用当日收盘价成交实际做不到二是忽略 A 股限制与手续费不能裸卖空、换手有成本。正确做法前复权价算 SAR、次日开盘成交、只做多头段、扣费、对比基准。分步骤解决每步配可运行代码第 1 步取前复权日线并计算 SARfromalphafeedimportAlphaFeedimportpandasaspd afAlphaFeed()# 读取 ALPHAFEED_API_KEYdfaf.klines.get(600519.SH,period1d,count500,adjustforward,to_dataframeTrue)dfdf.sort_values(trade_date).reset_index(dropTrue)defparabolic_sar(high,low,af_step0.02,af_max0.20):highhigh.to_numpy();lowlow.to_numpy();nlen(high)sar[0.0]*n;trend_upTrue;afaf_step;ephigh[0];sar[0]low[0]foriinrange(1,n):prevsar[i-1];sar[i]prevaf*(ep-prev)iftrend_up:sar[i]min(sar[i],low[i-1],low[max(i-2,0)])ifhigh[i]ep:ephigh[i];afmin(afaf_step,af_max)iflow[i]sar[i]:trend_upFalse;sar[i]ep;eplow[i];afaf_stepelse:sar[i]max(sar[i],high[i-1],high[max(i-2,0)])iflow[i]ep:eplow[i];afmin(afaf_step,af_max)ifhigh[i]sar[i]:trend_upTrue;sar[i]ep;ephigh[i];afaf_stepreturnpd.Series(sar,indexrange(n))df[SAR]parabolic_sar(df[high],df[low])第 2 步生成多空信号 → 次日开盘成交避免未来函数# 收盘价在 SAR 上方多头持有下方空仓A 股不裸做空df[long](df[close]df[SAR]).astype(int)df[position]df[long].shift(1).fillna(0)# 当日信号次日才持仓第 3 步按次日开盘价 手续费计算净值FEE0.0013# 单边约 0.13%佣金印花税近似df[open_ret]df[open].pct_change().shift(-1)# 持仓吃 t→t1 开盘间收益df[trade]df[position].diff().abs().fillna(0)# 换手建仓/平仓df[strat_ret]df[position]*df[open_ret].fillna(0)-df[trade]*FEE df[equity](1df[strat_ret]).cumprod()df[bench](1df[close].pct_change().fillna(0)).cumprod()# 买入持有基准第 4 步输出绩效并与买入持有对比defstats(equity,rets):totalequity.iloc[-1]-1cagrequity.iloc[-1]**(252/len(equity))-1dd(equity/equity.cummax()-1).min()returntotal,cagr,dd t_s,c_s,d_sstats(df[equity],df[strat_ret])t_b,c_b,d_bstats(df[bench],df[close].pct_change())tradesint(df[trade].sum()//2)print(fSAR策略 收益{t_s:.2%}年化{c_s:.2%}回撤{d_s:.2%}交易{trades}次)print(f买入持有 收益{t_b:.2%}年化{c_b:.2%}回撤{d_b:.2%})关键参数参数含义本文取值af_step/af_maxSAR 加速因子步长/上限0.02 / 0.20FEE单边手续费0.0013成交时点避免未来函数次日开盘方向A 股只做多头段空仓代替做空关键坑与注意事项避免未来函数信号当日收盘出现必须次日开盘成交本文用position.shift(1)实现。A 股不能裸做空SAR 翻空时用「空仓」代替做空别把做空收益算进去。手续费必扣SAR 在震荡市翻转频繁忽略费用会严重高估单边 0.13% 仅为近似按实际佣金调整。前复权价未复权价在除权日让 SAR 与收益都失真。震荡市被反复打脸SAR 是趋势工具横盘时频繁翻转、交易成本高可用 ADX 过滤无趋势阶段。单标的≠有效应在多只、多区间验证避免过拟合与幸存者偏差本文为简化模型未完全模拟 T1、涨跌停无法成交等。常见问题FAQQ为什么不按当日收盘价成交A当日收盘才算出信号用当日收盘价成交是未来函数。用次日开盘价才真实可执行。QSAR 翻空为什么不做空AA 股个股无法裸做空融券成本高、标的有限所以翻空时用空仓代替只赚多头段。QSAR 策略一定跑赢买入持有吗A不一定。趋势强的品种/区间 SAR 能控回撤震荡市则因频繁交易而跑输。回测对比才有结论。Q需要付费吗A单只历史日线有免费额度多标的批量回测klines.batchuniverses需 Starter 及以上。详见定价页。小结SAR 翻转策略回测的关键在严谨性前复权价算 SAR、次日开盘成交避免未来函数、A 股只做多头段、扣手续费、和买入持有对比。用 AlphaFeed 取回前复权日线几十行 Python 就能客观检验这套经典趋势跟踪信号在具体品种上到底值不值。参考AlphaFeed Python SDK 文档https://docs.alphafeed.org/zh-Hans/sdk/python-quickstartAlphaFeed 官网https://alphafeed.org/
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →