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_cum和imbalance通常排前两名,poc_offset在震荡市中表现不错。
19.6 知识体系总览
下面这张图是我自己整理的订单流+机器学习知识结构。你可以把它当成一个检查清单。
别追求完美模型。订单流预测的准确率能到60%-65%,配合好的风控,就能稳定盈利。我见过太多人花三个月调参,结果实盘还不如一个简单的随机森林。
先跑通,再优化。这是我一直以来的原则。
核心要点回顾:
- Delta、失衡、POC是订单流机器学习的三大核心特征
- 特征工程比模型选择更重要,控制在10个特征以内
- 用时间序列交叉验证,别用随机打乱
- 关注F1分数和夏普比率,别只看准确率
- 过拟合是最大的敌人,早停法和数据泄露检查是护身符
好了,这一章的内容就到这里。订单流和机器学习的结合,是我这几年花时间最多的方向。希望这些经验能帮你少走弯路。
交易系统化学习资料 微信Strategy888888