2. 交易成本的构成:佣金、印花税、滑点、冲击成本详解
做量化交易这么多年,我见过太多人把精力全花在策略信号上。说实话,信号再漂亮,交易成本一高,收益照样被吃掉。今天咱们就把交易成本这层窗户纸捅破。
交易成本不是简单的「手续费」。它分显性和隐性两大类。显性的你一眼能看到,隐性的才是真正的大头。我习惯把它们分成四个维度来拆解。
2.1 佣金:最透明的成本
佣金就是券商收你的交易服务费。国内A股市场,佣金通常是万分之几。比如万2.5,就是你交易10万块,交25块。
这里有个坑,我刚开始做高频策略时踩过——最低佣金限制。很多券商设了最低5元的标准。你交易1万块,按万2.5算才2.5元,但实际收你5元。小单交易时,这个比例会高得吓人。
我个人习惯在回测框架里这样处理佣金:
def calc_commission(trade_value, rate=0.00025, min_fee=5.0):
fee = trade_value * rate
return max(fee, min_fee)
你看,一行代码就能避免回测结果过于乐观。
2.2 印花税:单向征收的硬成本
印花税是政府收的,目前A股是卖出时收千分之一。买进不收。这个比例看着不高,但它是单向的,而且没法谈。
举个例子:你一年换手率20倍,印花税就能吃掉你2%的收益。很多策略年化收益也就10%-20%,印花税直接砍掉一大块。
| 交易方向 | 印花税率 | 收取方 |
|---|---|---|
| 买入 | 0% | 无 |
| 卖出 | 0.1% | 国家税务局 |
嗯,这里要注意:印花税是不可优化的。你只能通过降低交易频率来减少它的影响。我曾经有个趋势策略,信号多到一天交易十几次,算完印花税直接放弃。
2.3 滑点:你看到的价和实际成交价的差距
滑点是最容易被忽视的成本。你看到买一价是10.00元,下单后成交在10.02元。这0.02元就是滑点。
为什么会这样?说白了就是流动性不够。你的订单进去时,最优价格已经被别人抢走了。
滑点跟几个因素有关:
- 订单规模:单子越大,滑点越明显
- 市场波动:波动大时,价格跳得快
- 交易时间:开盘和收盘时滑点通常更大
我建议在回测里这样模拟滑点:
def apply_slippage(price, slippage_rate=0.0001, direction='buy'):
if direction == 'buy':
return price * (1 + slippage_rate)
else:
return price * (1 - slippage_rate)
你看,买入时价格变高,卖出时价格变低。这才是真实世界的样子。
2.4 冲击成本:大资金的天敌
冲击成本跟滑点有点像,但本质不同。滑点是市场波动导致的,冲击成本是你的订单主动推动了价格。
你想想看,你一下子买100万股,买一挂单只有1万股。你的大单会吃掉所有挂单,价格自然被推高。这个推高的部分,就是冲击成本。
冲击成本可以用一个简单公式估算:
impact_cost = (order_size / total_volume) * price * spread
其中order_size是你的订单量,total_volume是市场总成交量。比例越大,冲击越严重。
2.5 一张图看懂交易成本结构
下面这张SVG图,把四个成本的关系画清楚了。我习惯用这种图来跟团队沟通,一目了然。
2.6 实战中的成本控制思路
讲完理论,说点实际的。我一般按这个顺序来优化交易成本:
- 先砍佣金:找券商谈,或者换低佣金券商。这是最容易的。
- 再控频率:减少不必要的交易,印花税自然就降了。
- 优化下单时机:避开开盘和收盘的高波动时段。
- 拆单交易:大单拆成小单,降低冲击成本。
好了,交易成本的四个维度就讲到这里。记住一句话:成本是策略的隐形杀手。你算得越细,实盘就越稳。
- 佣金:固定比例 + 最低收费,小单注意
- 印花税:单向千分之一,不可优化
- 滑点:市场波动导致,回测必须加
- 冲击成本:大单交易的核心成本