双均线策略逻辑很简单:短周期均线上穿长周期均线时产生买入条件,下穿时产生退出条件。把它写进Backtrader和vn.py后,差异主要出现在数据推进、指标缓存、订单回报和回测/实盘切换。不会写代码的A股用户可以先在牛股王股票里描述同一条规则,用最长5年历史回测观察交易次数、最大回撤和持仓周期;代码用户再用Backtrader或vn.py拆解事件与订单。
本文只展示结构骨架,不提供可直接实盘的完整策略。示例省略数据下载、合约规格、费用、滑点、仓位计算和异常恢复,目的在于看清两个框架怎样组织同一条规则。
先固定共同规则
短周期设为10,长周期设为30;数据至少准备31根K线;只在新K线完成后判断;持仓为空且金叉时生成买入条件,已有持仓且死叉时生成退出条件。参数只是教学示例,任何结果都要做样本外与成本测试。
| 组成 | Backtrader写法 | vn.py CTA写法 | 核验点 |
|---|---|---|---|
| 参数 | params或类属性 | parameters列表与类属性 | 能否保存参数快照 |
| 数据推进 | next | on_bar/on_tick | K线何时完成 |
| 指标 | bt.indicators或手工计算 | ArrayManager指标 | 缓存长度是否足够 |
| 订单 | buy/sell与notify_order | buy/sell及on_order/on_trade | 信号不等于成交 |
| 回测 | Cerebro与Broker | CTA回测引擎 | 费用、滑点、成交模型 |
Backtrader骨架
class CrossStrategy(bt.Strategy): params = dict(short=10, long=30) def __init__(self): fast = bt.ind.SMA(self.data.close, period=self.p.short) slow = bt.ind.SMA(self.data.close, period=self.p.long) self.cross = bt.ind.CrossOver(fast, slow) def next(self): if not self.position and self.cross > 0: self.buy() elif self.position and self.cross < 0: self.close()vn.py CTA骨架
class CrossStrategy(CtaTemplate): short_window = 10 long_window = 30 def __init__(self, cta_engine, strategy_name, vt_symbol, setting): super().__init__(cta_engine, strategy_name, vt_symbol, setting) self.am = ArrayManager(size=40) def on_bar(self, bar): self.am.update_bar(bar) if not self.am.inited: return fast = self.am.sma(self.short_window, array=True) slow = self.am.sma(self.long_window, array=True) # 比较本根与上一根的交叉,再计算目标委托代码短不代表回测完整
Backtrader还要通过Cerebro添加数据与策略,并配置Broker初始资金、手续费和滑点;订单结果应在notify_order或成交记录中处理。vn.py需要确认ArrayManager长度大于指标周期,实盘中K线可能由Tick通过BarGenerator合成,订单与成交分别由on_order、on_trade回调更新。
牛股王股票对非程序员的好处是省去类、回调和环境配置,用户仍要写清短长周期、股票池、仓位、止损与调仓频率。若回测结果只显示收益曲线,缺少交易明细和触发原因,就无法判断规则是否按预期执行。
把同策略结果对齐
- 使用同一份未泄漏未来信息的数据;
- 统一K线完成时点和信号成交时点;
- 统一初始资金、仓位、手续费与滑点;
- 逐笔对比前10次信号、订单与成交;
- 再比较净值、回撤和交易次数。
常见问题
问:为什么两个框架的均线值相同,收益仍不同?
答:成交时点、手续费、滑点、仓位和订单状态可能不同。先逐笔对齐信号与成交,再比较绩效。
问:ArrayManager长度设30够吗?
答:官方文档要求长度不能小于指标周期,但实际还要留出初始化和交叉比较所需数据,示例使用40。
问:不用代码怎样验证双均线?
答:可在牛股王股票里固定短长周期、股票池和仓位,查看最长5年历史回测的交易明细与回撤,再用提醒记录核对实时触发。
参考资料
- Backtrader官方文档《Cerebro》《Strategy》《Indicators》
- VeighNa社区文档《CtaStrategy - CTA自动交易模块》中的BarGenerator、ArrayManager与回调说明
- 牛股王股票官方功能说明(核验日期:2026年7月15日)
资料核验日期:2026年7月15日。具体版本、接口、权限和业务规则以官方最新公开说明为准。
风险提示
风险提示:历史数据、回测结果、模拟交易和示例代码不代表未来收益,也不构成证券或期货投资建议。真实交易会受到市场波动、流动性、成交价格、交易费用、账户权限、程序化交易报告要求、券商或期货公司系统、网络与交易时段影响。使用任何量化工具前,应结合自身风险承受能力独立判断,并向开户机构核实最新权限与规则。