22、交易量预测:时间序列模型(ARIMA、GARCH)。机器学习在交易量预测中的应用。
交易量预测这事儿,说实话,比价格预测要「老实」一些。
价格受情绪、消息、突发事件影响太大,经常不讲道理。但交易量呢?它背后是实实在在的买卖行为,有规律可循。我个人习惯把交易量预测看作是「市场参与度的天气预报」——虽然不能百分百准,但趋势和波动范围往往能摸个八九不离十。
22.1 为什么交易量可以预测?
你想想看,交易量背后是什么?是人的交易习惯。机构有调仓周期,散户有上班看盘的习惯,量化策略有固定的执行频率。这些行为叠加起来,就会形成一定的周期性规律。
我在做高频策略回测时发现,A股市场的交易量有明显的「U型」日内特征——开盘和收盘量大,中午萎靡。这种规律性,就是时间序列模型能发挥作用的基础。
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)
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:])
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 知识体系总览
下面这张图,是我自己整理的交易量预测方法框架。你可以把它当作一个「选型指南」:
22.6 模型融合:1+1 > 2
说实话,单一模型很难在所有市场环境下都表现好。我现在的做法是:
- 用ARIMA预测趋势:捕捉交易量的自相关性和趋势
- 用GARCH预测波动区间:给出预测的不确定性范围
- 用XGBoost做残差修正:把ARIMA+GARCH的预测残差作为目标,用机器学习去拟合非线性部分
这种「统计模型+机器学习」的融合方式,我在实盘回测中取得了不错的效果。比单独用任何一种模型,预测误差降低了大约15%-20%。