Ai Trading Backtester — AI 交易回测器
v1.0.0基于AI的量化交易策略回测助手。设计、编码和评估历史市场数据上的交易策略。支持A股(中国)、香港、美国股市。涵盖均值回归、动量、突破、配对交易和基于机器学习的策略。为量化分析师和零售交易者设计。关键词:交易回测、量化策略、算法交易、Python回测、backtrader、vectorbt、交易策略、动量、均值回归、配对交易、A股策略、金融数据、技术指标。支持API、CLI,托管于GitHub。
运行时依赖
安装命令
点击复制技能文档
AI 交易策略回测概述 一个由 AI 驱动的量化交易策略设计和回测助手,帮助您将交易想法转化为完全编码和回测的策略。它指导您完成策略设计(均值回归、动量、突破、配对交易、基于机器学习的策略),并使用 Python 实现(backtrader、vectorbt、pandas),评估其在 A 股、港股和美股历史数据上的表现,并生成风险调整后的表现报告。 触发器: “回测我的交易策略” “为 [股票/市场] 设计动量策略” “在 [symbol] 上测试均值回归” “配对交易策略示例” “Python backtrader 设置指南” “vectorbt 教程” “交易策略优化” “量化回测策略” “技术指标择时策略” “A 股量化策略设计”
工作流程 步骤 1:定义策略简介 收集交易想法: 策略类型:动量、均值回归、突破、配对交易、基于机器学习的策略、事件驱动 市场:A 股(sh/sz)、港股(hk)、美股(us) 时间范围:日内(1m/5m/15m)、日、周、月 资产:单只股票、ETF、指数、投资组合 入市/出市信号:技术指标、价格模式、基本面信号、机器学习预测 仓位规模:固定、凯利标准、风险平价、动态 约束:最大仓位规模、只做多/只做空、换手限制、滑点模型
步骤 2:策略设计和代码生成 根据简介生成生产质量的 Python 代码: A. 动量策略模板
B. 均值回归策略模板import pandas as pd import numpy as np import backtrader as btclass MomentumStrategy(bt.Strategy): params = ( ('lookback', 20), # 回望期 ('hold_period', 5), # 持有期 ('rank_percentile', 0.2), # 选股分位数 )
def __init__(self): self.inds = {} for d in self.datas: self.inds[d] = {} self.inds[d]['momentum'] = bt.indicators.RateOfChange(d.close, period=self.params.lookback)
def next(self): # 按动量排序,取前 20% rankings = sorted(self.datas, key=lambda d: self.inds[d]['momentum'][0], reverse=True)[:int(len(self.datas) * self.params.rank_percentile)] # 平仓不在榜单的持仓 for d in self.datas: if d not in rankings and self.getposition(d).size > 0: self.close(d) # 买入榜单中的标的 for d in rankings: if self.getposition(d).size == 0: self.order_target_percent(d, 1.0 / len(rankings))
C. 配对交易策略class MeanReversionStrategy(bt.Strategy): params = ( ('bb_period', 20), ('bb_dev', 2.0), ('rsi_period', 14), ('rsi_oversold', 30), ('rsi_overbought', 70), )def __init__(self): self.bb = bt.indicators.BollingerBands(self.data.close, period=self.params.bb_period, devfactor=self.params.bb_dev) self.rsi = bt.indicators.RSI(self.data.close, period=self.params.rsi_period)
def next(self): if self.position.size == 0: # 价格触及下轨且 RSI 超卖 → 买入 if self.data.close < self.bb.lines.bot and self.rsi < self.params.rsi_oversold: self.order_target_percent(self.data, 1.0) else: # 价格触及上轨或 RSI 超买 → 卖出 if self.data.close > self.bb.lines.top or self.rsi > self.params.rsi_overbought: self.close()
步骤 3:回测执行 指导用户运行回测:import statsmodels.api as smdef find_cointegrated_pairs(data_dict): """寻找协整配对""" n = len(data_dict) pairs = [] symbols = list(data_dict.keys()) for i in range(n): for j in range(i + 1, n): try: x = data_dict[symbols[i]] y = data_dict[symbols[j]] # OLS 回归 X = sm.add_constant(x) model = sm.OLS(y, X).fit() residuals = model.resid # ADF 检验 adf_result = sm.tsa.stattools.adfuller(residuals) if adf_result[0] < adf_result[4]['1%']: pairs.append((symbols[i], symbols[j], adf_result[0])) except: continue return sorted(pairs, key=lambda x: x[2])
def pairs_trading_signals(spread, z_entry=2.0, z_exit=0.5): """配对交易信号""" signals = pd.Series(0, index=spread.index) z_score = (spread - spread.mean()) / spread.std() signals[z_score < -z_entry] = 1 # 做多价差 signals[z_score > z_entry] = -1 # 做空价差 signals[abs(z_score) < z_exit] = 0 # 平仓 return signals
import backtrader as bt import pandas as pd# 加载数据 data = bt.feeds.GenericCSVData( dataname='historical_data.csv', dtformat='%Y-%m-%d', datetime=0, open=1, high=2, low=3, close=4, volume=5, openinterest=-1 )
# 运行回测 cerebro = bt.Cerebro() cerebro.addstrategy(MomentumStrategy) cerebro.adddata(data) cerebro.broker.setcash(1000)