量化策略中的交易成本问题

发布于

最近重新看了一些以前做过的量化策略,发现一个挺扎心的现象:很多策略赚的钱根本不够付交易成本。以前我做回测的时候,经常会关注胜率、夏普比、最大回撤这些指标。比如一个策略:

- 年化收益 18%
- 夏普比 1.5
- 最大回撤 8%
- 胜率 55%

但如果这个策略一年交易几千次,真正把手续费、点差、滑点算进去之后,可能就变成:

- 年化收益 3%
- 夏普比 0.3
- 甚至直接亏损

所以评估一个策略的核心回到最根本的问题:这个策略每次交易到底赚多少钱?

## 交易成本不可忽略

举个最简单的例子。假设一个策略平均每次交易的预期收益是 0.08%,但是:

- 手续费:0.03%
- 买卖价差:0.02%
- 平均滑点:0.03%

这样一算:

策略毛收益: 0.08%

手续费: -0.03%

点差: -0.02%

滑点: -0.03%

-------------------

实际收益: 0%

这还没考虑市场冲击。交易频率越高,交易成本的重要性越大。

## 把交易成本直接放进回测

我会把交易成本单独建模,比如:

```python
gross_return = price_change * position

trading_cost = (
commission
+ spread_cost
+ slippage
)

net_return = gross_return - trading_cost
```

最关键的是,trading_cost 不能随便写一个固定数字。不同市场、不同股票、不同时间段,实际成本差别可能非常大。

## 看更精细的行情数据

以前只拿 K 线做策略,很多成本其实很难估,比如:

- 10:00:00 100.00
- 10:01:00 100.10
- 10:02:00 100.20

从 K 线上看,策略可能在 100.00 买入,100.20 卖出。但真实交易里可能是:

- 买入:100.02
- 卖出:100.17

中间差的这 0.07%,对于高频一点的策略来说已经非常明显了。最近我测试这类策略时,会直接拉 AllTick 的 Tick 级行情数据,而不是只看分钟 K 线。总之,回测的时候,尽可能让自己的成交价格接近真实市场,不能默认信号出现后可以用理想价格成交。

## 滑点

我以前会简单地给所有交易统一加一个:slippage = 0.01 。但这个处理挺粗糙,因为真正的滑点和很多东西有关:

- 当前盘口深度
- 下单量
- 买卖价差
- 市场波动
- 交易时间
- 股票流动性

比如一只很活跃的股票,我买 100 股和买 10000 股,受到的影响可能完全不同。所以如果策略依赖非常短的价格波动,光用 OHLC 数据回测,我觉得结果还是要打个问号。

## 交易成本压力测试

做个交易成本压力测试比单纯优化参数有用很多。比如原本回测结果:

成本 0 bps:

年化收益:21%

然后逐渐增加成本:

| 成本 | 年化收益 |
|------------|------------|
| 0 bps | 21% |
| 2 bps | 17% |
| 5 bps | 11% |
| 8 bps | 5% |
| 10 bps | 1% |
| 12 bps | -4% |

这时候其实已经很明显了。这个策略真正的问题是对交易成本太敏感。如果实际市场环境稍微变差一点,策略就没了。

## 继续参数调优? NO

看到以上结果,如果选择继续优化参数,然后找一个收益最高的参数,那这个方向很容易把自己带沟里。因为你最后可能只是找到了一个:在历史数据 + 特定交易成本假设下表现最好的参数。换一个时期,或者真实成交成本高一点,结果可能完全不同。

我现在的评估方式是,看一个策略在一段参数范围和一段交易成本范围内是不是都还能活着,比如:

| 参数 | 2bps | 5bps | 8bps | 10bps |
|-------|------|------|------|-------|
| 10 | 15% | 11% | 6% | 2% |
| 15 | 17% | 13% | 8% | 4% |
| 20 | 18% | 14% | 9% | 5% |
| 25 | 16% | 12% | 7% | 3% |
| 30 | 14% | 10% | 5% | 1% |

这种结果我反而觉得比较健康。至少说明这个策略不是靠某一个特别漂亮的参数点撑起来的。

## 有时候最好的优化,其实是少交易

假设两个策略:

### 策略 A

- 毛收益:30%
- 交易次数:5000
- 交易成本:20%
- 净收益:10%

### 策略 B

- 毛收益:22%
- 交易次数:800
- 交易成本:4%
- 净收益:18%

以前我可能会觉得 A 更厉害,因为毛收益高。现在我可能直接选 B ,因为 B 留出来的安全边际更大。市场环境稍微恶化一点,B 可能还能赚钱。而 A 的交易成本只要再增加一点,可能马上从盈利变成亏损。

## 看策略的“策略”

除了夏普比、收益率、最大回撤,我现在一般还会看:

1. 平均每笔交易赚多少?
2. 一年交易多少次?
3. 每笔交易需要承担多少成本?
4. 收益对滑点是否敏感?
5. 收益对手续费是否敏感?
6. 换一个成本假设还能不能赚钱?
7. 参数附近的结果是否稳定?
8. 减少交易次数之后,策略还成立吗?

尤其是最后两个。因为如果一个策略只有在:

- 参数 = 17.36
- 滑点 = 0.013%
- 手续费 = 0.027%

的时候赚钱,我基本不会太相信它。但如果:

- 参数 15~25
- 成本 5~10 bps

这一大片区域都还能保持正收益,那我会更愿意继续研究。

---

原文链接:[点击查看](https://www.v2ex.com/t/1234093)

评论

暂无评论。

0.039090s