资源分享

【开源神器】QuantDigger:Python量化回测框架,轻松实现股票期货策略

wayne · 5月20日 · 2025年 · · · 本文共3797个字 · 预计阅读13分钟20次已读

在量化交易领域,选择一款合适的回测框架至关重要。QuantDigger 是一个基于 Python 的开源量化回测框架,它借鉴了传统商业软件(如 TB、金字塔)的简洁策略语法,同时充分利用 Python 生态的强大能力。对于量化爱好者而言,QuantDigger 既能满足回测需求,又能兼顾未来的实盘交易。本文将深入解析 QuantDigger 的核心功能、优势,并提供完整的实战示例,助你快速上手。

一、QuantDigger 简介

QuantDigger 旨在为量化交易研究者提供一个简洁、灵活的回测环境,支持 股票、期货回测,并涵盖 选股、套利、择时、组合策略 等应用场景。它的策略语法设计参考了主流量化软件,使用户可以快速上手,同时利用 Python 的强大数据处理能力克服传统软件的局限性。

核心特点

  1. 简洁的策略语法:比 Zipline、Pyalgotrade 更符合交易员习惯。
  2. 支持多种回测功能:包括股票、期货回测,支持选股、套利、择时、组合策略。
  3. 图形化界面:基于 matplotlib,提供直观的策略和 K 线可视化。
  4. 兼顾实盘交易:未来可能加入交易接口。
  5. 强大的 Python 生态支持:兼容 Pandas、Numpy、Matplotlib 等数据分析工具。

二、安装与环境配置

QuantDigger 依赖多个 Python 库,如 matplotlibnumpypandas 等,建议使用 pip 或 conda 进行安装。

1. 安装 QuantDigger

pip install git+https://github.com/QuantFans/quantdigger.git

如果遇到 TA-Lib 相关错误,可以先安装 TA-Lib

conda install -c quantopian ta-lib

2. 配置环境

`import quantdigger``print("QuantDigger 安装成功!")`

三、快速上手:实现一个简单的交易策略

下面,我们将使用 QuantDigger 编写一个简单的均线策略,并回测其在 A 股市场的表现。

1. 策略逻辑

  • 当短期均线(5 日)上穿长期均线(20 日)时,买入。
  • 当短期均线下穿长期均线时,卖出。

2. 完整代码示例

from quantdigger import *
class DemoStrategy(Strategy):
    def on_init(self, ctx):
        ctx.short_ma = MA(ctx.close, 5, 'short_ma', plot=True)
        ctx.long_ma = MA(ctx.close, 20, 'long_ma', plot=True)
    def on_bar(self, ctx):
        if ctx.short_ma[0] > ctx.long_ma[0]:
            ctx.buy()
        elif ctx.short_ma[0] < ctx.long_ma[0]:
            ctx.sell()
set_symbols(['000001.SZ'], timeframe='D1')
add_strategy([DemoStrategy(name='均线策略')])
run()

3. 策略回测结果

执行上述代码后,QuantDigger 会自动绘制回测结果,包括买卖点标记、资金曲线、收益统计等,帮助交易者评估策略效果。


四、更多高级功能

1. 组合策略

QuantDigger 支持多个策略的组合回测,例如同时运行均线策略和动量策略。

add_strategy([DemoStrategy(name='均线策略'), MomentumStrategy(name='动量策略')])

2. 交易信号可视化

ctx.signal.plot()

3. 选股与套利策略

from quantdigger import (
   Strategy,
   MA,
   DateTimeSeries,
   NumberSeries,
   set_config,
   add_strategies,
   Profile
)
class DemoStrategy(Strategy):
   """ 策略A1 """
   def on_init(self, ctx):
      """初始化数据"""
      ctx.ma10 = MA(ctx.close, 10, 'ma10', 'y', 1)
      ctx.ma20 = MA(ctx.close, 20, 'ma20', 'b', 1)
      ctx.dt = DateTimeSeries()
      ctx.month_price = NumberSeries()
   def on_bar(self, ctx):
      ctx.dt.update(ctx.datetime)
      if ctx.dt[1].month != ctx.dt[0].month:
            ctx.month_price.update(ctx.close)
      if ctx.curbar > 20:
            if ctx.pos() == 0 and ctx.ma10[2] < ctx.ma20[2] and ctx.ma10[1] > ctx.ma20[1]:
               ctx.buy(ctx.close, 1)
               ctx.plot_text("buy", 1, ctx.curbar, ctx.close, "buy", 'black', 15)
            elif ctx.pos() > 0 and ctx.ma10[2] > ctx.ma20[2] and \
                  ctx.ma10[1] < ctx.ma20[1]:
               ctx.plot_text("sell", 1, ctx.curbar, ctx.close, "sell", 'blue', 15)
               ctx.sell(ctx.close, ctx.pos())
      ctx.plot_line("month_price", 1, ctx.curbar, ctx.month_price, 'y--', lw=2)
      return
   def on_exit(self, ctx):
      return
class DemoStrategy2(Strategy):
   """ 策略A2 """
   def on_init(self, ctx):
      """初始化数据"""
      ctx.ma50 = MA(ctx.close, 50, 'ma50', 'y', 2)
      ctx.ma100 = MA(ctx.close, 100, 'ma100', 'black', 2)
   def on_symbol(self, ctx):
      pass
   def on_bar(self, ctx):
      if ctx.curbar > 100:
            if ctx.pos() == 0 and ctx.ma50[2] < ctx.ma100[2] and ctx.ma50[1] > ctx.ma100[1]:
               ctx.buy(ctx.close, 1)
            elif ctx.pos() > 0 and ctx.ma50[2] > ctx.ma100[2] and \
                  ctx.ma50[1] < ctx.ma100[1]:
               ctx.sell(ctx.close, ctx.pos())
      return
   def on_exit(self, ctx):
      return
if __name__ == '__main__':
   import timeit
   start = timeit.default_timer()
   set_config({'source': 'csv'})
   profiles = add_strategies(['BB.SHFE-1.Day'], [
      {
            'strategy': DemoStrategy('A1'),
            'capital': 50000.0 * 0.5,
      },
      {
            'strategy': DemoStrategy2('A2'),
            'capital': 50000.0 * 0.5,
      }
   ])
   stop = timeit.default_timer()
   print("运行耗时: %d秒" % ((stop - start)))
   # 绘制k线,交易信号线
   from quantdigger.digger import finance, plotting
   s = 0
   # 绘制策略A1, 策略A2, 组合的资金曲线
   curve0 = finance.create_equity_curve(profiles[0].all_holdings())
   curve1 = finance.create_equity_curve(profiles[1].all_holdings())
   curve = finance.create_equity_curve(Profile.all_holdings_sum(profiles))
   plotting.plot_strategy(profiles[0].data(), profiles[0].technicals(),
                           profiles[0].deals(), curve0.equity.values,
                           profiles[0].marks())
   # 绘制净值曲线
   plotting.plot_curves([curve.networth])
   # 打印统计信息
   print(finance.summary_stats(curve, 252))
  • k线和信号线
    【开源神器】QuantDigger:Python量化回测框架,轻松实现股票期货策略
  • 2个策略和组合的资金曲线。
    【开源神器】QuantDigger:Python量化回测框架,轻松实现股票期货策略

五、总结

QuantDigger 作为一款专注于量化交易回测的开源框架,凭借其简洁语法、高效回测、多策略支持等特点,成为量化研究者不可多得的工具。无论你是初学者,还是希望在 Python 生态下进行回测的资深交易者,QuantDigger 都能助你一臂之力。

项目链接

  • GitHub:https://github.com/QuantFans/quantdigger
  • 文档:https://quantdigger.readthedocs.io
0 条回应

做什么都会有一个过程

  • Hot Post