尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

free-stockdb Python SDK源码剖析:StockDBClient从初始化到复权折算的完整路径

free-stockdb Python SDK源码剖析:StockDBClient从初始化到复权折算的完整路径 free-stockdb Python SDK源码剖析StockDBClient从初始化到复权折算的完整路径【免费下载链接】free-stockdb面向 A 股日K、分钟K与ETF分钟数据的本地量化引擎集成增量同步、本地缓存、复权、批量查询、回测与指标计算。项目地址: https://gitcode.com/GitHub_Trending/fr/free-stockdbfree-stockdb 是一个面向 A 股日K、分钟K与 ETF 分钟数据的本地量化数据引擎而 Python SDK 中的StockDBClient就是它与量化策略之间最核心的桥梁。本文带你完整走一遍这条源码路径从客户端初始化、连接本地数据库服务到get_data()的批量查询主流程再到前复权/后复权的内存折算逻辑帮助你真正看懂数据是怎么流动起来的。一分钟认识 StockDBClient整个 SDK 的核心只有两个文件客户端实现pybao/stock_sdk.py定义了StockDBClient类及其全部查询、聚合、复权逻辑底层驱动from stockdb import init, rd引入的 C 二进制模块stockdb.pyd负责与本机数据库服务默认监听127.0.0.1:7899通信服务参数见 stockdb.conf设计思路非常清晰C 层管存储和通信Python 层管业务逻辑周期聚合、复权折算、字段过滤、DataFrame 封装。zb.get()指标计算39 种指标也建立在这个客户端之上见 pybao/zhibiao.py。初始化连接时悄悄做完的两件事StockDBClient.__init__默认连接127.0.0.1:7899表面上只是建立连接源码里其实做了两件事pybao/stock_sdk.py1. 优先走init()建立连接self.rd init(hosthost, portport, passwordpassword) if self.rd is None: self.rd rd若init()失败会回退到模块级全局rd若底层二进制模块缺失则抛出带排查指引的ImportError提示stockdb.pyd路径对新手非常友好。2. 一次性预加载全市场复权因子raw self.rd.get(复权*).get(cum)这一步把全部股票、全部除权日期的累计复权因子拉到内存按股票代码整理成两个平行数组_fq_dates[code]该股票的除权日期列表LevelDB 天然有序无需排序_fq_cums[code]对应的累计复权因子列表这是典型的用一次 O(N) 换后续 O(log N)的缓存设计——因为后面每根 K 线都要做复权折算把因子预先装进内存并支持二分查找是整条链路里最关键的铺垫。 如果你刚拿到仓库先运行 pybao/安装.py 把项目目录写入 Python 的sys.path之后任何目录都能直接from stock_sdk import *效果类似 pip 安装。上手步骤可参考 先看这个使用说明.txt。get_data 主流程四步从参数到结果get_data()是 SDK 的总入口支持日K/分钟K/周K/月K、单股/批量、同步/异步。它的工作可以拆成四步第一步确定表名与时间查询表达式table 分钟k if frequency in (1m,5m,15m,30m,60m) else 日k time_query self.build_time_query_for_retrieval(start, end, desc, frequency)两个细节值得注意周K/月K 并不存表底层先查日k再由 Python 内存聚合见下文分钟级查询若只传 8 位日期build_time_query_for_retrieval会自动补全为 14 位时间戳000000/235959一次覆盖全天交易时段第二步单股点查 / 批量 pipeline单只股票rd.vals(table, code, time_query)一次范围查询多只股票rd.pipe()管道批量mget单路请求内并发多股避免逐股往返第三步内存加工管线剔除无效记录 → 复权折算 → 周期聚合 → 排序/截取 → 字段投影fq in (qfq,hfq)时执行复权折算下一节详解frequency为1w/1M走_merge_to_period按 ISO 周/年月分组合并日K为5m/15m/30m/60m走_merge_minutes_to_period用交易分钟数对齐 A 股午休断档把 1 分钟 K 聚合到整 5/15/30/60 分钟窗口需要降序且发生了聚合时聚合完成后才反转保证分组正确最后按limit截取、按fields投影把 dict 压成紧凑的二维数值列表第四步返回格式封装as_dfTrue时合并为带code首列的 Pandas DataFrame批量模式自动合并多股否则返回 list/dict。异步版get_data_async与同步版结构完全一致只是把查询换成await方便在事件循环中使用。复权折算一次二分查找 一个比例_apply_fq_in_memory是整个 SDK 最精华的片段pybao/stock_sdk.py核心只有三步1. 二分定位当前因子idx bisect.bisect_right(dates, r_date_str) - 1 f_current cums[idx] if idx 0 else 1.0对每根 K 线用bisect在预加载的除权日数组中找到不晚于该日期的最大累计因子。LevelDB 存储天然有序所以这里 O(log N) 完成。2. 计算折算比例前复权qfqratio f_latest / f_current锚定最新因子保证最新价真实价后复权hfqratio 1.0 / f_current锚定上市初价格单调累积3. 折算并就地复制open/high/low/close/pre_close五个字段除以ratio并舍入ETF/基金代码保留 3 位小数股票 2 位。ratio ≈ 1的记录直接跳过——未发生过除权除息时整段零开销。注意源码是r.copy()后再改绝不污染底层数据库缓存的对象这是缓存正确性的关键细节。这种因子存本地、查询时现算的方案意味着新增一次分红送转只需更新因子表全历史行情无需回刷重写。数据同步与校验机制详见 docs/DATA_SOURCE.md。同步与异步只是查询那一步不同对比get_data与get_data_async会发现聚合、复权、过滤这些 Python 逻辑完全复用唯一的差别是取数方式同步rd.valsvsawait rd.vals。这种薄异步包装 厚共享逻辑的写法让维护成本几乎不翻倍值得参考。想动手验证官方示例 调用方式/python/sdk_test.py 覆盖了原生查询、板块映射、批量日K、批量指标到在线 tick 行情的完整链路末尾还附了一份get_data全参数速查注释建议对照源码阅读。小结一条清晰的职责链环节位置设计要点连接与因子预加载__init__一次 O(N) 缓存换全程 O(log N) 折算查询表达式构建_build_time_query单日点查、分钟级自动补全时间戳批量取数get_data第 2 步单股vals/ 多股pipe管道复权折算_apply_fq_in_memory二分查找因子 拷贝后修改前/后复权零回刷周期聚合_merge_to_period/_merge_minutes_to_periodISO 周分桶、A 股午休分钟对齐返回封装_to_dataframe/_filter_fields二维数值列表、带 code 列的合并 DataFrame理解了这条初始化 → 预加载因子 → 批量查询 → 内存复权 → 聚合封装的路径你就掌握了 free-stockdb Python SDK 的骨架——后续的 39 种指标计算、板块映射bk.get()、私有数据写入都只是挂在这条数据链上的新能力。【免费下载链接】free-stockdb面向 A 股日K、分钟K与ETF分钟数据的本地量化引擎集成增量同步、本地缓存、复权、批量查询、回测与指标计算。项目地址: https://gitcode.com/GitHub_Trending/fr/free-stockdb创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表