15、订单流与动量结合:订单流动量指标,订单流加速度与价格加速,Python实现

动量交易,说白了就是追涨杀跌。但怎么追?怎么杀?很多人只看价格涨跌,结果追在山顶,杀在谷底。我个人习惯是把订单流数据加进来,看看这波动量到底有没有「真金白银」在支撑。

今天咱们聊的,就是订单流和动量的结合。核心是两个东西:订单流动量指标订单流加速度。前者告诉你当前动量有多强,后者告诉你动量是在加速还是减速。

15.1 订单流动量指标:不只是看价格

传统的动量指标,比如ROC(变动率指标),只算价格变化。但价格变化背后,是买卖双方的博弈。我遇到过好几次,价格涨得挺猛,但成交量萎缩,结果没几分钟就掉下来了。为什么?因为没有「量」的支撑。

订单流动量指标,说白了就是把成交量和订单流数据揉进动量计算里。我常用的公式是这样的:

订单流动量 = (主动买量 - 主动卖量) / 总成交量 * 价格变化率

这个指标的好处是:

  • 正数:买方主导,动量向上
  • 负数:卖方主导,动量向下
  • 绝对值越大:动量越强,越有持续性

嗯,这里要注意:如果价格涨了,但订单流动量是负的,说明是空头回补或者假突破。我曾经因为这个判断失误,亏了一笔大的。后来就养成了习惯,每次看动量,先看订单流方向。

15.2 订单流加速度:动量的「油门」

动量指标告诉你车在跑,但加速度告诉你车是在加速还是减速。这个在实战中特别重要。

你想想看,如果价格在涨,但订单流加速度在下降,说明买方力量在衰竭。这时候追进去,大概率被套。

我一般这样计算订单流加速度:

订单流加速度 = 当前订单流动量 - 前N周期订单流动量

N通常取3到5个周期。加速度为正,说明动量在增强;为负,说明动量在减弱。

核心逻辑:价格加速 + 订单流加速度为正 = 强趋势延续。价格加速 + 订单流加速度为负 = 趋势末端,准备反转。

15.3 Python实现:从数据到信号

好了,理论说完了,咱们直接上代码。我习惯用Pandas来处理,因为数据对齐和滚动计算都很方便。

import pandas as pd
import numpy as np

def order_flow_momentum(df, period=5):
    """
    计算订单流动量指标
    
    参数:
    df: DataFrame,必须包含 'active_buy', 'active_sell', 'close' 列
    period: 计算周期
    
    返回:
    DataFrame,新增 'of_momentum' 列
    """
    # 计算净主动买卖量
    df['net_volume'] = df['active_buy'] - df['active_sell']
    
    # 计算总成交量
    df['total_volume'] = df['active_buy'] + df['active_sell']
    
    # 计算价格变化率
    df['price_change'] = df['close'].pct_change(period)
    
    # 计算订单流动量
    df['of_momentum'] = (df['net_volume'] / df['total_volume']) * df['price_change']
    
    # 处理无穷值和NaN
    df['of_momentum'] = df['of_momentum'].replace([np.inf, -np.inf], 0).fillna(0)
    
    return df

def order_flow_acceleration(df, accel_period=3):
    """
    计算订单流加速度
    
    参数:
    df: DataFrame,必须包含 'of_momentum' 列
    accel_period: 加速度计算周期
    
    返回:
    DataFrame,新增 'of_acceleration' 列
    """
    df['of_acceleration'] = df['of_momentum'].diff(accel_period)
    return df

个人经验:我一般把period设成5,accel_period设成3。太短的周期噪音大,太长的周期反应慢。你可以根据自己的交易周期调整。

15.4 实战信号生成

有了指标,怎么用?我一般这样生成交易信号:

def generate_signals(df, momentum_threshold=0.02, accel_threshold=0.01):
    """
    生成交易信号
    
    参数:
    df: DataFrame,包含 'of_momentum', 'of_acceleration' 列
    momentum_threshold: 动量阈值
    accel_threshold: 加速度阈值
    
    返回:
    DataFrame,新增 'signal' 列: 1=买入, -1=卖出, 0=观望
    """
    df['signal'] = 0
    
    # 买入条件:动量强且加速度为正
    buy_condition = (df['of_momentum'] > momentum_threshold) & \
                   (df['of_acceleration'] > accel_threshold)
    
    # 卖出条件:动量弱且加速度为负
    sell_condition = (df['of_momentum'] < -momentum_threshold) & \
                    (df['of_acceleration'] < -accel_threshold)
    
    df.loc[buy_condition, 'signal'] = 1
    df.loc[sell_condition, 'signal'] = -1
    
    return df

阈值怎么设?我建议你先用历史数据回测,找到适合你品种的参数。比如在BTC上,动量阈值0.02可能就够,但在波动小的品种上,可能需要调到0.05。

15.5 知识体系图

下面这张图,把整个逻辑串起来了:

订单流与动量结合知识体系 输入数据 主动买量 / 主动卖量 / 价格 订单流动量指标 净买卖量 / 总成交量 * 价格变化率 订单流加速度 当前动量 - 前N周期动量 信号判断逻辑 动量 > 阈值 AND 加速度 > 阈值 → 买入 动量 < -阈值 AND 加速度 < -阈值 → 卖出 交易信号输出

15.6 避坑指南

我曾经踩过的坑:

  • 只看动量不看加速度:有一次ETH涨了5%,动量指标很强,我追了进去。结果加速度是负的,刚进去就回调了3%。从那以后,我每次开仓前必看加速度。
  • 阈值设得太小:刚开始做回测时,我把动量阈值设成0.01,结果信号满天飞,手续费都亏麻了。后来改成0.02,信号质量明显提升。
  • 忽略数据质量:订单流数据如果来自不同交易所,口径可能不一样。我建议统一用L2数据,或者至少保证数据源一致。

我的小技巧:在实盘前,先用模拟盘跑一个月。把动量阈值和加速度阈值调到一个「信号不多但准」的状态。我一般要求胜率在60%以上才敢上实盘。

好了,订单流与动量结合的核心逻辑和实现,就聊到这儿。你可以在自己的数据上跑跑看,感受一下「有量支撑的动量」和「无量空涨」的区别。相信我,用习惯了,你就再也回不去只看价格的交易方式了。


无相订单流研究社 微信Lucian808555