VeighNa量化社区
你的开源社区量化交易平台 | vn.py | vnpy
Member
avatar
加入于:
帖子: 10
声望: 0

新手求教,如题!

Super Moderator
avatar
加入于:
帖子: 74
声望: 7

vn.py 中,默认的 CtaBacktester 模块只支持 1分钟 K 线回测。如果你需要在 N 分钟(如 5 分钟、15 分钟或自定义周期)上进行回测,可以通过 BarGenerator 在策略中合成 N 分钟 K 线。以下是详细的操作步骤:


1. 使用 BarGenerator 合成 N 分钟 K 线

在策略代码中,使用 BarGenerator 将 1 分钟 K 线合成为 N 分钟 K 线。例如:

from vnpy.trader.utility import BarGenerator
from vnpy.trader.constant import Interval

class MyStrategy(CtaTemplate):
    def __init__(self, cta_engine, strategy_name, vt_symbol, setting):
        super().__init__(cta_engine, strategy_name, vt_symbol, setting)

        # 创建 BarGenerator,合成 5 分钟 K 线
        self.bg = BarGenerator(self.on_bar, 5, self.on_5min_bar, Interval.MINUTE)

    def on_bar(self, bar: BarData):
        """1 分钟 K 线回调"""
        self.bg.update_bar(bar)

    def on_5min_bar(self, bar: BarData):
        """5 分钟 K 线回调"""
        # 在这里实现策略逻辑

参数说明:

  • self.on_bar:1 分钟 K 线的回调函数。
  • 5:合成的 K 线周期(5 分钟)。
  • self.on_5min_bar:合成后的 5 分钟 K 线回调函数。
  • Interval.MINUTE:K 线周期类型(分钟)。

2. 在回测中使用合成 K 线

  1. CtaBacktester 模块中,选择 1分钟 K 线周期进行回测。
  2. 在策略代码中,通过 BarGenerator 合成 N 分钟 K 线。
  3. on_Nmin_bar 回调函数中实现策略逻辑。

3. 自定义周期回测

如果需要合成自定义周期(如 10 分钟或 30 分钟),只需修改 BarGenerator 的参数即可。例如:

# 合成 10 分钟 K 线
self.bg = BarGenerator(self.on_bar, 10, self.on_10min_bar, Interval.MINUTE)

# 合成 30 分钟 K 线
self.bg = BarGenerator(self.on_bar, 30, self.on_30min_bar, Interval.MINUTE)

4. 注意事项

  • 数据加载:确保加载的 1 分钟 K 线数据足够长,以支持合成 N 分钟 K 线。
  • 策略逻辑:在 on_Nmin_bar 回调函数中实现策略逻辑,而不是在 on_bar 中。
  • 回测周期:在 CtaBacktester 中,始终选择 1分钟 K 线周期,因为合成 K 线是在策略中完成的。

5. 示例代码

以下是一个完整的策略示例,合成 5 分钟 K 线并进行回测:

from vnpy.trader.utility import BarGenerator
from vnpy.trader.constant import Interval
from vnpy.trader.object import BarData
from vnpy_ctastrategy import CtaTemplate

class MyStrategy(CtaTemplate):
    def __init__(self, cta_engine, strategy_name, vt_symbol, setting):
        super().__init__(cta_engine, strategy_name, vt_symbol, setting)

        # 创建 BarGenerator,合成 5 分钟 K 线
        self.bg = BarGenerator(self.on_bar, 5, self.on_5min_bar, Interval.MINUTE)

    def on_bar(self, bar: BarData):
        """1 分钟 K 线回调"""
        self.bg.update_bar(bar)

    def on_5min_bar(self, bar: BarData):
        """5 分钟 K 线回调"""
        # 在这里实现策略逻辑
        if not self.am.inited:
            return

        # 示例:计算均线并生成交易信号
        fast_ma = self.am.sma(10)
        slow_ma = self.am.sma(30)

        if fast_ma > slow_ma and self.pos == 0:
            self.buy(bar.close_price, 1)
        elif fast_ma < slow_ma and self.pos > 0:
            self.sell(bar.close_price, 1)

6. 总结

  • 默认的 CtaBacktester 只支持 1 分钟 K 线回测。
  • 通过 BarGenerator 可以在策略中合成 N 分钟 K 线。
  • on_Nmin_bar 回调函数中实现策略逻辑。

通过以上方法,你可以在 vn.py 中轻松实现 N 分钟 K 线回测。如果有其他问题,欢迎继续讨论!

Member
avatar
加入于:
帖子: 10
声望: 0

VeighNa_AI wrote:

vn.py 中,默认的 CtaBacktester 模块只支持 1分钟 K 线回测。如果你需要在 N 分钟(如 5 分钟、15 分钟或自定义周期)上进行回测,可以通过 BarGenerator 在策略中合成 N 分钟 K 线。以下是详细的操作步骤:


1. 使用 BarGenerator 合成 N 分钟 K 线

在策略代码中,使用 BarGenerator 将 1 分钟 K 线合成为 N 分钟 K 线。例如:

from vnpy.trader.utility import BarGenerator
from vnpy.trader.constant import Interval

class MyStrategy(CtaTemplate):
    def __init__(self, cta_engine, strategy_name, vt_symbol, setting):
        super().__init__(cta_engine, strategy_name, vt_symbol, setting)

        # 创建 BarGenerator,合成 5 分钟 K 线
        self.bg = BarGenerator(self.on_bar, 5, self.on_5min_bar, Interval.MINUTE)

    def on_bar(self, bar: BarData):
        """1 分钟 K 线回调"""
        self.bg.update_bar(bar)

    def on_5min_bar(self, bar: BarData):
        """5 分钟 K 线回调"""
        # 在这里实现策略逻辑

参数说明:

  • self.on_bar:1 分钟 K 线的回调函数。
  • 5:合成的 K 线周期(5 分钟)。
  • self.on_5min_bar:合成后的 5 分钟 K 线回调函数。
  • Interval.MINUTE:K 线周期类型(分钟)。

2. 在回测中使用合成 K 线

  1. CtaBacktester 模块中,选择 1分钟 K 线周期进行回测。
  2. 在策略代码中,通过 BarGenerator 合成 N 分钟 K 线。
  3. on_Nmin_bar 回调函数中实现策略逻辑。

3. 自定义周期回测

如果需要合成自定义周期(如 10 分钟或 30 分钟),只需修改 BarGenerator 的参数即可。例如:

# 合成 10 分钟 K 线
self.bg = BarGenerator(self.on_bar, 10, self.on_10min_bar, Interval.MINUTE)

# 合成 30 分钟 K 线
self.bg = BarGenerator(self.on_bar, 30, self.on_30min_bar, Interval.MINUTE)

4. 注意事项

  • 数据加载:确保加载的 1 分钟 K 线数据足够长,以支持合成 N 分钟 K 线。
  • 策略逻辑:在 on_Nmin_bar 回调函数中实现策略逻辑,而不是在 on_bar 中。
  • 回测周期:在 CtaBacktester 中,始终选择 1分钟 K 线周期,因为合成 K 线是在策略中完成的。

5. 示例代码

以下是一个完整的策略示例,合成 5 分钟 K 线并进行回测:

from vnpy.trader.utility import BarGenerator
from vnpy.trader.constant import Interval
from vnpy.trader.object import BarData
from vnpy_ctastrategy import CtaTemplate

class MyStrategy(CtaTemplate):
    def __init__(self, cta_engine, strategy_name, vt_symbol, setting):
        super().__init__(cta_engine, strategy_name, vt_symbol, setting)

        # 创建 BarGenerator,合成 5 分钟 K 线
        self.bg = BarGenerator(self.on_bar, 5, self.on_5min_bar, Interval.MINUTE)

    def on_bar(self, bar: BarData):
        """1 分钟 K 线回调"""
        self.bg.update_bar(bar)

    def on_5min_bar(self, bar: BarData):
        """5 分钟 K 线回调"""
        # 在这里实现策略逻辑
        if not self.am.inited:
            return

        # 示例:计算均线并生成交易信号
        fast_ma = self.am.sma(10)
        slow_ma = self.am.sma(30)

        if fast_ma > slow_ma and self.pos == 0:
            self.buy(bar.close_price, 1)
        elif fast_ma < slow_ma and self.pos > 0:
            self.sell(bar.close_price, 1)

6. 总结

  • 默认的 CtaBacktester 只支持 1 分钟 K 线回测。
  • 通过 BarGenerator 可以在策略中合成 N 分钟 K 线。
  • on_Nmin_bar 回调函数中实现策略逻辑。

通过以上方法,你可以在 vn.py 中轻松实现 N 分钟 K 线回测。如果有其他问题,欢迎继续讨论!

Member
avatar
加入于:
帖子: 10
声望: 0

VeighNa_AI wrote:

vn.py 中,默认的 CtaBacktester 模块只支持 1分钟 K 线回测。如果你需要在 N 分钟(如 5 分钟、15 分钟或自定义周期)上进行回测,可以通过 BarGenerator 在策略中合成 N 分钟 K 线。以下是详细的操作步骤:


1. 使用 BarGenerator 合成 N 分钟 K 线

在策略代码中,使用 BarGenerator 将 1 分钟 K 线合成为 N 分钟 K 线。例如:

from vnpy.trader.utility import BarGenerator
from vnpy.trader.constant import Interval

class MyStrategy(CtaTemplate):
    def __init__(self, cta_engine, strategy_name, vt_symbol, setting):
        super().__init__(cta_engine, strategy_name, vt_symbol, setting)

        # 创建 BarGenerator,合成 5 分钟 K 线
        self.bg = BarGenerator(self.on_bar, 5, self.on_5min_bar, Interval.MINUTE)

    def on_bar(self, bar: BarData):
        """1 分钟 K 线回调"""
        self.bg.update_bar(bar)

    def on_5min_bar(self, bar: BarData):
        """5 分钟 K 线回调"""
        # 在这里实现策略逻辑

参数说明:

  • self.on_bar:1 分钟 K 线的回调函数。
  • 5:合成的 K 线周期(5 分钟)。
  • self.on_5min_bar:合成后的 5 分钟 K 线回调函数。
  • Interval.MINUTE:K 线周期类型(分钟)。

2. 在回测中使用合成 K 线

  1. CtaBacktester 模块中,选择 1分钟 K 线周期进行回测。
  2. 在策略代码中,通过 BarGenerator 合成 N 分钟 K 线。
  3. on_Nmin_bar 回调函数中实现策略逻辑。

3. 自定义周期回测

如果需要合成自定义周期(如 10 分钟或 30 分钟),只需修改 BarGenerator 的参数即可。例如:

# 合成 10 分钟 K 线
self.bg = BarGenerator(self.on_bar, 10, self.on_10min_bar, Interval.MINUTE)

# 合成 30 分钟 K 线
self.bg = BarGenerator(self.on_bar, 30, self.on_30min_bar, Interval.MINUTE)

4. 注意事项

  • 数据加载:确保加载的 1 分钟 K 线数据足够长,以支持合成 N 分钟 K 线。
  • 策略逻辑:在 on_Nmin_bar 回调函数中实现策略逻辑,而不是在 on_bar 中。
  • 回测周期:在 CtaBacktester 中,始终选择 1分钟 K 线周期,因为合成 K 线是在策略中完成的。

5. 示例代码

以下是一个完整的策略示例,合成 5 分钟 K 线并进行回测:

from vnpy.trader.utility import BarGenerator
from vnpy.trader.constant import Interval
from vnpy.trader.object import BarData
from vnpy_ctastrategy import CtaTemplate

class MyStrategy(CtaTemplate):
    def __init__(self, cta_engine, strategy_name, vt_symbol, setting):
        super().__init__(cta_engine, strategy_name, vt_symbol, setting)

        # 创建 BarGenerator,合成 5 分钟 K 线
        self.bg = BarGenerator(self.on_bar, 5, self.on_5min_bar, Interval.MINUTE)

    def on_bar(self, bar: BarData):
        """1 分钟 K 线回调"""
        self.bg.update_bar(bar)

    def on_5min_bar(self, bar: BarData):
        """5 分钟 K 线回调"""
        # 在这里实现策略逻辑
        if not self.am.inited:
            return

        # 示例:计算均线并生成交易信号
        fast_ma = self.am.sma(10)
        slow_ma = self.am.sma(30)

        if fast_ma > slow_ma and self.pos == 0:
            self.buy(bar.close_price, 1)
        elif fast_ma < slow_ma and self.pos > 0:
            self.sell(bar.close_price, 1)

6. 总结

  • 默认的 CtaBacktester 只支持 1 分钟 K 线回测。
  • 通过 BarGenerator 可以在策略中合成 N 分钟 K 线。
  • on_Nmin_bar 回调函数中实现策略逻辑。

通过以上方法,你可以在 vn.py 中轻松实现 N 分钟 K 线回测。如果有其他问题,欢迎继续讨论!

Member
avatar
加入于:
帖子: 10
声望: 0

非常感谢大佬的不惜指教!
接上面的话题

假如我的交易逻辑在5分钟K线上实现,那么我的回测是在5分钟k线上完成的吧?

那么,我希望交易逻辑在5分钟K线上实现,能否用1分钟、甚至TICK数据来回测呢?因为这样可以防止信号消失的问题 。

怎么简单实现“”交易逻辑在5分钟K线上实现,能否用1分钟、甚至TICK数据来回测呢“??”

Member
avatar
加入于:
帖子: 5399
声望: 327

一分钟你就参考上面的,tick就把load_bar换成load_tick就好

© 2015-2022 上海韦纳软件科技有限公司
备案服务号:沪ICP备18006526号

沪公网安备 31011502017034号

【用户协议】
【隐私政策】
【免责条款】