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分钟 | 抓入场 | 订单流失衡、吸收 |
具体怎么用?
- 日线定方向:先看日线 Market Profile,找到价值区域和 POC。如果价格在价值区域上方,偏多;在下方,偏空。
- 60分钟找节奏:看小时线的 TPO 分布,确认当前是吸筹还是派发。配合 Delta 趋势,判断主力意图。
- 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