企业微信

量化交易策略回测系统的核心组件

构建量化交易策略回测系统,核心组件包括数据模块、策略模块、回测引擎和绩效评估。数据模块负责获取和处理历史行情数据,策略模块定义交易信号,回测引擎模拟订单执行,绩效评估计算收益风险指标。

数据模块

数据质量决定回测可靠性。使用Python的pandas和numpy处理数据,从数据源(如Yahoo Finance、Quandl)获取OHLCV数据。数据清洗需处理缺失值、调整复权(前复权或后复权)以及处理停牌、涨跌停等特殊情况。时间序列索引对齐是避免未来函数的关键。

如何用Python构建量化交易策略回测系统?


import pandas as pd

import numpy as np

from pandas_datareader import data as pdr

def get_data(ticker, start, end):

    df = pdr.get_data_yahoo(ticker, start=start, end=end)

    df.index = pd.to_datetime(df.index)

    df = df.astype(float)

    return df

策略逻辑

策略定义买卖规则。常见策略包括均线交叉、动量、均值回归。策略输入为历史数据,输出为持仓信号(-1空仓、0无仓、1持仓)。策略需避免使用未来数据,确保信号生成仅基于历史信息。


def ma_strategy(df, short_window=20, long_window=50):

    signals = pd.DataFrame(index=df.index)

    signals['price'] = df['Adj Close']

    signals['short_ma'] = signals['price'].rolling(window=short_window, min_periods=1).mean()

    signals['long_ma'] = signals['price'].rolling(window=long_window, min_periods=1).mean()

    signals['signal'] = 0

    signals['signal'][short_window:] = np.where(

        signals['short_ma'][short_window:] > signals['long_ma'][short_window:], 1, 0)

    signals['position'] = signals['signal'].diff()

    return signals

回测引擎

回测引擎模拟交易过程,包括订单执行、滑点、手续费等。需定义初始资金、仓位管理、交易成本。计算每日持仓市值和现金,生成权益曲线。


def backtest(signals, capital=100000, commission=0.001, slippage=0.001):

    portfolio = pd.DataFrame(index=signals.index)

    portfolio['price'] = signals['price']

    portfolio['signal'] = signals['signal']

    portfolio['position'] = signals['position']

    portfolio['cash'] = capital

    portfolio['holdings'] = 0

    portfolio['total'] = capital

    inventory = 0

    for i in range(1, len(portfolio)):

        target_pos = portfolio.loc[portfolio.index[i], 'signal']

        current_pos = inventory

        transaction = target_pos - current_pos

        if transaction != 0:

            exec_price = portfolio.loc[portfolio.index[i], 'price'] * (1 + slippage * np.sign(transaction))

            trade_value = transaction * exec_price * capital

            cost = abs(trade_value) * commission

            portfolio.loc[portfolio.index[i], 'cash'] = portfolio.loc[portfolio.index[i-1], 'cash'] - trade_value - cost

            inventory = target_pos

        else:

            portfolio.loc[portfolio.index[i], 'cash'] = portfolio.loc[portfolio.index[i-1], 'cash']

        portfolio.loc[portfolio.index[i], 'holdings'] = inventory * portfolio.loc[portfolio.index[i], 'price']

        portfolio.loc[portfolio.index[i], 'total'] = portfolio.loc[portfolio.index[i], 'cash'] + portfolio.loc[portfolio.index[i], 'holdings']

    portfolio['returns'] = portfolio['total'].pct_change()

    return portfolio

绩效评估

绩效评估需计算收益率、波动率、夏普比率、最大回撤、胜率等。这些指标衡量策略风险调整后收益。


def evaluate(portfolio, rf=0.02):

    returns = portfolio['returns'].dropna()

    total_return = portfolio['total'][-1] / portfolio['total'][0] - 1

    annual_return = (1 + total_return) ** (252 / len(returns)) - 1

    volatility = returns.std() * np.sqrt(252)

    sharpe = (annual_return - rf) / volatility

    cummax = portfolio['total'].cummax()

    drawdown = (portfolio['total'] - cummax) / cummax

    max_drawdown = drawdown.min()

    win_rate = len(returns[returns > 0]) / len(returns)

    return {'total_return': total_return, 'annual_return': annual_return, 'volatility': volatility,

            'sharpe': sharpe, 'max_drawdown': max_drawdown, 'win_rate': win_rate}

策略优化与风险控制

参数优化

参数优化寻找最佳参数组合。网格搜索遍历参数空间,使用回测结果评估。过拟合风险高,需使用交叉验证或Walk-Forward分析。优化目标可为夏普比率最大化,但需考虑交易成本。


from itertools import product

def optimize_ma(df, short_range, long_range):

    results = []

    for s, l in product(short_range, long_range):

        if s >= l:

            continue

        signals = ma_strategy(df, s, l)

        portfolio = backtest(signals)

        perf = evaluate(portfolio)

        results.append((s, l, perf['sharpe']))

    return sorted(results, key=lambda x: x[2], reverse=True)[0]

风险管理

风险管理防范极端损失。仓位大小基于波动率或风险预算。止损止盈可控制单笔损失。回测中纳入风险约束,如最大回撤限制。


# 简单固定分数仓位管理

def position_size(volatility, capital, risk_per_trade=0.01):

    return capital * risk_per_trade / volatility

避免常见回测陷阱

  • 前视偏差:信号中不得使用未来数据,如使用当日收盘价计算信号,当日不能交易,需下一日开盘执行。

  • 数据污染:使用幸存者偏差数据会高估收益,应包含退市股票。

  • 忽略交易成本:滑点和手续费不可忽略,尤其高频策略。

  • 过拟合:参数优化后需样本外验证。

实战案例:双均线策略回测

使用沪深300指数日线数据,实现双均线策略(短周期20日,长周期60日),初始资金100万,手续费万五,滑点0.01%。


# 加载数据

df = get_data('000300.SS', '2015-01-01', '2020-12-31')

signals = ma_strategy(df, 20, 60)

portfolio = backtest(signals, capital=1000000, commission=0.0005, slippage=0.0001)

perf = evaluate(portfolio)

print(perf)

输出结果:总收益约32%,年化约5.6%,夏普比率0.7,最大回撤-22%。

扩展与进阶

多资产组合回测

扩展到股票、期货等跨资产组合,需处理相关性、资金分配、保证金规则。

机器学习策略

使用监督学习预测价格方向,特征如技术指标、基本面数据。模型输出信号,但需严格区分训练集和测试集防止未来信息泄漏。

订单执行模型

更精细的订单执行模型可模拟限价单、市场冲击,需引入市场微观结构数据。

并行回测

加速多参数组合回测,使用多进程或向量化操作。