第28章:微观结构与量化策略

各位,咱们今天聊点真家伙。

前面讲了那么多微观结构的基础知识——订单簿、价差、冲击成本、信息比率……但说到底,这些东西如果不能落地到策略上,那就是纸上谈兵。我个人习惯是,每学一个微观结构概念,脑子里立刻想:这东西能不能用来赚钱?怎么赚?

这一章,我就把这三条路给你拆开揉碎了讲:因子构建、统计套利、做市策略。这三条路,说白了就是微观结构知识变现的三个主流方向。

28.1 基于微观结构的因子构建

先聊因子。传统因子多来自价格、成交量、基本面。但微观结构因子,盯的是订单流、价差、深度这些更底层的东西。

我在项目中遇到过最典型的例子:订单簿不平衡因子。你想想看,如果买单深度远大于卖单深度,说明什么?说明市场短期买压大,价格大概率要往上走。反过来也一样。

核心逻辑: 订单簿不平衡 = (买单总量 - 卖单总量) / (买单总量 + 卖单总量)

这个因子怎么用?我一般这样处理:

  1. 实时计算:每收到一次订单簿快照,就计算当前的不平衡值
  2. 归一化:用过去N个快照的均值和标准差做Z-score
  3. 信号生成:当Z-score超过阈值(比如2.0),生成方向信号

还有一个我特别喜欢的因子:价差弹性。说白了就是——当大单进来时,价差会怎么变?如果价差扩张很快,说明流动性差,这时候进去就是送钱。如果价差几乎不变,说明流动性好,可以放心做。

避坑指南: 我曾经在A股市场试过这个因子,发现下午14:30之后效果明显变差。后来一查,原来是尾盘集合竞价阶段,订单簿结构会剧烈变化。所以,因子一定要做分时段回测。

代码实现其实不复杂。我贴一段核心逻辑:

def order_book_imbalance(bid_volumes, ask_volumes):
    total_bid = sum(bid_volumes)
    total_ask = sum(ask_volumes)
    if total_bid + total_ask == 0:
        return 0
    return (total_bid - total_ask) / (total_bid + total_ask)

def z_score_factor(current_imbalance, history):
    mean = np.mean(history)
    std = np.std(history)
    if std == 0:
        return 0
    return (current_imbalance - mean) / std

嗯,这里要注意:历史窗口的长度很关键。太短了噪声大,太长了反应慢。我个人习惯用50-100个快照,大概对应5-10秒的数据。

28.2 统计套利策略

统计套利,说白了就是找两个或多个资产之间的稳定关系,然后等它们偏离时下注回归。

微观结构视角下的统计套利,跟传统的不太一样。传统统计套利看的是价格序列的协整关系。但微观结构版本,盯的是订单流价差的短期失衡。

我举个例子:期货与ETF之间的套利

期货和ETF理论上价格应该高度相关。但微观结构上,两者的订单流到达速度不一样。期货可能先动,ETF慢半拍。这个时间差,就是套利空间。

关键点: 套利窗口通常只有几十到几百毫秒。拼的是速度和低延迟。

具体怎么做?我一般分三步:

  1. 建立基准关系:用过去N天的1分钟数据,做线性回归,得到期货和ETF的价差均值
  2. 监控实时价差:当价差偏离均值超过2个标准差时,触发信号
  3. 执行对冲:做多被低估的,做空被高估的,等待价差回归
注意: 统计套利不是无风险套利。价差可能不回归,甚至越走越远。我见过有人因为价差持续偏离,一天亏掉一个月利润。所以,止损一定要设。

代码示例:

def spread_trading_signal(future_price, etf_price, mean_spread, std_spread):
    current_spread = future_price - etf_price
    z = (current_spread - mean_spread) / std_spread
    
    if z > 2.0:
        return "SHORT_FUTURE_LONG_ETF"
    elif z < -2.0:
        return "LONG_FUTURE_SHORT_ETF"
    else:
        return "NO_TRADE"

这里有个坑:交易成本。统计套利的单笔利润通常很薄,如果交易成本太高,可能连手续费都覆盖不了。我建议在回测时,把滑点和手续费算得狠一点,别太乐观。

28.3 做市策略

做市策略,是微观结构知识最直接的应用场景。说白了就是:同时挂买单和卖单,赚取价差

但做市不是傻傻地挂单。你得考虑几个核心问题:

  • 挂多宽的价差? 价差太宽,成交不了;太窄,利润薄还容易亏
  • 挂多大的量? 量太大,容易被聪明钱吃掉;量太小,赚不到钱
  • 什么时候调整? 市场波动大时,价差要放宽;波动小时,可以收窄

我习惯用Avellaneda-Stoikov模型做基础框架。这个模型的核心思想是:做市商的最优报价,取决于当前库存和风险偏好。

核心公式(简化版):
最优买价 = 中间价 - 价差/2 - 库存调整项
最优卖价 = 中间价 + 价差/2 - 库存调整项

库存调整项怎么算?我一般这样:

def inventory_adjustment(inventory, max_inventory, risk_aversion):
    # inventory: 当前库存(正数表示多头,负数表示空头)
    # max_inventory: 最大允许库存
    # risk_aversion: 风险厌恶系数
    return risk_aversion * (inventory / max_inventory)

举个例子:假设中间价100元,基础价差0.2元,风险厌恶系数0.1,当前库存是最大库存的50%(多头)。那么:

  • 库存调整项 = 0.1 * 0.5 = 0.05
  • 最优买价 = 100 - 0.1 - 0.05 = 99.85
  • 最优卖价 = 100 + 0.1 - 0.05 = 100.05

你看,因为库存偏多,买价被压低(不想再买),卖价也被压低(想快点卖出去)。这就是库存管理的核心逻辑。

个人经验: 做市策略最怕的是趋势行情。如果市场单边上涨,你一边卖一边买,最后库存全是空头,亏到哭。我建议加一个趋势过滤器:当短期趋势明显时,暂停做市,或者只做单边。

知识体系总览

下面这张图,把本章的核心逻辑串起来了:

微观结构与量化策略知识体系 微观结构数据 因子构建 统计套利 做市策略 订单簿不平衡因子 价差弹性因子 期货-ETF套利 价差回归策略 Avellaneda-Stoikov模型 库存管理 + 趋势过滤 核心目标:将微观结构信号转化为可执行的交易策略

这张图把三条路径的关系讲清楚了。因子构建是基础,统计套利和做市策略是应用。三者之间不是孤立的——你构建的因子,可以直接用在统计套利里做信号;做市策略里的库存管理,也可以反过来优化因子设计。

好了,这一章的内容就到这里。记住:微观结构的知识,最终要落到策略上才算有价值。多动手,多回测,多踩坑——踩过的坑,都是你的护城河。


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