把“我的选股逻辑”写成买入规则:均线 / 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 > 0 | 20 日线最近 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 并列:
- 风险止损:floating_loss_pct > 6,买入理由还在但价格证明你错了。
- 逻辑失效:price_vs_ma20 < 0 且 holding_days >= 10,当初“站稳均线”的理由已经不成立。
- 事件回避: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 允许每个策略单独设定市场,这样每个市场可以有自己的阈值。