
数据准备与清洗
回测验证的第一步是获取高质量历史数据。股票策略需包含开盘价、最高价、最低价、收盘价、成交量等基础行情数据,期货策略还需考虑主力合约切换时的连续价格处理。数据清洗需重点解决:
异常值处理:剔除因系统错误导致的零值或极端值
停牌数据处理:保留停牌日数据点避免时间序列错位
复权处理:股票需进行前复权或后复权调整,消除分红配股影响
幸存者偏差防范:使用包含已退市股票的全样本数据库
# 期货主力合约连续处理示例
def generate_continuous_contract(df_original, rollover_dates):
df = df_original.copy()
df['contract'] = 1
for date in rollover_dates:
df.loc[df.index >= date, 'contract'] += 1
return df.groupby('contract').apply(lambda x: x.iloc[:-5]) # 剔除交割日前5日数据
策略代码实现
将交易逻辑转化为可执行代码时需注意:
避免未来函数:严格使用历史时点可用数据
交易成本建模:包含佣金(如股票万2.5)、印花税(卖出0.1%)、滑点(按波动率动态设置)
仓位控制:实现金字塔加仓/倒金字塔减仓等风险管理模块
# 均线策略核心代码示例
def ma_strategy(data, fast_period=5, slow_period=20):
data['fast_ma'] = data['close'].rolling(fast_period).mean()
data['slow_ma'] = data['close'].rolling(slow_period).mean()
data['signal'] = np.where(data['fast_ma'] > data['slow_ma'], 1, -1)
# 加入交易成本影响
data['position'] = data['signal'].shift() * (1 - 0.00025) # 扣除佣金
return data[['position']]
回测执行与参数设置
选择回测引擎时需关注:

事件驱动型 vs 向量化回测:前者更接近实盘但速度慢,后者适合快速迭代
初始资金设置:股票策略建议50万以上,期货需覆盖保证金要求
时间区间选择:包含牛熊市周期(如A股2015-2023年)
滑点模型:固定滑点(如0.1%)或动态滑点(按波动率比例)
关键参数设置原则:
交易日设置:A股采用
calendar = ShanghaiExchange()撮合机制:使用
next_open模式避免使用未来价格基准选择:股票策略对标沪深300指数,期货策略对标主力合约指数
结果分析与优化
回测输出需多维评估:
核心绩效指标
年化收益率:需高于无风险利率3倍以上
最大回撤:控制在总资金15%以内
夏普比率:大于1.5为可接受水平
Calmar比率:年化收益/最大回撤 > 2
过拟合排查技术
参数敏感度测试:在±20%参数范围内观察指标稳定性
蒙特卡洛模拟:
随机删除10%交易记录
打乱交易顺序
结果波动率需<15%
样本外测试:保留最后20%数据不作任何优化
实盘过渡验证
通过以下步骤实现平稳过渡:
前向分析:在回测结束点向后模拟3个月
小资金实盘:初始投入不超过总资金5%
监控关键差异:
实盘滑点 vs 回测滑点
实际成交率 vs 回测假设
极端行情下的流动性差异
专业回测需警惕三大陷阱:幸存者偏差导致收益高估、过拟合产生虚假信号、交易成本低估造成绩效失真。稳健策略应通过参数敏感度测试、蒙特卡洛验证、样本外检测三重关卡,最终经小资金实盘校验方可投入主力资金。量化交易本质是概率游戏,回测仅是验证胜率的起点而非终点。