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

engine.load_data()
engine.run_backtesting()
df = engine.calculate_result()
engine.calculate_statistics()
engine.show_chart()
2025-03-22 22:39:47.947073 开始加载历史数据
2025-03-22 22:39:47.948187 加载进度:# [0%]
2025-03-22 22:39:48.054323 加载进度:## [10%]
2025-03-22 22:39:48.055324 加载进度:### [20%]
2025-03-22 22:39:48.056802 加载进度:#### [30%]
2025-03-22 22:39:48.057805 加载进度:##### [40%]
2025-03-22 22:39:48.058803 加载进度:###### [50%]
2025-03-22 22:39:48.060801 加载进度:####### [60%]
2025-03-22 22:39:48.061800 加载进度:######## [70%]
2025-03-22 22:39:48.062810 加载进度:######### [80%]
2025-03-22 22:39:48.062810 加载进度:########## [90%]
2025-03-22 22:39:48.064289 加载进度:########## [100%]
2025-03-22 22:39:48.065302 历史数据加载完成,数据量:0
2025-03-22 22:39:48.066298 策略初始化完成
2025-03-22 22:39:48.066298 开始回放历史数据
2025-03-22 22:39:48.066298 历史数据回放结束
2025-03-22 22:39:48.066298 开始计算逐日盯市盈亏
2025-03-22 22:39:48.066298 回测成交记录为空

加载的数据是空的,也报错了,但mysql里有数据,请问是什么原因?

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

从日志来看,engine.load_data() 加载历史数据时显示加载进度为 100%,但最终加载的数据量为 0,并且回测成交记录为空。这表明虽然 MySQL 数据库中有数据,但 VeighNa 未能正确加载这些数据。可能的原因和解决方法如下:


1. 数据库配置问题

  • 原因:VeighNa 的数据库配置可能不正确,导致无法从 MySQL 中读取数据。
  • 解决方法
    1. 检查 database.json 文件中的数据库配置,确保以下字段正确:
      {
          "database": "mysql",
          "host": "localhost",
          "port": 3306,
          "user": "root",
          "password": "your_password",
          "database_name": "vnpy"
      }
      
    2. 确保 MySQL 服务已启动,并且数据库 vnpy 中存在正确的表(如 dbbardata)。
    3. 使用 MySQL 客户端(如 MySQL Workbench)手动查询数据库,确认数据是否存在。

2. 数据表结构不匹配

  • 原因:MySQL 中的数据表结构可能与 VeighNa 的默认表结构不匹配,导致无法正确读取数据。
  • 解决方法
    1. 检查 dbbardata 表的结构,确保字段与 VeighNa 的默认表结构一致:
      CREATE TABLE `dbbardata` (
        `id` int(11) NOT NULL AUTO_INCREMENT,
        `symbol` varchar(32) NOT NULL,
        `exchange` varchar(32) NOT NULL,
        `datetime` datetime NOT NULL,
        `interval` varchar(16) NOT NULL,
        `volume` float NOT NULL,
        `open_interest` float NOT NULL,
        `open_price` float NOT NULL,
        `high_price` float NOT NULL,
        `low_price` float NOT NULL,
        `close_price` float NOT NULL,
        PRIMARY KEY (`id`),
        UNIQUE KEY `symbol` (`symbol`,`exchange`,`datetime`,`interval`)
      ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
      
    2. 如果表结构不一致,可以手动调整表结构,或者重新导入数据。

3. 数据查询条件不匹配

  • 原因engine.load_data() 加载数据时,可能由于合约代码(vt_symbol)或时间范围设置不正确,导致查询结果为空。
  • 解决方法
    1. 检查 engine.set_parameters() 中的参数设置,确保 vt_symbolinterval 正确:
      engine.set_parameters(
          vt_symbol="IF888.CFFEX",  # 确保合约代码和交易所正确
          interval="1m",            # 确保K线周期正确
          start=datetime(2020, 1, 1),
          end=datetime(2020, 12, 31)
      )
      
    2. 使用 MySQL 客户端手动查询数据,确认是否存在符合条件的数据:
      SELECT * FROM dbbardata
      WHERE symbol = 'IF888' AND exchange = 'CFFEX' AND interval = '1m'
      AND datetime BETWEEN '2020-01-01' AND '2020-12-31';
      

4. 数据导入问题

  • 原因:如果数据是通过手动导入的方式添加到 MySQL 中的,可能存在数据格式或字段值不正确的问题。
  • 解决方法
    1. 检查导入的 CSV 文件,确保字段名称和数据类型与 VeighNa 的默认表结构一致。
    2. 使用 VeighNa 的 DataManager 模块重新导入数据,确保数据格式正确。

5. 日志调试

  • 原因:日志中没有详细的错误信息,难以定位问题。
  • 解决方法
    1. engine.load_data() 前后添加调试日志,打印查询条件和返回结果:
      print(f"查询条件: vt_symbol={vt_symbol}, interval={interval}, start={start}, end={end}")
      engine.load_data()
      print(f"加载数据量: {len(engine.history_data)}")
      
    2. 如果仍然无法解决问题,可以尝试在 VeighNa 的 GitHub 仓库中提交 Issue,附上详细的日志和配置信息。

6. 数据库权限问题

  • 原因:MySQL 用户可能没有足够的权限访问数据库或表。
  • 解决方法
    1. 检查 MySQL 用户的权限,确保其对 vnpy 数据库有 SELECT 权限:
      SHOW GRANTS FOR 'root'@'localhost';
      
    2. 如果权限不足,可以授予用户相应的权限:
      GRANT SELECT ON vnpy.* TO 'root'@'localhost';
      FLUSH PRIVILEGES;
      

通过以上步骤,你应该能够定位并解决数据加载为空的问题。如果问题仍然存在,可以提供更多详细信息(如数据库配置、查询条件、表结构等),以便进一步分析。

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

沪公网安备 31011502017034号

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