韩国股市数据源

📎 引用文件

本文引用的文件 - pykrx_loader.py - korea_equity.py - base.py - _http.py - registry.py - test_pykrx_loader.py - test_korea_equity_engine.py - market_data_tool.py

目录

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

简介

本文件面向 Vibe-Trading 的韩国股市数据源,聚焦 PyKRX 库的集成实现与韩国交易所(KRX)数据获取。内容涵盖: - 韩元计价、交易时间差异、市场休市规则等韩国市场的特殊性 - 数据格式转换:日期格式、股票代码规范、价格单位处理 - KOSPI 与 KOSDAQ 的区别与选择逻辑 - 历史数据下载、实时数据获取与批量数据处理方法 - 常见错误处理:网络连接超时、数据缺失、API 限流等 - 性能优化建议与最佳实践

项目结构

围绕韩国股市的数据链路主要由两部分构成: - 数据加载器:通过 PyKRX 拉取 KRX 日频 OHLCV 数据,并进行标准化 - 回测引擎:封装韩国市场的交易规则(涨跌停、最小变动价位、手续费、滑点等)

graph TB A["调用方<br/>策略/工具"] --> B["数据加载器注册表<br/>registry.py"] B --> C["PyKRX 加载器<br/>pykrx_loader.py"] C --> D["HTTP 节流与缓存<br/>_http.py / base.py"] C --> E["KRX 数据源<br/>pykrx.stock.get_market_ohlcv_by_date"] C --> F["标准化输出<br/>open/high/low/close/volume"] F --> G["回测引擎<br/>korea_equity.py"] G --> H["结果/信号"]

图表来源 - registry.py - pykrx_loader.py:76-144 - _http.py - base.py:31-48 - korea_equity.py:139-174

章节来源 - pykrx_loader.py:1-30 - korea_equity.py:1-48

核心组件

章节来源 - pykrx_loader.py:76-144 - pykrx_loader.py:167-194 - korea_equity.py:61-136 - korea_equity.py:139-174 - korea_equity.py:175-228 - korea_equity.py:269-317

架构总览

下图展示从调用方到 KRX 数据源再到回测引擎的完整流程,包括节流、缓存、标准化与执行规则校验。

sequenceDiagram participant Caller as "调用方" participant Reg as "加载器注册表" participant Loader as "PyKRX 加载器" participant Throttle as "HostThrottle" participant Cache as "缓存层" participant KRX as "pykrx.stock" participant Engine as "韩国股市引擎" Caller->>Reg : 请求 kr_equity 数据 Reg-->>Caller : DataLoader(DataLoader.name="pykrx") Caller->>Loader : fetch(codes, start_date, end_date, interval="1D") Loader->>Cache : cached_loader_fetch(...) alt 非日频 Loader-->>Caller : {} (空结果,触发回退) else 日频 loop 每个 code Loader->>Throttle : wait("pykrx", min_interval) Loader->>KRX : get_market_ohlcv_by_date(fromdate,todate,ticker,adjusted=True) KRX-->>Loader : DataFrame(韩文列名) Loader->>Loader : _normalize() -> 标准OHLCV Loader-->>Cache : 写入缓存 end Loader-->>Caller : {symbol : DataFrame} Caller->>Engine : can_execute(...), calc_commission(...), apply_slippage(...) Engine-->>Caller : 允许/拒绝、费用、滑点后成交价 end

图表来源 - pykrx_loader.py:92-164 - pykrx_loader.py:167-194 - korea_equity.py:175-228 - korea_equity.py:269-317

详细组件分析

PyKRX 加载器(数据获取与标准化)

flowchart TD Start(["开始"]) --> CheckInterval["检查频率是否为日频"] CheckInterval --> |否| ReturnEmpty["返回空字典"] CheckInterval --> |是| LoopCodes["遍历代码列表"] LoopCodes --> Throttle["HostThrottle 等待间隔"] Throttle --> Fetch["调用 pykrx.stock.get_market_ohlcv_by_date"] Fetch --> Normalize["_normalize: 重命名列/转日期/排序/类型转换/去无效"] Normalize --> HasData{"是否有有效数据?"} HasData --> |是| AddResult["加入结果映射"] HasData --> |否| NextCode["下一个代码"] AddResult --> NextCode NextCode --> End(["结束"]) ReturnEmpty --> End

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

章节来源 - pykrx_loader.py:66-73 - pykrx_loader.py:92-144 - pykrx_loader.py:146-164 - pykrx_loader.py:167-194

韩国股市回测引擎(交易规则与成本)

classDiagram class KoreaEquityEngine { +price_limit : float +slippage_rate : float +kr_brokerage : float +kr_tax_sell : 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 -_base_price(symbol, bar) float? } class TickHelpers { +krx_tick_size(price) float +krx_round_down(price) float +krx_round_up(price) float +krx_price_limits(base_price, limit) tuple } KoreaEquityEngine --> TickHelpers : "使用"

图表来源 - korea_equity.py:61-136 - korea_equity.py:139-174 - korea_equity.py:175-228 - korea_equity.py:269-317

章节来源 - korea_equity.py:139-174 - korea_equity.py:175-228 - korea_equity.py:230-268 - korea_equity.py:269-317

数据格式转换与规范

章节来源 - pykrx_loader.py:45-52 - pykrx_loader.py:66-68 - pykrx_loader.py:155-164 - pykrx_loader.py:167-194 - korea_equity.py:61-136

KOSPI 与 KOSDAQ 的区别与选择逻辑

章节来源 - korea_equity.py:22-41 - pykrx_loader.py:15-23

历史数据下载、实时数据获取与批量处理

章节来源 - pykrx_loader.py:92-144 - pykrx_loader.py:146-164 - base.py:31-48

依赖关系分析

graph LR Registry["registry.py"] --> Loader["pykrx_loader.py"] HTTP["_http.py"] --> Loader Base["base.py"] --> Loader Loader --> Engine["korea_equity.py"]

图表来源 - registry.py - pykrx_loader.py:34-43 - korea_equity.py:50-58

章节来源 - pykrx_loader.py:34-43 - korea_equity.py:50-58

性能考量

章节来源 - pykrx_loader.py:25-30 - pykrx_loader.py:58-63 - korea_equity.py:205-216

故障排查指南

章节来源 - base.py:163-200 - pykrx_loader.py:128-144 - korea_equity.py:205-216 - korea_equity.py:273-296

结论

Vibe-Trading 的韩国股市数据源通过 PyKRX 加载器与韩国股市回测引擎实现了端到端的日频数据获取与交易规则建模。其特点包括: - 严格遵循 KRX 报价单位与涨跌停规则,确保回测结果的合理性 - 数据标准化与缓存机制提升性能与稳定性 - 灵活的节流与重试策略应对网络波动与 API 限流 - 明确的成本栈与滑点模型贴近真实交易环境

建议在生产环境中: - 监控请求间隔与失败率,适时调整节流参数 - 定期核验税费与报价单位变化,保持回测准确性 - 结合其他数据源构建回退链,提高鲁棒性

附录

章节来源 - pykrx_loader.py:25-30 - market_data_tool.py:51-79