第28章:策略容量评估:市场深度分析、资金容量测算、收益衰减曲线

做基差交易的朋友,最怕什么?

不是行情反转,不是滑点太大。而是——你的策略跑着跑着,突然不赚钱了。

为什么?因为资金量太大了,市场吃不下。你想想看,一个本来能赚5个点的机会,你拿1000万进去,可能只能赚3个点。拿1个亿进去,搞不好还亏钱。

这就是策略容量问题。今天我们就来聊聊,怎么评估你的基差交易策略到底能吃下多少资金。

28.1 市场深度分析:你的对手盘是谁?

市场深度,说白了就是「你在某个价位上能成交多少单子」。我习惯把它分成两层来看:

  • 静态深度:当前盘口挂单的厚度
  • 动态深度:你吃单时,市场会不会「跑」

先看静态深度。拿沪深300股指期货举例,假设当前基差是-5个点,你想做多基差(买期货、卖现货)。盘口上买一价是3800点,挂了50手。卖一价是3800.2点,挂了30手。

嗯,这里要注意:你看到的挂单量,不等于你能成交的量。因为你的单子一进去,市场会动。

核心公式:

有效深度 = 盘口挂单量 × 冲击系数

冲击系数通常在0.6-0.8之间,取决于品种流动性

我在项目中遇到过最典型的案例:某商品期货盘口看着有200手,我试着吃了50手,结果价格直接跳了2个tick。为什么?因为那200手里有大量是「钓鱼单」,根本不是真实流动性。

所以我的建议是:永远不要只看一档深度。至少要看五档,甚至十档。用Python可以这样抓取:

import ccxt
import pandas as pd

# 以币安期货为例
exchange = ccxt.binanceusdm()
orderbook = exchange.fetch_order_book('BTCUSDT', limit=10)

# 计算累计深度
bids = orderbook['bids']  # 买盘
asks = orderbook['asks']  # 卖盘

def calc_depth(orderbook_side, price_range=0.001):
    """计算价格区间内的累计深度"""
    base_price = orderbook_side[0][0]
    cumulative_volume = 0
    for price, volume in orderbook_side:
        if abs(price - base_price) / base_price <= price_range:
            cumulative_volume += volume
        else:
            break
    return cumulative_volume

print(f"买盘0.1%深度: {calc_depth(bids, 0.001):.2f} BTC")
print(f"卖盘0.1%深度: {calc_depth(asks, 0.001):.2f} BTC")

28.2 资金容量测算:你的策略能吃下多少钱?

资金容量,不是拍脑袋算出来的。我一般用「三步法」:

  1. 单笔最大仓位:基于市场深度,确定一次能开多少手
  2. 总仓位上限:考虑多品种、多周期分散
  3. 资金利用率:保证金占用 + 预留安全垫

举个例子。假设你做螺纹钢的期现套利,期货盘口深度显示:在基差±2个点范围内,能成交500手。你设定的最大冲击成本是0.5个点。

那么单笔最大仓位就是:

# 冲击成本模型
def max_position(orderbook, max_slippage=0.5):
    """
    给定最大滑点容忍度,计算最大开仓量
    """
    total_volume = 0
    total_cost = 0
    
    for price, volume in orderbook['asks']:
        # 计算当前价位成交的冲击成本
        slippage = price - orderbook['asks'][0][0]
        if slippage > max_slippage:
            break
        total_volume += volume
        total_cost += volume * slippage
    
    avg_slippage = total_cost / total_volume if total_volume > 0 else 0
    return total_volume, avg_slippage

max_vol, avg_slip = max_position(orderbook, max_slippage=0.5)
print(f"最大可开仓: {max_vol}手, 平均滑点: {avg_slip:.2f}点")

我曾经犯过一个错误:只算了单笔容量,没算总容量。结果策略在3个品种上同时开仓,每个品种都只用了50%的深度,但加起来把整个市场的流动性都抽干了。基差瞬间被打到不利位置,那周亏了6%。

避坑指南:

总资金容量 ≠ 各品种容量之和。因为不同品种的流动性会相互影响,尤其是相关性高的品种。我建议总容量控制在各品种容量之和的60%-70%。

28.3 收益衰减曲线:钱越多,赚得越少

这是最扎心的一张图。你策略的收益率,会随着资金量的增加而下降。不是线性下降,是指数级下降。

为什么?因为市场深度是有限的。你资金越大,每次开仓对市场的冲击就越大,成交价格就越不利。

我习惯用「边际收益递减模型」来刻画:

import numpy as np
import matplotlib.pyplot as plt

def decay_curve(capital_range, base_return=0.15, decay_factor=0.0001):
    """
    收益衰减曲线模型
    capital_range: 资金量数组
    base_return: 基础年化收益率
    decay_factor: 衰减系数
    """
    # 冲击成本随资金量指数增长
    impact_cost = 1 - np.exp(-decay_factor * capital_range)
    # 实际收益率 = 基础收益率 × (1 - 冲击成本)
    actual_return = base_return * (1 - impact_cost)
    return actual_return

# 模拟不同资金量下的收益率
capitals = np.array([1e6, 5e6, 1e7, 5e7, 1e8, 5e8])  # 100万到5亿
returns = decay_curve(capitals)

# 输出结果
for cap, ret in zip(capitals, returns):
    print(f"资金量: {cap/1e6:.0f}百万, 预期年化: {ret*100:.2f}%")

输出结果大概是这样:

资金量 预期年化收益率 衰减幅度
100万 15.00% 0%
500万 14.88% 0.8%
1000万 14.50% 3.3%
5000万 11.80% 21.3%
1亿 9.50% 36.7%
5亿 3.20% 78.7%

看到了吗?从1000万到5000万,收益率掉了21%。从1亿到5亿,直接掉了78%。这就是为什么很多私募做到一定规模就封盘了——不是不想赚钱,是再大就赚不到了。

我的经验:

收益衰减曲线的「拐点」通常在总市场深度的10%-15%左右。超过这个比例,每增加一块钱资金,带来的边际收益都是负的。我建议把策略容量定在拐点之前的70%位置,留点安全边际。

28.4 知识体系总览

下面这张图,是我自己整理策略容量评估时的思维框架。你可以照着这个顺序一步步来:

策略容量评估核心框架 市场深度分析 静态深度 + 动态深度 资金容量测算 单笔 + 总仓位 + 利用率 收益衰减曲线 边际收益递减 关键指标 • 盘口五档深度 • 冲击成本系数 • 流动性弹性 测算方法 • 三步法 • 蒙特卡洛模拟 • 历史回测验证 风险控制 • 容量上限70% • 多品种分散 • 动态调整机制 核心结论:容量评估是动态过程,需持续监控和调整 数据来源:实盘交易数据 + 历史回测 更新频率:每周一次

这张图的核心逻辑是:先看市场深度,再算资金容量,最后画衰减曲线。三步走完,你就能清楚地知道:这个策略,到底能吃下多少钱。

我个人习惯每两周做一次容量评估。因为市场深度是变化的,尤其是临近交割日或者重大数据公布时,流动性会骤变。你想想看,如果平时容量是5000万,到了交割周可能只剩2000万。不调整的话,就是送钱给市场。

最后说一句:策略容量不是越大越好。找到那个「收益-容量」的最优平衡点,才是真本事。我见过太多人,为了多管一点钱,把策略的夏普比率从3做到1.5,得不偿失。

本章核心要点:

  • 市场深度要分静态和动态,只看一档深度会吃大亏
  • 资金容量用三步法:单笔→总仓位→利用率
  • 收益衰减曲线是指数级的,拐点在10%-15%深度处
  • 总容量控制在各品种容量之和的60%-70%
  • 每周做一次容量评估,动态调整

公众号:蓝海资料掘金营,微信deep3321