基于 Mark Minervini(马克·米内尔维尼),Trade Like a Stock Market Wizard: How to Achieve Super Performance in Stocks in Any Market(2013)
Mark Minervini(马克·米内尔维尼)是一位自学成才的交易者,在其职业生涯中将几千美元变成了数百万美元。他经过审计的业绩记录包括:
Minervini没有上过商学院,没有在华尔街工作过,也没有金融行业的人脉关系。他完全通过自学构建了自己的方法论——分析了数千张历史股票图表,阅读了他能找到的每一本市场书籍,并在近十年间系统性地记录了什么有效、什么无效,然后才实现了持续盈利。
SEPA是Minervini给他完整交易方法论起的名字。这个缩写反映了系统的核心重点:你进入交易的确切时点极其重要。SEPA不是笼统地寻找"好股票"——而是识别具有正确特征的股票最可能开始显著价格上涨的精确时刻。
SEPA将四个领域整合为一个统一的系统:
1. 基本面 — 公司的盈利、收入和利润率是否在加速增长?
2. 技术面 — 股票是否处于已确认的第二阶段上升趋势中,并有适当的底部形态?
3. 时机 — 股票是否处于或接近特定的低风险入场点(枢轴点)?
4. 风控 — 你能否设定一个将损失限制在预定小额范围内的止损?
四项必须同时对齐。基本面很好但处于第四阶段下跌的股票不是买入对象。图表完美但盈利恶化的股票不是买入对象。通过了所有筛选但没有可定义的低风险入场点的股票还不是买入对象——你等待。
Minervini研究了每一只在任何滚动两年期间内涨幅超过200%的股票,追溯到1880年代。这项覆盖了一个多世纪市场历史和数千只个股的研究揭示,超级绩效股票在它们做出最大涨幅之前呈现出一组惊人一致的特征:
核心洞见:你不需要预测哪些股票会成为超级绩效股。你需要识别它们在成为超级绩效股时展现的特征,并在正确的时间建仓。
大多数业余交易者问:"我能赚多少?"Minervini问:"我可能亏多少?"这个区别是根本性的。
每只股票都会经历四个不同的阶段。识别股票处于哪个阶段是交易者能够发展的最重要技能,因为它决定了你应该买入、持有、卖出还是完全回避该股票。
特征:
均线关系:
价格 ≈ 50日均线 ≈ 150日均线 ≈ 200日均线(全部聚集,持平或下降)
应该做什么:什么都不做。观察。不要买入。无法知道第一阶段会持续多久。它可能是6个月或6年。在这里买入是机会成本陷阱——即使你对公司的判断是"对"的,你的资金在等待期间也是死的。
特征:
均线关系:
价格 > 50日均线 > 150日均线 > 200日均线(全部向上趋势,正常排列)
应该做什么:这是你唯一应该买入的阶段。所有SEPA入场都发生在第二阶段。目标是在第二阶段当股票形成适当的底部形态(VCP)并从特定枢轴点突破时买入。
持续时间:对于最大的赢家,第二阶段上涨通常持续1-4年。在此期间,股票可能上涨100%到1000%或更多,期间穿插周期性的整理(底部),提供重新入场的机会。
特征:
均线关系:
价格围绕50日均线波动;150日和200日均线开始走平
均线开始聚合和纠缠(没有清晰的排列顺序)
应该做什么:卖出。如果你持有该股票,逢高卖出(进攻性卖出)。不要等到下跌开始。不要合理化——"它只是在回调。"识别见顶信号并保护你的利润。
特征:
均线关系:
价格 < 50日均线 < 150日均线 < 200日均线(全部下降,反向排列)
应该做什么:绝对什么都不做。永远不买入。永远不要试图"抄底"。永远不要试图接飞刀。第四阶段的股票在下跌,因为大型持有者正在清仓,你没有优势对抗那种卖压。最终股票可能形成一个第一阶段的底部——然后周期重复。
第三阶段:见顶
┌──────/\──────┐
/ / \ \ \
/ / \ \
/ / \ \
第二阶段:/ / (宽幅 \ \ 第四阶段:
上升期 / 波动 \ 下跌期
/ 震荡) \
/ \
/ \
────────────/ \──────────────
第一阶段:忽视/ 第一阶段:
积累期 下一个周期
(平坦、低量) 开始...
绝大多数业余交易者犯下两个灾难性错误之一:
在第四阶段买入("它很便宜,是捡便宜"):股票便宜是有原因的。它正在被知情投资者积极卖出。在这里买入就是站在火车前面。
在第三阶段买入("它一直在涨,会继续涨"):股票正在被那些在第一阶段积累的机构派发。你就是退出的流动性。
通过将所有购买限制在第二阶段——进一步限制在第二阶段内已形成适当底部的股票——Minervini在交易发生之前就消除了绝大多数亏损交易。
趋势模板是Minervini用于识别处于已确认第二阶段上升趋势的股票的量化筛选器。它是一个通过/不通过的检查清单:股票必须同时满足全部八项标准才能合格。没有部分分数。没有例外。没有自由裁量。
含义:股票的当前收盘价高于最近150个日收盘价的平均值。
重要性:150日均线代表中期趋势。如果价格低于此线,中期趋势是向下的,或充其量是在转换中。低于150日均线的股票要么处于第一阶段(筑底)、第三阶段(均线追赶的见顶)或第四阶段(下跌)。这些都不可买入。
实施说明:使用简单移动平均线(SMA),而非指数移动平均线。Minervini的历史研究是使用SMA进行的。
含义:股票交易在其长期趋势线之上。
重要性:200日均线是最广泛关注的股票长期趋势指标。机构投资者——拥有最多资金和对价格影响最大的参与者——密切关注这一水平。低于200日均线的股票,在广泛共识下处于长期下降趋势中。你是在逆流而行。
150日和200日共同作用:标准1和2一起确保股票高于其中期和长期趋势线。这是第二阶段上升趋势的最低条件。
含义:中期趋势强于(领先于)长期趋势。
重要性:当150日均线高于200日均线时,意味着股票更近期的价格行为(最近30周)始终高于其更长期的平均水平(最近40周)。这是趋势正在加速而非减速的结构性确认。如果150日低于200日,股票可能暂时高于两条均线——这是下降趋势中的反弹,而非真正的第二阶段上涨。
与"金叉"的关系:150/200日交叉在概念上类似于流行的50/200日"金叉",但Minervini使用150日是因为它过滤掉更多假信号,同时仍然足够早地捕捉第二阶段转换。
含义:200日均线本身(不仅仅是价格相对于它的位置)必须有正斜率。它必须已经上升至少20个交易日,理想情况下80-100+个交易日。
重要性:这是最积极过滤假第二阶段信号的标准。股票可以在200日均线之上而200日本身仍在下降——这通常发生在急剧的熊市反弹或更广泛下降趋势中的逼空期间。200日均线是滞后指标;通过要求它上升,你确保长期趋势已经真正转向。它上升的时间越长,上升趋势就越成熟和可靠。
如何评估"趋势向上":将当前200日均线值与1个月前(约20个交易日)的值进行比较。如果今天的值更高,则满足最低条件。对于理想的4-5个月门槛,与约100个交易日前的值进行比较。
含义:短期趋势领先于中期和长期趋势向上。
重要性:当50日均线叠加在150日均线之上,后者在200日均线之上(标准3涵盖了150/200关系),你就有了"正常排列"——健康、成熟的第二阶段上升趋势的标志:
正常排列(必须):
价格 > 50日均线 > 150日均线 > 200日均线
↑ ↑ ↑
短期 中期 长期
(最快) (中等) (最慢)
如果50日跌破150日,则表明短期动量正在衰减——股票可能正在过渡到第三阶段。这是一个早期预警。
含义:股票交易在其短期趋势线之上。
重要性:即使在第二阶段上升趋势中,交易在50日均线以下的股票也处于短期回调或修正中。虽然这在上涨过程中是正常和健康的,但此时不是建立新仓位的时候。Minervini希望在股票展示短期强势时买入——价格高于50日——理想地从一个VCP底部在新高附近或之处突破。
例外情况:在第二阶段期间回调到10周(50日)均线的股票在特定情况下可能提供潜在入场点,但Minervini的主要方法是在突破枢轴点时买入,这定义上发生在50日均线之上。
含义:(当前价格 - 52周低点) / 52周低点 >= 0.25
重要性:仅比52周低点高10%的股票可能仍处于第一阶段或早期过渡中。它尚未展示出表征第二阶段上涨的价格动量。25%的门槛确保股票已经展示了有意义的上行运动。
实践中,大多数超级绩效候选者在形成最佳底部时已经比52周低点高出100-300%或更多。 不要害怕"已经涨了很多"的股票。最大的赢家往往在其最佳入场点出现之前有最大的前期涨幅。
要避免的常见错误:许多交易者错误地相信涨了100%的股票"必须回来"。这是锚定偏差。超级绩效股票通常从第一阶段低点上涨500%、1000%或更多。25%的最低要求是下限,不是上限。
含义:(52周高点 - 当前价格) / 52周高点 <= 0.25
重要性:从52周高点下跌40%的股票可能处于第三阶段或第四阶段——它处于从峰值开始的下降趋势中。通过要求股票在高点的25%以内,Minervini确保股票展示相对强度,且交易在"新高区域"附近。越接近52周高点越好——在满足所有其他标准的同时创造新52周高点的股票是最强的候选者。
"底中底"概念:往往最好的设置是那些在创出历史新高10-15%以内、在窄幅范围(VCP)内整理后突破新高的股票。它们不是低于高点20-25%;它们是低于高点5-10%。
八项标准作为复合过滤器一起工作。任何单一标准都不够——许多下跌股票在熊市反弹期间会暂时满足8项中的4或5项。模板的力量在于同时要求全部八项,这消除了几乎所有假信号。
通常有多少股票通过? 在健康的牛市中,大约15-25%的股票可能通过全部八项标准。在熊市中,这个数字降至2-5%或更少。这是一个特性,不是缺陷。 当很少股票通过时,市场在告诉你环境是敌对的。增加现金。
趋势模板可以实现为程序化筛选器。每天收盘后,对全部股票范围运行筛选(所有具有足够流动性的NYSE、NASDAQ、AMEX股票——通常最低$10价格和100K平均日成交量)。输出是你的"合格范围"——结构上有资格买入的股票。从这个列表中,你然后寻找适当的底部形态(VCP)以识别具体的交易候选者。
VCP是Minervini对技术分析的标志性贡献。它是他通过研究数千只历史超级绩效股票而识别出的底部形态。VCP描述了在整理形态中供需如何转移以创造低风险、高回报入场点的具体方式。
在第二阶段上涨期间,股票会周期性地暂停整理。这种整理是必要和健康的——它使股票能够:
底部不是随机的横盘形态。在超级绩效股票中,底部展示了一个非常具体的结构:波动收缩形态。
VCP的定义特征是底部内每个连续的震荡显示:
这创造了一系列收缩——通常2-4次收缩(有时更多)——在视觉上像一个收紧的弹簧或漏斗。
VCP视觉图
价格
│
│ T1 (25%) T2 (12%) T3 (6%) T4 (3%)
│ ╱╲ ╱╲ ╱╲ ╱╲
│ ╱ ╲ ╱ ╲ ╱ ╲ ╱╲ ← 枢轴点
│ ╱ ╲ ╱╲ ╱ ╲ ╱╲ ╱ ╲ ╱╲ ╱
│╱ ╲ ╱ ╲ ╱ ╲ ╱ ╲╱ ╲ ╱ ╲╱
│ ╲ ╱ ╲ ╲╱ │ ╲╱ │
│ ╲╱ │ │ │ │ │
│ │ │ │ │ │ │
│ 第1次震荡 │ 第2次震荡 │ 第3次震荡│
│ │ │ │ 突破
│ 放量
└──────────────────────────────────────────────────────── 时间
成交量:
███████ ██████ ████ ██ ████████████
(高) (较少) (更少) (枯竭) (突破时激增)
典型收缩序列(以每次震荡高点的最大回撤百分比衡量):
| 收缩 | 典型范围 | 描述 |
|---|---|---|
| T1 | 20-35% | 上涨后的初始修正。这是最深的回调。 |
| T2 | 10-15% | 第二次收缩。明显浅于T1。 |
| T3 | 5-8% | 第三次收缩。非常紧密。弱手已被清洗。 |
| T4 | 2-4% | 最终收缩(如果存在)。几乎没有波动率了。 |
具体数字是指导方针,不是规则。 关键原则是每次后续收缩必须小于前一次。显示20% → 18% → 15%的形态不是VCP——没有有意义的收缩。显示25% → 12% → 6%的形态是VCP——每次震荡大约是前一次的一半(或更少)。
收缩波动率的含义:每次后续回调更小是因为卖家正在被耗尽。在T1中,许多持有者卖出——一些为了获利,一些出于恐惧。在T2中,更少的持有者愿意在这些价格卖出。到T3和T4,剩下的持有者几乎全是不卖出的强手机构。股票已从"弱手"(任何下跌都卖的人)转移到"强手"(积累和持有的人)。
这是整个系统中最重要的确认信号之一:
这样理解:VCP是挤干所有卖盘的过程。成交量枯竭是确认挤干完成。突破时的成交量激增是需求打入一个没有供给的市场。
枢轴点(也称"买入点")是股票从VCP形态突破的具体价格水平。它定义为:
枢轴点不是:
枢轴点是一个可精确识别的价格水平,当放量突破时,表明需求已压倒了最后剩余的供给,股票准备上涨。
实践中识别枢轴点:
并非所有底部都是平等的。Minervini跟踪"底部计数"——这是当前第二阶段上涨中的第几个底部:
第一阶段底部(最可靠)
第二阶段底部(仍然可靠)
第三阶段底部(需要谨慎)
第四阶段底部(高风险——一般应避免)
经验法则:底部计数越早,赔率越好。将资金集中在第一和第二阶段底部。对第三阶段底部要有选择性和谨慎。避免第四阶段底部。
VCP不仅仅是一个需要记忆的图表形态——它是股票供需动态根本性转变的视觉表现:
通过VCP的供需动态
T1(深度回调,高成交量):
供给 ████████████████ 许多持有者愿意卖出——获利了结、
需求 ████████ 恐惧、止损都在制造卖压。
T2(较浅回调,较少成交量):
供给 ██████████ 更少的卖家留在这个水平。
需求 ██████████ 买家开始匹配卖家(均衡)。
T3(紧密收缩,低成交量):
供给 ████ 几乎没人愿意在这个价格卖出。
需求 ████████████ 机构买家正在吸收剩余供给。
枢轴点突破(成交量激增):
供给 ██ 几乎没有供给。
需求 ████████████████ 需求激增。价格快速上涨,因为没有
卖家来吸收买入压力。
标准SEPA入场是:
成交量是不可协商的。 轻量突破是可疑的——它缺乏维持显著上涨所需的机构买入信念。当你看到一只股票从完美的VCP形态突破但成交量仅略高于平均水平时,放弃它。最好的突破以明确无误的成交量宣告自己。
口袋枢轴概念(由Gil Morales和Chris Kacher开发,Minervini采用)是一种可以在正式VCP枢轴点突破之前的替代入场:
口袋枢轴可以提供更早的入场和更紧的风险,但它们需要更多技能才能正确识别,成功率低于适当的VCP枢轴点突破。Minervini将它们视为补充性的而非主要的入场。
可买入的跳空高开是一个强大的入场信号,当股票在巨大成交量上大幅跳空高开时发生,通常由盈利超预期、新产品公告或其他基本面催化剂驱动。
可买入跳空高开的标准:
如何交易可买入的跳空高开:
为什么跳空高开有效:巨大成交量上的大幅跳空代表机构对股票认知的突然、戏剧性转变。大型参与者愿意比昨天收盘价多付很多来建立或增加仓位。这种需求水平通常标志着持续上涨的开始。
低位提前入场是一种在正式枢轴点突破之前稍早入场的技术,以获得更好的价格并降低风险:
优势:更紧的止损 = 每股更小的风险 = 更大的潜在仓位或更小的美元风险。更早入场 = 如果突破成功则更低的平均成本。
劣势:交易成功的概率较低(突破可能永远不会来)。需要更多经验和图表阅读技能。
Power Play是在重大基本面催化剂(通常是强劲的财报)之后形成的超紧密整理形态:
为什么Power Play有效:催化剂后的紧密整理告诉你,可以获利了结的股东选择不卖。尽管有大幅快速的涨幅,几乎没人在卖出。这是来自大型持有者最强烈的信念信号。
这是一个反直觉但关键的洞见:
枢轴点突破是市场证明买家处于控制地位的证据。没有那个证据,你只是在猜测。
Minervini在任何单笔交易中接受的绝对最大亏损是从入场价的7-8%。这是硬性规则——没有例外,没有合理化,没有期待反弹。
为什么是7-8%?
虽然7-8%是绝对最大值,但Minervini在执行良好的交易中的理想亏损仅为3-5%:
止损不是设在任意整数或固定百分比处。它们设在技术上有意义的水平,如果被突破,则表明设置已失败:
Minervini用"沙线"这个短语来描述你知道交易错误的具体价格水平:
除了基于价格的止损外,Minervini还使用基于时间的止损:
Minervini将卖出分为两类:进攻性卖出(逢高,锁定利润)和防守性卖出(逢低,保护资本)。
当股票从适当底部突破的枢轴点上涨20-25%时,至少部分获利:
为什么是20-25%? 历史研究表明,许多股票在从枢轴点上涨20-25%后回调或整理。通过在此获利,你捕获了最常见的涨幅并降低了不可避免的回调的敞口。
高潮见顶是股票上涨的最终、通常是戏剧性的衰竭。Minervini将这些信号识别为积极逢高卖出的理由:
当你同时看到两个或更多这些信号时,卖出你全部或大部分剩余仓位。不要等待反转。在狂热中卖出。
不可协商。当你预定的止损价位被突破时,你卖出。没有疑问。没有"再等一天"。没有"它会回来的"。止损存在的意义正是为了这个时刻。执行它。
在第二阶段上涨期间,50日(10周)均线作为关键支撑位:
如果股票出现自第二阶段上涨开始以来最大的单日跌幅(百分比),这是一个重大警告:
如果第三或第四阶段底部突破失败(股票突破后迅速反转并跌回枢轴点下方),立即卖出:
这是Minervini最具体和最强大的规则之一:
如果股票在突破后3周或更短时间内涨幅达到20%或以上,从原始入场日期起至少持有8周。
理由:
每笔交易都从同一个问题开始:"我可能亏多少?"
在考虑潜在利润之前,在甚至决定是否买入之前,你必须:
如果你无法定义一个将风险限制在可接受百分比内的合理止损位,就不要进行交易。等待更紧的设置。
仓位大小公式为:
仓位大小(股数)= 最大美元风险 / 每股风险
其中:
最大美元风险 = 组合价值 x 每笔交易最大风险%
每股风险 = 入场价 - 止损价
示例:
组合价值: $100,000
每笔最大风险: 1% = $1,000
入场价: $50.00
止损价: $47.00
每股风险: $50.00 - $47.00 = $3.00
仓位大小 = $1,000 / $3.00 = 333股
仓位价值 = 333 x $50.00 = $16,650(组合的16.65%)
关键洞见:仓位大小不是任意的,也不是基于确信程度。它是从你的风险承受能力和具体设置的风险特征数学推导出来的。止损紧的交易(每股风险小)自然产生更大的仓位。止损宽的交易产生更小的仓位。每笔交易的风险保持恒定;仓位大小进行调整。
Minervini推荐集中型组合:
集中需要信念和纪律。 你必须高度选择性——只有最好的设置才值得投入资金。而且你必须严格执行止损——集中仓位如果走势相反且不管理,可能造成重大损害。
组合风险敞口是组合在任何给定时间的总未平仓风险:
组合风险敞口 = 所有仓位的(每个未平仓仓位的美元风险)之和
每个仓位的美元风险 = (入场价 - 当前止损价) x 股数
最大组合风险敞口:总组合价值的20-25%。 这意味着如果每一个未平仓仓位同时触及止损,你将损失不超过组合的20-25%。
为什么这很重要:组合风险敞口是对相关性损失的防御。在市场崩盘中,所有股票都倾向于一起下跌。如果你的总未平仓风险是40%且每个止损都被触发,你失去组合的40%——一个毁灭性的回撤。通过将组合风险敞口控制在20-25%,即使是最坏情况(每个止损同时被触发)也让你保留75-80%的资本。
如果组合风险敞口接近最大值,不要增加新仓位。 等待现有仓位被止损出局(降低敞口)或上涨足够多以将止损提高到保本价(消除这些仓位的敞口)。
大多数业余交易者固执于胜率。Minervini关注的是平均盈利与平均亏损的比率:
期望值 = (胜率 x 平均盈利) - (败率 x 平均亏损)
示例1(Minervini风格):
胜率: 50% 平均盈利:15%
败率: 50% 平均亏损:5%
期望值: (0.50 x 15%) - (0.50 x 5%) = 7.5% - 2.5% = +5.0%/笔交易
示例2(典型业余者):
胜率: 70% 平均盈利:5%
败率: 30% 平均亏损:15%
期望值: (0.70 x 5%) - (0.30 x 15%) = 3.5% - 4.5% = -1.0%/笔交易
业余者"赢"得更频繁但会破产。SEPA交易者"输"了一半的时间但快速复利财富。你的盈利相对于亏损的大小比你赢的频率重要得多。
Minervini的基本面标准深受William O'Neil的CAN SLIM系统影响,但通过他自己的研究进行了改进。这些标准确保通过趋势模板的股票具有真正的商业质量,而不仅仅是技术动量。
即使最好的个股设置在下跌市场中也会以更高的比率失败:
派发日是主要指数(标普500或纳斯达克综合指数)在成交量高于前一天的情况下收低的日子。
在滚动基础上跟踪派发日。当它们聚集时,开始减少敞口。
跟进日(FTD)是市场修正可能结束和新上升趋势开始的信号:
跟进日应该做什么:
Minervini根据证据权重调整其市场敞口:
| 市场条件 | 目标敞口 | 行动 |
|---|---|---|
| 已确认的上升趋势,低派发,领先股票正在突破 | 80-100%投资 | 积极买入最好的设置 |
| 上升趋势承压(一些派发) | 50-80%投资 | 有选择性,收紧止损 |
| 不确定/混合信号 | 25-50%投资 | 只选最好的设置,小仓位 |
| 下降趋势/高派发/熊市 | 0-25%投资 | 主要或完全现金 |
现金不是"什么都不做"的仓位。现金是一个刻意的、战略性的配置:
最昂贵的错误。股票"看起来一直在涨",因为它确实涨了——但现在它正在被聪明钱派发给后来者。当一只股票出现在杂志封面和"最佳"列表上时,涨幅已经结束。
向亏损仓位加仓是SEPA教导的反面。如果股票在你入场后下跌,设置是错误的。向错误的设置添加更多股票只会使损害更严重。向上加仓,永远不要向下。 给赢家加仓,不是输家。
每个交易者都会有亏损。问题是亏损是5%(可控的)还是50%(灾难性的)。区别在于止损纪律。5%的亏损是商业费用。50%的亏损是终结职业的创伤。
对回吐利润的恐惧导致交易者在股票仍处于第二阶段上升趋势中时仅有适度收益就卖出。同时,他们持有亏损者期待恢复。这完全是本末倒置。快速砍掉输家;让赢家运行直到出现卖出信号。
持有20-30只股票意味着没有任何个别仓位能对回报产生重大影响。这也意味着你无法正确研究或监控每个仓位。有纪律的集中胜过无纪律的分散。
在熊市中积极交易就像迎着飓风航行。即使最好的股票也会被下跌的市场拖累。第一个过滤器始终是市场方向。如果市场是敌对的,留在现金中。
在不知道止损位、仓位大小和利润目标的情况下进入交易是赌博,不是交易。每次入场都必须附有完整的计划:在哪里进入,错误时在哪里退出,正确时在哪里获利。
市场不在乎你为股票付了多少钱。你的买入价格对你来说在心理上有意义,但对股票的未来走势完全无关。所有决策都基于股票当前的技术面和基本面状况,而不是你是否从入场价"盈利"或"亏损"。
买入已经超过枢轴点10-15%的股票意味着你的止损距离现在是15-20%或更多。这违反了最大亏损规则,并在股票回调时使你面临超额亏损。如果你错过了枢轴点,等待下一个底部形成。
等待"完美"的设置意味着你永远不交易。没有设置是完美的。你需要一个足够好的设置——满足所有标准——然后你需要执行。优势来自于多次交易的系统,而不是任何单一"完美"交易。
本节展示了一个从初始筛选到最终退出的完整假设交易,演示了SEPA流程的每个步骤。
每晚例行程序(收盘后):
识别出股票XYZ:
次日开盘前:
交易计划 — 股票 XYZ
═══════════════════════════════════════════
入场触发: 突破$49.50,成交量≥50日平均的140%
止损: $47.70(略低于T3低点$47.80)
每股风险: $49.50 - $47.70 = $1.80(从入场价3.6%)
组合价值: $100,000
每笔最大风险:1.0% = $1,000
仓位大小: $1,000 / $1.80 = 555股
仓位价值: 555 × $49.50 = $27,472(组合的27.5%)
利润目标1: $49.50 × 1.20 = $59.40(20%盈利——部分卖出)
利润目标2: 让剩余部分跟随移动止损运行
═══════════════════════════════════════════
第1天:XYZ以$49.80开盘,高于$49.50的枢轴点。到上午10:30成交量已经是50日平均的两倍。以$49.80买入555股。
实际每股风险:$49.80 - $47.70 = $2.10。实际美元风险:555 × $2.10 = $1,165.50(组合的1.17%)。略高于1%目标,但在可接受范围内。
第1周:XYZ周收盘$52.40。突破正在奏效。无需行动。止损保持$47.70。
第2周:XYZ周中达到$54.00,然后周五回调到$51.50。正常回调。止损保持$47.70。股票仍在50日均线之上。没有卖出信号。
第3周:XYZ在强劲财报后飙升至$59.50。股票3周内涨了19.5%。接近8周持有规则中的20%门槛。
决策点:XYZ接近3周内20%。如果达到20%($59.76),8周持有规则激活。股票周四达到$59.80——规则生效。从原始入场日期起至少持有8周。
第4-6周:XYZ在$57到$62之间整理。正常。将止损提高到保本价($49.80)。该仓位在剩余股票上现在是无风险的。
第7周:XYZ从迷你整理中放量突破到$64.50。这是一个潜在的加仓机会(股票正在第二阶段内形成新的VCP)。
第8周:8周持有期到期。XYZ在$65.00。现在重新评估:
第12周:XYZ达到$72.00。然后出现自突破以来最大的单日跌幅(4.5%),在大成交量上收于$68.80。这是高潮警告。
第13周:XYZ在高于平均80%的成交量上跳空低开跌破50日均线。连续两次收盘跌破50日均线。
卖出决定:多个防守性卖出信号——最大下跌日、放量收盘跌破50日均线、50日均线走平。以$66.50卖出剩余仓位。
交易总结 — 股票 XYZ
═══════════════════════════════════════════
入场: 555股 @ $49.80 = $27,639
退出: 555股 @ $66.50 = $36,907
毛利润: $9,268
回报率: 33.5%
持有期间: 13周
承担风险: $1,165(组合的1.17%)
回报/风险: $9,268 / $1,165 = 7.95:1
═══════════════════════════════════════════
该交易冒了约1%的组合风险,回报了组合的9.3%。这就是SEPA系统按设计运行的样子:小风险、管理仓位、明确的卖出规则,以及一个显著的盈利,足以补偿多次小亏损。
def trend_template_screen(stock):
"""
如果股票通过Minervini趋势模板的全部8项标准,返回True。
所有标准必须同时满足。
"""
price = stock.close
ma_50 = stock.sma(50)
ma_150 = stock.sma(150)
ma_200 = stock.sma(200)
ma_200_prev = stock.sma(200, days_ago=20) # 1个月前的值
high_52w = stock.high_52_week
low_52w = stock.low_52_week
# 标准1:价格高于150日均线
c1 = price > ma_150
# 标准2:价格高于200日均线
c2 = price > ma_200
# 标准3:150日均线高于200日均线
c3 = ma_150 > ma_200
# 标准4:200日均线至少上升1个月
c4 = ma_200 > ma_200_prev
# 标准5:50日均线高于150日和200日均线
c5 = (ma_50 > ma_150) and (ma_50 > ma_200)
# 标准6:价格高于50日均线
c6 = price > ma_50
# 标准7:价格至少高于52周低点25%
c7 = price >= (low_52w * 1.25)
# 标准8:价格在52周高点的25%以内
c8 = price >= (high_52w * 0.75)
return all([c1, c2, c3, c4, c5, c6, c7, c8])
def detect_vcp(stock, lookback_days=120):
"""
通过识别连续的幅度递减和成交量递减的震荡来检测波动收缩形态。
如果找到则返回带有枢轴点的VCP对象,否则返回None。
"""
swings = identify_swings(stock.prices[-lookback_days:])
if len(swings) < 2:
return None
# 计算每次震荡的收缩百分比
contractions = []
for swing in swings:
high = swing.high
low = swing.low
pct_contraction = (high - low) / high * 100
avg_volume = mean(swing.volumes)
contractions.append({
'pct': pct_contraction,
'volume': avg_volume,
'high': high,
'low': low
})
# 验证:每次后续收缩应该更小
is_contracting = True
for i in range(1, len(contractions)):
if contractions[i]['pct'] >= contractions[i-1]['pct']:
is_contracting = False
break
if contractions[i]['volume'] >= contractions[i-1]['volume']:
is_contracting = False
break
if not is_contracting:
return None
# 检查尾部的成交量枯竭
recent_volume = stock.average_volume(days=5)
avg_volume_50 = stock.average_volume(days=50)
volume_dried = recent_volume < (avg_volume_50 * 0.60)
if not volume_dried:
return None
# 识别枢轴点:最后一次收缩的高点
pivot = contractions[-1]['high']
return VCP(
pivot=pivot,
contractions=contractions,
base_low=min(c['low'] for c in contractions),
base_count=determine_base_count(stock),
volume_dry=True
)
def calculate_position(portfolio_value, entry_price, stop_price,
max_risk_pct=0.01, max_position_pct=0.25):
"""
基于风险参数计算仓位大小。
返回应买入的股数,如果风险超过限制则返回0。
"""
per_share_risk = entry_price - stop_price
risk_pct = per_share_risk / entry_price
# 如果每股风险超过8%则拒绝
if risk_pct > 0.08:
return 0
max_dollar_risk = portfolio_value * max_risk_pct
shares = int(max_dollar_risk / per_share_risk)
# 限制最大仓位大小
position_value = shares * entry_price
max_position_value = portfolio_value * max_position_pct
if position_value > max_position_value:
shares = int(max_position_value / entry_price)
return shares
def calculate_portfolio_heat(positions, portfolio_value):
"""
计算总未平仓风险占组合价值的百分比。
"""
total_risk = 0
for pos in positions:
per_share_risk = pos.current_price - pos.stop_price
# 如果止损高于入场价(保本或更好),风险为零
if per_share_risk <= 0:
risk = 0
else:
risk = per_share_risk * pos.shares
total_risk += risk
heat_pct = total_risk / portfolio_value
return heat_pct
def can_add_position(positions, portfolio_value, new_risk,
max_heat=0.25):
"""
如果增加新仓位会使组合风险敞口保持在可接受范围内,返回True。
"""
current_heat = calculate_portfolio_heat(positions, portfolio_value)
new_heat = current_heat + (new_risk / portfolio_value)
return new_heat <= max_heat
def check_sell_signals(position, stock, market):
"""
评估未平仓仓位的所有卖出条件。
返回触发的卖出信号列表及建议的行动。
"""
signals = []
# 防守性:止损触发
if stock.close <= position.stop_price:
signals.append(SellSignal(
type='STOP_LOSS',
urgency='IMMEDIATE',
action='SELL_ALL',
reason=f'价格 {stock.close} 突破止损 {position.stop_price}'
))
# 防守性:放量收盘跌破50日均线
if (stock.close < stock.sma(50) and
stock.volume > stock.average_volume(50) * 1.5):
signals.append(SellSignal(
type='BELOW_50MA_HEAVY_VOL',
urgency='HIGH',
action='SELL_OR_TIGHTEN',
reason='在150%+平均成交量上收盘跌破50日均线'
))
# 防守性:自上涨开始以来最大的下跌日
todays_decline = (stock.open - stock.close) / stock.open
if todays_decline > 0 and todays_decline >= position.max_decline_since_entry:
signals.append(SellSignal(
type='LARGEST_DOWN_DAY',
urgency='MEDIUM',
action='TIGHTEN_STOP',
reason=f'自入场以来最大跌幅({todays_decline:.1%})'
))
# 进攻性:达到20-25%利润
gain_pct = (stock.close - position.entry_price) / position.entry_price
if gain_pct >= 0.20 and not position.partial_profit_taken:
signals.append(SellSignal(
type='PROFIT_TARGET_1',
urgency='MEDIUM',
action='SELL_PARTIAL',
reason=f'20%+盈利({gain_pct:.1%})——部分获利'
))
# 进攻性:高潮见顶检测
if (stock.daily_range() >= position.max_daily_range * 1.5 and
stock.volume >= position.max_volume * 1.2 and
gain_pct > 0.50):
signals.append(SellSignal(
type='CLIMAX_TOP',
urgency='HIGH',
action='SELL_ALL',
reason='潜在高潮见顶——最大幅度 + 最高成交量'
))
# 时间止损:2-3周无进展
weeks_held = position.days_held / 5
if weeks_held >= 3 and gain_pct < 0.02:
signals.append(SellSignal(
type='TIME_STOP',
urgency='LOW',
action='REVIEW_POSITION',
reason=f'持有{weeks_held:.0f}周,盈利<2%'
))
return signals
def check_eight_week_hold(position, stock):
"""
实施8周持有规则:
如果股票在入场后3周内涨幅达到20%+,最少持有8周。
"""
gain_pct = (stock.close - position.entry_price) / position.entry_price
weeks_held = position.days_held / 5
if gain_pct >= 0.20 and weeks_held <= 3:
position.eight_week_hold = True
position.hold_until = position.entry_date + timedelta(weeks=8)
if position.eight_week_hold and date.today() < position.hold_until:
return HoldDecision(
hold=True,
reason=f'8周持有规则生效。持有到 {position.hold_until}',
# 例外:如果触发止损仍然执行
override_allowed_for=['STOP_LOSS']
)
return HoldDecision(hold=False, reason='8周持有规则未激活或已过期')
"在股市中,最好的机会伴随着不确定性的价格标签。等待确定性意味着你会进入太晚或根本不进入。"
"重要的不是你是对还是错,而是你对的时候赚多少钱,错的时候亏多少钱。"
"超级绩效股票不是从基本面疲弱的位置开始上涨的。它们以强劲的盈利、销售增长和利润率起步——图表反映了机构的积累。"
"VCP不仅仅是一个图表形态——它是供给枯竭和需求接管的视觉表现。每次收缩都显示更少的卖家愿意以当前价格出让股份。"
"你的工作不是预测未来。你的工作是识别当前设置何时匹配过去超级绩效股票的蓝图,并在匹配时有纪律地行动。"
"果断止损是你能做的改善投资结果的最重要的事情。其他一切都是次要的。"
"我看到交易者犯的最大错误是在错误的阶段买入股票。他们在第四阶段买入,以为捡到了便宜。他们唯一捡到的便宜是进一步亏损的前排座位。"
"我不在下跌途中买入。我在上涨途中买入。我买正在创新高的股票,而不是创新低的。我知道这听起来违反直觉,但最大的赢家来自那些已经在赢的股票。"
"仓位管理是风险管理中被低估的英雄。大多数交易者关注买什么和什么时候买。专业人士关注买多少。"
"现金是一个仓位。在敌对的市场环境中,持有现金不是什么都不做——它是做正确的事。资本保全是资本增值的基础。"
"我从不向下摊平。如果我错了,我希望用尽可能少的资金犯错,而不是用最多的。"
"趋势模板是我的第一个过滤器。如果股票不能通过全部八项标准,我不在乎故事多好,市盈率看起来多便宜,或者盈利多好。它不在考虑范围内。"
"在枢轴点买入不是买在高位。它是在最大概率的时刻买入。股票已经证明了在那个价格水平需求超过供给。"
"大多数交易者认为70%的正确率是成功的关键。我宁愿50%的正确率加上3:1的回报风险比。数学远更有利。"
"纪律就是在感觉错误的时候做正确的事。卖出亏损仓位感觉是错的。通过回调持有赢家感觉是错的。但这些恰恰是将赢家和输家区分开的行动。"
本规范涵盖了Minervini第一本书中呈现的基础SEPA方法论。后续的两本书——《像冠军一样思考和交易》(2017)和《赢家的心态秘密》(2019)——在此基础上构建了改进的执行规则、高级风险管理技术以及持续实施所需的心理架构。