CHAPTER 04

看懂 K 线

K 线不是玄学符号,是 OHLC 时间序列的可视化——学会读图,同时认清技术分析的边界。

4.1 一根蜡烛,就是一次 GROUP BY

打开任何一个行情软件,满屏红红绿绿的小蜡烛会让人以为里面藏着什么密码。没有。K 线图是一次聚合查询的可视化结果,聚合函数只有四个:第一个、最大、最小、最后一个。

交易所撮合出的原始数据是一条 tick 流:每一笔成交的时间、价格、数量。把这条流按时间窗口分桶,每个桶里算四个数,就得到了一根 K 线:

SELECT
  time_bucket('1 day', ts) AS bar,
  first(price ORDER BY ts) AS open,   -- 开盘价
  max(price)               AS high,   -- 最高价
  min(price)               AS low,    -- 最低价
  last(price  ORDER BY ts) AS close,  -- 收盘价
  sum(qty)                 AS volume  -- 成交量
FROM ticks
GROUP BY bar;

画出来的时候,规则同样只有三条:

颜色只表示一件事:close − open 的符号。A 股的习惯是红涨绿跌,和美股、欧洲市场的绿涨红跌正好相反。这是文化差异不是技术差异,红色在中国是喜庆色。同时看 A 股和美股,或者用 TradingView 这类国际软件时,第一件事是确认当前配色,否则会把满屏上涨读成暴跌。

图 4-1 · 一根 K 线的解剖:同一组 OHLC,只换开收顺序

最高价 high 11.00 收盘价 close 10.80 开盘价 open 10.20 最低价 low 10.00 最高价 high 11.00 开盘价 open 10.80 收盘价 close 10.20 最低价 low 10.00 上影线 实体 下影线 阳线:收盘 > 开盘 A 股画成红色 = 涨 阴线:收盘 < 开盘 A 股画成绿色 = 跌 两根蜡烛的最高价、最低价完全相同,只是开收顺序相反:颜色只编码 close − open 的符号
左右两根蜡烛的最高价、最低价、实体高度完全一样,区别只是开盘价和收盘价对调。部分软件把阳线画成空心红框而不是实心,含义不变。

图 4-1 里藏着两个容易被忽略的结论。

第一,颜色不编码涨跌幅。一根小小的红色实体,可能是全天从 −9% 一路拉回到 +0.1% 收盘;一根粗大的绿色实体,可能是开盘跳空高开 5% 然后回落到 +1%,全天其实是涨的。「今天几根红几根绿」这类统计信息量极低。真正表示涨跌幅的是今日收盘相对昨日收盘的百分比,而昨收这个数根本没画在这根蜡烛上。

第二,K 线是有损压缩。同一组 {open, high, low, close} 背后可以对应无数条日内路径:先冲高再砸下来、先砸下去再拉起来、全天窄幅震荡最后一分钟拉升,画出来可能是同一根蜡烛。所有「这根 K 线说明主力在洗盘」的解读,都是在对已经丢掉的信息做想象。

程序员视角 K 线 = 对 tick 流做 GROUP BY 时间窗口后的 OHLC 聚合,切换周期就是改 window size。而且这是有损聚合——就像监控系统里只保留每分钟的 min / max / first / last,你永远无法从这四个数还原出原始曲线的形状。区别在于,没人会盯着 CPU 使用率的 p99 折线图去预测下周的流量,但很多人会盯着 K 线做这件事。

4.2 周期就是 window size

同一段行情,换个聚合粒度就是另一张图。A 股一个交易日 4 小时,等于 240 分钟,所以一天可以切成 240 根 1 分钟线、48 根 5 分钟线,或者聚合成 1 根日线;5 根日线合成 1 根周线(遇上节假日不足 5 天也算 1 根),大约 21 根日线合成 1 根月线。

图 4-2 · 同一段行情的四种聚合粒度

月线 · 24 根(近两年,每根 = 21 个交易日) 区间 10.09 → 18.80(+86.3%) 20.8 9.4 周线 · 26 根(近半年,每根 = 5 个交易日) 区间 20.27 → 18.80(-7.2%) 20.8 16.8 日线 · 30 根(近 6 周,每根 = 48 根 5 分钟线) 区间 19.11 → 18.80(-1.6%) 20.8 18.7 5 分钟线 · 48 根(最后 1 个交易日) 区间 19.08 → 18.80(-1.4%) 19.1 18.7
四张图由同一条 5 分钟级价格序列逐级聚合而来(5 分钟 → 日 → 周 → 月),只改了 GROUP BY 的窗口大小,并且都锚定同一个收盘时刻——所以四个面板最后一根的收盘价是同一个数:18.80。各面板第一根的开盘价不同,因为窗口起点不同;相等关系只出现在嵌套处:月 K 的开盘价 = 当月第一周的开盘价 = 当周第一天的开盘价 = 当天第一根 5 分钟线的开盘价。同一份数据:月线上是 +86.3% 的上涨,周线上是 −7.2% 的回调,日线上是 −1.6% 的震荡,5 分钟线上基本看不出方向。

图 4-2 值得盯着多看一会儿。同一只股票、同一段数据,在月线上你会说「这是一轮大牛市」,在周线上你会说「明显在跌」,在 5 分钟线上你只会说「一片混乱」。这三句话没有一句是错的,它们回答的是不同时间尺度上的问题。

所以不存在「更准」的周期,只存在和你持有期匹配的周期。如果你打算持有三年,5 分钟线对你就是纯噪声输入;如果你要做的是长期定投(第 7 章),你连日线都不需要看。

这背后有一个干净的数学理由。把价格近似看成带漂移的随机游走,那么在时间跨度 t 上,趋势带来的价格变化正比于 t,而波动带来的噪声正比于 √t。信噪比因此正比于 t / √t = √t。周期从日线放大到月线,跨度乘以 21,信噪比只提高约 4.6 倍——但换来的好处是,你的决策次数少了 20 倍,而每次决策都要付出真金白银的成本(第 3 章算过,一买一卖约千分之一)。

避坑 盯短周期做「趋势判断」是新手最常见的自我损耗:5 分钟线上你一天能看到七八次「突破」和「破位」,其中绝大多数是噪声,但每一次都在诱导你下单。真按这些信号操作,一年换手几十次,光成本就能吃掉本金好几个点——而这几个点恰好是长期年化收益里很大的一块。

4.3 成交量:这次价格变动的置信度

成交量是那根蜡烛对应时间窗口内成交的股数,A 股常以「手」计(1 手 = 100 股);成交额则是金额。行情软件一般把它画成 K 线下方的柱状图,柱子颜色跟随当根 K 线的红绿。

价量关系不是定律,而是一个常识性的先验:成交量是这次价格变动的样本量

形态字面含义合理的解读边界
放量上涨价格涨,成交量显著高于近期均值有大量资金真金白银换手,这个新价格被更多人认可
缩量上涨价格涨,成交量萎缩只有少量筹码在换手,价格容易被小单推动,代表性弱
放量滞涨 / 放量下跌成交量放大但价格不涨或下跌买卖双方分歧加大,有人在大举离场
缩量阴跌价格阴跌,成交量低迷卖压不重,但也没人愿意接,属于无人关注状态

注意这张表的第三列写的是「解读」不是「预测」。放量上涨之后既可能继续涨也可能见顶,成交量能告诉你的是这次定价的参与人数,不是下一步方向。

程序员视角 价格是均值,成交量是 n。有人告诉你 A/B 实验转化率提升了 20%,你的第一个问题一定是样本量多少——3 万人的实验和 30 人的实验是两回事。看 K 线时该问同一个问题:这根阳线是几十亿成交额堆出来的,还是几百万就把它推上去的。

比较不同股票时,绝对成交量没有可比性,要看换手率 = 成交量 ÷ 流通股本。一只流通盘几十亿股的银行股成交 1 亿股是缩量,一只流通盘 1 亿股的小盘股成交 1 亿股是全天筹码换了一遍。

避坑 「几百万资金就能拉涨停」不是机会,是风险信号。流动性差意味着你买进去容易、卖出来难:同样的挂单量,在冷门股上会把价格打穿好几档(第 2 章的滑点),而这类股票也正是题材炒作和资金做局最喜欢的容器(第 9 章)。

4.4 均线:一个天生滞后的滤波器

MA5 就是最近 5 个收盘价的算术平均,MA20 是最近 20 个。写成代码没有任何悬念:

def ma(close, n):
    """长度为 n 的滑动窗口平均,每个 tap 权重都是 1/n"""
    return [sum(close[i-n+1 : i+1]) / n for i in range(n-1, len(close))]

这是一个 FIR 低通滤波器。EMA(指数移动平均)则是把权重改成按 α(1−α)^k 指数衰减,也就是一阶 IIR 低通——和 TCP 里估算 RTT 的 SRTT 平滑公式、和指数退避,是同一个数学形状。

既然是低通滤波,滞后就是它的数学性质,不是可以调掉的 bug。一个 n 日简单均线对线性趋势的响应大约滞后 (n−1)/2 天:MA20 滞后约两周,MA60 滞后约一个半月。

均线窗口长度覆盖时间大致滞后
MA55 个收盘价约 1 周约 2 天
MA2020 个收盘价约 1 个月约 10 天
MA6060 个收盘价约 1 个季度约 1 个半月
MA250250 个收盘价约 1 年(A 股一年约 242~244 个交易日,也有人用 MA240)约半年

口语里这几条均线常被叫成「周线」「月线」「年线」,和 4.2 节讲的周 K 线、月 K 线完全是两回事——前者是画在日线图上的一条平滑曲线,后者是换了聚合周期的另一张图。听别人讲盘时要看上下文,这是个高频的沟通误会。

金叉是快线上穿慢线,死叉是快线下穿慢线。剥掉话术,它的定义就是:最近 5 天的均价刚刚超过最近 20 天的均价。这是一个关于已经发生的事的陈述——等到 MA5 穿过 MA20,那波上涨早就走完一段了。

这不算缺点。趋势跟踪本来就是「放弃头部和底部,赚中间那一段」的交易方式,滞后是它为了过滤噪声主动付出的代价。它真正的问题在震荡市:价格来回穿越均线,你被反复触发买卖,每次都在高点买、低点卖,成本一层层叠加。

程序员视角 金叉死叉 = 快慢两个低通滤波器输出的交叉点。你不会指望把监控告警的滑动窗口从 5 分钟改成 10 分钟就能预测故障——换窗口只是换了灵敏度和误报率的权衡点。均线参数完全一样:把 MA5/MA20 调成 MA7/MA23,改变的是「多敏感、多少假信号」,不是「多准」。

4.5 常见形态:市场语言,不是预测函数

有几个形态值得认识,因为它们是行情讨论里的通用词汇,你需要听得懂:

关于缺口有个必须分清的坑:K 线图上的缺口,很多根本不是市场行为,而是除权除息造成的技术性断层——公司分红那天股价被机械地扣掉一块。这类缺口会被复权抹平,4.7 节详细讲。把除息缺口当成「跳空下跌」来解读,是新手最常见的误读之一。

以上解读全都是对已发生事实的描述。「今天冲高回落」是一句有效的信息交流,「出现长上影线所以明天会跌」则是另一回事。任何把形态包装成预测函数的说法,都要先问三个问题:样本量多大、有没有对「你一共试了多少种形态」做统计校正、扣掉交易成本之后还剩多少。下一节就来算这笔账。

4.6 为什么「战法」在你手里会失效

这是本章最重要的一节。技术分析预测未来的能力很弱,这个结论有三层理由,从弱到强。

第一层,有效市场的挤出。如果某个形态真有稳定的预测力,机构的程序会以毫秒级把它套利掉,直到这个信号消失。你在手机上肉眼看到的形态,专业团队早就用全市场几十年的数据扫过无数遍了。你能想到的,不太可能是别人没想到的。

第二层,数据窥探与多重检验。Sullivan、Timmermann 和 White 在 1999 年《Journal of Finance》上用 White 的 Reality Check 自助法,检验了近 100 年道琼斯工业指数日线上的近 8000 条技术交易规则。结论是:一旦对「你一共试了多少条规则」做出统计校正,最好那条规则的超额收益就不再显著;而且把它拿到随后 10 年的样本外去交易,优势没有延续。

第三层,交易成本。Bajgrowicz 和 Scaillet 在 2012 年《Journal of Financial Economics》上用错误发现率(FDR)方法重做了 1897–2011 年道指上的 7846 条规则,结论更狠两句:持续性检验表明投资者事前根本无法挑出未来表现最好的规则;而且即便只看样本内,很低的交易成本就足以把超额收益完全抹平。

这些都是别人的研究。我自己做了一个更直白的实验,你可以在几十行代码里复现它。

我用随机数生成了 500 段价格序列——按构造,这些序列里不含任何规律,未来的涨跌与过去完全独立。对每一段,我在前 80 个交易日上用 36 组均线参数(快线取 3~15,慢线取 20~60)做网格搜索,选出样本内收益最高的那一组,然后把这组参数原封不动用到后 80 个交易日上。结果是:

45% 这个数字很关键:在纯噪声上,样本外的胜率就是掷硬币,甚至略低于掷硬币。而样本内那个漂亮的 80% 和 +8.4 个百分点,完全是搜索参数这个动作本身制造出来的。只要你试的参数够多,漂亮的回测是必然产物,不是发现。

图 4-3 · 一次教科书式的过拟合

同一段行情的 K 线:MA15 / MA30 金叉买、死叉卖 MA15 MA30 24.7 17.7 买入信号  卖出信号 实心 = 样本内,空心 = 样本外(同一套规则,一直照常发信号) ← 样本内 80 天:参数在这里被调出来 样本外 80 天 → 净值曲线:策略 vs 买入持有(起点都是 1.00) 1.00 策略 买入持有 1.03 1.02 样本内:策略 +20.8%,买入持有 +3.0%  样本外:策略 -14.6%,买入持有 -0.9% 这段行情是用随机数生成的,价格里不含任何规律;36 组参数中最好的一组仍能在样本内跑赢。
上图是其中一段随机行情,蓝色阴影区是调参用的样本内区间,买卖点由样本内最优的 MA15 / MA30 参数生成;下图是两条净值曲线。样本内策略 +20.8% 完胜买入持有 +3.0%,一过分界线,同一套规则就变成 −14.6% 对 −0.9%。

顺带说一句:这张图是我从 500 段随机序列里挑出对比最鲜明的一段画的。这个挑选动作本身就是数据窥探——和「战法」课程里那些精准标注的案例图,是同一种操作。差别只是我在这里告诉了你,而他们不会。

程序员视角 迷信 K 线战法 = 在训练集上把参数调到 100% 准确率,然后直接上生产。机器学习至少有 train / test split 这个行业共识,而「战法」课程连这一步都没有:你看到的每一张标注得天衣无缝的历史图,都是在训练集上画的。真正的检验只有一种——前推验证(walk-forward),参数只用过去的数据定,永远在没见过的数据上结算。
避坑 判断一套「战法」是不是过拟合,问五个问题:1. 有没有样本外或前推验证,还是只展示历史标注图;2. 一共有几个可调参数(自由度越多越可疑);3. 回测扣了多少手续费、印花税和滑点;4. 展示的是全部结果还是精选案例;5. 对方靠什么赚钱——靠这套方法自己交易,还是靠卖课、卖软件、收会员费。最后一个问题的答案通常最有信息量。

4.7 复权:不做这一步,你看到的历史是错的

假设一家公司 10 派 5(每 10 股派 5 元现金,税前),股价 30.00 元。除息日当天,交易所会把开盘参考价直接下调到 29.50。这不是下跌——那 0.50 元从公司账上转到了你的账户里,你的总资产没有变化。送股转股同理:10 转 10 之后股价直接腰斩,但你手里的股数翻倍。

如果不处理这件事,K 线图上就会留下一连串向下的技术性缺口。一只十年涨了十倍、年年高分红的公司,不复权的走势图可能看起来「十年没怎么涨」。所有基于价格的计算——长期收益率、均线、历史高低点、当前位置判断——全部失真。

模式做法特点什么时候用
不复权直接显示交易所的历史成交价除权日留有缺口;每个价格都是当年真实成交价想知道「当年真的是多少钱成交的」
前复权以最新价为基准,把历史价格向下调整当前价与真实盘口一致;历史价低于当年真实价,长期高分红股甚至可能出现负值看长期走势、算均线、判断当前位置(软件默认,也是日常首选)
后复权以上市首日为基准,把后续价格向上调整历史价格固定不变;当前显示价高于真实盘口价做长期回测、算累计收益率
程序员视角 前复权数据是可变历史:公司每分一次红,全部历史价格都会被改写一遍。这意味着你今天拉到的前复权 K 线,和上个月拉到的同一段数据数值不同——用它做回测,结果不可复现。要可复现,就用后复权,或者干脆存不复权价加一张复权因子表,需要时自己算。这跟你不会把可变对象当缓存 key 是同一条戒律。

4.8 行情软件里实际怎么用

把上面的东西落到操作上,第一次打开行情软件只需要做四件事:

至于条件选股 / 选股器:用它按市值、PE、PB、ROE、行业做基本面初筛是合理的(第 6 章会给具体的筛法);用它扫「出现 XX 形态的股票」,就是在把 4.6 节讲的过拟合自动化——搜索空间更大,假发现更多。

本章的结论可以压缩成一句话:K 线只能告诉你三件事——现在的价格位置、最近的波动幅度、市场的关注度(成交量)。这三件事对判断「现在贵不贵」有一点用,对预测「明天涨不涨」没有用。判断贵不贵需要一个锚,那个锚不在价格图里,而在公司的经营数据里。下一章开始看财报。