问题描述
解决方案
在聚宽(JoinQuant)平台中,要一次性获取单个股票过去一段时间的开盘价、收盘价和成交量数据,最常用且推荐的方法是使用 get_price 函数。如果在回测策略中需要获取相对于当前时间往前推的数据(例如“过去10天”),也可以使用 attribute_history 函数。
以下是具体的实现方法和代码示例:
方法一:使用 get_price (推荐)
get_price 是最通用的数据获取函数,适用于研究环境和回测环境。它允许你指定具体的开始日期和结束日期。
代码示例:
# 获取平安银行(000001.XSHE) 2023年1月1日 到 2023年2月1日 的日线数据
# 包含字段:开盘价(open), 收盘价(close), 成交量(volume)
df = get_price(
security='000001.XSHE',
start_date='2023-01-01',
end_date='2023-02-01',
frequency='daily',
fields=['open', 'close', 'volume']
)
# 打印结果
print(df)
参数说明:
security: 股票代码(字符串)。start_date: 开始日期。end_date: 结束日期。frequency: 数据频率,'daily' 表示日线,'1m' 表示分钟线。fields: 需要获取的字段列表,如['open', 'close', 'volume']。
方法二:使用 attribute_history (策略专用)
如果你是在编写策略(回测或模拟交易),并且需要获取“截止到当前时间的前 N 个单位时间”的数据,attribute_history 是最高效的选择。
代码示例:
def handle_data(context, data):
# 获取平安银行过去 10 天的数据
# 包含字段:开盘价, 收盘价, 成交量
# 注意:在日级回测中,attribute_history 默认不包含当天的数据(避免未来函数)
history_data = attribute_history(
security='000001.XSHE',
count=10,
unit='1d',
fields=['open', 'close', 'volume']
)
# 打印结果
print(history_data)
参数说明:
security: 股票代码。count: 获取的历史长度(例如 10 表示过去 10 天)。unit: 时间单位,'1d' 为天,'1m' 为分钟。fields: 字段列表。
方法三:使用 get_bars (高性能)
如果你需要获取大量数据或者对性能有极高要求,可以使用 get_bars。它支持返回 numpy.ndarray 或 DataFrame。
代码示例:
# 获取平安银行截止到当前时间的最后 100 条日线数据
df = get_bars(
security='000001.XSHE',
count=100,
unit='1d',
fields=['date', 'open', 'close', 'volume'],
include_now=False,
df=True # 设置为 True 返回 DataFrame格式
)
print(df)
常见问题 Q&A
Q: get_price 返回的数据类型是什么?
A: 返回的是 pandas.DataFrame 对象。行索引(index)是时间(datetime),列索引(columns)是你请求的字段名(如 open, close)。
Q: 如何获取复权后的价格?
A: get_price 和 attribute_history 都有一个 fq 参数。
fq='pre':前复权(默认)。fq='post':后复权。fq=None:不复权(真实价格)。
Q: 如果我想获取多只股票的数据怎么办?
A: 在 get_price 的 security 参数中传入一个列表,例如 ['000001.XSHE', '000002.XSHE']。此时如果 panel 参数为默认值(旧版pandas),可能会返回 Panel 对象;建议设置 panel=False (在较新版本API中通常默认返回DataFrame或Panel已废弃),通常会返回一个 MultiIndex 的 DataFrame 或者 Panel(视pandas版本而定,建议查阅具体环境文档)。在聚宽目前的环境中,获取多只股票通常建议使用 get_price 并处理返回的 Panel 或 DataFrame。
Q: attribute_history 包含当天的数据吗?
A: 当获取天数据(unit='1d')时,默认不包含当天的数据(即使是在收盘后调用),这是为了防止在盘中回测时用到未来数据。如果需要当天数据,请使用分钟频率或 get_current_data()。