刚入行的时候,我总能在回测里跑出像喜马拉雅山一样陡峭的净值曲线。那时候我觉得自己简直是百年一遇的交易天才,直到真金白银进了场,那条曲线却像断了线的风筝直往下掉。
厄尼·陈在《量化交易——如何建立自己的算法交易事业》第三章里聊透了这种幻觉。回测这事儿,说白了就像是在看后视镜开车——如果你盯着后视镜里的坦途就敢踩死油门,前面的急转弯分分钟让你翻车。

“偷看剧本”的代价
量化圈里最隐秘也最致命的罪名,叫前瞻偏差(Look-ahead Bias)。
想象一下你穿越回了 20 世纪 90 年代,你当然知道哪支股票会翻倍,这就是偷看了剧本。在代码里,这种错误往往很隐蔽:比如你用“今天的收盘价”去决定“今天的买入点”。在回测的逻辑里,收盘价就是一个数字,但在真实的交易时间线上,收盘那一秒之前,你根本不知道那个价格是多少。
你的代码在“偷看未来”,回测结果当然美如画。但现实的市场,从来不给你看剧本的机会。

被隐没的“摩擦力”:滑点与手续费
很多新手(包括以前的我)在回测代码里会写:price = df['close']。这默认了你可以精准地在收盘那一刻、按那个价格买到你想要的任何头寸。
但这在实盘里纯属扯淡。 当你下单的那一刻,你的买单本身就会推高股价(冲击成本),或者你只能排在队伍后面等着成交。厄尼·陈特别强调,回测必须加入“摩擦力”。一个在回测里年化收益 $20\%$ 的策略,如果没算滑点,实盘可能直接就是亏损的。

实战笔记:在代码里筑起防火墙
为了防止自己再次被回测欺骗,我现在的标准做法是在逻辑中强制引入“时间滞后”和“模拟滑点”。
以下是一个更加硬核的逻辑:通过Alltick API接口拉取行情后,我们不仅要偏移信号,还要在执行价上“砍一刀”,看看策略在最差成交环境下还能不能活。

import requests
import pandas as pd

def backtest_logic_hardcore(symbol):
    """
    通过Alltick API获取K线,并注入真实的交易成本模拟
    """
    # 获取1小时级别数据
    url = f"https://api.alltick.co/quote-bbo-ig/v1/klines?symbol={symbol}&resolution=1h"
    data = requests.get(url).json()['data']
    df = pd.DataFrame(data)
    
    # 1. 规避前瞻偏差:所有决策基于上一根K线
    df['prev_close'] = df['close'].shift(1)
    df['prev_open'] = df['open'].shift(1)
    
    # 2. 模拟滑点 (Slippage):假设实际成交价比开盘价贵 0.05%
    # 别小看这万五,高频策略的利润往往就是这么磨掉的
    slippage = 0.0005
    
    # 策略逻辑:前一小时收阳,本小时开盘买入
    df['signal'] = (df['prev_close'] > df['prev_open']).astype(int)
    
    # 计算收益:
    # 实际买入价 = 当前开盘价 * (1 + 滑点)
    df['execution_price'] = df['open'] * (1 + slippage)
    
    # 简单计算持仓收益率(忽略离场滑点,实际操作中离场也要算)
    df['strategy_return'] = (df['close'] / df['execution_price'] - 1) * df['signal']
    
    return df

数据的“脱水”与生存偏差
除了代码逻辑,数据源本身也有毒。生存偏差(Survivorship Bias)是很多人的滑铁卢。
如果你只拿着现在还在标普 500 里的公司跑回测,你其实是在“幸存者”里找规律。那些在 2008 年消失的投行、在 2000 年泡沫中退市的科技股,才是量化策略最该经历的试金石。如果你的策略在这些“死人”身上表现极差,而你却没算进去,你的回测结果就是注了水的“精修图”。

夏普比率的“欺骗性”
厄尼·陈在第三章还提到了一个扎心的观点:夏普比率(Sharpe Ratio)会掩盖尾部风险。 一个每天赚一点点、偶尔暴亏一把的“卖出期权型”策略,在回测里会有极高的夏普比率。但在现实中,只要遇到一次黑天鹅,你就彻底出局了。所以,我现在看回测报表,第一眼不看夏普,看最大回撤(Maximum Drawdown)。

最后的一点洞察
读完这一章你会明白,回测的终极目的不是为了“证明自己是对的”,而是为了“寻找自己哪里错了”。
一个好的量化交易员,应该像个挑剔的审计员。当你看到一个完美的夏普比率时,不该狂欢,而该心生恐惧——去查查是不是数据没复权?是不是滑点设得太小?是不是在不经意间偷看了未来?
在量化的世界里,能活下来的,永远是那些最不相信奇迹的人。

标签: none

添加新评论