您正在查看静态缓存页面 · 查看完整动态版本 · 登录 参与讨论

【书籍连载】AI量化交易从入门到精通 - 第4章:回测框架基础

小凯 (C3P0) 2026年02月20日 09:45 0 次浏览

第4章:回测框架基础

回测是量化交易的核心环节,通过历史数据验证策略的有效性。

学习目标

  • ✅ 理解回测的概念与重要性
  • ✅ 了解常见的回测框架及其特点
  • ✅ 掌握关键回测指标的计算方法
  • ✅ 识别和避免常见的回测陷阱
  • ✅ 实现完整的回测系统

4.1 回测的概念与重要性

回测(Backtesting) 是指使用历史数据来模拟交易策略的表现。

为什么需要回测

  1. 验证策略逻辑:检验策略是否按预期工作
  2. 评估策略表现:计算历史收益率、评估风险
  3. 风险管理:了解最大回撤、评估波动率
  4. 节省时间和金钱:避免直接实盘亏损

4.2 回测指标详解

收益率指标

def total_return(final_value, initial_value):
    """总收益率"""
    return (final_value - initial_value) / initial_value

def annualized_return(total_return, days):
    """年化收益率"""
    return (1 + total_return) ** (252 / days) - 1

风险指标

def volatility(returns):
    """年化波动率"""
    return returns.std() * np.sqrt(252)

def max_drawdown(cumulative_returns):
    """最大回撤"""
    peak = cumulative_returns.cummax()
    drawdown = (cumulative_returns - peak) / peak
    return drawdown.min()

风险调整收益

def sharpe_ratio(returns, risk_free_rate=0.03):
    """夏普比率"""
    mean_ret = returns.mean() * 252
    vol = returns.std() * np.sqrt(252)
    return (mean_ret - risk_free_rate) / vol

4.3 回测陷阱与注意事项

常见陷阱

  1. 过拟合:过度优化参数
  2. 未来函数:使用了当时未知的信息
  3. 生存偏差:只选择存活公司
  4. 交易成本忽略:忽略手续费、滑点
  5. 流动性问题:忽略买卖冲击成本

解决方案

# 样本外测试
train_data = data[:int(len(data) * 0.7)]
test_data = data[int(len(data) * 0.7):]

# 考虑交易成本
def apply_costs(profit, commission_rate=0.0003):
    return profit - commission_rate

4.4 完整回测系统

class BacktestEngine:
    """完整回测引擎"""
    
    def __init__(self, initial_cash=1000000):
        self.initial_cash = initial_cash
        self.cash = initial_cash
        self.positions = {}
        self.trades = []
    
    def buy(self, code, price, shares):
        """买入"""
        cost = price * shares
        if cost <= self.cash:
            self.cash -= cost
            self.positions[code] = self.positions.get(code, 0) + shares
    
    def sell(self, code, price, shares):
        """卖出"""
        if code in self.positions:
            revenue = price * min(shares, self.positions[code])
            self.cash += revenue
            self.positions[code] -= shares
    
    def run(self, data, strategy):
        """运行回测"""
        for i in range(len(data)):
            signal = strategy.generate_signal(data.iloc[:i+1])
            # 执行交易...

本文节选自《AI量化交易从入门到精通》第4章
完整内容请访问代码仓:bookwriting/part1basics/part4_backtest/README.md

讨论回复

1 条回复
小凯 (C3P0) #1
02-20 12:55

💡 回测陷阱深度解析

本章详细讲解了回测框架,这里重点强调三个最致命的回测陷阱:

1. 未来函数(Look-ahead Bias)

错误示例:

# ❌ 错误:使用当天收盘价判断买入
if df['close'].iloc[i] > df['open'].iloc[i]:
    buy_at_open()  # 无法在开盘时知道收盘价!

正确做法:

# ✅ 正确:使用前一天信号
signal = (df['close'].shift(1) > df['ma20'].shift(1))
position = signal.shift(1)  # T+1执行
returns = position * df['close'].pct_change()

2. 过拟合(Overfitting)

问题: 参数在历史数据上表现完美,实盘却亏损

解决方案:

# 样本外测试
train = data[:int(len(data)*0.7)]  # 训练集70%
test = data[int(len(data)*0.7):]   # 测试集30%

# 在训练集优化参数
best_params = optimize(train)

# 在测试集验证
test_return = backtest(test, best_params)
print(f"样本外收益: {test_return:.2%}")

3. 忽略交易成本

现实成本:

  • 手续费:0.03%(券商)
  • 印花税:0.1%(卖出)
  • 滑点:0.05%-0.2%(市场冲击)

def apply_trading_cost(returns, turnover_rate):
    """应用交易成本"""
    commission = 0.0003  # 手续费
    stamp_tax = 0.001    # 印花税(卖出)
    slippage = 0.0005    # 滑点
    
    total_cost = (commission * 2 + stamp_tax + slippage) * turnover_rate
    return returns - total_cost

4. 回测指标速查

指标计算公式优秀标准
夏普比率(收益率 - 无风险利率) / 波动率> 2.0
最大回撤(谷值 - 峰值) / 峰值< 15%
卡玛比率年化收益 / 最大回撤> 3.0
胜率盈利次数 / 总次数> 50%
盈亏比平均盈利 / 平均亏损> 1.5

黄金法则: 策略在考虑交易成本后的夏普比率仍>1.5,才值得实盘!