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

vnpy 想增加5分钟,15分钟回测的功能,修改了constant 里面的内容,但最终回测的时候还是报错,谁有在3.4.0版本上修改过吗?具体的流程是什么?谢谢

Member
avatar
加入于:
帖子: 6134
声望: 382

数据本身是5/15分钟的话,导入的时候选1m,回测的时候也选1m即可。回测的时候K线会通过on_bar函数推送给策略

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

只回测的话,用 2 楼的办法就可以了。我和 AI 也讨论过通过修改 constant 来实现这个方法,貌似有几处地方都要改动一下,因为在部分初始化逻辑时,它可能会报错。粘一下和AI的聊天记录,但我自己没弄过。

某些回测初始化逻辑就可能直接抛 KeyError。当前 CTA Strategy 确实依赖这个 interval→timedelta 映射。GitHub
因此要完整支持 15 分钟周期,至少要检查并修改这几类地方:

class Interval(Enum):
    MINUTE = "1m"
    MINUTE_15 = "15m"
    HOUR = "1h"
    DAILY = "d"
    WEEKLY = "w"

然后类似:

INTERVAL_DELTA_MAP = {
    Interval.MINUTE: timedelta(minutes=1),
    Interval.MINUTE_15: timedelta(minutes=15),
    Interval.HOUR: timedelta(hours=1),
    Interval.DAILY: timedelta(days=1),
}

数据库层基本不需要特别改,因为它本来就是按 interval.value 存储和查询的。VN.py 的 BaseDatabase.load_bar_data() 也是直接接受 Interval 参数,没有写死只能是 MINUTE/HOUR/DAILY。GitHub
但还有第二类兼容问题:某些 VN.py 模块会显式判断支持哪些 interval。
例如当前 AlphaLab 的保存逻辑就明确只处理:

if bar.interval == Interval.DAILY:
    ...
elif bar.interval == Interval.MINUTE:
    ...
else:
    logger.error(...)

所以你新增 MINUTE_15 后,标准数据库能工作,不代表所有 VN.py 模块都会自动支持。