第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 资金容量测算:你的策略能吃下多少钱?
资金容量,不是拍脑袋算出来的。我一般用「三步法」:
- 单笔最大仓位:基于市场深度,确定一次能开多少手
- 总仓位上限:考虑多品种、多周期分散
- 资金利用率:保证金占用 + 预留安全垫
举个例子。假设你做螺纹钢的期现套利,期货盘口深度显示:在基差±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 知识体系总览
下面这张图,是我自己整理策略容量评估时的思维框架。你可以照着这个顺序一步步来:
这张图的核心逻辑是:先看市场深度,再算资金容量,最后画衰减曲线。三步走完,你就能清楚地知道:这个策略,到底能吃下多少钱。
我个人习惯每两周做一次容量评估。因为市场深度是变化的,尤其是临近交割日或者重大数据公布时,流动性会骤变。你想想看,如果平时容量是5000万,到了交割周可能只剩2000万。不调整的话,就是送钱给市场。
最后说一句:策略容量不是越大越好。找到那个「收益-容量」的最优平衡点,才是真本事。我见过太多人,为了多管一点钱,把策略的夏普比率从3做到1.5,得不偿失。
本章核心要点:
- 市场深度要分静态和动态,只看一档深度会吃大亏
- 资金容量用三步法:单笔→总仓位→利用率
- 收益衰减曲线是指数级的,拐点在10%-15%深度处
- 总容量控制在各品种容量之和的60%-70%
- 每周做一次容量评估,动态调整