3、价格序列基础:开盘价、收盘价、最高价、最低价、成交量、成交额

做高频交易的人,每天跟什么打交道最多?

说白了,就是这六个字段:开盘价、收盘价、最高价、最低价、成交量、成交额。它们构成了价格序列的骨架。我刚开始接触量化那会儿,觉得这玩意儿太简单了,不就是几个数字嘛。后来踩了不少坑才明白——越是基础的东西,越容易出问题。

3.1 四个价格:谁在说话?

先聊聊四个价格。很多人以为开盘价就是9:30第一笔成交,其实没那么简单。

核心定义:

  • 开盘价:每个交易时段的第一笔有效成交价。在A股,它是集合竞价的结果。
  • 收盘价:每个交易时段的最后一笔有效成交价。A股收盘前3分钟是集合竞价。
  • 最高价:时段内所有成交价的最大值。
  • 最低价:时段内所有成交价的最小值。

嗯,这里要注意。我见过不少新手直接用tick数据的第一个价格当开盘价,结果遇到开盘瞬间的异常报价,直接带偏了整个策略。我个人习惯是:先做一次价格合理性校验,比如检查开盘价是否落在昨日收盘价的±10%范围内。

为什么会这样?因为开盘价和收盘价承载的信息完全不同。开盘价反映的是隔夜信息的集中释放,而收盘价则是多空双方博弈后的暂时共识。你想想看,一个跳空高开的开盘价,往往意味着有重大利好被市场消化了。

3.2 最高价与最低价:波动的边界

最高价和最低价,这两个指标我特别喜欢用来做波动率估计。它们比收盘价的变化更敏感,能提前捕捉到市场的异动。

我曾经在一个日内策略里,只用最高价和最低价计算日内振幅,然后跟过去20天的平均振幅做比较。当振幅突然放大到均值2倍以上时,我就暂停交易——经验告诉我,这种时候往往伴随着大资金进出,散户很容易被来回打脸。

实战技巧:

用最高价和最低价计算真实波幅(ATR)时,记得考虑跳空缺口。公式是:

TR = max(最高价 - 最低价, |最高价 - 前收盘|, |最低价 - 前收盘|)

这个细节,很多教材都不讲,但实盘中特别重要。

3.3 成交量与成交额:量在价先

成交量是股数,成交额是金额。这两个指标,我建议你优先看成交额

为什么?因为不同股票的价格差异太大。贵州茅台一手20多万,农业银行一手才3000块。只看成交量,你根本分不清是散户在玩还是机构在动。成交额直接反映了资金的实际参与度,这个更有说服力。

我记得有一次做回测,发现某个策略在低价股上表现特别好,换到高价股就崩了。查了半天,原来是成交量阈值设错了——低价股一天成交几亿股很正常,高价股一天也就几百万股。后来我把所有逻辑都改成基于成交额,问题就解决了。

避坑指南:

我曾经在数据清洗时,发现某天的成交量突然变成0。一开始以为是停牌,后来发现是交易所数据源切换时字段映射错了。所以,拿到原始数据后,第一件事就是检查成交量和成交额的比例是否合理。正常情况下,成交额 ≈ 成交量 × 均价,偏差超过5%就要警惕。

3.4 六个字段的联动关系

这六个字段不是孤立的。它们之间有很多隐含关系,我总结了几条:

关系 含义 实战应用
收盘价 > 开盘价 阳线,买方占优 连续阳线+放量,趋势可能延续
最高价 - 最低价 很大 日内波动剧烈 配合成交量放大,可能是突破信号
成交量放大但价格不动 多空分歧严重 观望为主,等方向明确
成交额突然萎缩 流动性枯竭 小心闪崩,降低仓位

这些关系,说白了就是市场情绪的温度计。你如果能读懂它们,就能比别人早一步发现机会或风险。

3.5 代码实现:从原始数据到结构化序列

光说不练假把式。下面是我常用的数据预处理代码,处理的就是这六个字段:

import pandas as pd
import numpy as np

def clean_price_series(df):
    """
    清洗价格序列的六个核心字段
    df必须包含: open, high, low, close, volume, amount
    """
    # 1. 去除价格异常值
    df = df[(df['high'] >= df['low']) & (df['high'] >= df['open'])]
    df = df[(df['low'] <= df['close']) & (df['volume'] >= 0)]
    
    # 2. 检查成交额合理性
    estimated_amount = df['volume'] * (df['open'] + df['close']) / 2
    ratio = df['amount'] / estimated_amount
    df = df[(ratio > 0.95) & (ratio < 1.05)]
    
    # 3. 计算衍生指标
    df['range'] = df['high'] - df['low']  # 日内振幅
    df['body'] = abs(df['close'] - df['open'])  # 实体长度
    df['vwap'] = df['amount'] / df['volume']  # 均价
    
    return df

# 使用示例
raw_data = pd.read_csv('tick_data.csv')
clean_data = clean_price_series(raw_data)
print(f"清洗前{len(raw_data)}条,清洗后{len(clean_data)}条")

这段代码我用了好几年,核心逻辑就三条:价格合理性、量价匹配、衍生计算。你拿去用的时候,可以根据自己的数据源调整阈值。

3.6 知识体系结构图

下面这张图,把六个字段的关系和衍生逻辑串起来了。我建议你保存下来,写策略时对照着看:

价格序列六字段知识体系 开盘价 (Open) 收盘价 (Close) 最高价 (High) 最低价 (Low) 成交量 (Volume) 成交额 (Amount) 衍生指标 • 日内振幅 (High - Low) • 实体长度 (|Close - Open|) • 均价 (Amount / Volume) • 涨跌幅 (Close / 前Close - 1) 实战应用 📊 趋势判断:连续阳线+放量 → 趋势延续 ⚠️ 风险预警:振幅突增+缩量 → 流动性危机 🔍 资金监测:成交额异常放大 → 主力异动 ⚡ 策略触发:价格突破前高+放量 → 开仓信号

这张图的核心逻辑是:六个原始字段 → 衍生指标 → 实战应用。你写策略的时候,每一步都要想清楚:我到底在用哪个层面的信息?

3.7 一些心里话

做高频数据这么多年,我最大的体会是:基础不牢,地动山摇。很多人一上来就搞机器学习、神经网络,结果连开盘价和收盘价哪个先出来都搞不清楚。你想想看,这样的策略能赚钱吗?

我个人习惯是,每接手一个新品种,先花一周时间把它的价格序列特征摸透。什么时候波动大,什么时候流动性差,开盘价有没有跳空习惯——这些细节,往往决定了策略的生死。

好了,这章就聊到这儿。记住这六个字段,它们是你在高频数据世界里最忠实的朋友。