![]()
开发者圈子里有个心照不宣的默契:上线真金白银之前,先用模拟交易(paper trading)跑一遍策略。零风险、零成本,数据还漂亮。但有个问题几乎没人认真想过——这些漂亮数字,到底有多少水分?
一位叫Ryan Bell的开发者做了个实验。他用自己写的Python交易机器人TradeSight,连续6周模拟多种策略、多种资产。结果出来后,他把代码直接扔上了GitHub。「我原以为差距在5%以内,」他在博客里写,「实际差距是22%。」
这22%的窟窿,不是策略不行,是模拟器在撒谎。
滑点:每笔交易都在偷偷抽税
真实市场里,你下单的价格和最终成交的价格永远有落差。这叫滑点(slippage,价格滑移)——市场深度不够、订单簿变化、流动性瞬间蒸发,都会导致你想买100块,实际成交100.05块。
但大多数模拟平台假设你能以报价完美成交。Ryan在代码里加了一层修正:买入时价格上浮0.05%,卖出时下浮0.05%。
```python import yfinance as yf
# 模拟滑点:假设每笔成交损耗0.05% def apply_slippage(price, direction='buy', slippage_pct=0.0005): if direction == 'buy': return price * (1 + slippage_pct) return price * (1 - slippage_pct)
data = yf.download('AAPL', period='1d') raw_price = data['Close'].iloc[-1] actual_buy = apply_slippage(raw_price, 'buy') print(f'Raw: ${raw_price:.2f}, After Slippage: ${actual_buy:.2f}') ```
6周跑下来,滑点单独吃掉总收益的0.3%。单看一笔交易,5分钱差异几乎可以忽略。但策略交易频率越高,复利效应越狠——50笔交易后,0.3%会变成策略生与死的分界线。
![]()
成交率:3%的订单会凭空消失
真实券商不会保证你的单子一定能成交。流动性枯竭、价格跳变、系统延迟,都会导致订单被拒或部分成交。模拟器默认100%成交,现实里这个数字大概是97%。
Ryan在TradeSight里加了第二层:随机拒绝3%的订单,另外5%以 worse price(更差价格)成交。
```python import random
def simulate_fill(requested_price, fill_rate=0.97, slippage_range=0.001): if random.random() > fill_rate: return None # 订单被拒绝 actual_fill = requested_price * (1 + random.uniform(0, slippage_range)) return actual_fill ```
这层滤镜打开后,他表现最好的策略从模拟收益12%直接跌到9.4%。22%的收益差距,就这么凭空蒸发。
不是策略失效,是模拟器之前根本没告诉你「失效」长什么样。
买卖价差:高频策略的隐形绞肉机
第三个被模拟器忽略的成本是买卖价差(bid-ask spread,买卖报价差)。你想买的时候按「卖一价」,想卖的时候按「买一价」,这个差额就是市场 maker 的利润,也是你的成本。
Ryan拉了6周的逐笔成交数据(tick data),算出不同资产的平均价差:
![]()
```python import numpy as np
# 从逐笔数据计算各资产平均价差 spreads = { 'AAPL': 0.03, # 百分比 'SPY': 0.01, 'TSLA': 0.08, }
avg_spread = np.mean(list(spreads.values())) print(f'Average Spread Cost: {avg_spread:.2%}') ```
特斯拉这种高波动资产,价差干到0.08%。标普500 ETF(SPY)流动性好,只有0.01%。平均下来0.04%的价差成本,对持仓几天的策略影响不大。但如果你一周交易50次以上,这个数字会像钝刀子割肉——每周2%的成本,一年下来足够让任何「圣杯策略」变成慈善捐款。
当模拟器学会说实话
Ryan把这三层成本全部塞进TradeSight的默认配置:滑点修正、成交率模拟、价差损耗。代码开源在GitHub上,路径是github.com/rmbell09-lang/tradesight。
他的结论很直白:「如果你用模拟交易验证策略,却不调整这些参数,你得到的不是『接近真实』,是『系统性乐观』。」
这种乐观有多危险?想象一下:你在模拟盘里跑出一个年化30%的策略,信心爆棚地上了实盘。结果滑点吃掉5%,成交失败再吃掉3%,价差磨损再叠2%。30%的预期变成20%,再扣掉管理费、税费、情绪干扰导致的操作变形——最终收益可能连银行理财都打不过。
更隐蔽的伤害是策略迭代。开发者根据模拟数据反复调参,其实是在拟合一个不存在的市场。参数越精细,对模拟器的幻觉依赖越深,上线后的落差越大。
Ryan的6周数据没有给出「完美修正公式」。不同资产、不同时间段、不同策略类型,成本结构完全不同。但他证明了一件事:承认不确定性的存在,比假装它不存在更接近真相。
TradeSight现在把三层成本设为默认开启。新用户第一次跑策略,看到的数字会比竞品难看一截。但Ryan觉得这是 feature,不是 bug。「如果你接受不了真实的难看,就不配拥有真实的收益。」
他在文章结尾留了个问题:你在自己的模拟交易设置里,发现过哪些隐藏成本?
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.