一句话结论:94.4% 的日子,今天日盘会突破当天夜盘区间的至少一侧;两边都没破的只有 5.6%。
单看一边:夜盘高点被突破的概率是 61.1%,夜盘低点是 54.6%。
作用:当你今天已经明确了要做哪个方向,把这个方向上的夜盘高点或低点当作目标位,是一个相对可靠的选择。
夜盘也叫 Globex(老一辈交易员的叫法),或者 ETH。
2010–2026 年 · 至少突破夜盘高低点一侧
94.4%
样本 3878 个交易日
只破上
39.8%
1545 天
只破下
33.3%
1293 天
两边都破
21.2%
823 天
都没破
5.6%
217 天
逐年分布右侧是至少突破一侧的比例,点某一年只看这一年。
两种参照线对比2010–2026 年
结论:夜盘区间几乎一定会被突破
3878 个交易日里,94.4% 的日子至少突破了夜盘区间的一侧。
而且很稳定:逐年都在 88.2% 到 97.5% 之间,最低的 2020 年也接近九成。
剩下的日子:两边都破更常见
- 两边都破(21.2%):差不多每五天就有一天,日盘把夜盘区间的上下沿都破了。
- 两边都没破(5.6%):日盘整天待在夜盘区间里,很少见。
方向偏向比较弱
只破上 39.8%,只破下 33.3%,差了 6.5 个百分点。16 年里有 5 年是下破多于上破:2010、2012、2015、2016、2022。
这 5 年是不是都在下跌?用数据核对了一下,并不是:
| 年份 | ES 全年涨跌 | 夜盘高点被突破 | 夜盘低点被突破 |
|---|---|---|---|
| 2010(6 月起) | +17.9% | 56.7% | 59.0% |
| 2012 | +11.9% | 55.4% | 58.4% |
| 2015 | −0.1% | 53.4% | 61.3% |
| 2016 | +11.7% | 53.9% | 60.1% |
| 2022 | −19.0% | 59.7% | 63.4% |
全年涨跌:这一年第一个交易日日盘的开盘价,到最后一个交易日日盘的收盘价。连续合约没有复权,换约时的价差也算在里面,所以只是近似值。
只有 2022 年是真正的熊市,2015 年基本持平,另外三年全年都是上涨的。反过来,2011 年(−0.8%)和 2018 年(−6.7%)全年下跌,夜盘却仍然是上破多于下破。
所以全年的涨跌和“日盘往哪边突破夜盘区间”关系不大。夜盘区间是每天重新画的,突破哪一边反映的是当天的走势,和一整年的趋势不是一回事。即使是 2022 年这样全年跌了 19% 的熊市,夜盘低点被突破也只比高点多 3.7 个百分点。
逐年看:夜盘区间宽的年份,突破率低
大体上,夜盘区间相对日盘越宽,突破率越低。最低和最高的几年:
| 年份 | 夜盘宽度 / 日盘宽度(中位数) | 至少突破一侧 |
|---|---|---|
| 2020 | 0.98 | 88.2% |
| 2019 | 0.85 | 90.0% |
| 2023 | 0.66 | 97.5% |
夜盘宽度 / 日盘宽度:每天用“夜盘最高价 − 夜盘最低价”除以“当天日盘最高价 − 日盘最低价”,得到一个比值,再取这一年所有交易日的中位数。它不是价格的百分比,而是两段区间的相对宽度:0.98 表示这一年里典型的一天,夜盘区间差不多和日盘一样宽;0.66 表示夜盘区间只有日盘的三分之二左右。
2020 年波动极大,夜盘区间几乎和日盘一样宽,日盘就更难走出夜盘的范围;2023 年夜盘区间相对窄,日盘几乎天天走出去。
和昨日高低点比
切换到“昨日高低点”会看到,昨日区间被突破的比例低一些(89.6%),两边都破的比例只有夜盘的一半不到(9.7% 对 21.2%)。
原因是两个区间的宽度不一样:夜盘区间更窄,宽度的中位数只有当天日盘的 0.77;昨天日盘的区间和今天日盘差不多宽,中位数是 1.01。区间越窄,单边被突破或者两边都被突破的概率相对更高。详见突破昨日高低点。
定义和复现
突破夜盘高低点
- 数据:清洗后的 ES 1 分钟 K 线,2010-06 到 2026-09,清洗方法见这篇。
- 日盘:美东 09:30–16:15,也就是 1 分钟 K 线从 09:30 到 16:14,5 分钟 K 线 81 根。
- 夜盘:前一个交易日 16:15 到当天 09:29。夜盘高点 / 低点就是这段时间的最高价 / 最低价。
- 跳过的日子:夜盘数据不完整(少于 800 根 1 分钟 K 线)的 46 天不算,剩下 3878 天。
- 向上突破:今天日盘最高价严格高于夜盘高点,也就是至少高 1 个跳动单位(0.25 点)。正好等于不算。
- 向下突破:今天日盘最低价严格低于夜盘低点。
- 四种结果:只破上、只破下、两边都破、都没破。
我有一份清洗过的 ES 期货 1 分钟 K 线 CSV(Databento 的 ES.c.0 连续合约,列有 ts_event、high、low,时间是 UTC)。请帮我写 Python 代码,统计“今天日盘有没有突破当天夜盘的最高点或最低点”。规则如下: 1. 时间先转成美东时间(US/Eastern),自动处理夏令时。日盘 = 09:30–16:15,也就是 1 分钟 K 线从 09:30 到 16:14(405 根)。 2. 夜盘 = 前一个交易日 16:15 到当天 09:29。具体做法:16:15 之后的 K 线归到下一个有日盘的交易日,09:30 之前的 K 线归到当天(如果当天没有日盘,就归到之后最近的交易日)。夜盘高点 / 低点 = 这段时间的最高价 / 最低价。 3. 夜盘不完整的日子跳过:夜盘少于 800 根 1 分钟 K 线就不算。 4. 向上突破:今天日盘最高价严格大于夜盘高点(等于不算,也就是至少高 1 个跳动单位 0.25)。向下突破:今天日盘最低价严格小于夜盘低点。 5. 每天归入四种结果之一:只破上、只破下、两边都破、都没破。打印样本天数、四种结果的占比、至少突破一侧的比例,再按年份列一张表。 请每一步加中文注释,说明为什么这样做。
# 突破夜盘高低点:今天日盘有没有突破当天夜盘的最高点 / 最低点
# 输入:清洗后的 ES 1 分钟 K 线(Databento ES.c.0,时间是 UTC)
import numpy as np
import pandas as pd
df = pd.read_csv("ES-1min_标准版.csv", usecols=["ts_event", "high", "low"])
t = pd.to_datetime(df.ts_event, utc=True).dt.tz_convert("US/Eastern").dt.tz_localize(None)
hm = t.dt.hour * 100 + t.dt.minute
df["date"] = t.dt.normalize()
is_rth = (hm >= 930) & (hm < 1615) # 日盘 09:30–16:15
rth = df[is_rth].groupby("date").agg(hi=("high", "max"), lo=("low", "min"))
days = rth.index
# 夜盘 = 前一个交易日 16:15 到当天 09:29:
# 16:15 之后的 K 线归到下一个交易日,09:30 之前的归到当天
eth = df[~is_rth]
anchor = eth.date + pd.to_timedelta((hm[~is_rth] >= 1615).astype(int), unit="D")
pos = days.searchsorted(anchor)
keep = pos < len(days)
night = (eth[keep].assign(day=days[pos[keep]])
.groupby("day").agg(hi=("high", "max"), lo=("low", "min"), bars=("high", "size")))
night = night[night.bars >= 800] # 夜盘不完整(少于 800 根)的日子跳过
today = rth.loc[night.index]
up = today.hi > night.hi # 严格高于,等于不算
down = today.lo < night.lo
cls = pd.Series(np.select([up & down, up, down], ["两边都破", "只破上", "只破下"], "都没破"), index=today.index)
print("样本天数", len(cls))
print((cls.value_counts(normalize=True) * 100).round(1).to_string())
print("至少破一侧 %.1f%%" % (100 * (cls != "都没破").mean()))局限
- 只看有没有突破,没看突破了多远:超出 1 个跳动单位就算突破。夜盘区间本来就窄,被突破不代表会走出趋势。
- 没有区分先破哪一边:两边都破的日子,先上后下和先下后上混在一起。
- 夜盘不完整的 46 天被排除:这些天日盘正常,只是夜盘数据缺了一段。
(2026 年 10 月更新:用清洗后的数据重新计算,替换了原来的示例数字,加入可交互统计和复现卡片。)