外汇期货数据源

📎 引用文件

本文引用的文件 - mt5_loader.py - stooq_loader.py - tiingo_loader.py - base.py - _http.py - forex.py - futures_base.py - global_futures.py - china_futures.py - README_zh.md

目录

  1. 简介
  2. 项目结构
  3. 核心组件
  4. 架构总览
  5. 详细组件分析
  6. 依赖关系分析
  7. 性能与高吞吐优化
  8. 故障排查指南
  9. 结论
  10. 附录

简介

本文件面向 Vibe-Trading 的外汇与期货市场数据源,聚焦 MetaTrader 5(MT5)、Stooq、Tiingo 三类数据源的集成实现,并覆盖外汇货币对与期货合约的数据结构、报价惯例与合约规格;阐述外汇市场的点差、隔夜利息与杠杆交易支持;说明期货合约生命周期管理(到期、换月、保证金);给出数据质量验证方法(异常值检测、完整性检查);并提供高频数据处理优化与实时行情订阅的实现思路。

项目结构

围绕“数据加载器 + 回测引擎”的分层设计: - 数据加载器层:按市场/来源提供 OHLCV 历史数据,统一输出 trade_date 索引的 DataFrame(open/high/low/close/volume)。 - 公共基础能力:日期校验、OHLC 合法性校验、本地缓存、HTTP 限流与重试预算等。 - 回测引擎层:针对外汇(ForexEngine)与期货(ChinaFuturesEngine、GlobalFuturesEngine)实现各自的市场规则、滑点、佣金、合约乘数与保证金计算。

graph TB subgraph "数据加载器" MT5["MT5 加载器"] Stooq["Stooq 加载器"] Tiingo["Tiingo 加载器"] Base["公共基础(base.py)"] HTTP["HTTP 限流(_http.py)"] end subgraph "回测引擎" Forex["外汇引擎(ForexEngine)"] ChinaFut["中国期货引擎(ChinaFuturesEngine)"] GlobalFut["全球期货引擎(GlobalFuturesEngine)"] FutBase["期货基类(FuturesBaseEngine)"] end MT5 --> Forex Stooq --> GlobalFut Tiingo --> GlobalFut Base --> MT5 Base --> Stooq Base --> Tiingo HTTP --> Stooq HTTP --> Tiingo FutBase --> ChinaFut FutBase --> GlobalFut

图表来源 - mt5_loader.py:170-251 - stooq_loader.py:74-163 - tiingo_loader.py:133-246 - base.py:31-119 - _http.py:120-180 - forex.py:56-137 - futures_base.py:19-57 - global_futures.py:130-223 - china_futures.py:131-255

章节来源 - README_zh.md:338-359

核心组件

章节来源 - mt5_loader.py:170-251 - stooq_loader.py:74-163 - tiingo_loader.py:133-246 - base.py:31-119 - forex.py:56-137 - futures_base.py:19-57 - global_futures.py:130-223 - china_futures.py:131-255

架构总览

数据流从“加载器”产出标准化的 OHLCV 帧,进入“回测引擎”进行策略模拟。外汇与期货在引擎层分别实现点差/隔夜利息与合约乘数/保证金等差异。

sequenceDiagram participant Caller as "调用方" participant Loader as "数据加载器" participant Cache as "本地缓存" participant Engine as "回测引擎" Caller->>Loader : fetch(codes, start, end, interval) Loader->>Cache : 查询缓存键 alt 命中缓存 Cache-->>Loader : DataFrame else 未命中 Loader->>Loader : 校验日期/OHLC Loader->>Loader : 访问外部源(HTTP/SDK) Loader-->>Caller : {symbol : DataFrame} end Caller->>Engine : on_bar(symbol, bar, timestamp) Engine-->>Caller : 信号/成交/资金更新

图表来源 - base.py:306-439 - mt5_loader.py:186-251 - stooq_loader.py:89-163 - tiingo_loader.py:149-246 - forex.py:124-137

详细组件分析

MT5 外汇数据加载器

flowchart TD Start(["开始"]) --> Avail{"是否可用?"} Avail -- 否 --> End(["结束"]) Avail -- 是 --> Loop["遍历代码列表"] Loop --> Resolve["解析券商符号"] Resolve --> SelectTF["选择时间框架"] SelectTF --> Fetch["获取K线(copy_rates_range)"] Fetch --> Frame["构造DataFrame并校验"] Frame --> Result{"是否有数据?"} Result -- 否 --> Next["下一个代码"] Result -- 是 --> Out["加入结果集"] Out --> Next Next --> |完成| End

图表来源 - mt5_loader.py:79-147 - mt5_loader.py:186-251

章节来源 - mt5_loader.py:1-251

Stooq 美股日频数据加载器

sequenceDiagram participant L as "Stooq加载器" participant H as "HTTP限流" participant S as "Stooq服务器" L->>H : GET /q/d/l/?s=aapl.us&d1=...&d2=...&i=d H->>S : 发送请求(带UA/限流) S-->>H : 返回CSV或N/D H-->>L : Response L->>L : 解析CSV/校验/去重/排序 L-->>调用方 : {symbol : DataFrame}

图表来源 - stooq_loader.py:57-72 - stooq_loader.py:89-163 - _http.py:120-180

章节来源 - stooq_loader.py:1-199 - _http.py:1-180

Tiingo 美股日频数据加载器

sequenceDiagram participant L as "Tiingo加载器" participant H as "HTTP限流" participant T as "Tiingo API" L->>L : 解析符号/校验key L->>H : GET /daily/{ticker}/prices?startDate=...&endDate=...&token=... H->>T : 发送请求 T-->>H : JSON数组 H-->>L : 响应 L->>L : 解析/类型转换/排序 L-->>调用方 : {symbol : DataFrame}

图表来源 - tiingo_loader.py:46-80 - tiingo_loader.py:149-246 - _http.py:155-180

章节来源 - tiingo_loader.py:1-246

数据质量验证与完整性检查

flowchart TD In["输入DataFrame"] --> CheckDate["日期范围校验"] CheckDate --> ValidDate{"合法?"} ValidDate -- 否 --> Err["抛出错误"] ValidDate -- 是 --> OHLC["OHLC结构校验"] OHLC --> Clean{"有效?"} Clean -- 否 --> Drop["丢弃非法行/告警"] Clean -- 是 --> Cache["可选写入缓存"] Drop --> Cache Cache --> Out["输出DataFrame"]

图表来源 - base.py:31-119 - base.py:343-439

章节来源 - base.py:31-119 - base.py:343-439

外汇市场特殊处理:点差、隔夜利息与杠杆

classDiagram class ForexEngine { +spread_override +lot_size +swap_enabled +slippage_pips +apply_slippage_for_symbol(symbol, price, direction) +on_bar(symbol, bar, timestamp) +get_contract_multiplier(symbol) }

图表来源 - forex.py:56-137

章节来源 - forex.py:1-137

期货合约生命周期管理:到期、换月与保证金

classDiagram class FuturesBaseEngine { +get_contract_multiplier(symbol) +_calc_pnl(symbol, direction, size, entry, exit) +_calc_margin(symbol, size, price, leverage) +_calc_raw_size(symbol, notional, price) } class GlobalFuturesEngine { +can_execute(symbol, direction, bar) +round_size(raw, price) +calc_commission(size, price, direction, is_open) +apply_slippage(price, direction) } class ChinaFuturesEngine { +can_execute(symbol, direction, bar) +round_size(raw, price) +calc_commission_for_symbol(symbol, size, price, is_open) +get_margin_rate(symbol) } FuturesBaseEngine <|-- GlobalFuturesEngine FuturesBaseEngine <|-- ChinaFuturesEngine

图表来源 - futures_base.py:19-57 - global_futures.py:130-223 - china_futures.py:131-255

章节来源 - futures_base.py:1-57 - global_futures.py:1-223 - china_futures.py:1-255

数据结构与报价惯例

章节来源 - mt5_loader.py:150-167 - stooq_loader.py:41-49 - tiingo_loader.py:82-130 - forex.py:23-54 - global_futures.py:23-48 - china_futures.py:23-48

依赖关系分析

graph LR MT5["MT5加载器"] --> FX["外汇引擎"] STOOQ["Stooq加载器"] --> GF["全球期货引擎"] TIINGO["Tiingo加载器"] --> GF BASE["公共基础"] --> MT5 BASE --> STOOQ BASE --> TIINGO HTTP["HTTP限流"] --> STOOQ HTTP --> TIINGO FBASE["期货基类"] --> GF FBASE --> CF["中国期货引擎"]

图表来源 - mt5_loader.py:170-251 - stooq_loader.py:74-163 - tiingo_loader.py:133-246 - base.py:31-119 - _http.py:120-180 - forex.py:56-137 - futures_base.py:19-57 - global_futures.py:130-223 - china_futures.py:131-255

章节来源 - base.py:31-119 - _http.py:1-180

性能与高吞吐优化

章节来源 - base.py:243-439 - _http.py:46-118 - mt5_loader.py:15-18 - stooq_loader.py:38-55 - tiingo_loader.py:31-40

故障排查指南

章节来源 - mt5_loader.py:79-147 - stooq_loader.py:117-163 - tiingo_loader.py:149-246 - base.py:31-119

结论

Vibe-Trading 在外汇与期货数据源上提供了稳健的加载器与引擎组合:MT5 提供本地终端的高保真外汇/贵金属历史;Stooq/Tiingo 覆盖美股日频;公共基础保障数据质量与性能;外汇与期货引擎分别实现点差/隔夜利息与合约乘数/保证金等市场特性。通过本地缓存、HTTP 限流与重试预算,系统在稳定性与吞吐方面具备良好表现。对于高频与实时需求,建议在数据层分片拉取并结合缓存,同时通过连接器接入实时行情。

附录

章节来源 - README_zh.md:338-359