22、交易量预测:时间序列模型(ARIMA、GARCH)。机器学习在交易量预测中的应用。

交易量预测这事儿,说实话,比价格预测要「老实」一些。

价格受情绪、消息、突发事件影响太大,经常不讲道理。但交易量呢?它背后是实实在在的买卖行为,有规律可循。我个人习惯把交易量预测看作是「市场参与度的天气预报」——虽然不能百分百准,但趋势和波动范围往往能摸个八九不离十。

22.1 为什么交易量可以预测?

你想想看,交易量背后是什么?是人的交易习惯。机构有调仓周期,散户有上班看盘的习惯,量化策略有固定的执行频率。这些行为叠加起来,就会形成一定的周期性规律。

我在做高频策略回测时发现,A股市场的交易量有明显的「U型」日内特征——开盘和收盘量大,中午萎靡。这种规律性,就是时间序列模型能发挥作用的基础。

核心观点:交易量具有自相关性、周期性和波动聚集性。这三个特性,分别对应了ARIMA、季节性分解和GARCH模型的用武之地。

22.2 经典时间序列模型:ARIMA

ARIMA,全称自回归积分滑动平均模型。名字挺唬人,说白了就是三件事的叠加:

  • AR(自回归):用过去几天的交易量预测今天的交易量
  • I(差分):如果交易量序列不平稳,先做差分让它平稳
  • MA(滑动平均):考虑过去几天的预测误差

我在一个期货品种上试过,直接用日频交易量跑ARIMA(2,1,2),效果居然还不错。但要注意——ARIMA擅长捕捉线性关系,对突发放量基本没辙。

# Python示例:ARIMA模型拟合交易量
from statsmodels.tsa.arima.model import ARIMA
import pandas as pd

# 假设df包含日交易量数据,列名为'volume'
model = ARIMA(df['volume'], order=(2, 1, 2))
result = model.fit()
print(result.summary())

# 预测未来5天
forecast = result.forecast(steps=5)
print("未来5天交易量预测:", forecast)
我的经验:ARIMA的阶数选择别太迷信AIC/BIC。我习惯先用ACF和PACF图肉眼看一下,再结合业务理解去定阶。有时候统计上最优的模型,实盘表现反而不如一个简单的手工调参模型。

22.3 波动率模型:GARCH

交易量有个很有意思的特性——大波动往往跟着大波动,小波动往往跟着小波动。这就是所谓的「波动聚集性」。

GARCH模型就是专门干这个的。它不仅能预测交易量的均值,还能预测交易量的方差(也就是不确定性)。

# Python示例:GARCH模型拟合交易量波动
from arch import arch_model

# 对交易量收益率(或差分)建模
returns = df['volume'].pct_change().dropna()
model = arch_model(returns * 100, vol='Garch', p=1, q=1)
result = model.fit(disp='off')
print(result.summary())

# 预测未来波动
forecasts = result.forecast(horizon=5)
print("未来5天波动预测:", forecasts.variance[-1:])
避坑指南:我曾经在股指期货上直接用GARCH(1,1)预测交易量波动,结果发现模型在极端行情下完全失效。后来加了外生变量(比如隔夜消息面指标),才勉强稳住。记住:GARCH对结构性突变非常敏感,遇到政策市、长假前后,最好手动干预。

22.4 机器学习方法:从线性到非线性

时间序列模型有个天花板——它假设数据生成过程是线性的。但交易量受多种因素影响,比如:

  • 价格涨跌幅
  • 波动率
  • 资金流向
  • 市场情绪指标
  • 节假日效应

这些因素之间可能存在复杂的非线性关系。这时候,机器学习就派上用场了。

22.4.1 特征工程是关键

我个人做交易量预测时,特征工程花的时间比模型调参多得多。常用的特征包括:

特征类别 具体特征 说明
历史交易量 过去N日交易量、移动平均、标准差 捕捉自相关性和趋势
价格相关 收益率、振幅、日内高低差 价格波动往往伴随放量
时间特征 星期几、月份、是否节假日前后 捕捉周期性规律
市场状态 大盘成交量、行业成交量、资金流向 个股交易量受整体市场影响

22.4.2 常用模型对比

我试过几种主流模型,简单说说感受:

  • 随机森林:稳健,不容易过拟合,适合做基线模型。我一般先用它跑一遍,看看特征重要性排序。
  • XGBoost/LightGBM:效果通常最好,但需要认真调参。我习惯用早停法和交叉验证来防止过拟合。
  • LSTM:理论上适合序列数据,但实际效果往往不如树模型。除非数据量极大(比如分钟级数据),否则不推荐。
# Python示例:LightGBM预测交易量
import lightgbm as lgb
from sklearn.model_selection import train_test_split

# 假设X为特征矩阵,y为交易量
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, shuffle=False)

model = lgb.LGBMRegressor(
    n_estimators=500,
    learning_rate=0.05,
    max_depth=5,
    num_leaves=31,
    early_stopping_rounds=50
)

model.fit(
    X_train, y_train,
    eval_set=[(X_test, y_test)],
    eval_metric='mae',
    callbacks=[lgb.early_stopping(50)]
)

# 特征重要性
lgb.plot_importance(model, max_num_features=10)
一个小技巧:做交易量预测时,我习惯把「预测目标」做一下变换。比如预测对数交易量,或者预测交易量的排名分位数。这样能避免模型被极端值带偏。尤其是遇到涨停板、跌停板的时候,原始交易量数据会非常离谱。

22.5 知识体系总览

下面这张图,是我自己整理的交易量预测方法框架。你可以把它当作一个「选型指南」:

交易量预测方法框架 交易量时间序列 统计模型(线性) 机器学习(非线性) ARIMA GARCH 随机森林 XGBoost/LGBM 适用场景 ARIMA:平稳序列、短期预测 | GARCH:波动聚集性明显 | 树模型:特征丰富、非线性关系 实战建议 先用ARIMA做基线 → 加入GARCH捕捉波动 → 用树模型提升精度

22.6 模型融合:1+1 > 2

说实话,单一模型很难在所有市场环境下都表现好。我现在的做法是:

  1. 用ARIMA预测趋势:捕捉交易量的自相关性和趋势
  2. 用GARCH预测波动区间:给出预测的不确定性范围
  3. 用XGBoost做残差修正:把ARIMA+GARCH的预测残差作为目标,用机器学习去拟合非线性部分

这种「统计模型+机器学习」的融合方式,我在实盘回测中取得了不错的效果。比单独用任何一种模型,预测误差降低了大约15%-20%。

最后说一句:交易量预测不是为了预测而预测。它的最终目的是为交易决策服务——比如判断当前放量是趋势启动还是短期噪音,或者为订单执行算法提供流动性预估。模型再漂亮,落不了地也是白搭。

无相订单流研究社 微信Lucian808555