股票大作手操盘术——完整实施规范

基于杰西·利弗莫尔 (Jesse Livermore),《股票大作手操盘术》(1940)


目录

  1. 概述
  2. 利弗莫尔市场密钥
  3. 支点理论
  4. 交易中的时间因素
  5. 入场规则
  6. 资金管理
  7. 情绪纪律与心理规则
  8. 市场时机与一般条件
  9. 卖空规则
  10. 常见错误
  11. 完整交易生命周期示例
  12. 实施伪代码——利弗莫尔市场密钥算法
  13. 关键语录

1. 概述

杰西·利弗莫尔于1940年写成《股票大作手操盘术》,作为其交易方法论的直接、第一人身陈述。与埃德温·勒菲弗的虚构《股票作手回忆录》(1923)不同,这本书是利弗莫尔自己的系统论述——一份投机技术手册。

本书的核心贡献是利弗莫尔市场密钥,这是利弗莫尔经过数十年交易开发的专有价格记录和趋势识别系统。密钥不是现代意义上的公式或指标;它是一个手动状态机——一种结构化的记账方法,迫使交易员将每个显著价格变动分类为六种定义状态之一,仅当状态之间的转换确认了可交易趋势时才采取行动。

核心论点: 投机是一门生意,不是赌博。它需要:

利弗莫尔坚持没有人能每天交易都持续盈利。大钱是靠坐着——识别主要波动并持有。市场密钥是他识别那些波动何时开始和结束的工具。

预期应用: 该系统专为活跃交易的股票和商品期货设计,使用每日收盘价格。利弗莫尔主要将其应用于1920-1930年代的铁路股票和钢铁股票,但将其呈现为可适应任何流动性市场的通用框架。


2. 利弗莫尔市场密钥

2.1 目的与哲学

利弗莫尔市场密钥是一个手动价格跟踪系统,旨在:

利弗莫尔不用图表。他认为图表阅读是模糊的且易于解释。相比之下,密钥对每个股票在所有时间的当前状态产生明确分类。

2.2 六列记录方法

密钥对每个关注的股票使用带六列的划线表。每个显著价格精确记录在一列中,基于当前趋势状态和系统规则。

名称 缩写 墨水颜色 含义
1 次级反弹 SR 黑色 主导下降趋势中的反弹
2 自然反弹 NR 黑色 下降趋势中的正常向上修正
3 上升趋势 UT 黑色 确认的主要上升趋势
4 下降趋势 DT 红色 确认的主要下降趋势
5 自然回调 NRe 红色 上升趋势中的正常向下修正
6 次级回调 SRe 红色 上升趋势中的回调

这些列按特定顺序排列——不是升序/降序,而是反弹列(1、2、3)在左,回调列(4、5、6)在右。第3列(上升趋势)和第4列(下降趋势)在中间。

2.3 颜色编码系统

利弗莫尔指定了三种记录颜色以提供即时视觉识别:

铅笔下划线是最重要的视觉元素。它们标记系统关注的关键价格,用于突破和破位。

2.4 价格变动阈值

系统需要最小价格变动才能从一列切换到另一列。利弗莫尔对铁路股票(在当时30-150美元范围内交易)使用约6点作为阈值。对于其他股票,阈值按比例调整。

阈值规则:

现代改编: 因为股票价格和波动性发生了巨大变化,基于百分比的阈值(大宗股约4-6%)或基于ATR的阈值比固定点值更合适。

2.5 在每列中记录价格的规则

以下规则管理何时以及在何处记录价格。这些是确定性的——一旦当前状态已知就没有歧义。

规则1——当前列中的继续: 如果今天的收盘价在当前列的方向上继续(反弹列更高,回调列更低),将其记录在当前列。该列中的先前条目带下划线。

规则2——超过阈值的反转: 如果今天的收盘价按阈值数量(约6点)从当前列的方向反转,将当前列中的最后条目带下划线(现在是关键价格),并将今天的价位记录在适当的反转列。

规则3——从下降趋势中的自然反弹: 当在下降趋势列(第4列)中记录时,如果价格按阈值反弹,将最后DT价格带下划线并记录在自然反弹(第2列)。

规则4——从上升趋势中的自然回调: 当在上升趋势列(第3列)中记录时,如果价格按阈值回调,将最后UT价格带下划线并记录在自然回调(第5列)。

规则5——从自然回调中的次级反弹: 当在自然回调(第5列)中记录时,如果价格按阈值反弹但超过最后带下划线的上升趋势关键价格,记录在次级反弹(第1列)。这是上升趋势中回调内的反弹——一个次级、未确认的变动。

规则6——从自然反弹中的次级回调: 当在自然反弹(第2列)中记录时,如果价格按阈值回调但跌破最后带下划线的下降趋势关键价格,记录在次级回调(第6列)。这是下降趋势中反弹内的回调。

规则7——上升趋势确认: 当价格超过上升趋势列中最后带下划线的关键价格,同时也高于最后带下划线的自然反弹关键价格时,股票进入上升趋势列(第3列)。这种双重确认是买入信号。

规则8——下降趋势确认: 当价格跌破下降趋势列中最后带下划线的关键价格,同时也低于最后带下划线的自然回调关键价格时,股票进入下降趋势列(第4列)。这种双重确认是卖出/卖空信号。

规则9——组合规则(反弹继续): 当在自然反弹(第2列)中记录时,如果价格反弹超过最后带下划线的自然反弹关键价格并且最后带下划线的上升趋势关键价格,跳过自然反弹,直接记录在上升趋势(第3列)。

规则10——组合规则(回调继续): 当在自然回调(第5列)中记录时,如果价格回调低于最后带下划线的自然回调关键价格并且最后带下划线的下降趋势关键价格,跳过自然回调,直接记录在下降趋势(第4列)。

2.6 使用密钥识别趋势变化

密钥产生两种可操作信号:

上升趋势信号(买入):

  1. 股票一直在下降趋势或自然反弹
  2. 价格反弹超过最后带下划线的自然反弹关键价格
  3. 价格也超过最后带下划线的上升趋势关键价格
  4. 记录切换到上升趋势列(第3列)
  5. 这是开始试探多头的信号

下降趋势信号(卖出/卖空):

  1. 股票一直在上升趋势或自然回调
  2. 价格回调低于最后带下划线的自然回调关键价格
  3. 价格也跌破最后带下划线的下降趋势关键价格
  4. 记录切换到下降趋势列(第4列)
  5. 这是开始试探空头的信号

该系统的天才在于双重确认要求。单纯突破反弹高点不够——价格还必须清除先前的上升趋势支点。这过滤掉了许多假信号。


3. 支点理论

3.1 支点的定义

支点是股票趋势改变性质的价格水平。它不是数学计算(与现代"支点"公式不同);它是识别最大机会时刻的概念框架。

利弗莫尔将支点定义为供需平衡决定性转变的价格水平。它们在回顾时可以观察为价格图表上的转折点,但密钥系统旨在在它们形成时识别它们。

3.2 两种类型的支点

连续支点:

反转支点:

3.3 如何在实时中识别支点

利弗莫尔实时识别方法:

  1. 观察关键列。 当股票从主要趋势列(UT或DT)切换到次级列(NR、NRe、SR、SRe)时,一个潜在支点正在形成。

  2. 监控关键价格。 每列中的带下划线价格是关键水平。当价格从相反方向接近其中之一时,准备行动。

  3. 等待确认。 不要预判。支点仅在记录规则将股票切换到新列时才得到确认。基于未确认支点过早行动是最常见错误之一。

  4. 使用成交量作为次级确认。 利弗莫尔指出,真正的支点通常在增加成交量下发生,尽管密钥系统本身是纯价格基础的。

3.4 使用支点进行入场时机


4. 时间因素在交易中的重要性

4.1 时机就是一切

利弗莫尔认为时间因素与价格同等重要。方向正确但时机错误同样会产生损失。

时间因素表现为几种方式:

4.2 "市场从不错,观点经常错"

这是利弗莫尔最基本的哲学陈述。它意味着:

实际含义:永远不要与 tape 争论。如果密钥系统说趋势下降,它就是下降,无论你对公司价值的看法如何。

4.3 等待正确时机

利弗莫尔明确表示:交易员大部分时间应该无所事事。密钥系统经常显示股票处于过渡状态(自然反弹、自然回调、次级列),不值得行动。只有当双重确认信号触发时,交易员才行动。

等待规则:

4.4 过早行动的危险

利弗莫尔因过早行动损失了财富。他的反过早行动规则:


5. 入场规则

5.1 试探/测试仓位

利弗莫尔从不一次投入全部预期仓位。他使用他称之为"试探"的分阶段入场系统:

阶段1——初始试探(预期仓位的20%):

阶段2——确认试探(再加20%):

阶段3——完全投入(剩余60%):

放弃规则:

5.2 完全投入前的确认要求

完全投入需要以下全部:

  1. 利弗莫尔市场密钥已确认趋势变化(双重确认规则)
  2. 初始试探显示利润
  3. 在更高价格的第二次试探(多头)也有利润
  4. 整体市场方向(从指数股读取)是有利的
  5. 股票的行业组正在朝同一方向移动

5.3 Tandem Trading Concept

利弗莫尔观察到同一行业的股票倾向于一起移动。他将此作为确认机制:

Tandem规则:

书中的例子: 利弗莫尔将美国钢铁和伯利恒钢铁作为 tandem 对。他不会除非另一只确认上升趋势,否则不会做多其中一只。同样,他跟踪几只铁路股票作为一组。


6. 资金管理

6.1 永远不要在一个仓位上损失超过10%

这是利弗莫尔最严格的规则,也是他资本保全体系的基础。

10%规则:

理由: 如果你对趋势正确,适当计时的入场不会显示10%损失。10%损失意味着你的时机错了,待在仓位中是幻想,不是交易。

6.2 资本保全规则

6.3 何时增加仓位规模

仓位规模仅在以下情况下增加:

仓位规模应在以下情况减少:

6.4 大赢后取利

利弗莫尔的利润获取规则:

  1. 大战胜利后: 从账户提取50%利润。将这笔钱放入安全、无法访问的储蓄工具中。
  2. 不要立即将大利润再投资。 休息一下。大赢的欣快像大输的沮丧一样损害判断。
  3. 如果盈利仓位开始显示趋势耗尽迹象(密钥列在主要和次级状态之间快速振荡),获取部分利润。
  4. 永远不要让大利润变成亏损。 一旦仓位已大幅朝你有利移动,将心理止损移至至少盈亏平衡。

7. 情绪纪律与心理规则

7.1 "华尔街永远不会变,因为人性永远不会变"

利弗莫尔的中心心理洞察:市场模式重复不是因为任何机械定律,而是因为人类情感——贪婪、恐惧、希望、无知——跨代不变。掌控自己情绪的交易员相比大多数无法掌控的人获得了优势。

7.2 消息是危险的

利弗莫尔明确表示:永远不要根据消息行动。 他的规则:

7.3 希望与恐惧——两个敌人

利弗莫尔将希望和恐惧识别为交易账户的两个孪生毁灭者,但指出它们以 precisely 错误 方向运作:

正确的反转:

7.4 独立思考的重要性


8. 市场时机与一般条件

8.1 读取一般市场方向

利弗莫尔坚持个股选择次于一般市场方向。他的层级:

  1. 一般市场方向——通过将密钥应用于市场领导者来确定整体市场是处于上升趋势、下降趋势还是无趋势阶段
  2. 行业组方向——在有利的一般市场内,识别最强(多头)或最弱(空头)行业组
  3. 个股选择——在最强者组内,选择领先的个股

规则: 永远不要对抗一般市场。即使最好组中最好的股票也会被熊市拖累。相反,许多平庸股票会在强劲牛市中上涨。

8.2 行业组分析

利弗莫尔将密钥应用于行业组,而不仅是单个股票:

8.3 领先股票作为市场指标

利弗莫尔使用领先股票行为作为市场健康的代理:


9. 卖空规则

利弗莫尔在多头和空头方面同样自如。他的卖空规则:

  1. 密钥必须确认下降趋势——双重确认规则对空头和多头同样严格适用
  2. 在反弹中卖空,不在下跌中卖空——在确认下降趋势(第4列)中的自然反弹(第2列)期间等待,然后在反弹失败且密钥恢复DT时卖空
  3. 最佳卖空候选是 former 领导者——先前上涨领导且已打破上升趋势的股票是最强的卖空,因为有最多的持有者将被迫卖出
  4. 卖空更困难,因为下跌通常比上涨更快更尖锐,熊市中的反弹是暴力的,心理压力更大(人群讨厌卖空者)
  5. 使用相同的试探方法——初始试探20%,确认,然后承诺
  6. 同样10%止损适用于空头仓位的上方
  7. 当密钥从DT切换到NR时回补空头——长期下跌后第一次——这是卖出压力正在耗尽的第一个迹象
  8. 永远不要在沉闷、安静的市场中卖空——仅在密钥积极确认下降趋势且价格下跌时卖空

10. 常见错误

利弗莫尔编目了他在四十年中观察(并犯下)的错误:

  1. 向下摊平。 在亏损仓上加仓。这是单一最具破坏性的做法。10%规则存在以防止它。

  2. 过度交易。 交易太频繁、太多数量的股票、太多资本。交易质量远比数量重要。

  3. 根据消息行动。 将你自己的判断投降给他人意见。

  4. 对抗趋势。 在确认下降趋势中因为股票"看起来便宜"而买入。在确认上升趋势中因为股票"看起来贵"而卖空。

  5. 不耐烦。 在密钥确认之前入场。利弗莫尔称之为"抢跑",识别它是无聊和自我的产物。

  6. 未能切割损失。 因为希望而持有亏损仓位。这个单一错误比所有其他加起来破坏更多投机者。

  7. 过快获取利润。 在第一次回调迹象而非等待密钥切换列时就关闭盈利仓位。

  8. 在交易中途改变方法。 基于密钥系统入场,然后在仓位承压时放弃系统。方法必须机械地遵循。

  9. 为刺激而交易。 市场不是娱乐。当你感到兴奋时,你是脆弱的。

  10. 忽视时间因素。 在市场处于无趋势、波动阶段时强迫交易。正确行动是无事可做和等待。

  11. 忽视一般市场条件。 不参考整体市场方向交易个股。

  12. 过度杠杆。 使用过多保证金。杠杆放大收益和损失。利弗莫尔曾因过度杠杆被摧毁数次。


11. 完整交易生命周期示例

以下示例以利弗莫尔在书中的自己陈述为模型,使用他应用于假设股票的方法。利弗莫尔在他的例子中使用了美国钢铁和铁路股票。

设置——用密钥跟踪美国钢铁

背景: 美国钢铁一直处于下降趋势。最后几个条目在第4列(DT,红色墨水)。带下划线的关键价格是:

最后关键价格(带下划线)
上升趋势(第3列) 88
自然反弹(第2列) 82
下降趋势(第4列) 70(当前列,最新:68)
自然回调(第5列) 75

阶段1——自然反弹发展

美国钢铁收盘于74(从68上涨6)。达到阈值。将68在DT列中带下划线。将74记录在自然反弹列(第2列,黑色墨水)。

在接下来几天,美国钢铁继续反弹:75、77、79、80。每个价格都记录在NR列中。

阶段2——关键问题:继续还是反转?

美国钢铁收盘于83。这超过了82(最后带下划线的NR关键价格)。我们检查:它也超过88(最后带下划线的UT关键价格)吗?

83未超过88。因此,将83记录在自然反弹列。这是一个强劲反弹但还不是确认的上升趋势。

阶段3——持续反弹至支点

美国钢铁收盘于89。这同时超过了82(最后NR关键价格)和88(最后UT关键价格)。根据规则7/规则9,这是双重确认的上升趋势信号。将83(最后的NR条目)带下划线。将89记录在上升趋势列(第3列,黑色墨水)。

行动: 这是第一个买入信号。启动试探序列。

阶段4——初始试探

在89买入200股美国钢铁(预期1,000股仓位的20%)。在80.10设置心理止损(约为入场价下方10%)。

阶段5——Tandem确认

检查伯利恒钢铁(tandem股票)。其密钥也最近切换到上升趋势。确认。 信号有效。

阶段6——第二次试探

美国钢铁收盘于92,然后94。初始试探盈利5点。在94再买入200股。新平均成本:400股约91.50。

阶段7——完全投入

美国钢铁收盘于97,然后99。两次试探都盈利。在99买入剩余600股。总仓位:1,000股,平均成本约96。

阶段8——持有趋势

美国钢铁继续:101、104、108、112。所有条目进入上升趋势列(第3列)。交易员除了记录价格和享受利润外什么都不做。

阶段9——自然回调发展

美国钢铁从112跌至106(6点回调)。将112在UT列中带下划线。将106记录在自然回调(第5列,红色墨水)。

行动: 无为。上升趋势中的自然回调是正常的。趋势仍然完整。继续持有。

阶段10——连续支点

美国钢铁从106反弹回113,然后118。从112到106的回调和恢复到118创造了一个连续支点。将价格记录回UT列。这确认上升趋势仍然存活。

行动: 可以在这里加仓(利弗莫尔有时在连续支点时这样做),但试探序列已完成。

阶段11——警告信号

美国钢铁达到125,然后回调:119、117、115。将125在UT列中带下划线。将119、117、115记录在自然回调(第5列)。然后反弹:118、120。但120未超过最后带下划线的UT关键价格(125)。记录在次级反弹(第1列)。

然后再次下跌:114、111。进入自然回调。然后另一个弱反弹至116——仍低于关键价格。股票在次级列中振荡,无法确认连续。

行动: 次级列之间的振荡是警告。收紧心理止损。利弗莫尔会将止损移至至少盈亏平衡(96)或更高。

阶段12——退出信号

美国钢铁跌至108。这跌破了最后带下划线的自然回调关键价格(106)。检查:它也跌破最后带下划线的下降趋势关键价格(70)吗?不——那还很远。所以这是自然回调,尚未是下降趋势。

但利弗莫尔也观察 tandem。伯利恒钢铁已经切换到其密钥的下降趋势。tandem背离。

行动: 在108平仓。利润:约每股12点,1,000股12,000美元。提取6,000美元(50%利润)到银行。

生命周期摘要

阶段 行动 价格 理由
信号 密钥确认UT 89 双重确认规则
试探1 买入200 89 测试信号
试探2 买入200 94 试探1盈利
完全投入 买入600 99 两次试探盈利
持有 99-125 密钥在UT列,趋势完整
警告 收紧止损 120 次级振荡,tandem背离
退出 卖出1,000 108 密钥恶化,tandem失败
保护 提取$6,000 50%利润存入银行

12. 实施伪代码——利弗莫尔市场密钥算法

本节将利弗莫尔市场密钥呈现为正式状态机。这是本书的核心算法贡献。

================================================================================
利弗莫尔市场密钥——完整状态机
================================================================================

常量:
    THRESHOLD = 6.0          // 触发列变化的最小点变动
                              // (按股票价格水平调整)
    STOP_LOSS_PCT = 0.10     // 10%最大损失

枚举:
    TrendState = {
        SECONDARY_RALLY,      // 第1列——趋势中的反弹
        NATURAL_RALLY,        // 第2列——下降趋势中的正常反弹修正
        UPWARD_TREND,         // 第3列——确认的主要上升趋势
        DOWNWARD_TREND,       // 第4列——确认的主要下降趋势
        NATURAL_REACTION,     // 第5列——上升趋势中的正常回调修正
        SECONDARY_REACTION    // 第6列——上升趋势中的回调
    }

数据结构:

    KeyPrice:
        column:     TrendState
        price:      float
        date:       date
        underlined: boolean    // true = 这是支点/参考价格

    StockRecord:
        symbol:           string
        current_state:    TrendState
        columns:          map<TrendState, list<KeyPrice>>

        // 缓存关键价格(每列最后带下划线价格)
        last_key_ut:      float or null   // 最后带下划线上升趋势价格
        last_key_dt:      float or null   // 最后带下划线下降趋势价格
        last_key_nr:      float or null   // 最后带下划线自然反弹价格
        last_key_nre:     float or null   // 最后带下划线自然回调价格
        last_key_sr:      float or null   // 最后带下划线次级反弹价格
        last_key_sre:     float or null   // 最后带下划线次级回调价格

================================================================================
初始化
================================================================================

function initialize_record(symbol, initial_state, initial_price, date):
    record = new StockRecord()
    record.symbol = symbol
    record.current_state = initial_state

    for each state in TrendState:
        record.columns[state] = empty list

    // 在适当列中记录初始价格
    entry = KeyPrice(column=initial_state, price=initial_price,
                     date=date, underlined=false)
    record.columns[initial_state].append(entry)

    // 将所有关键价格初始化为null
    record.last_key_ut  = null
    record.last_key_dt  = null
    record.last_key_nr  = null
    record.last_key_nre = null
    record.last_key_sr  = null
    record.last_key_sre = null

    return record

================================================================================
辅助函数
================================================================================

function last_price_in_column(record, state):
    // 返回给定列中最新的价格条目
    entries = record.columns[state]
    if entries is empty:
        return null
    return entries[last].price

function current_price(record):
    return last_price_in_column(record, record.current_state)

function underline_current(record):
    // 将当前列中的最后条目标记为关键价格
    entries = record.columns[record.current_state]
    if entries is not empty:
        entries[last].underlined = true
        // 更新此列的缓存关键价格
        switch record.current_state:
            case UPWARD_TREND:      record.last_key_ut  = entries[last].price
            case DOWNWARD_TREND:    record.last_key_dt  = entries[last].price
            case NATURAL_RALLY:     record.last_key_nr  = entries[last].price
            case NATURAL_REACTION:  record.last_key_nre = entries[last].price
            case SECONDARY_RALLY:   record.last_key_sr  = entries[last].price
            case SECONDARY_REACTION:record.last_key_sre = entries[last].price

function record_price(record, state, price, date):
    entry = KeyPrice(column=state, price=price, date=date, underlined=false)
    record.columns[state].append(entry)
    record.current_state = state

function is_rally_column(state):
    return state in {SECONDARY_RALLY, NATURAL_RALLY, UPWARD_TREND}

function is_reaction_column(state):
    return state in {DOWNWARD_TREND, NATURAL_REACTION, SECONDARY_REACTION}

================================================================================
主更新函数——每日收盘价调用一次
================================================================================

function update_key(record, closing_price, date):

    prev_price = current_price(record)
    delta = closing_price - prev_price
    state = record.current_state

    // ============================================================
    // 情况1:当前在上升趋势(第3列)
    // ============================================================
    if state == UPWARD_TREND:

        if closing_price > prev_price:
            // 价格继续向上——留在UT列
            record_price(record, UPWARD_TREND, closing_price, date)
            return "CONTINUE_UT"

        if closing_price <= prev_price - THRESHOLD:
            // 价格按阈值回调——切换到自然回调
            underline_current(record)
            record_price(record, NATURAL_REACTION, closing_price, date)
            return "UT_TO_NRe"

        // 价格下跌但小于阈值——忽略(噪音)
        return "NO_CHANGE"

    // ============================================================
    // 情况2:当前在下降趋势(第4列)
    // ============================================================
    if state == DOWNWARD_TREND:

        if closing_price < prev_price:
            // 价格继续向下——留在DT列
            record_price(record, DOWNWARD_TREND, closing_price, date)
            return "CONTINUE_DT"

        if closing_price >= prev_price + THRESHOLD:
            // 价格按阈值反弹——切换到自然反弹
            underline_current(record)
            record_price(record, NATURAL_RALLY, closing_price, date)
            return "DT_TO_NR"

        return "NO_CHANGE"

    // ============================================================
    // 情况3:当前在自然反弹(第2列)
    // ============================================================
    if state == NATURAL_RALLY:

        if closing_price > prev_price:
            // 反弹继续——但检查UT确认

            // 组合规则(规则9):价格是否超过最后NR关键价格
            // 和最后UT关键价格?
            if (record.last_key_nr is not null
                AND closing_price > record.last_key_nr
                AND record.last_key_ut is not null
                AND closing_price > record.last_key_ut):

                // 双重确认——直接切换到上升趋势
                underline_current(record)
                record_price(record, UPWARD_TREND, closing_price, date)
                return "NR_TO_UT_CONFIRMED"  // *** 买入信号 ***

            // 单独突破NR关键价格但非UT——或尚无关键价格——留在NR
            record_price(record, NATURAL_RALLY, closing_price, date)
            return "CONTINUE_NR"

        if closing_price <= prev_price - THRESHOLD:
            // 反弹失败——价格回调
            underline_current(record)

            // 检查:此回调是否跌破最后DT关键价格?
            if (record.last_key_dt is not null
                AND record.last_key_nre is not null
                AND closing_price < record.last_key_nre
                AND closing_price < record.last_key_dt):

                // 双重确认——直接切换到下降趋势
                record_price(record, DOWNWARD_TREND, closing_price, date)
                return "NR_TO_DT_CONFIRMED"  // *** 卖出/卖空信号 ***

            // 从NR回调但未确认DT——进入次级回调
            record_price(record, SECONDARY_REACTION, closing_price, date)
            return "NR_TO_SRe"

        return "NO_CHANGE"

    // ============================================================
    // 情况4:当前在自然回调(第5列)
    // ============================================================
    if state == NATURAL_REACTION:

        if closing_price < prev_price:
            // 回调继续——但检查DT确认

            // 组合规则(规则10):价格是否跌破最后NRe关键价格
            // 和最后DT关键价格?
            if (record.last_key_nre is not null
                AND closing_price < record.last_key_nre
                AND record.last_key_dt is not null
                AND closing_price < record.last_key_dt):

                // 双重确认——直接切换到下降趋势
                underline_current(record)
                record_price(record, DOWNWARD_TREND, closing_price, date)
                return "NRe_TO_DT_CONFIRMED"  // *** 卖出/卖空信号 ***

            // 继续降低但未确认DT
            record_price(record, NATURAL_REACTION, closing_price, date)
            return "CONTINUE_NRe"

        if closing_price >= prev_price + THRESHOLD:
            // 回调结束——价格反弹
            underline_current(record)

            // 检查:此反弹是否突破最后UT关键价格?
            if (record.last_key_ut is not null
                AND record.last_key_nr is not null
                AND closing_price > record.last_key_nr
                AND closing_price > record.last_key_ut):

                // 双重确认——直接切换到上升趋势
                record_price(record, UPWARD_TREND, closing_price, date)
                return "NRe_TO_UT_CONFIRMED"  // *** 买入信号 ***

            // 从NRe反弹但未确认UT——进入次级反弹
            record_price(record, SECONDARY_RALLY, closing_price, date)
            return "NRe_TO_SR"

        return "NO_CHANGE"

    // ============================================================
    // 情况5:当前在次级反弹(第1列)
    // ============================================================
    if state == SECONDARY_RALLY:

        if closing_price > prev_price:
            // 次级反弹继续——检查UT确认

            if (record.last_key_nr is not null
                AND closing_price > record.last_key_nr
                AND record.last_key_ut is not null
                AND closing_price > record.last_key_ut):

                // 双重确认——切换到上升趋势
                underline_current(record)
                record_price(record, UPWARD_TREND, closing_price, date)
                return "SR_TO_UT_CONFIRMED"  // *** 买入信号 ***

            if (record.last_key_nr is not null
                AND closing_price > record.last_key_nr):

                // 超过NR关键但非UT——切换到自然反弹
                underline_current(record)
                record_price(record, NATURAL_RALLY, closing_price, date)
                return "SR_TO_NR"

            // 仍在次级范围内
            record_price(record, SECONDARY_RALLY, closing_price, date)
            return "CONTINUE_SR"

        if closing_price <= prev_price - THRESHOLD:
            // 次级反弹失败——回到回调
            underline_current(record)

            // 检查DT确认
            if (record.last_key_nre is not null
                AND closing_price < record.last_key_nre
                AND record.last_key_dt is not null
                AND closing_price < record.last_key_dt):

                record_price(record, DOWNWARD_TREND, closing_price, date)
                return "SR_TO_DT_CONFIRMED"  // *** 卖出/卖空信号 ***

            // 回到自然回调
            record_price(record, NATURAL_REACTION, closing_price, date)
            return "SR_TO_NRe"

        return "NO_CHANGE"

    // ============================================================
    // 情况6:当前在次级回调(第6列)
    // ============================================================
    if state == SECONDARY_REACTION:

        if closing_price < prev_price:
            // 次级回调继续——检查DT确认

            if (record.last_key_nre is not null
                AND closing_price < record.last_key_nre
                AND record.last_key_dt is not null
                AND closing_price < record.last_key_dt):

                // 双重确认——切换到下降趋势
                underline_current(record)
                record_price(record, DOWNWARD_TREND, closing_price, date)
                return "SRe_TO_DT_CONFIRMED"  // *** 卖出/卖空信号 ***

            if (record.last_key_nre is not null
                AND closing_price < record.last_key_nre):

                // 跌破NRe关键但非DT——切换到自然回调
                underline_current(record)
                record_price(record, NATURAL_REACTION, closing_price, date)
                return "SRe_TO_NRe"

            // 仍在次级范围内
            record_price(record, SECONDARY_REACTION, closing_price, date)
            return "CONTINUE_SRe"

        if closing_price >= prev_price + THRESHOLD:
            // 次级回调结束——再次反弹
            underline_current(record)

            // 检查UT确认
            if (record.last_key_nr is not null
                AND closing_price > record.last_key_nr
                AND record.last_key_ut is not null
                AND closing_price > record.last_key_ut):

                record_price(record, UPWARD_TREND, closing_price, date)
                return "SRe_TO_UT_CONFIRMED"  // *** 买入信号 ***

            // 回到自然反弹
            record_price(record, NATURAL_RALLY, closing_price, date)
            return "SRe_TO_NR"

        return "NO_CHANGE"

================================================================================
信号解读
================================================================================

function interpret_signal(signal):

    BUY_SIGNALS = {
        "NR_TO_UT_CONFIRMED",
        "NRe_TO_UT_CONFIRMED",
        "SR_TO_UT_CONFIRMED",
        "SRe_TO_UT_CONFIRMED"
    }

    SELL_SIGNALS = {
        "NRe_TO_DT_CONFIRMED",
        "NR_TO_DT_CONFIRMED",
        "SRe_TO_DT_CONFIRMED",
        "SR_TO_DT_CONFIRMED"
    }

    WARNING_SIGNALS = {
        "UT_TO_NRe",       // 上升趋势中断——密切关注
        "DT_TO_NR",        // 下降趋势中断——密切关注
        "NR_TO_SRe",       // 反弹失败——潜在趋势变化
        "NRe_TO_SR"        // 回调失败——潜在趋势变化
    }

    if signal in BUY_SIGNALS:
        return "INITIATE_LONG_PROBING_SEQUENCE"

    if signal in SELL_SIGNALS:
        return "INITIATE_SHORT_PROBING_SEQUENCE"

    if signal in WARNING_SIGNALS:
        return "TIGHTEN_STOPS_AND_MONITOR"

    return "HOLD_CURRENT_POSITION"

================================================================================
仓位管理(试探系统)
================================================================================

function manage_position(signal, account, record, closing_price):

    action = interpret_signal(signal)

    if action == "INITIATE_LONG_PROBING_SEQUENCE":
        intended_shares = calculate_position_size(account)
        probe_size = intended_shares * 0.20

        buy(record.symbol, probe_size, closing_price)
        set_stop_loss(closing_price * (1 - STOP_LOSS_PCT))
        account.phase = "PROBE_1_LONG"
        account.probe_entry = closing_price
        return

    if action == "INITIATE_SHORT_PROBING_SEQUENCE":
        intended_shares = calculate_position_size(account)
        probe_size = intended_shares * 0.20

        short(record.symbol, probe_size, closing_price)
        set_stop_loss(closing_price * (1 + STOP_LOSS_PCT))
        account.phase = "PROBE_1_SHORT"
        account.probe_entry = closing_price
        return

    // 多头仓位阶段进展
    if account.phase == "PROBE_1_LONG":
        if closing_price > account.probe_entry:
            // 试探1盈利——增加阶段2
            probe2_size = intended_shares * 0.20
            buy(record.symbol, probe2_size, closing_price)
            account.avg_cost = weighted_average(account)
            set_stop_loss(account.avg_cost * (1 - STOP_LOSS_PCT))
            account.phase = "PROBE_2_LONG"
            account.probe2_entry = closing_price

        if closing_price <= account.probe_entry * (1 - STOP_LOSS_PCT):
            // 止损触发——退出全部仓位
            sell_all(record.symbol)
            account.phase = "FLAT"

    if account.phase == "PROBE_2_LONG":
        if closing_price > account.probe2_entry:
            // 试探2盈利——完全投入
            remaining = intended_shares * 0.60
            buy(record.symbol, remaining, closing_price)
            account.avg_cost = weighted_average(account)
            set_stop_loss(account.avg_cost * (1 - STOP_LOSS_PCT))
            account.phase = "FULLY_COMMITTED_LONG"

        if closing_price <= account.avg_cost * (1 - STOP_LOSS_PCT):
            sell_all(record.symbol)
            account.phase = "FLAT"

    if account.phase == "FULLY_COMMITTED_LONG":
        if action == "TIGHTEN_STOPS_AND_MONITOR":
            // 移动止损到盈亏平衡或跟踪
            new_stop = max(account.avg_cost, closing_price * 0.92)
            set_stop_loss(new_stop)

        if signal in SELL_SIGNALS:
            sell_all(record.symbol)
            profit = calculate_profit(account)
            bank_profits(profit * 0.50)  # 存入50%的利润
            account.phase = "FLAT"

    // 做空仓位的镜像逻辑(PROBE_1_SHORT等)


================================================================================
串联确认
================================================================================

function check_tandem(primary_record, tandem_record, signal):
    // 两支股票必须处于相同趋势状态才能确认

    if signal in BUY_SIGNALS:
        if tandem_record.current_state == UPWARD_TREND:
            return "TANDEM_CONFIRMED"
        if tandem_record.current_state == NATURAL_RALLY:
            return "TANDEM_PENDING"   // 等待串联确认
        return "TANDEM_DIVERGENCE"    // 警告 — 不交易

    if signal in SELL_SIGNALS:
        if tandem_record.current_state == DOWNWARD_TREND:
            return "TANDEM_CONFIRMED"
        if tandem_record.current_state == NATURAL_REACTION:
            return "TANDEM_PENDING"
        return "TANDEM_DIVERGENCE"


================================================================================
状态转换图(总结)
================================================================================

    SR (第1列) ---反弹---> NR (第2列) ---反弹---> UT (第3列)
        ^                      |                        |
        |                      |回调                   |回调
        |                      v                        v
        +---反弹--- NRe (第5列) <---回调--- UT (第3列)
                        |
                        |下跌
                        v
    SRe (第6列) <--回调-- NR (第2列)    DT (第4列) <---下跌
        |                                    |            ^
        |反弹                                |反弹        |
        v                                    v            |
        NR (第2列)                      NR (第2列)---失败-+

    关键转换(需要双重确认):

    * -> UT:  价格 > last_key_nr  AND  价格 > last_key_ut
    * -> DT:  价格 < last_key_nre AND  价格 < last_key_dt

    所有其他转换仅需单次阈值突破。

---

## 13. 关键语录

> "华尔街没有什么新鲜事。不可能有,因为投机和山丘一样古老。无论今天股市发生什么,以前发生过,以后还会再发生。"

> "市场永远不会错——意见往往才是错的。"

> "让我赚大钱的从来不是我的思考。永远是我的坐着。明白吗?是我的坐着不动!"

> "利润总是会自理,但亏损永远不会。投机者必须通过接受第一笔小额亏损来保护自己免受重大损失。"

> "不要在股市中使用'便宜'或'贵'这个词。股票永远不会太高而不能买,也永远不会太低而不能卖空。"

> "每个投机者的主要敌人始终是从内部烦扰。期望和恐惧是人类本性固有的,这是不可避免的。"

> "当你在股市赚了钱,你想挥霍的时候——把部分利润存入银行。把它放在保险箱里。让它在那里积累。股市游戏中唯一确定的事是,你已经取出并存起来的资金,你永远都会有。"

> "内幕消息!人们多么想要内幕消息!他们渴望的不仅仅是内幕消息,而是真正的内幕消息。内幕消息对这些人来说就像毒品一样。"

> "在牛市市场中,你的策略是买入并持有,直到你相信牛市接近尾声。要做到这一点,你必须研究一般情况,而不是内幕消息或影响个别股票的特殊因素。"

> "每个普通投资者或投机者最大的敌人都是自己的人性方面。"

> "一个谨慎的投机者永远不会与行情纸带争辩。市场永远不会错,但意见往往才是错的。"

> "记住,在市场上全面铺开是危险的。不要同时对太多股票感兴趣。比起关注许多股票,专注于少数几只要容易得多。"

---

*本规范编译自杰西·利弗莫尔,《股票大作手操盘术》(1940)。
利弗莫尔市场密钥伪代码是对原书第2-5章所述记录方法的系统性重构。*