量化群都在偷用的SAR指标,我把微盘股指数改成了分钟级,结果有点东西……

0 阅读10分钟

别再只知道日线了!微盘股分钟级择时,可能是下一片蓝海

最近量化群里风向有点微妙——前阵子还满屏“小市值轮动”、“微盘股增强”,这阵子突然冒出不少人在聊 ** SAR指标 ** 。有人说用它做风控择时效果炸裂,也有人嗤之以鼻说“抛物线转向早就过时了”。

我扒了几个群友发出来的曲线图,嘿,底部和顶部标记的好好的,还真像那么回事。但仔细一看,大部分人还在用 ** 日线 ** 做微盘股指数择时,日内波动基本被平滑掉了。

微盘股这玩意儿,日内的急涨急跌你吃得消吗?日线信号出来的时候,可能已经滑了三个点,滞后太多,不利于量化策略使用,实际量化策略使用盘中120分钟内最适合风控等操作。

** 所以我把同花顺883418(微盘股指数)的复刻代码改了一版——支持任意分钟频率,顺手把SAR指标也塞了进去。 ** 今天就把这套代码和实测思考分享出来,是骡子是马,拉出来遛遛。


一、微盘股指数:量化的“圣杯”还是“巨坑”?📊

先给不熟的朋友科普一下: ** 同花顺883418 ** 俗称微盘股指数,成分股是市值最小的 ** 400只票 ** (剔除ST、退市、北交所、科创板),每日调仓,等权编制。

这玩意儿过去两年吊打沪深300,年化收益接近 ** 40% ** ,但回撤起来也是爹妈不认——2024年那波小微盘流动性危机,一个月跌了 ** 30%+ ** 。

所以我一直觉得: ** 裸多微盘股就是送人头,必须加上择时风控。 **

而 ** SAR(抛物线转向) ** 的特点恰好适合做趋势跟踪——它会给出一根“止损线”,价格在线上一路持有,一旦跌破就翻空。参数简单,没有未来函数,对参数不敏感,简直就是微盘股这种高波动品种的 ** 天然风控器 ** 🎯


二、代码核心改动:从日线到分钟级,不是简单的“改个参数” ⚙️

原始社区版代码只支持日线回测,我主要干了 ** 三件事 ** :

1️⃣ 底层数据拉取支持任意分钟频率(60m/30m/15m/120m)

** 关键逻辑: **

  • 日内每一根K线,都需要知道每个成分股的**“上一根收盘价” ** ——如果是当日第一根,就用 ** 昨日日线收盘**;否则用上一根分钟的收盘。

  • 然后按等权权重,加权计算指数当根K线的开高低收。

# 逐根合成示例 idx\_open = prev\_index\_close \* sum( (open/prev\_close) \* weight ) idx\_close = prev\_index\_close \* sum( (close/prev\_close) \* weight )

这样就能保证每一根分钟K线都是 ** 可交易、无未来 ** 的真实指数线。

2️⃣ 加入自适应缓存(频率区分)

不同频率的指数计算结果是 ** 完全不同的数据 ** (因为分钟K线合成路径依赖),所以我给缓存key加上了 frequency 参数,避免60m和30m串数据。首次运行后,下次直接秒出。

3️⃣ 集成了SAR计算和可视化

直接调用 calc_psar ,在K线图上把SAR点画出来。 ** 红点代表多头趋势,绿点代表空头 ** ——一眼就能看出啥时候该跑路。


三、实测:60分钟级别的微盘股指数长啥样?📈

我用代码跑了一段 ** 2026‑03‑15 到 2026‑05‑19 ** 的60分钟K线(频率= 60m ),参数:

  • 成分股数量n=400
  • 流动性过滤:过去20日日均成交额≥2000万,有效交易天数≥12天
  • 剔除ST、8开头、4开头
    对比了同花顺,完全一致。
    结果画出来的图长这样(部分截图):

🖼️ [图片:60分钟K线+SAR点示意图]

** 说几个肉眼看到的: **

  1. ** 分钟K线的波动比日线剧烈得多 **
    日内经常出现2%以上的实体阴线,而日线可能只是一根小阴。如果你只在日线级别做风控,这些日内亏损是硬吃的。说白了,日线反应太慢,等你看到信号,黄花菜都凉了。

  2. ** SAR的转向点非常密集 **
    在高波动的微盘股环境下,60分钟SAR可能一个月给出5‑6次多空切换信号。 ** 这不一定是坏事 ** ——宁可多交点手续费,也别一次亏20%。做量化的都懂,活着比什么都重要。

  3. ** SAR空头信号时,指数确实进入主跌段 **
    比如4月中旬那波,SAR连续绿点,指数从高位回撤约7%。如果等日线SAR翻绿,估计到4月底了,那时候已经跌傻了。


补充:这套代码到底怎么用?(附实战操作指南)🛠️

看到很多朋友留言问:“代码跑通了,但具体怎么下单?能不能用在个股上?”
我把 ** 使用场景、规则、个股适配性 ** 一次性说清楚,不吹不黑。

一、核心定位:这不是一个“选股策略”,而是一个“仓位风向标” 🧭

你跑出来的 df_60m 是 ** 微盘股指数 ** (类似大盘指数),而不是个股信号。
它的作用是告诉你: ** 当前整个微盘股板块的趋势强度 ** ,从而决定你应该重仓、轻仓还是空仓。

类比:你看天气预报决定带不带伞。指数SAR就是那个“24小时降雨概率”。

二、两种最有效的实战用法

✅ 用法1:择时(单独做一个ETF/一篮子微盘股策略)

如果你的策略基于固定池子(不一定是微盘池,要活学活用呀老铁们),例如以微小盘为池子,可以据此进行择时 ,可以直接根据指数SAR信号进行择时买卖。

** 规则示例(60分钟级别): **

  • ** 开多信号 ** :当前K线收盘价 > SAR值,且SAR趋势向上( sar_trend=1 ),并且 ** 连续满足2根K线 ** (过滤假信号)。
  • ** 平多/翻空信号 ** :收盘价跌破SAR值,且SAR趋势转为 -1 ,直接清仓。

⚠️ 实盘注意:60分钟信号每天可能出现1‑2次。建议在 ** 收盘前最后15分钟 ** 确认信号,次日开盘执行,避免盘中频繁交易。别问我怎么知道的,说多了都是泪。

`# 伪代码逻辑
if df\['sar\_trend'] == 1 and df\['close'] > df\['sar'] and atr\_ratio > 0.02:    
    position = 100%
elif df\['sar\_trend'] == -1 or df\['close'] < df\['sar']:    
    position = 0%
else:  position = position  # 持有不变`

其中 atr_ratio = ATR(20) / close ,当波动率过低(<2%)时停止交易,震荡市减少打脸。

✅ 用法2:风控层(配合你现有的日线微盘股轮动策略)

这是 ** 性价比最高的用法 ** ——不需要改动你原来的选股和日线调仓逻辑,只加一个**“紧急刹车”**。

** 操作流程: **

  • ** 日线层面 ** :你原有策略每天选股、等权买入(假设满仓)。
  • ** 盘中/盘后 ** :实时计算60分钟微盘股指数的SAR。
  • ** 风控规则 ** :
    • 如果60分钟SAR连续 ** 2根 ** 绿柱(空头趋势),盘中将仓位 ** 减半或清仓 ** 。
    • 如果60分钟SAR连续 ** 3根 ** 绿柱,清仓至0%。
    • 重新出现连续2根红柱后,恢复原仓位。

这样你既保留了日线选股的超额收益,又躲过了微盘股指数日内级别的急跌(比如2024年1月那波,60分钟SAR提前8小时给出离场信号)。实测能少亏不少。

三、个股能不能用SAR?——客观说:效果远不如指数 ❌

很多朋友会问:“那我能不能直接用这个SAR算个股,然后买卖茅台、宁德时代?”

** 答案:不推荐,原因有三。 **

1️⃣ 个股噪音太大,SAR会被震成筛子

微盘股指数是 ** 400只股票等权平均 ** ,个股的随机波动被平滑了。而单只个股随时可能因为一个公告、一个股东减持、甚至一个大户的买卖盘走出完全随机的走势。
实测:在沪深300成分股上跑60分钟SAR,胜率不足45%,年化夏普常为负。 ** 不是指标不好,是指数天然适合趋势跟踪,个股不一定。 **

2️⃣ 个股的“趋势”经常是庄家画出来的

SAR假设价格能真实反映供需,但在A股小盘股中,流动性差,几笔对倒就能改变技术形态。你会看到股价明明跌破SAR,第二天又大幅高开拉回——来回打脸。我当年就被这样玩过,气得摔鼠标。

3️⃣ 更好的个股替代方案

如果你非要给个股加趋势风控,建议用 ** 自适应移动平均(AMA) ** 或 ** Hull移动平均 ** ,对参数敏感度更低。或者改用 ** 日线SAR + 成交量确认 ** (放量跌破才止损)。

** 唯一例外 ** :市值大于200亿、日均成交额>5亿的流动性充裕个股,60分钟SAR有一定参考意义,但也要搭配RSI背离过滤。

四、最小化可行产品(MVP)代码示例 💻

假设你在聚宽研究环境已经跑通了指数,下一步如何在回测中使用信号?

# 假设你已经有了 df\_60m(包含 close, sar, sar\_trend)# 每天下午14:45获取最新一根60分钟线的信号

def get\_sar\_signal(current\_time):    
# 找到当天最新的一根60分钟K线    
    latest = df\_60m\[df\_60m.index < current\_time].iloc\[-1]    
    if latest\['close'] > latest\['sar'] and latest\['sar\_trend'] > 0:        
        return 1    # 多头    
    elif latest\['close'] < latest\['sar'] and latest\['sar\_trend'] < 0:       
        return -1   # 空头    
    else:       
        return 0    # 震荡

# 在每日调仓函数中调用
signal = get\_sar\_signal(context.current\_dt)if signal == -1:   
# 清仓所有微盘股持仓   
    for stock in context.portfolio.positions:       
        order\_target(stock, 0)
elif signal == 1 and context.portfolio.positions\_value == 0:    # 重新买入原有选股列表(可加缓冲,避免频繁开仓)    buy\_stocks()

五、最后的忠告💡

  1. ** 不要直接照搬参数 **
    SAR的 step max_step 建议用过去2年数据做网格搜索,不同指数、年份的最优参数差异很大。别偷懒。

  2. ** 分钟级信号必须考虑交易成本 **
    微盘股印花税+佣金+滑点,一次全仓调仓成本约0.3%‑0.5%。如果60分钟SAR一个月给出10次信号,成本或吃掉3%‑5%——除非你的超额收益能覆盖。算不清账的建议先拿计算器按按。

  3. ** 先用模拟盘跑三个月 **
    这套代码最值钱的不是技术实现,而是让你在低风险环境下体验**“震荡市来回止损”**的心理折磨。真金白银上去之前,先看看自己扛不扛得住。

  4. 瑕不掩瑜,这个SAR指标对于一篮子股票或指数的确具有不错的效果,或可加入你的弹药库,减少你的策略曲线波动。


最后 🎁

免费的赞和 在看,是持续更新的动力。 后台回复‘SAR’获取源码。

_ 有问题评论区见——个股SAR踩过坑的也欢迎现身说法,一起吐槽。 _


** 风险提示: ** 本文仅作策略思路分享,不构成投资建议。量化交易存在重大亏损风险,请谨慎评估自身能力。别脑子一热就梭哈。