量化交易入门:策略回测与自动执行
量化交易入门:策略回测与自动执行
量化交易并非高不可攀的“黑箱艺术”,而是一套用数据验证想法、用代码执行决策的系统方法。本教程将带你从零开始,理解量化交易的核心环节:如何把一个交易想法转化为可回测的策略,如何评估其表现,以及如何实现自动执行。我们不会停留在空泛的概念,而是通过具体的步骤与免费工具,让你能够亲手走出量化交易的第一步。
1. 理解量化交易的本质
量化交易是将交易逻辑固化为规则,并用历史数据检验这套规则的有效性,最终让计算机自动完成交易的过程。它解决了主观交易中的两大难题:情绪干扰与不可复制性。
在正式开始之前,你需要了解三个核心模块:
- 数据:策略的燃料。包括价格、成交量、财务数据等。
- 策略:你的交易逻辑。例如“当5日均线上穿20日均线时买入”。
- 执行:通过程序自动下单,减少延迟与人为错误。
本教程将聚焦于策略回测和自动执行这两个最关键的环节。
2. 免费工具准备:搭建你的量化环境
作为初学者,无需一开始就付费购买专业终端。以下免费工具链足以覆盖完整的回测与执行需求:
- Python:量化领域的主流语言,生态丰富。安装Anaconda发行版可省去大量配置麻烦。
- 数据源:
yfinance:免费获取股票、ETF 的历史价格数据(基于雅虎财经)。akshare:覆盖A股、期货、债券等中国金融数据。
- 回测框架:
backtrader:功能完善、文档齐全的回测库,适合学习与实盘过渡。vectorbt:基于向量的回测库,速度极快,支持高级可视化。
- 自动执行接口:
- 对于A股,可以使用券商提供的量化API(如国信iQuant、华泰matrade的仿真环境)。
- 对于加密货币,常用
ccxt库,支持接入币安、OKX等交易所的测试网络。
建议第一步:安装Python,并在终端使用pip install yfinance backtrader pandas matplotlib完成核心库的安装。
3. 策略回测:从想法到验证
回测是用历史数据模拟真实交易,回答“这个策略过去表现如何”。它不是一个简单的净值曲线,而是系统的工程。
3.1 定义一个基础策略:双均线交叉
我们选择一个经典示例——双均线交叉策略,规则如下:
- 当短期均线(如10日)上穿长期均线(如30日)时,买入。
- 当短期均线下穿长期均线时,卖出。
- 始终全仓进出(买入时卖出所有现金,卖出时卖出所有持仓)。
在backtrader中实现该策略的代码如下:
import backtrader as bt
class DoubleMAStrategy(bt.Strategy):
params = (('short_period', 10), ('long_period', 30))
def __init__(self):
self.sma_short = bt.ind.SMA(period=self.params.short_period)
self.sma_long = bt.ind.SMA(period=self.params.long_period)
self.crossover = bt.ind.CrossOver(self.sma_short, self.sma_long)
def next(self):
if not self.position:
if self.crossover > 0:
self.buy()
elif self.crossover < 0:
self.close()
3.2 获取数据并运行回测
用yfinance获取美股历史数据,或使用akshare获取A股数据。以下示例获取苹果公司(AAPL)近5年数据并执行回测:
import yfinance as yf
from backtrader.feeds import PandasData
data_df = yf.download('AAPL', start='2019-01-01', end='2024-12-31')
data = PandasData(dataname=data_df)
cerebro = bt.Cerebro()
cerebro.addstrategy(DoubleMAStrategy)
cerebro.adddata(data)
cerebro.broker.setcash(100000.0)
cerebro.run()
cerebro.plot()
运行后你会看到包含K线、买卖点标记和资金曲线的图表。但这仅仅是开始,我们需要知道这个曲线是否可靠。
3.3 你必须关注的回测指标
净利润率并不能反映策略质量。初学者必须学会查看以下指标,避免过度乐观:
- 夏普比率(Sharpe Ratio):衡量每单位风险的回报。>1.0可接受,>2.0优秀。
- 最大回撤(Max Drawdown):从峰顶到谷底的最大跌幅。超过30%的策略心理压力极大。
- 胜率(Win Rate):盈利交易次数占比。需结合盈亏比看,低胜率高盈亏比依然可行。
- 年化收益率(Annual Return):与基准(如买入持有指数)比较。
- 交易次数:过少的次数可能缺乏统计意义。
backtrader内置了分析器,添加以下代码即可输出:
cerebro.addanalyzer(bt.analyzers.SharpeRatio, _name='sharpe')
cerebro.addanalyzer(bt.analyzers.DrawDown, _name='drawdown')
# ... 运行结束后
thestr = results[0]
print('夏普比率:', thestr.analyzers.sharpe.get_analysis())
4. 避免回测陷阱:让你的策略更真实
历史回测优秀并不代表未来有效。许多新手策略陷入了这几类陷阱:
4.1 未来函数
在信号计算中,无意中使用了当时还不可知的数据。例如,在计算当日信号时使用了当日的收盘价却假设在开盘时就能成交。解决方法:永远在next()方法的下一天成交,并使用次日开盘价(open)作为交易价格。backtrader默认在下一个交易日开盘时执行订单,较为合理。
4.2 生存偏差
只使用当前仍在交易的股票数据。如果你在2019年回测一个今日还在的股票池,就忽略了那些已经退市、破产的股票,导致结果虚高。对于A股,必须使用包含退市列表的全量历史数据(如使用聚宽、米筐的本地数据,或akshare的股票历史列表)。
4.3 过度拟合
为历史数据精心挑选参数,导致曲线完美但毫无外推能力。你可以用样本外测试来缓解:将数据分为训练期(70%)和测试期(30%),只在训练期优化参数,然后在从未见过的测试期运行一次,无任何改动。如果测试期表现断崖式下跌,就是过度拟合的信号。
4.4 忽视交易成本
手续费、滑点和印花税对高频策略影响致命。backtrader中可以方便设置:
cerebro.broker.setcommission(commission=0.0003) # 万三佣金
cerebro.broker.set_slippage_perc(perc=0.001) # 0.1%滑点
5. 策略自动执行:从回测到实盘
自动执行不是直接照搬回测代码。真实市场存在行情延迟、部分成交、订单失败等复杂情况。初学者应从模拟交易开始,过渡到小资金实盘。
5.1 简单的自动化架构
一个精简的自动化执行流程如下:
- 定时任务:使用
schedule库或系统cron在每天固定时间(如下午收盘前)触发策略。 - 获取最新数据:从API拉取当日的K线数据。
- 生成信号:运行策略逻辑,得到目标仓位(如“买入1000股”)。
- 对比当前持仓:向交易所查询实际持仓。
- 生成订单:计算调仓差额,发送订单。
- 确认与记录:检查订单状态,记录日志。
5.2 使用ccxt连接加密货币测试网
加密货币交易所提供了完备的测试网络(testnet),是学习自动执行的理想平台。以币安测试网为例:
import ccxt
exchange = ccxt.binance({
'apiKey': 'your_testnet_api_key',
'secret': 'your_testnet_secret',
})
exchange.set_sandbox_mode(True) # 开启测试模式
# 获取当前持仓
balance = exchange.fetch_balance()
# 发送市价买单
order = exchange.create_market_buy_order('BTC/USDT', 0.001)
你可以在此环境反复练习,直到订单执行流程稳定无误。
5.3 A股的自动交易方案
A股自动交易的门槛较高,但仍有免费路径:
- 量化平台:JoinQuant(聚宽)、BigQuant等提供在线回测与模拟交易,支持微信信号提醒。
- 券商API:部分券商开放了实盘API,通常需要一定资金门槛。新手可先使用其仿真交易系统(如国信TradeStation、华泰MATIC的仿真模式)。
- 文件信号+手动确认:作为折中方案,程序只输出信号为文件,由你手动下单。这是最安全的自动化起步方式。
6. 构建你的第一套完整流程
让我们整合一下,规划一个可行的练习项目:
任务:构建一个简易的A股动量策略自动提醒系统。
步骤:
- 使用
akshare获取沪深300成分股最近的20日涨跌幅。 - 选出涨幅排名前5的股票作为买入目标。
- 在
backtrader中回测该规则,确保样本外有效。 - 编写一个脚本,每周末运行,输出目标列表和参考仓位。
- 将结果通过邮件或钉钉机器人推送给自己,下周一手动操作。
这套流程让你在不依赖复杂实盘接口的情况下,完整走通“数据→回测→信号→执行指导”的链条,体会量化交易的实际运作。
7. 持续学习与进阶方向
入门之后,你自然会面临更复杂的问题。以下路径可供参考:
- 因子检验:学习Alphalens库,系统性地测试选股因子的IC、分层收益。
- 风险模型:波动率平价、VaR、行业中性化,使策略更稳健。
- 订单执行算法:TWAP、VWAP,减少大单对市场的冲击。
- 另类数据:社交媒体情绪、卫星图像、供应链数据,寻找独特Alpha。
量化交易是一场长期的自我教育。坚持用数据说话,保持对市场的敬畏,你完全可以成为一名独立的量化交易者。现在,打开你的编辑器,开始编写第一条双均线策略吧。