股票趋势技术分析 — 完整实施规范

基于 Robert D. Edwards & John Magee,Technical Analysis of Stock Trends(第十版)


目录

  1. 概述 — 技术分析的哲学
  2. 道氏理论
  3. 图表构建与阅读
  4. 反转形态
  5. 持续形态
  6. 缺口分析
  7. 成交量分析
  8. 支撑和阻力
  9. 趋势线分析
  10. 移动平均线
  11. 止损和风险管理
  12. 道氏理论实施
  13. 常见错误
  14. 完整交易生命周期示例
  15. 实施伪代码
  16. 关键语录

1. 概述 — 技术分析的哲学

核心前提

股票的市场价格反映了在任何给定时刻对该股票可知的一切。所有基本面数据、内幕知识、机构持仓和大众心理学都已嵌入价格和成交量行为中。技术分析师不需要知道 为什么 价格会移动——只知道它们会移动,并以可识别、可重复的形态移动。

三个基础假设

  1. 市场行为消化一切。 价格是最终的仲裁者。财报、利率决策、地缘政治事件——所有这些在公众意识到之前就已定价,因为知情参与者先行动。

  2. 价格按趋势移动。 处于运动中的股票倾向于保持运动。趋势持续直到出现明确的反转信号。技术分析师的首要任务是在早期识别趋势并持有直到证据表明趋势已结束。

  3. 历史重演。 图表形态会重现,因为人性不会改变。恐惧、贪婪、希望和绝望在每一代人身上产生相同的价格足迹。

技术分析不是什么

Edwards & Magee 的方法

Edwards 和 Magee 几乎完全专注于价格-成交量K线图分析。他们的方法是视觉形态识别,加上确认、测量含义和止损设置的严格规则。这本书本质上是 决策框架:何时行动、预期多少、以及何时承认分析错误。


2. 道氏理论

六大原则

原则1:平均指数消化一切。 道琼斯工业平均指数和运输平均指数共同反映了所有市场知识和预期的总和。没有事件能逃脱市场的定价机制。

原则2:市场有三种趋势。

原则3:主要趋势有三个阶段。

原则4:平均指数必须相互确认。 有效的主要趋势信号需要工业和运输指数都在合理时间内创出新高(牛市)或新低(熊市)。一个指数单独创新高值得怀疑,必须在得到确认后才能行动。时间越近,确认越强。

原则5:成交量必须确认趋势。 在牛市中,成交量应在上涨时扩大,在回调时收缩。在熊市中,成交量应在下跌时扩大,在反弹时收缩。成交量是次要指标——价格优先——但价格与成交量的背离是早期警告。

原则6:趋势被假定持续直到给出明确的反转信号。 这是实施中最重要的原则。不要预测反转。等待确认信号。举证责任总是在反转上,而非持续上。

道氏理论信号的实施规则

信号 条件
牛市确认 工业和运输指数都创出高于先前次要反应峰值的新高
熊市确认 工业和运输指数都创出低于先前次要反应谷底的新低
非确认(警告) 一个指数创新高/低但另一个在合理窗口内未能确认
次要反应确认 下跌达先前主要上涨的33-66%,持续3+周,成交量下降

3. 图表构建与阅读

K线图

日K线图是主要分析工具。每根K线记录:

构建规则:

点数图

点数图剥离时间,专注于纯粹的价格运动:

支撑和阻力 — 识别

趋势线 — 基本绘制规则

通道线


4. 反转形态

4.1 头肩顶

识别规则:

  1. 股票处于已确立的上涨趋势。
  2. 左肩:成交量 heaviest 创新高,然后成交量 lighter 下跌。
  3. 头部:成交量可能较重但通常比左肩反弹少,价格上涨超过左肩高点,然后回落到左肩峰值水平。
  4. 右肩:价格再次反弹但未能达到头部高度。成交量明显比左肩和头部反弹都轻。
  5. 颈线:连接左肩后下跌和头部后下跌的低点。这条线不需要水平——可以向上或向下倾斜。
  6. 突破:成交量放大,收盘在颈线下方。

成交量形态:

测量公式:

入场触发:

止损设置:

失败条件:

4.2 头肩底(倒置)

识别规则: 头肩顶的镜像,但有一个关于成交量的关键区别:

  1. 股票处于已确立的下跌趋势。
  2. 左肩:价格创出新低然后反弹。
  3. 头部:价格跌破左肩低点,然后反弹。
  4. 右肩:价格再次下跌但未能达到头部低点。
  5. 颈线:连接肩膀和头部之间的反弹高点。
  6. 成交量在突破时绝对必要。 在顶部,股票可以自行下跌。在底部,股票需要买入力量(成交量)才能上涨。成交量轻的颈线突破非常可疑。

测量公式: 与常规头肩形态相同——从头低到颈线的距离,从突破点向上投射。

入场触发:

止损设置:

4.3 双顶和双底

双顶识别:

  1. 价格涨至高点(第一个峰值)然后下跌。
  2. 价格再次上涨至与第一个峰值大约相同水平(3%以内)。
  3. 两个峰值应分隔至少数周——几天内的两个峰值只是阻力,不是双顶。
  4. 第二个峰值成交量通常比第一个轻。
  5. 仅在价格跌破两个峰值之间的谷底时形态才被确认。

双底识别:

  1. 双顶的镜像。
  2. 第二个低点应在第一个低点附近或略高。
  3. 突破中间反弹高点时成交量必须扩大。
  4. 低点之间的最小分隔:数周。

测量公式:

常见错误: 在谷底被跌破之前不要称为双顶。两个相同水平的峰值在确认之前只是阻力。许多明显的双顶向上解决。

入场和止损:

4.4 三顶和三底

识别:

与矩形区分:

测量公式:

4.5 圆顶和圆底(碟形)

特征:

实施挑战:

没有特定测量公式:

4.6 V形/尖峰反转

特征:

实施挑战:

确认:

形态汇总表 — 反转

形态 最短持续时间 成交量特征 测量目标 可靠性
头肩顶 1-3个月 右肩成交量下降 头到颈线距离
头肩底 1-3个月 突破时必须扩大 头到颈线距离
双顶 峰值间隔3+周 第二个峰值较轻 峰值到谷底距离 中-高
双底 低点间隔3+周 突破时扩大 谷底到峰值距离 中-高
三顶/三底 2+个月 每次测试成交量下降 形态高度
碟形 数周至数月 碟形成交量 无特定公式
V形 数天 高潮成交量飙升 无特定公式 低(难交易)

5. 持续形态

5.1 对称三角形

识别:

  1. 两条收敛趋势线:下降的上线(较低高点)和上升的下线(较高低点)。
  2. 至少需要四个反转点(每条线两个)。
  3. 成交量在形态发展时应收缩,反映信心减弱。
  4. 突破应发生在从底部到顶点的距离的一半到四分之三之间。接近顶点突破不可靠。

突破规则:

测量公式:

重要提示:

5.2 上升三角形

识别:

  1. 平坦(水平)上边界——价格反复在同一水平触及阻力。
  2. 上升的下边界——每个连续低点高于前一个。
  3. 买家越来越激进;卖家防御固定水平。
  4. 成交量在形态形成时收缩。

方向偏见:

突破规则:

测量公式:

5.3 下降三角形

识别:

  1. 平坦(水平)下边界——价格反复在同一水平触及支撑。
  2. 下降的上边界——每个连续高点低于前一个。
  3. 卖家越来越激进;买家防御固定水平。

方向偏见:

突破和测量:

5.4 矩形

识别:

  1. 价格在明确定义的水平和阻力之间振荡。
  2. 每个边界至少两次接触。
  3. 成交量往往在最终突破方向的移动中较重。

方向偏见:

测量公式:

在矩形内交易:

5.5 旗形和尖旗

识别:

半旗规则:

入场触发:

止损设置:

失败:

5.6 楔形

上升楔形:

下降楔形:

测量公式:

形态汇总表 — 持续

形态 典型持续时间 偏见 成交量 测量方法
对称三角形 1-3个月 持续 收缩,突破时扩大 底部宽度从突破点
上升三角形 1-3个月 看涨 收缩,突破时扩大 高度从突破点
下降三角形 1-3个月 看跌 收缩,突破时扩大 高度从突破点
矩形 1-3个月 持续 混合;向突破方向较重 高度从突破点
旗形 1-3周 持续 干涸,突破时飙升 旗杆 = 剩余移动
尖旗 1-3周 持续 干涸,突破时飙升 旗杆 = 剩余移动
上升楔形 3-6周 看跌 收缩 返回楔形起源
下降楔形 3-6周 看涨 收缩 返回楔形起源

6. 缺口分析

缺口类型

普通(区域)缺口:

突破缺口:

逃逸(测量)缺口:

衰竭缺口:

岛形反转:

缺口识别决策树

1. 缺口在盘整区域内吗?
   是 → 普通缺口(忽略)
   否 → 继续步骤2

2. 缺口从明确定义的图表形态中突破吗?
   是 → 突破缺口(沿方向交易)
   否 → 继续步骤3

3. 趋势已经确立了吗?
   否 → 可能是突破缺口
   是 → 继续步骤4

4. 移动已经运行很长时间且已有多个缺口了吗?
   否 → 可能是逃逸/测量缺口
   是 → 可能是衰竭缺口(观察反转)

7. 成交量分析

核心原则

成交量确认趋势方向:

成交量领先价格:

顶部与底部的成交量

顶部:

底部:

能量潮(OBV)— 概念

由 Joseph Granville 引入,在后续版本中引用:

高潮成交量信号

买入高潮:

卖出高潮:


8. 支撑和阻力

如何识别水平

  1. 先前的高点和低点。 任何重要的摆动高或低都成为潜在支撑/阻力水平。摆动越突出,水平越重要。

  2. 盘整区域。 价格长时间来回交易的区域。在一个水平交易的成交量越多,参与者对该价格的承诺越大,作为支撑或阻力就越重要。

  3. 整数。 心理重要性:$10、$25、$50、$100。许多订单聚集在整数,创建自然的支撑和阻力。

  4. 先前缺口边界。 未填补缺口的边缘作为支撑和阻力。

角色反转原则

这是书中最重要的概念之一:

机制:在阻力附近卖出的参与者现在后悔卖出,会在回调至该水平时买入(旧阻力成为支撑)。在支撑附近买入并看着它破位的参与者现在想要"保本出",会在反弹回该水平时卖出(旧支撑成为阻力)。

多次测试的重要性

实施规则

对于每个价格水平 L:
  significance_score = (触点数量 * 2)
                     + (该水平总成交量 / 平均成交量)
                     + (自首次接触以来的周数 / 4)
                     + (如果是整数则 +3)

如果 significance_score > 阈值:
  将 L 标记为重要支撑/阻力水平。

9. 趋势线分析

绘制规则

两点趋势线:

三点趋势线:

绘制规则:

扇形原则

当陡峭趋势线被突破时:

  1. 从原始低点绘制第一条趋势线。
  2. 被突破时,从同一低点绘制第二条趋势线到下一个反应低点。
  3. 当第二条被突破时,绘制第三条趋势线到下一个反应低点。
  4. 第三条扇形线被突破通常是趋势反转的可靠信号。

扇形原则起作用是因为每条连续的趋势线都较缓,代表动量减速。当甚至最缓的可持续趋势线也被突破时,趋势已衰竭。

速度阻力线

由 Edson Gould 开发,纳入后续版本:

  1. 从运动开始到峰值(或低谷)取总上涨(或下跌)。
  2. 将垂直距离分成三等分。
  3. 从运动起点通过1/3和2/3水平绘制线。

解读:

趋势线穿透规则

并非每个趋势线突破都重要。Edwards 和 Magee 提供了几种过滤:

百分比过滤(1-3%规则):

两天规则:

成交量过滤:

组合过滤(推荐方法):


10. 移动平均线

类型

简单移动平均线(SMA):

加权移动平均线(WMA):

指数移动平均线(EMA):

常见周期和用途

周期 用途
10日 短期交易,捕捉微小波动
20日 约一个月; swing 交易者流行
50日 中期趋势;机构基准。股价在50日均线上方是"健康"
150日 长期趋势过滤;Stan Weinstein 阶段分析使用30周(约150日)
200日 主要趋势的黄金标准。机构广泛注视

交叉系统

价格-MA 交叉:

双 MA 交叉:

三重 MA 系统:

移动平均通道

Edwards & Magee 对移动平均线的警告

作者强调移动平均线是次要工具。图表形态和趋势线优先。移动平均线用于:

移动平均线不适用于:


11. 止损和风险管理

基于形态的止损设置

最可靠的止损设置方法是使用图表形态本身:

情况 止损位置
头肩底突破后做多 右肩低点下方
双底突破后做多 第二个低点下方
上升三角形突破后做多 三角形内最后反应低点下方
旗形突破后做多 旗形最低点下方
头肩顶破位后做空 右肩高点上方
下降三角形破位后做空 三角形内最后反弹高点上方

逻辑很简单:如果形态有效,价格不应返回形态另一侧。如果返回,形态失败,必须退出。

百分比过滤

渐进止损策略

  1. 初始止损: 基于形态(如上)。
  2. 达到第一利润目标后(1R): 移动止损至盈亏平衡。
  3. 追踪止损: 使用趋势线分析追踪止损。当在上涨趋势中形成新的更高低时,将止损移动至该低点上方的紧位置。
  4. 最终退出: 基于形态退出信号(反转形态、趋势线突破或达到目标)。

时间过滤


12. 道氏理论实施

牛市识别

当满足以下条件时确认牛市:

  1. 道琼斯工业平均指数和运输平均指数都创出次要反应低点(下跌达先前上涨的33-66%,持续3+周)。
  2. 两个平均指数然后反弹并超过次要反应之前的峰值。
  3. 确认必须在两个平均指数中发生,虽然不一定在同一天。

实施逻辑:

state = BEAR(默认)

每当道琼斯工业平均指数创新高时:
  检查:道琼斯运输平均指数自上次次要反应以来也创新高了吗?
  如果是:state = BULL

每当道琼斯工业平均指数创新低时:
  检查:道琼斯运输平均指数自上次次要反弹以来也创新低了吗?
  如果是:state = BEAR

熊市识别

当满足以下条件时确认熊市:

  1. 两个平均指数从下跌中反弹(熊市中的次要反弹)。
  2. 两个平均指数然后跌破反弹前的低点。
  3. 再次,两者都必须确认。

确认和背离

现代应用说明

-许多从业者用标普500代替道琼斯工业平均指数,用运输 ETF(IYT)或道琼斯运输平均指数代替运输平均指数。


13. 常见错误

形态识别错误

  1. 看到不存在的形态。 确认偏见是技术分析师最大的敌人。形态在满足所有识别标准之前无效。如果你正在眯眼和合理化,它就不是形态。

  2. 在确认之前行动。 头肩形态直到颈线突破才是头肩形态。双顶直到谷底突破才是双顶。预测完结是亏损之路。

  3. 忽视成交量。 没有成交量确认的突破(尤其是上涨突破)不可靠。成交量是市场的测谎仪。

  4. 在不适合的股票上使用形态。 交易清淡的股票、微型股和被严重操纵的股票不会形成可靠形态。坚持流通、活跃交易的股票。

  5. 混淆时间周期。 日线图上的形态和周线图上的形态分量不同。始终知道你在哪个时间周期交易。

趋势分析错误

  1. 对抗主要趋势。 反对主要趋势的形态交易成功率高得多。只要可能,沿主要趋势方向交易。

  2. 重新绘制趋势线以避免承认突破。 如果趋势线被突破,接受它。如果趋势恢复,从头绘制新的。

  3. 忽视扇形原则。 当陡峭趋势线被突破时,它们通常被更缓的替换。第三条扇形线突破是明确信号。

风险管理错误

  1. 没有止损。 每笔交易必须有预定义的亏损退出点。没有止损,小亏损变大亏损,大亏损变成灾难。

  2. 将止损移向错误方向。 止损是基于形态的无效点设置的。如果你移动它给交易"更多空间",你是在用希望覆盖分析。

  3. 基于信念而非风险确定仓位大小。 根据止损位置确定仓位大小,而不是根据你有多自信。市场不在乎你的信念。

  4. 过早卖出赢家而持有输家。 处置效应。让赢家运行至测量目标。在止损位砍输家。


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

场景:头肩底看涨交易

第1步:背景评估

第2步:形态识别

第3步:测量目标

第4步:风险评估

第5步:入场执行

第6步:交易管理

第7步:出场

结果:


15. 实施伪代码

15.1 头肩检测

function detect_head_and_shoulders(prices, volumes, lookback=120):
    pivots = find_pivot_points(prices, lookback)
    highs = [p for p in pivots if p.type == HIGH]
    lows = [p for p in pivots if p.type == LOW]

    for i in range(len(highs) - 2):
        left_shoulder  = highs[i]
        head           = highs[i+1]
        right_shoulder = highs[i+2]

        if head.price <= left_shoulder.price or head.price <= right_shoulder.price:
            continue

        shoulder_diff = abs(left_shoulder.price - right_shoulder.price) / left_shoulder.price
        if shoulder_diff > 0.05:
            continue

        low_1 = find_lowest_between(lows, left_shoulder.date, head.date)
        low_2 = find_lowest_between(lows, head.date, right_shoulder.date)

        if low_1 is None or low_2 is None:
            continue

        neckline = Line(low_1, low_2)

        vol_left  = average_volume(volumes, left_shoulder.date, window=5)
        vol_right = average_volume(volumes, right_shoulder.date, window=5)
        if vol_right >= vol_left:
            continue

        neckline_at_head = neckline.value_at(head.date)
        pattern_height = head.price - neckline_at_head

        current_price = prices[-1]
        current_neckline = neckline.value_at(current_date)

        if current_price < current_neckline:
            return {
                'pattern': 'HEAD_AND_SHOULDERS_TOP',
                'left_shoulder': left_shoulder,
                'head': head,
                'right_shoulder': right_shoulder,
                'neckline': neckline,
                'target': current_neckline - pattern_height,
                'stop': right_shoulder.price,
                'confirmed': True
            }

    return None

15.2 三角形检测

function detect_triangle(prices, lookback=90):
    pivots = find_pivot_points(prices, lookback)
    highs = [p for p in pivots if p.type == HIGH]
    lows  = [p for p in pivots if p.type == LOW]

    if len(highs) < 2 or len(lows) < 2:
        return None

    upper_line = linear_regression(highs)
    lower_line = linear_regression(lows)

    upper_slope = upper_line.slope
    lower_slope = lower_line.slope

    FLAT_THRESHOLD = 0.001

    if upper_slope < -FLAT_THRESHOLD and lower_slope > FLAT_THRESHOLD:
        triangle_type = 'SYMMETRICAL'
        bias = 'CONTINUATION'
    elif abs(upper_slope) < FLAT_THRESHOLD and lower_slope > FLAT_THRESHOLD:
        triangle_type = 'ASCENDING'
        bias = 'BULLISH'
    elif upper_slope < -FLAT_THRESHOLD and abs(lower_slope) < FLAT_THRESHOLD:
        triangle_type = 'DESCENDING'
        bias = 'BEARISH'
    else:
        return None

    if upper_slope - lower_slope >= 0:
        return None

    apex_date = (lower_line.intercept - upper_line.intercept) / (upper_slope - lower_slope)

    base_date = min(highs[0].date, lows[0].date)
    current_position = (current_date - base_date) / (apex_date - base_date)
    if current_position < 0.5 or current_position > 0.75:
        pass

    base_width = highs[0].price - lows[0].price

    current_price = prices[-1]
    upper_boundary = upper_line.value_at(current_date)
    lower_boundary = lower_line.value_at(current_date)

    if current_price > upper_boundary:
        return {
            'pattern': f'{triangle_type}_TRIANGLE',
            'breakout_direction': 'UP',
            'target': current_price + base_width,
            'stop': lower_boundary,
            'bias': bias
        }
    elif current_price < lower_boundary:
        return {
            'pattern': f'{triangle_type}_TRIANGLE',
            'breakout_direction': 'DOWN',
            'target': current_price - base_width,
            'stop': upper_boundary,
            'bias': bias
        }

    return {
        'pattern': f'{triangle_type}_TRIANGLE',
        'breakout_direction': 'PENDING',
        'upper_boundary': upper_boundary,
        'lower_boundary': lower_boundary,
        'bias': bias
    }

15.3 支撑和阻力检测

function find_support_resistance(prices, volumes, lookback=252):
    levels = {}

    pivots = find_pivot_points(prices, lookback)

    for pivot in pivots:
        matched = False
        for level in levels:
            if abs(pivot.price - level) / level < 0.015:
                levels[level].append(pivot)
                matched = True
                break
        if not matched:
            levels[pivot.price] = [pivot]

    scored_levels = []
    for price, touches in levels.items():
        score = 0
        score += len(touches) * 2
        score += sum(v.volume for v in touches) / avg_vol
        score += (current_date - touches[0].date).days / 30
        if price % 10 == 0 or price % 25 == 0:
            score += 3

        scored_levels.append({
            'price': price,
            'touches': len(touches),
            'score': score,
            'type': 'SUPPORT' if price < current_price else 'RESISTANCE'
        })

    return sorted(scored_levels, key=lambda x: x['score'], reverse=True)[:10]

15.4 旗形/尖旗检测

function detect_flag(prices, volumes, lookback=30):
    pole_lookback = 15
    recent_high = max(prices[-pole_lookback:])
    recent_low  = min(prices[-pole_lookback:])
    pole_move = (recent_high - recent_low) / recent_low

    if pole_move < 0.08:
        return None

    if prices[-1] > prices[-pole_lookback]:
        pole_direction = 'UP'
        pole_start = recent_low
        pole_end   = recent_high
    else:
        pole_direction = 'DOWN'
        pole_start = recent_high
        pole_end   = recent_low

    consolidation = prices[-10:]
    consol_range = max(consolidation) - min(consolidation)
    pole_range = abs(pole_end - pole_start)

    if consol_range / pole_range > 0.38:
        return None

    vol_during_pole   = mean(volumes[-pole_lookback:-10])
    vol_during_consol = mean(volumes[-10:])
    if vol_during_consol >= vol_during_pole:
        return None

    consol_slope = linear_regression(consolidation).slope
    if pole_direction == 'UP' and consol_slope > 0:
        return None
    if pole_direction == 'DOWN' and consol_slope < 0:
        return None

    if pole_direction == 'UP':
        target = pole_end + pole_range
        stop = min(consolidation)
    else:
        target = pole_start - pole_range
        stop = max(consolidation)

    return {
        'pattern': 'FLAG' if pole_direction == 'UP' else 'PENNANT',
        'direction': pole_direction,
        'target': target,
        'stop': stop,
        'pole_move': pole_move,
        'consolidation_slope': consol_slope
    }

16. 关键语录

"市场价格反映了在任一时刻可知晓的关于该股票的一切。"

"处于运动中的趋势倾向于保持运动,直到明确的反转信号出现。"

"图表形态会重现,因为驱动它们的人类心理不会改变。"

"交易量确认价格运动。在牛市中,上涨的成交量应大于下跌的成交量。在熊市中则相反。"

"形态越大,其后续运动越大。"

"在价格上涨之前积累。在价格下跌之前派发。"

"趋势线需要三个点来确认。在那之前,它只是试探性的。"

"止损是保险——你购买它,希望永远不需要使用它。"

"技术分析不是关于预测确定性;而是关于识别概率。"

"最重要的规则是:永远不要与主要趋势对抗。"


实施规范结束。