国际区域市场数据源

📎 引用文件

本文引用的文件 - stooq_loader.py - yahoo_loader.py - pykrx_loader.py - india_broker_loader.py - base.py - global_equity.py - forex.py

目录

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

简介

本文件面向 Vibe-Trading 的国际区域市场数据源,重点说明 Stooq、Yahoo Finance、KRX(韩国交易所)以及印度券商历史数据桥接的集成实现与多市场支持。文档覆盖不同国家/地区市场的特殊处理:时区与交易日历对齐、货币与汇率相关成本建模、交易规则差异(涨跌停、最小变动价位、手数/碎股)、数据格式标准化与本地化适配;并给出多市场投资组合构建、跨区域资产配置方法、汇率风险管理、跨境交易成本计算与税务考量、数据质量验证、异常值检测与缺失数据填充策略,以及国际化部署最佳实践与性能优化建议。

项目结构

围绕“数据加载器 + 回测引擎”的分层设计: - 数据加载器:按市场/来源提供统一的 OHLCV 接口,负责协议适配、字段映射、时间索引规范化、限流与缓存。 - 回测引擎:封装各市场交易规则(佣金、滑点、手数/碎股、价格最小变动单位、隔夜利息等),在统一执行循环中运行策略。

graph TB subgraph "数据加载器" S["Stooq 加载器"] Y["Yahoo 加载器"] K["KRX(pykrx) 加载器"] I["印度券商历史桥接"] B["加载器基类/缓存/校验"] end subgraph "回测引擎" GE["全球股票引擎(US/HK/CA)"] FX["外汇引擎(Forex)"] end S --> GE Y --> GE K --> GE I --> GE S --> FX Y --> FX B --> S B --> Y B --> K B --> I

图表来源 - stooq_loader.py:74-162 - yahoo_loader.py:173-270 - pykrx_loader.py:76-164 - india_broker_loader.py:118-194 - base.py:240-439 - global_equity.py:33-124 - forex.py:56-137

章节来源 - stooq_loader.py:1-199 - yahoo_loader.py:1-271 - pykrx_loader.py:1-194 - india_broker_loader.py:1-195 - base.py:1-645 - global_equity.py:1-124 - forex.py:1-137

核心组件

章节来源 - base.py:27-119 - base.py:240-439 - stooq_loader.py:74-162 - yahoo_loader.py:173-270 - pykrx_loader.py:76-164 - india_broker_loader.py:118-194 - global_equity.py:33-124 - forex.py:56-137

架构总览

下图展示从加载器到引擎的数据流与规则应用路径。

sequenceDiagram participant U as "调用方" participant L as "加载器(DataLoader)" participant C as "缓存(base.py)" participant E as "回测引擎(BaseEngine)" U->>L : fetch(codes, start, end, interval) L->>C : 读取缓存(若启用且范围已结算) alt 命中缓存 C-->>L : DataFrame else 未命中 L->>L : 请求外部源(Stooq/Yahoo/pykrx/券商) L->>L : 字段映射/时间索引标准化 L->>C : 写入缓存(可选) end L-->>U : {symbol : DataFrame} U->>E : 传入对齐后的OHLCV E->>E : 应用市场规则(佣金/滑点/手数/最小变动价位/隔夜利息) E-->>U : 回测结果/指标

图表来源 - base.py:401-439 - stooq_loader.py:89-162 - yahoo_loader.py:191-270 - pykrx_loader.py:92-164 - india_broker_loader.py:134-194 - global_equity.py:65-124 - forex.py:76-137

详细组件分析

Stooq 加载器(美国股票 EOD)

flowchart TD Start(["进入 fetch"]) --> CheckInterval["检查周期是否为日频"] CheckInterval --> |否| ReturnEmpty["返回空映射(触发回退)"] CheckInterval --> |是| LoopCodes["遍历代码列表"] LoopCodes --> TryFetch["调用 _fetch_one + 缓存"] TryFetch --> ParseCSV["解析CSV并标准化列/索引"] ParseCSV --> Valid{"是否有可用行?"} Valid --> |否| NextCode["跳过该代码"] Valid --> |是| AddResult["加入结果映射"] AddResult --> NextCode NextCode --> End(["返回结果"])

图表来源 - stooq_loader.py:89-162 - stooq_loader.py:165-199

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

Yahoo 加载器(全球股票/期货/外汇)

sequenceDiagram participant L as "Yahoo 加载器" participant H as "HTTP客户端" L->>L : 校验符号/区间映射 L->>H : get_chart(code, interval, period1, period2) H-->>L : rows[{trade_date(epoch), OHLCV}] L->>L : 转DatetimeIndex(日内保留真实时间; 日频归一到午夜) L->>L : 裁剪[start,end]并标准化列 L-->>L : 返回DataFrame或None

图表来源 - yahoo_loader.py:44-73 - yahoo_loader.py:125-170 - yahoo_loader.py:191-270

章节来源 - yahoo_loader.py:1-271

KRX 加载器(韩国 KOSPI/KOSDAQ)

flowchart TD A["进入 fetch"] --> B["校验区间=日频?"] B --> |否| R["返回空(触发回退)"] B --> |是| T["HostThrottle.wait()"] T --> Q["stock.get_market_ohlcv_by_date(...)"] Q --> N["列名映射+索引/类型标准化"] N --> O{"有可用行?"} O --> |否| R O --> |是| S["返回DataFrame"]

图表来源 - pykrx_loader.py:76-164 - pykrx_loader.py:167-194

章节来源 - pykrx_loader.py:1-194

印度券商历史桥接(Shoonya/Dhan)

sequenceDiagram participant L as "印度桥接加载器" participant SDK as "券商SDK" L->>SDK : get_historical_bars(symbol, exchange?, period, limit) SDK-->>L : envelope{status,bars} L->>L : 时间戳解析/归一化 L->>L : 裁剪[start,end]并标准化列 L-->>L : 返回DataFrame或None

图表来源 - india_broker_loader.py:50-86 - india_broker_loader.py:89-115 - india_broker_loader.py:134-194

章节来源 - india_broker_loader.py:1-195

加载器基类与数据质量

flowchart TD In["输入DataFrame"] --> CheckCols{"包含OHLC列?"} CheckCols --> |否| Out["原样返回"] CheckCols --> |是| Inv["检测结构/非正价格违规"] Inv --> Mode{"策略: drop/warn/raise"} Mode --> |drop| Drop["移除违规行"] Mode --> |warn| Keep["记录日志并保留"] Mode --> |raise| Err["抛出异常"] Drop --> Out2["返回清洗后DataFrame"] Keep --> Out2 Err --> Out2

图表来源 - base.py:50-119

章节来源 - base.py:1-645

全球股票引擎(US/HK/CA)

classDiagram class GlobalEquityEngine { +market : string +slippage_us : float +slippage_hk : float +hk_stamp_tax : float +hk_commission : float +hk_levy : float +hk_settlement : float +slippage_ca : float +ca_commission : float +can_execute(symbol, direction, bar) bool +round_size(raw_size, price) float +calc_commission(size, price, direction, is_open) float +apply_slippage(price, direction) float }

图表来源 - global_equity.py:33-124

章节来源 - global_equity.py:1-124

外汇引擎(Forex)

sequenceDiagram participant E as "ForexEngine" participant P as "对子/点差表" E->>P : 查询spread_pips(pair) P-->>E : pips E->>E : 计算total_pips = spread/2 + slippage_pips E->>E : 换算为价格偏移(direction * total_pips * pip) E-->>E : 返回调整后价格 Note over E : 每日收盘调用on_bar计算swap并更新资金

图表来源 - forex.py:23-37 - forex.py:98-132

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

依赖关系分析

graph LR Base["base.py(缓存/校验)"] --> S["stooq_loader.py"] Base --> Y["yahoo_loader.py"] Base --> K["pykrx_loader.py"] Base --> I["india_broker_loader.py"] S --> GE["global_equity.py"] Y --> GE K --> GE I --> GE S --> FX["forex.py"] Y --> FX

图表来源 - base.py:240-439 - stooq_loader.py:74-162 - yahoo_loader.py:173-270 - pykrx_loader.py:76-164 - india_broker_loader.py:118-194 - global_equity.py:33-124 - forex.py:56-137

章节来源 - base.py:1-645 - stooq_loader.py:1-199 - yahoo_loader.py:1-271 - pykrx_loader.py:1-194 - india_broker_loader.py:1-195 - global_equity.py:1-124 - forex.py:1-137

性能考虑

[本节为通用性能建议,不直接分析具体文件]

故障排查指南

章节来源 - base.py:31-47 - base.py:50-119 - base.py:163-236 - base.py:328-439 - stooq_loader.py:117-143 - pykrx_loader.py:118-144 - india_broker_loader.py:153-187

结论

本项目通过统一的加载器协议与回测引擎,实现了 Stooq、Yahoo、KRX 与印度券商历史数据的跨市场整合。各加载器负责数据格式标准化、时间索引对齐与本地化适配;引擎则封装各国/地区的交易规则与成本模型。结合内容寻址缓存、批量失败隔离与数据质量校验,系统在稳定性与性能上具备良好表现。对于国际化部署,建议遵循本文的最佳实践与性能优化建议,确保在多市场环境下的一致性与可靠性。

[本节为总结性内容,不直接分析具体文件]

附录

多市场投资组合构建与跨区域资产配置

[本节为概念性指导,不直接分析具体文件]

汇率风险管理、跨境交易成本与税务

[本节为概念性指导,不直接分析具体文件]

数据质量验证、异常值检测与缺失数据填充

[本节为概念性指导,不直接分析具体文件]

国际化部署最佳实践与性能优化

[本节为概念性指导,不直接分析具体文件]