14、订单流与市场轮廓:Market Profile与订单流的时间价格机会

做交易这么多年,我越来越觉得一个道理:价格只是结果,时间才是过程

很多人盯着K线看,觉得价格涨了就是买盘强,跌了就是卖盘狠。但你有没有想过——同样的涨幅,用了10分钟和用了2小时,背后的含义完全不一样?

这就是我今天要聊的核心:Market Profile(市场轮廓)。它把时间和价格揉在一起,告诉你市场在什么价位花了多少时间。再配合订单流,你就能看到「谁在什么时间、什么价位、干了多少事」。

说白了,这就是多周期共振的另一种玩法——时间周期和价格周期共振。

14.1 市场轮廓的核心逻辑

Market Profile 是 Pete Steidlmayer 在80年代搞出来的。他当时在CBOT(芝加哥期货交易所)做交易,发现一个现象:市场在某个价位停留的时间越长,这个价位就越重要

为什么?

你想想看,如果某个价位反复被测试,说明多空双方在这里激烈博弈。谁赢了,价格就往哪边跑。这个价位就成了「价值区域」——也就是市场公认的合理价格区间。

我个人习惯把 Market Profile 理解成「市场的记忆」。它记录了每个价格被交易了多少次,或者说,市场在哪个价格区间花了最多的时间。

核心公式:
时间 × 价格 = 价值区域
价值区域 + 订单流 = 交易机会

14.2 订单流如何补充市场轮廓

Market Profile 告诉你「在哪里花了时间」,但没告诉你「谁在花时间」。订单流正好补上这一环。

举个例子:

假设某只股票在 100 元附近横盘了 2 小时,Market Profile 显示这里是个高价值区域。但光看这个,你不知道是买方在吸筹,还是卖方在派发。

这时候订单流就派上用场了:

  • 如果 Delta 持续为正(主动买盘 > 主动卖盘),说明买方在悄悄吃货。这个横盘就是吸筹区。
  • 如果 Delta 持续为负(主动卖盘 > 主动买盘),说明卖方在偷偷出货。这个横盘就是派发区。
  • 如果 Delta 来回震荡,说明多空在拉锯,还没分出胜负。

我在项目中遇到过好几次这种情况:光看 Market Profile 觉得是个支撑位,结果一进去就被套。后来加上订单流一看,原来 Delta 一直在负值区,那是卖方在压盘。嗯,从那以后我再也不敢只看轮廓不看流量了。

14.3 时间价格机会(TPO)的结构

TPO(Time Price Opportunity)是 Market Profile 的最小单位。每个 TPO 代表「在某个时间段内,价格到达过某个价位」。

通常我们用字母来表示时间:

  • A 代表第一个30分钟
  • B 代表第二个30分钟
  • C 代表第三个30分钟
  • ……以此类推

每个字母出现在某个价格旁边,就说明在那个30分钟内,价格到过这个位置。

举个例子:

价格     TPO
102.50   A B C
102.00   A B C D
101.50   A B C D E
101.00   B C D E
100.50   C D E
100.00   D E

你看,101.50 这个价位出现了 5 个字母(A到E),说明市场在这里花了最多的时间。这就是价值区域的核心。

我的小技巧:
如果某个价位的 TPO 数量是相邻价位的 2 倍以上,这个价位就是「关键控制点」(POC)。POC 往往是多空分水岭,突破或跌破都有大行情。

14.4 多周期共振的实战应用

好了,理论说完了,咱们来点实战的。

我个人习惯用三个时间周期来做共振分析:

周期 作用 关键指标
日线 定方向 日线价值区域、POC
60分钟 找节奏 小时线TPO、Delta趋势
5分钟 抓入场 订单流失衡、吸收

具体怎么用?

  1. 日线定方向:先看日线 Market Profile,找到价值区域和 POC。如果价格在价值区域上方,偏多;在下方,偏空。
  2. 60分钟找节奏:看小时线的 TPO 分布,确认当前是吸筹还是派发。配合 Delta 趋势,判断主力意图。
  3. 5分钟抓入场:在日线和小时线都共振的方向上,用订单流找具体的入场点。比如出现大单吸收、Delta 背离等信号。

我曾经用这个方法抓过一波原油的行情。日线 POC 在 78.5,价格一直在上面晃。小时线显示 Delta 持续为正,说明买方在吸筹。5分钟图上出现了一个明显的吸收形态——大卖单被吃掉,价格不跌。我果断入场,拿了 3 美元的利润。

注意:
多周期共振不是万能的。如果三个周期方向不一致,千万别强行交易。我见过太多人为了「凑共振」而硬做,结果被来回打脸。记住:共振是等出来的,不是找出来的

14.5 用Python实现Market Profile

光说不练假把式。咱们写个简单的 Python 代码,把 Market Profile 画出来。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

def calculate_market_profile(df, period='30min'):
    """
    计算Market Profile
    df: 包含时间、最高价、最低价的DataFrame
    period: TPO的时间周期,默认30分钟
    """
    # 按时间周期分组
    df['time_group'] = df['time'].dt.floor(period)
    
    # 为每个时间组分配字母
    letters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
    df['tpo_letter'] = df.groupby('time_group').ngroup().apply(
        lambda x: letters[x % 26]
    )
    
    # 构建TPO矩阵
    tpo_data = []
    for _, row in df.iterrows():
        price_range = np.arange(row['low'], row['high'] + 0.5, 0.5)
        for price in price_range:
            tpo_data.append({
                'price': price,
                'letter': row['tpo_letter']
            })
    
    tpo_df = pd.DataFrame(tpo_data)
    
    # 统计每个价位的TPO数量
    profile = tpo_df.groupby('price')['letter'].apply(
        lambda x: ''.join(sorted(set(x)))
    ).reset_index()
    
    # 找到POC(关键控制点)
    profile['tpo_count'] = profile['letter'].str.len()
    poc = profile.loc[profile['tpo_count'].idxmax(), 'price']
    
    return profile, poc

# 使用示例
# profile, poc = calculate_market_profile(data)
# print(f"POC: {poc}")

这段代码的核心逻辑:

  • 把时间切成30分钟的块,每个块分配一个字母
  • 记录每个价格在哪些时间块被触及
  • 统计每个价位的TPO数量,找到POC

实际项目中,我会把这个函数封装到交易系统里,每天开盘前自动跑一遍,看看当天的价值区域在哪里。

14.6 避坑指南

最后,分享几个我踩过的坑:

  • 别把TPO当精确信号:TPO只是告诉你市场在哪里花了时间,不代表一定会反转。它是个概率工具,不是水晶球。
  • 注意时间周期的一致性:如果你用30分钟的TPO,就别跟5分钟的订单流硬凑。周期差太多,共振效果会打折扣。
  • 小心跳空缺口:跳空会让Market Profile出现断层。这时候TPO的参考价值会下降,需要结合订单流重新评估。

我曾经在黄金上吃过这个亏。日线POC在1850,价格跳空低开到1840,我以为是假突破,结果一路跌到1800。后来复盘发现,跳空后的订单流显示Delta持续为负,卖方完全控盘。嗯,从那以后我再也不敢忽视跳空后的订单流了。

14.7 本章小结

Market Profile 和订单流,一个是「时间维度」,一个是「量能维度」。两者结合,你就能看到市场的全貌:

  • Market Profile 告诉你「在哪里花了时间」
  • 订单流告诉你「谁在花时间」
  • 多周期共振告诉你「什么时候动手」

说白了,这就是把时间和价格两个维度揉在一起,找到高概率的交易机会。我个人觉得,这是目前最接近「市场本质」的分析方法之一。

记住一句话:价格会骗人,但时间和量能不会


交易系统化学习资料 微信Strategy888888