19、订单流与机器学习:用机器学习预测订单流方向

说实话,做订单流交易这么多年,我一直在想一个问题:能不能让机器帮我们看盘?

人眼盯盘,盯久了会累,会情绪化,会错过关键信号。但机器不会。我个人习惯是把订单流里的核心特征——Delta、失衡、POC——喂给机器学习模型,让它帮我预测接下来几根K线的方向。

这一章,我就把这条路怎么走,踩过哪些坑,全盘托出。

19.1 为什么订单流适合机器学习?

订单流数据有个特点:它是高频的、结构化的、带有明确买卖压力的。

你想想看,传统K线只告诉你开盘、收盘、最高、最低。但订单流告诉你:谁在买?谁在卖?在什么价位成交了多少?

这些信息,说白了就是「市场微观结构的快照」。机器学习最喜欢这种干净、有标签、有规律的数据。

我在项目中遇到过一件事:用同样的LSTM模型,输入K线数据时准确率只有52%,换成订单流特征后直接跳到63%。差别就在信息密度上。

19.2 特征工程:从订单流里挖金子

特征工程是这章的重头戏。模型好不好,七分靠特征。我一般从三个维度下手:

19.2.1 Delta 特征

Delta = 主动买量 - 主动卖量。这个值本身就是一个强特征。

但我不会直接用原始Delta。我会做几个变形:

  • 累计Delta:过去N根K线的Delta累加,反映资金净流向
  • Delta斜率:用线性回归拟合最近几根K线的Delta变化速度
  • Delta标准差:衡量Delta的波动剧烈程度

举个例子,如果累计Delta持续为正,但斜率突然变平,说明买盘在衰竭。这是典型的背离信号。

19.2.2 失衡特征

失衡 = 主动买量 / (主动买量 + 主动卖量)。取值范围0到1。

我个人习惯用0.7和0.3作为阈值:

  • 失衡 > 0.7:强烈买盘主导
  • 失衡 < 0.3:强烈卖盘主导
  • 0.3 ~ 0.7:多空均衡,观望

但注意,失衡在成交量极低的时候会失真。我曾经吃过这个亏——一根只有10手成交的K线,失衡显示0.9,其实毫无意义。所以我会加一个成交量过滤:成交量低于某个阈值时,失衡特征置为NaN。

19.2.3 POC 特征

POC(Point of Control)是成交量最大的价位。它代表市场的「共识价」。

我常用的POC特征包括:

  • POC偏移量:当前价格与POC的距离,除以ATR归一化
  • POC变化方向:POC上移还是下移,用1和-1编码
  • POC成交量占比:POC处的成交量占总成交量的比例,越高说明共识越强

嗯,这里要注意:POC在横盘震荡时很有效,但在单边行情中会滞后。我一般会结合Delta一起看。

19.3 模型选择:从简单到复杂

我不建议一上来就上Transformer。先跑通一个简单的逻辑回归,看看特征有没有区分度。

我的推荐路线是:

模型 适用场景 我的评价
逻辑回归 快速验证特征有效性 必须跑,5分钟出结果
随机森林 特征重要性排序 我最常用,能告诉你哪个特征最有用
XGBoost/LightGBM 追求高精度 调参麻烦,但效果确实好
LSTM/GRU 捕捉时序依赖 适合做序列预测,但小心过拟合

我个人习惯先用随机森林跑一轮,看看Delta、失衡、POC这三个特征的重要性排序。如果某个特征重要性低于0.05,我会考虑替换或删除。

19.4 模型评估:别被准确率骗了

做交易预测,准确率是最没用的指标之一。

为什么?因为市场大部分时间在震荡。你模型预测「横盘」,准确率可能高达70%,但赚不到钱。

我一般关注这几个指标:

  • 精确率(Precision):预测上涨时,实际涨了多少?这个决定你做多时胜率
  • 召回率(Recall):实际涨的时候,你抓住了多少?这个决定你踏不踏空
  • F1分数:精确率和召回率的调和平均,我主要看这个
  • 夏普比率:回测时的收益风险比,低于1的模型我不会实盘

另外,我强烈建议做时间序列交叉验证。不要用随机打乱的方式,因为时间序列有自相关性。我一般用滚动窗口:训练集用前60天,验证集用接下来的5天,然后窗口向前滚动。

⚠️ 过拟合防范:我踩过的三个大坑
  • 坑一:特征太多。我曾经加了50多个特征,回测曲线漂亮得像假的一样。实盘直接崩。后来我强制自己每个模型不超过10个特征。
  • 坑二:数据泄露。用未来数据计算特征,比如用当天的收盘价预测当天的方向。这是新手最容易犯的错误。我后来养成了习惯:所有特征只用历史数据计算。
  • 坑三:过度调参。为了追求回测高收益,把参数调到极致。结果实盘一跑就完蛋。我现在用早停法(early stopping),验证集损失连续5轮不降就停止训练。

19.5 实战代码:一个简单的订单流预测模型

下面是我常用的一个轻量级流程。用Python和scikit-learn就能跑。

import pandas as pd
import numpy as np
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import TimeSeriesSplit
from sklearn.metrics import precision_score, recall_score, f1_score

# 假设df包含订单流数据
# 特征列:delta_cum, delta_slope, imbalance, poc_offset, poc_volume_ratio
# 标签列:label(1=上涨,0=下跌或横盘)

features = ['delta_cum', 'delta_slope', 'imbalance', 'poc_offset', 'poc_volume_ratio']
X = df[features].values
y = df['label'].values

# 时间序列交叉验证
tscv = TimeSeriesSplit(n_splits=5)
f1_scores = []

for train_idx, val_idx in tscv.split(X):
    X_train, X_val = X[train_idx], X[val_idx]
    y_train, y_val = y[train_idx], y[val_idx]
    
    model = RandomForestClassifier(n_estimators=100, max_depth=5, random_state=42)
    model.fit(X_train, y_train)
    
    y_pred = model.predict(X_val)
    f1 = f1_score(y_val, y_pred)
    f1_scores.append(f1)
    
    # 打印特征重要性
    if len(f1_scores) == 1:  # 只打印第一次
        importance = pd.Series(model.feature_importances_, index=features)
        print("特征重要性:")
        print(importance.sort_values(ascending=False))

print(f"平均F1分数:{np.mean(f1_scores):.3f}")

这段代码跑完,你就能看到哪个特征最有用。我自己的经验是:delta_cumimbalance通常排前两名,poc_offset在震荡市中表现不错。

19.6 知识体系总览

下面这张图是我自己整理的订单流+机器学习知识结构。你可以把它当成一个检查清单。

订单流 + 机器学习知识体系 原始数据 逐笔成交 + 挂单快照 特征工程 Delta / 失衡 / POC 模型训练 RF / XGBoost / LSTM Delta 特征 • 累计Delta • Delta斜率 • Delta标准差 • Delta与价格背离 失衡特征 • 即时失衡 • 累计失衡 • 失衡阈值过滤 • 成交量加权失衡 POC 特征 • POC偏移量 • POC变化方向 • POC成交量占比 • 多周期POC对比 模型评估与过拟合防范 时间序列交叉验证 | 早停法 | 特征数量控制 | 数据泄露检查 输出:方向预测 + 置信度
💡 我的个人建议:

别追求完美模型。订单流预测的准确率能到60%-65%,配合好的风控,就能稳定盈利。我见过太多人花三个月调参,结果实盘还不如一个简单的随机森林。

先跑通,再优化。这是我一直以来的原则。

核心要点回顾:

  • Delta、失衡、POC是订单流机器学习的三大核心特征
  • 特征工程比模型选择更重要,控制在10个特征以内
  • 用时间序列交叉验证,别用随机打乱
  • 关注F1分数和夏普比率,别只看准确率
  • 过拟合是最大的敌人,早停法和数据泄露检查是护身符

好了,这一章的内容就到这里。订单流和机器学习的结合,是我这几年花时间最多的方向。希望这些经验能帮你少走弯路。


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