把“我的选股逻辑”写成买入规则:均线 / ADX / 突破怎么用

把选股逻辑写成买入规则,就是把“站稳均线再进”“放量突破就买”这类语感,翻译成机器能逐条判定的条件:选一个指标、一个比较符、一个阈值,再用 AND / OR 把多个条件组合起来。写清楚之后,规则才能回测、才能每天自动扫描,也才能在你情绪最差的时候替你守纪律。本文用一张翻译表和一个算得出来的例子,把这件事讲透。

本文要点

  • 一条可执行的规则只有三部分:指标、比较符、阈值。写不出这三样,说明你的逻辑还停在感觉层面。
  • 均线看方向、ADX 看趋势强弱、突破看动量是否启动,三类条件解决三个不同的问题,常常需要搭配使用。
  • AND 让规则更严、信号更少;OR 让规则更宽、信号更多。先用 AND 搭骨架,再谨慎用 OR 补充。
  • 每条买入规则都必须配一条退出规则,否则回测结果无从谈起,实盘也没有出口。
  • 规则写完先回测,再放进每日扫描,不要直接上真钱。

为什么“语感”不能直接用

“看起来要涨了”“这波应该稳了”——这些判断在盘中往往是对的,但它们有两个致命问题。第一,无法验证:你没法回到过去 300 个交易日,逐日问自己“当时看起来要涨吗”。第二,无法复现:今天觉得“稳了”的标准,和上个月、和你亏钱之后的标准,大概率不一样。

规则化的意义就是把标准固定下来。固定之后你才能回答三个问题:这条逻辑历史上灵不灵?一年会触发几次?触发之后我应该在哪里出?

三类最常用的技术条件

均线:判断方向。 价格在 20 日均线之上,说明短期偏多;MA20 在 MA50 之上,说明中期趋势向上。均线的好处是简单、直观,缺点是滞后,行情走了一段才会确认。

ADX:判断趋势强弱。 ADX 不管方向,只测量趋势有多强。高于 25 通常代表有值得跟的趋势;低于 20 多半是震荡,这时候的突破很容易变成假突破。ADX 最适合做“过滤器”,而不是单独的买入理由。详见用 ADX 过滤假突破。

突破:判断动量是否启动。 收盘创 20 日新高,常常是资金开始进场的信号。单看突破噪音很大,所以经常要配上成交量(量比 20 日均量)和 ADX 一起用。如果你不想追太高,可以用距 20 日高的百分比把入场位限制在高点附近的小区间里。

三者的关系可以这样记:均线告诉你“往哪边站”,ADX 告诉你“值不值得站”,突破告诉你“现在是不是该动了”。

翻译表:嘴上说的话 → 指标和阈值

下面这张表把常见的口头逻辑翻译成 Stock Compass 里的指标 id 和阈值。阈值只是常见起点,不是标准答案,回测之后要按你的市场和股票池调整。

你嘴上说的翻译成条件说明
“站稳 20 日线”price_vs_ma20 > 0 AND days_above_ma20 >= 3不只是站上,还要连续站住几天
“放量突破”is_20d_breakout == 1 AND vol_vs_avg20d > 1.5创 20 日新高,且成交量是 20 日均量的 1.5 倍以上
“趋势明确”adx_14 > 25 AND ma20_above_ma50 == 1趋势有强度,而且方向向上
“别追太高”pct_from_high_20d >= -6 AND return_5d < 10离高点不远,但最近 5 天没有暴涨
“别在财报前进”days_to_next_earnings > 5距下次财报至少 5 个交易日
“大盘配合”market_index_vs_ma50_pct > 0所在市场指数在自己的 50 日线之上
“别接飞刀”ma20_slope_5d_pct > 020 日线最近 5 天是向上的

写表的时候有一个检验标准:每一格是否都能让一台没有感情的机器在收盘后给出“是”或“否”。做不到,就还要再拆。

AND 收窄,OR 放宽

AND 的意思是“全部满足才算”。每多一个 AND 条件,符合条件的股票就少一批,信号变少、但每个信号背后的理由更充分。OR 的意思是“满足任意一个就算”。每多一个 OR 分支,信号就多一批,覆盖面更广、但质量更参差。

举个假设的场景:你的股票池有 200 只。“是 20 日突破”可能一天筛出 15 只;再 AND 上“量比 > 1.5”,可能剩 6 只;再 AND 上“ADX > 25”,可能只剩 2 只。反过来,如果你把“20 日突破”和“RSI < 35 反弹”用 OR 连起来,一天可能出 20 多只,但里面混着两种完全不同的行情。

Stock Compass 的规则结构正是这两层:组内条件用 AND(innerOp),组与组之间用 OR(outerOp)。一个实用的习惯是:一个组只表达一种入场逻辑,把所有必要条件用 AND 写全;如果你真的有两套不同的入场逻辑,就写成两个组,用 OR 并列,回测时分别看它们各自的表现。

一个算得出来的例子

假设某只美股上周四收盘 52.40 美元,之前 20 个交易日的最高收盘价是 51.80 美元,所以 is_20d_breakout == 1。当天成交量 320 万股,20 日均量 190 万股,vol_vs_avg20d = 320 / 190 ≈ 1.68,大于 1.5。20 日均线在 49.50 美元,price_vs_ma20 = (52.40 − 49.50) / 49.50 ≈ 5.9%。ADX 读数 28,MA20 高于 MA50,距下次财报 23 天,指数在 50 日线上方 2.1%。所有买入条件同时满足,规则触发。

接着算退出和仓位。你的退出规则之一是“浮亏超过 6% 就走”,对应止损位 52.40 × (1 − 0.06) ≈ 49.26 美元,恰好在 20 日均线下方一点,逻辑上说得通。账户 10 万美元,单笔愿意承担的风险是 1%,即 1,000 美元。每股风险 52.40 − 49.26 = 3.14 美元,可买股数 1,000 / 3.14 ≈ 318 股,取整 300 股,仓位金额 300 × 52.40 = 15,720 美元,约占账户 15.7%。

这一段的每个数字你都能用计算器验算。这就是“可执行”的含义:规则触发、止损位、股数,三个数在下单前就已经确定,而不是在盘中临时拍脑袋。仓位的算法详见按风险算仓位。

每条买入规则都要配一条退出规则

只有买入规则的策略是不完整的。原因很直接:回测需要知道每笔交易在哪里结束,否则算不出收益、回撤和胜率;实盘更需要知道,因为亏钱的时候你最没有能力临场做决定。

退出规则通常有三种来源,可以用 OR 并列:

  1. 风险止损:floating_loss_pct > 6,买入理由还在但价格证明你错了。
  2. 逻辑失效:price_vs_ma20 < 0 且 holding_days >= 10,当初“站稳均线”的理由已经不成立。
  3. 事件回避:days_to_next_earnings <= 2,如果你不打算持股过财报。

把买入和退出写成一对,你还能反过来检验买入规则的合理性:如果退出条件动不动就触发,说明入场位本身选得太激进。止损和止盈的具体写法见止盈止损规则怎么定。

在 Stock Compass 里怎么设

下面是上文例子对应的完整策略,买入一组、退出三组。你可以在策略编辑器里逐条添加,也可以直接粘贴这段 JSON。

{
  "name": "放量突破 + 趋势过滤",
  "market": "us",
  "rules": {
    "buy": {
      "v": 2,
      "outerOp": "OR",
      "groups": [
        {
          "innerOp": "AND",
          "conditions": [
            { "indicator": "is_20d_breakout", "operator": "==", "value": 1 },
            { "indicator": "vol_vs_avg20d", "operator": ">", "value": 1.5 },
            { "indicator": "adx_14", "operator": ">", "value": 25 },
            { "indicator": "ma20_above_ma50", "operator": "==", "value": 1 },
            { "indicator": "days_to_next_earnings", "operator": ">", "value": 5 },
            { "indicator": "market_index_vs_ma50_pct", "operator": ">", "value": 0 }
          ]
        }
      ]
    },
    "add": { "v": 2, "outerOp": "OR", "groups": [] },
    "trim": { "v": 2, "outerOp": "OR", "groups": [] },
    "exit": {
      "v": 2,
      "outerOp": "OR",
      "groups": [
        {
          "innerOp": "AND",
          "conditions": [
            { "indicator": "floating_loss_pct", "operator": ">", "value": 6 }
          ]
        },
        {
          "innerOp": "AND",
          "conditions": [
            { "indicator": "price_vs_ma20", "operator": "<", "value": 0 },
            { "indicator": "holding_days", "operator": ">=", "value": 10 }
          ]
        },
        {
          "innerOp": "AND",
          "conditions": [
            { "indicator": "days_to_next_earnings", "operator": "<=", "value": 2 }
          ]
        }
      ]
    }
  }
}

买入组(全部满足):

  • is_20d_breakout == 1:收盘创 20 日新高。
  • vol_vs_avg20d > 1.5:成交量至少是 20 日均量的 1.5 倍。
  • adx_14 > 25:趋势强度足够。
  • ma20_above_ma50 == 1:中期方向向上。
  • days_to_next_earnings > 5:避开财报前一周。
  • market_index_vs_ma50_pct > 0:大盘在 50 日线上方。

退出组(任一满足):

  • floating_loss_pct > 6:浮亏超过 6%,风险止损。
  • price_vs_ma20 < 0 AND holding_days >= 10:持有超过 10 天后跌回 20 日线下方,逻辑失效。
  • days_to_next_earnings <= 2:财报前两天离场。

保存后先跑回测,看触发次数、胜率和最大回撤是否在你能接受的范围。确认之后再把策略挂到每日扫描,系统会在收盘后告诉你哪些股票满足了你自己写的条件——它扫描的是你的规则,不是在推荐股票。

常见错误

  • 只写买入,不写退出。 没有退出的策略回测不了,实盘也没有出口。
  • 阈值照抄别人的。 ADX 25、量比 1.5 只是常见起点,不同市场、不同波动率的股票需要不同的阈值。
  • 条件堆得太多。 六七个 AND 叠在一起,一年可能只触发两三次,回测样本太少,结论不可信。
  • 把 OR 当作“保险”。 把互不相关的入场逻辑用 OR 连起来,只会让你分不清到底哪一套在赚钱。
  • 写完就上真钱。 规则写出来只是第一步,回测通过才是可以试用的最低门槛。

小结

把选股逻辑写成买入规则,本质是把每一个“感觉”换成“指标 + 比较符 + 阈值”。均线判方向、ADX 判强度、突破判启动;AND 收窄、OR 放宽;每条买入配一条退出。能写清楚就能回测,能回测才知道这套逻辑值不值得你用真钱去执行。

常见问题

均线、ADX、突破,该用哪个?

它们解决不同问题:均线判方向、ADX 判趋势强弱、突破判动量是否启动。趋势策略常把三者组合,例如 MA20 高于 MA50 且 ADX > 25 且创 20 日新高。先选一个回答你真正在问的那个问题的指标,再把其他的当过滤器加上。

指标越多越好吗?

不是。每多一个 AND 条件就少一批信号,过了某个点回测样本太少,结论就不可靠了。先用 2–3 个核心条件回测,只有当结果里能看到某个具体的失败模式时,再加一个针对它的过滤器。

ADX > 25、量比 1.5 这些阈值是怎么来的?

它们是常见的经验值,不是定律。一只低波动的大盘股和一只每天波动 5% 的小盘股,合理的阈值不会一样。把本文的数字当起点,然后在回测里试试把阈值小幅移动,看结果是否剧烈变化;如果是,说明这条规则很脆弱。

退出规则能不能等进场之后再想?

可以,但那时你是在最糟糕的条件下做决定:真钱在场上,屏幕上是浮亏。买入和退出一起写,回测才有可能进行,因为回测必须知道每笔交易在哪里结束。从第一天起就把它们配成一对。

同一条规则能同时用在港股、美股、A 股吗?

结构可以照搬,阈值通常不能。不同市场的成交量特征、日常波动幅度和财报日历都不一样,在美股上调好的规则拿到港股或 A 股之前应该重新回测。Stock Compass 允许每个策略单独设定市场,这样每个市场可以有自己的阈值。