3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在聚宽(JoinQuant)平台中,get_price、history(以及 attribute_history)和 get_bars 是获取行情数据的三个核心函数。虽然它们的功能有重叠,但在使用场景、数据包含范围、返回类型以及运行效率上有显著区别。
以下是详细的对比和使用建议:
get_price 是最通用的数据获取函数,既可以在研究环境中使用,也可以在回测/模拟中使用。
start_date 和 end_date 获取指定绝对时间段的数据。pandas.DataFrame(多标的时曾返回 Panel,现多建议设 panel=False 返回 DataFrame)。get_bars,速度稍慢。end_date 设置不当,容易引入未来函数。这两个函数是回测/模拟交易专用的 API,无法在研究环境中直接调用。它们的设计初衷是为了方便策略编写并防止未来函数。
context.current_dt)向前获取 count 个单位的数据。history 获取的数据严格不包含当前单位时间的数据。
handle_data 中调用 history(5, '1d', ...),获取的是昨天及过去4天的数据,不包含今天。history:可查询多个标的、单个字段,返回 DataFrame 或 Dict。attribute_history:查询单个标的、多个字段,返回 DataFrame 或 Dict。attribute_history 获取过去5天的收盘价求平均。因为在盘中决策时,当天的收盘价尚未确定,使用过去的数据才符合逻辑。get_bars 是较新的 API,旨在提供更快的速度和更灵活的数据获取方式,支持获取当前时刻的数据。
numpy.ndarray(也可设 df=True 返回 DataFrame)。include_now=True,可以获取包含当前分钟/当天的 bar。| 特性 | get_price | history / attribute_history | get_bars |
|---|---|---|---|
| 主要环境 | 研究环境 / 回测 | 仅回测/模拟 | 研究环境 / 回测 |
| 时间指定 | 绝对时间 (Start/End) | 相对时间 (Count) | 相对时间 (Count) + 截止时间 |
| 包含当前Bar | 视 end_date 而定 | 否 (严格不包含) | 可配置 (include_now) |
| 停牌处理 | 默认填充 (Fill) | 默认填充 | 不填充 (跳过) |
| 返回类型 | DataFrame | DataFrame / Dict | Array (默认) / DataFrame |
| 运行速度 | 中等 | 中等 | 快 |
| 典型用途 | 研究分析、获取特定日期数据 | 策略中计算MA、MACD等指标 | 高频策略、获取实时K线、高性能计算 |
我在写策略,需要计算过去5天的平均收盘价,用来做判断:
attribute_history。我在做研究,想拉取平安银行2020年全年的数据做分析:
get_price。start_date='2020-01-01' 和 end_date='2020-12-31'。我在写策略,需要在盘中(如10:00)获取包含刚才这一分钟(09:59-10:00)在内的最新10根分钟K线:
get_bars。include_now=True 即可拿到最新的数据,且速度快。我的策略涉及几千只股票,循环获取数据太慢了:
get_bars。df=False 返回 numpy 数组,计算效率最高。Q: 为什么 history 不包含当前数据?
A: 为了防止“未来函数”。在日频回测中,handle_data 通常在开盘或盘中运行,此时当天的“收盘价”尚未产生。如果包含了当天的数据(且该数据在回测引擎中通常是全天收盘后的数据),策略就会利用收盘价去指导开盘的交易,导致回测结果虚高,实盘必亏。
Q: get_bars 获取的数据和 get_price 的复权数据一致吗?
A: 一致,但前提是复权参数设置相同。get_bars 的 fq_ref_date 默认为当前时间(动态复权),而 get_price 的 fq 默认为 'pre'(前复权)。在回测开启 set_option('use_real_price', True) 后,两者逻辑基本一致。
Q: 如果我想获取当前的最新价格(Tick级),应该用哪个?
A: 以上三个都是获取 K 线(Bar)数据的。如果需要当前的最新瞬时价格(Tick),请使用 get_current_data() 或 get_current_tick()。