ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

用 AkShare + backtrader 做 量化策略:ETF 双均线回测(含滑点/印花税完整代码)

用 AkShare + backtrader 做 量化策略:ETF 双均线回测(含滑点/印花税完整代码) ## 前言很多刚接触量化的朋友第一个策略就是双均线——短期均线上穿长期均线买入下穿卖出。但大部分人跑出来的回测结果都是假的没算手续费、没考虑 T1、没处理涨跌停。本文用 AkShare 获取数据 backtrader 做回测把真实成本全部算进去给你一个能直接用的模板。## 环境准备命令行安装必要依赖库pip install akshare backtrader pandas numpy matplotlib## 完整代码python脚本import akshare as ak import backtrader as bt import pandas as pd from datetime import datetime class DualMAStrategy(bt.Strategy): params ( (fast, 20), (slow, 60), ) def __init__(self): self.fast_ma bt.indicators.SMA(self.data.close, periodself.params.fast) self.slow_ma bt.indicators.SMA(self.data.close, periodself.params.slow) self.crossover bt.indicators.CrossOver(self.fast_ma, self.slow_ma) def next(self): if not self.position: if self.crossover 0: self.buy() elif self.crossover 0: self.close() # 获取 ETF 数据以沪深300ETF为例 etf_code 510300 df ak.fund_etf_hist_em(symboletf_code, perioddaily, start_date20180101, end_date20241231) df[date] pd.to_datetime(df[日期]) df.set_index(date, inplaceTrue) df df[[开盘, 最高, 最低, 收盘, 成交量]] df.columns [open, high, low, close, volume] df df.sort_index() # backtrader 数据加载 data bt.feeds.PandasData( datanamedf, datetimeNone, open0, high1, low2, close3, volume4, openinterestNone ) # 回测引擎 cerebro bt.Cerebro() cerebro.addstrategy(DualMAStrategy, fast20, slow60) cerebro.adddata(data) cerebro.broker.setcash(100000.0) cerebro.broker.setcommission(commission0.0003) # 万三佣金 cerebro.broker.set_slippage_fixed(0.01) # 1分钱滑点 cerebro.addanalyzer(bt.analyzers.SharpeRatio, _namesharpe) cerebro.addanalyzer(bt.analyzers.DrawDown, _namedrawdown) cerebro.addanalyzer(bt.analyzers.Returns, _namereturns) print(f初始资金: {cerebro.broker.getvalue():.2f}) results cerebro.run() strat results[0] print(f最终资金: {cerebro.broker.getvalue():.2f}) print(f夏普比率: {strat.analyzers.sharpe.get_analysis()[sharperatio]:.3f}) print(f最大回撤: {strat.analyzers.drawdown.get_analysis()[max][drawdown]:.2f}%) cerebro.plot()## 关键参数说明| 参数 | 值 | 说明 ||------|------|------|| 佣金 | 0.0003 | 万三单边 || 印花税 | 0ETF免收| A股股票为0.0005 || 滑点 | 0.01 元 | 模拟实际成交偏差 || 初始资金 | 100,000 | 可自行调整 |## 回测结果解读跑完你会看到- 资金曲线- 夏普比率- 最大回撤**但注意**这只是日线级别的简化回测。真实交易中还要考虑1. T1 限制当天买不能当天卖2. 涨跌停买不到/卖不掉3. 成交量不足时的冲击成本4. 参数过拟合20/60 是不是刚好选了最好的参数## 常见坑1. **未来函数**用当天收盘价做当天信号判断backtrader 默认用次日开盘价成交这点是对的2. **生存者偏差**只测了当前还在的 ETF没考虑退市的3. **过拟合**在 2018–2024 上优化参数换个时间段可能就不行了4. **手续费低估**股票万三印花税千一实际成本比 ETF 高很多## 下一步- 想加更多过滤条件成交量/资金流/波动率- 想测多只 ETF 轮动- 想做多因子选股回测报告如何解读如何进一步优化策略可以自己改代码也可以找我帮你把想法落地。---⚠️ 声明本文所有回测结果仅用于量化研究方法演示不构成任何投资建议。历史回测≠未来收益。如果需要把你的交易想法写成回测代码或者交流关于量化策略、回测的相关问题闲鱼搜「新智量化Lab」可找到我的服务。
返回列表