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

我用社区版跑了回测,数据是用AI下载导入的,但是跑模拟的话用不了这些数据,然后开了几天都没有一个交易,不知道是不是数据的问题还是什么问题,但很大几率是数据问题,想问下各位大佬,你们跑模拟的时候有没有这个问题?

Super Moderator
avatar
加入于:
帖子: 120
声望: 13

我来帮你分析一下这个问题。回测数据和模拟交易(实盘模拟)使用的数据机制确实不同,让我先查询一下相关文档。

根据文档资料,我来帮你分析这个问题。这是一个很常见的误区,回测数据和模拟交易使用的数据机制确实不同


问题原因分析

1. 回测 vs 模拟交易的数据区别

场景 数据来源 触发方式
回测 DataManager 导入的历史数据 程序逐根回放历史 K 线
模拟交易 需要实时行情推送 收到实时 Tick/Bar 触发 on_tick/on_bar

关键点:你导入的历史数据只能用于回测和策略初始化计算指标,模拟交易必须有实时行情推送才能触发交易逻辑

2. 模拟交易没有成交的常见原因

根据官方文档,模拟交易(Paper Account)没有交易通常是因为:

(1)没有订阅行情

"在对某一合约进行下单和撤单操作前,用户必须先订阅该合约的行情" —— paper_account.md

(2)策略初始化问题

"如果策略内用到了 K 线时间序列管理模块(ArrayManager)来计算变量指标的值,那么请确保历史数据的长度足够 ArrayManager 进行初始化(默认的 ArrayManager 需要 100 条数据才能初始化成功)" —— cta_strategy.md

如果 ArrayManager 没有初始化成功,策略逻辑会在 if not am.inited 处直接返回,不会走到发单逻辑。

(3)没有配置数据服务
模拟交易时策略初始化需要调用 load_bar 加载历史数据:

"如果接口不提供历史数据,则通过配置的数据服务获取...如果没有配置数据服务,则通过访问本地数据库查询" —— cta_strategy.md


解决方案

方案一:使用 DataRecorder 录制实时行情(推荐)

如果你要做模拟交易,需要先有实时行情数据源。社区版可以使用 DataRecorder 模块录制行情:

  1. 连接交易接口(如 CTP 模拟盘)
  2. 使用 DataRecorder 订阅并录制 Tick/K 线数据到数据库
  3. 启动策略时会自动从数据库加载历史数据完成初始化
  4. 同时接收实时行情推送触发交易

方案二:检查策略初始化状态

在 CtaStrategy 界面观察:

  • inited 是否为 True —— 确认初始化完成
  • 策略变量是否显示具体数值(而非 0)—— 确认 ArrayManager 已初始化
  • 日志是否有 "行情订阅失败,找不到合约" —— 确认合约代码正确

方案三:确认合约订阅

在 VeighNa Trader 主界面:

  1. 点击【帮助】->【查询合约】,确认合约存在
  2. 检查策略的 vt_symbol 是否与查询结果一致(注意大小写、交易所后缀)
  3. 确认已连接行情接口并订阅成功

总结

你的问题大概率不是数据导入的问题,而是:

  1. 模拟交易需要实时行情推送,单纯导入的历史数据不会触发交易
  2. 需要确保策略初始化时 ArrayManager 有足够的历史数据(100 条)
  3. 需要正确订阅合约行情

建议先用 DataRecorder 录制几天数据,或者连接 CTP 模拟盘获取实时行情,再进行模拟交易测试。


参考文档

  • cta_strategy.md - CTA 策略初始化说明
  • paper_account.md - 模拟交易模块说明
  • data_recorder.md - 实盘行情记录模块说明
© 2015-2022 上海韦纳软件科技有限公司
备案服务号:沪ICP备18006526号

沪公网安备 31011502017034号

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