本文目录导读:

在股票量化交易中,“盘口”通常指Level-2行情中的买卖五档/十档挂单、逐笔成交、委托队列等高频数据,把盘口数据结合到Java量化系统里做最终判断,一般遵循数据接入 → 特征计算 → 信号融合 → 风控执行这条链路,下面从架构到代码给出一个可落地的案例。
整体思路
盘口数据的特点是更新快(毫秒级)、噪声大、易被操纵(挂撤单诱多诱空),所以不能单独用盘口下结论,通常的做法是:
盘口微观特征 ┐
技术指标(K线) ├──► 多因子打分/模型融合 ──► 最终信号 ──► 风控 ──► 下单
资金流/大单 ┘
盘口负责择时和确认,K线/基本面负责方向和仓位。
盘口关键特征(Java可计算)
| 特征 | 含义 | 用途 |
|---|---|---|
| 委比 | (买量-卖量)/(买量+卖量) | 短期多空强弱 |
| 买卖压力比 | 买一~五总量 / 卖一~五总量 | 支撑/压力 |
| 大单净流入 | 逐笔成交中>阈值的主动买-主动卖 | 主力意图 |
| 撤单率 | 撤单量/委托量 | 识别虚假挂单 |
| 价差(spread) | 卖一-买一 | 流动性 |
| 盘口斜率 | 各档挂单量分布 | 支撑厚度 |
| 主动成交占比 | 外盘/(内盘+外盘) | 买方积极性 |
Java代码示例
盘口数据结构
public class OrderBook {
private String symbol;
private long timestamp;
private double[] bidPrice = new double[5]; // 买1~5价
private long[] bidVol = new long[5]; // 买1~5量
private double[] askPrice = new double[5];
private long[] askVol = new long[5];
// getter/setter 省略
}
public class Tick {
private String symbol;
private long timestamp;
private double price;
private long volume;
private boolean activeBuy; // 主动买/卖
}
特征计算
public class OrderBookFeature {
/** 委比 */
public static double weiBi(OrderBook ob) {
long bidSum = sum(ob.getBidVol());
long askSum = sum(ob.getAskVol());
if (bidSum + askSum == 0) return 0;
return (bidSum - askSum) * 1.0 / (bidSum + askSum);
}
/** 买卖压力比 */
public static double pressureRatio(OrderBook ob) {
long bidSum = sum(ob.getBidVol());
long askSum = sum(ob.getAskVol());
return askSum == 0 ? Double.MAX_VALUE : (double) bidSum / askSum;
}
/** 盘口斜率:买盘厚度衰减速度,越平说明支撑越强 */
public static double bidSlope(OrderBook ob) {
// 用最小二乘拟合 量 vs 档位
double[] x = {1,2,3,4,5};
return linearSlope(x, toDouble(ob.getBidVol()));
}
/** 大单净流入(需逐笔累积) */
public static long bigOrderNetInflow(List<Tick> ticks, long bigThreshold) {
long net = 0;
for (Tick t : ticks) {
if (t.getVolume() >= bigThreshold) {
net += t.isActiveBuy() ? t.getVolume() : -t.getVolume();
}
}
return net;
}
private static long sum(long[] a){ long s=0; for(long v:a) s+=v; return s; }
private static double[] toDouble(long[] a){
double[] d = new double[a.length];
for(int i=0;i<a.length;i++) d[i]=a[i];
return d;
}
private static double linearSlope(double[] x, double[] y){
int n = x.length;
double sx=0,sy=0,sxy=0,sxx=0;
for(int i=0;i<n;i++){ sx+=x[i]; sy+=y[i]; sxy+=x[i]*y[i]; sxx+=x[i]*x[i]; }
double denom = n*sxx - sx*sx;
return denom==0?0:(n*sxy - sx*sy)/denom;
}
}
多因子融合打分
把盘口因子和技术因子归一化后加权:
public class SignalEngine {
// 权重可以从历史回测/机器学习学到
private static final double W_WEIBI = 0.20;
private static final double W_PRESSURE = 0.20;
private static final double W_BIGORDER = 0.35;
private static final double W_MA = 0.25;
public static Signal decide(OrderBook ob, List<Tick> ticks,
double price, double ma5, double ma20) {
double weiBi = OrderBookFeature.weiBi(ob);
double pressure = Math.tanh(OrderBookFeature.pressureRatio(ob) - 1);
long bigNet = OrderBookFeature.bigOrderNetInflow(ticks, 500_000);
double bigScore = Math.tanh(bigNet / 1_000_000.0);
double maScore = price > ma5 && ma5 > ma20 ? 1 : (price < ma5 ? -1 : 0);
double score = W_WEIBI * weiBi
+ W_PRESSURE * pressure
+ W_BIGORDER * bigScore
+ W_MA * maScore;
// 流动性过滤:价差过大不出手
double spread = ob.getAskPrice()[0] - ob.getBidPrice()[0];
double mid = (ob.getAskPrice()[0] + ob.getBidPrice()[0]) / 2;
if (spread / mid > 0.003) return Signal.HOLD;
if (score > 0.4) return Signal.BUY;
if (score < -0.4) return Signal.SELL;
return Signal.HOLD;
}
}
风控 + 执行
public class Trader {
public void onTick(OrderBook ob, List<Tick> ticks, double price,
double ma5, double ma20) {
Signal sig = SignalEngine.decide(ob, ticks, price, ma5, ma20);
if (sig == Signal.BUY && !hasPosition(ob.getSymbol())) {
// 用卖一价打对手盘保证成交,或挂买一价排队
double limit = ob.getAskPrice()[0];
int qty = calcPosition(price);
orderApi.buy(ob.getSymbol(), limit, qty);
}
// 卖出、止盈止损逻辑类似
}
}
盘口要避免的坑
- 挂单可撤:委比高不等于真买盘,需结合逐笔成交和撤单率。
若“买盘很厚 + 撤单率高 + 主买少”→ 典型诱多。
- 主动买卖方向:需用交易所的逐笔成交标志(或按“成交价≥卖一=主动买”近似)。
- 不同市场规则不同:A股集合竞价、涨跌停时的盘口特征与连续竞价差别很大。
- 过度拟合:盘口因子在历史回测中很容易过拟合,建议样本外验证 + 因子正交化。
- 延迟:Java要保证从行情到决策在毫秒级,建议用 Disruptor / 环形队列,避免GC停顿。
典型的最终判断决策表
| 盘口 | 技术面 | 资金 | |
|---|---|---|---|
| 委比高、买盘厚、无大撤单 | 均线多头 | 大单净流入 | 买入 |
| 委比高但撤单频繁 | 均线走平 | 主买很少 | 观望/不追 |
| 卖压重、价差扩大 | 均线空头 | 大单流出 | 卖出/做空 |
| 盘口平稳、价差小 | 均线纠缠 | 资金中性 | 持有/等待 |
进阶方向
- 用机器学习(XGBoost/LightGBM)替代人工权重,输入:盘口特征+技术特征+资金流。
- 用订单流不平衡(Order Flow Imbalance, OFI)做短期价格预测。
- 用强化学习做执行层择时(TWAP/VWAP优化)。
- Java侧可用 Flink / Kafka Streams 做实时因子计算,落库到 ClickHouse 回测。
如果你告诉我具体场景(A股/期货/加密、Level-1还是Level-2、是否已有行情源),我可以给出更针对性的Java代码(比如对接CTP、QMT、Binance WebSocket等)。