数据获取函数
策略的核心是「拿数据 → 算信号 → 下单」。聚宽提供了丰富的数据 API,本章按用途分组,讲清每个函数取什么、怎么用。
一、行情数据 — get_price
最通用的行情获取函数,支持单只或多只标的、按天或按分钟、多个字段:
get_price(security, start_date=None, end_date=None, frequency='daily',
fields=None, skip_paused=False, fq='pre', count=None, panel=True)
security:单个代码字符串或代码列表。count与start_date二选一:count取 end_date 往前 N 根,start_date取区间。frequency:'daily'、'1m'、'5m'、'1w'等。fq:复权,'pre'前复权(默认)、None不复权、'post'后复权。fields:默认['open','close','high','low','volume','money'],还支持factor、high_limit、low_limit、avg、pre_close、paused。
# 取平安银行最近 5 根日线
df = get_price('000001.XSHE', count=5, end_date='2024-06-01')
# 取多只股票、分钟数据、指定字段
df = get_price(['000001.XSHE','600000.XSHG'],
start_date='2024-05-01', end_date='2024-05-31 15:00',
frequency='1m', fields=['open','close'])
取多只标的时建议设
panel=False(pandas 已移除 Panel),返回按字段组织的 DataFrame。
二、历史快查 — history / attribute_history
这两个是回测中高频使用的轻量函数:
| 函数 | 特点 | 适用场景 |
|---|---|---|
history(count, unit, field, security_list, df) | 取多只标的的单个字段 | 批量取某字段做横截面 |
attribute_history(security, count, unit, fields, df) | 取单只标的的多个字段 | 看单只票近期明细 |
# 取股票池过去 5 天的均价(不含当天)
h = history(5, unit='1d', field='avg', security_list=['000001.XSHE','000002.XSHE'])
# 取平安银行近 5 天的开收量
ah = attribute_history('000001.XSHE', 5, '1d', ['open','close','volume'])
ma5 = ah['close'].mean()
重要:取天数据时不含当天(即使收盘后);分钟数据不含当前分钟,避免未来函数。
三、多周期 Bar — get_bars
需要非标准周期(如 5 分钟、周线、月线)或快照数据时用 get_bars:
get_bars(security, count, unit='1d', fields=['date','open','high','low','close'],
include_now=False, end_dt=None, fq_ref_date=None, df=False)
# 取近 5 周的周线数据
bars = get_bars('600507.XSHG', 5, unit='1w',
fields=['date','close'], include_now=False, df=True)
四、当前时刻数据 — get_current_data
回测中其他 API 取的是上一单位时间的数据。要取当天的开盘价、涨跌停、是否停牌,必须用:
def handle_data(context, data):
cur = get_current_data()
if cur['000001.XSHE'].paused: # 当天停牌
return
if cur['000001.XSHE'].high_limit: # 涨停价
pass
返回对象的常用属性:last_price、high_limit、low_limit、paused、is_st、day_open、name。
五、财务数据 — get_fundamentals
用 SQLAlchemy 的 query 对象查询估值、利润、资产负债等表:
q = query(valuation.code, valuation.market_cap, valuation.pe_ratio
).filter(valuation.market_cap > 1000,
valuation.pe_ratio < 15
).order_by(valuation.market_cap.desc()
).limit(50)
df = get_fundamentals(q, date='2024-06-03')
| 表 | 内容 | 常用字段 |
|---|---|---|
valuation | 市值估值 | market_cap、pe_ratio、pb_ratio、turnover_ratio |
income | 利润表 | total_operating_revenue、net_profit、basic_eps |
balance | 资产负债 | cash_equivalents、total_assets |
cash_flow | 现金流 | goods_sale_and_service_render_cash |
indicator | 财务指标 | eps、roe |
- 传
date:查该日收盘后能看到的最新数据(无未来函数,推荐)。 - 传
statDate:如'2024q1'或'2024',查指定报告期。
六、成分股与交易日
| 函数 | 含义 |
|---|---|
get_index_stocks('000300.XSHG', date) | 指数成分股列表 |
get_industry_stocks(industry_code) | 行业成分股 |
get_concept_stocks(concept_code) | 概念成分股 |
get_all_securities(['stock'], date) | 所有标的(股票/基金/期货/指数) |
get_security_info(code) | 单只标的的上市/退市信息 |
get_trade_days(start_date, end_date) | 指定范围交易日 |
get_industries(name='sw_l1') | 行业列表(申万/聚宽/证监会) |
stocks = get_index_stocks('000300.XSHG') # 沪深 300 成分
days = get_trade_days(start_date='2024-01-01', end_date='2024-06-30')
七、其他常用数据
get_extras(info, security_list, ...):基金净值、期货结算价/持仓量、是否 ST。get_money_flow(security_list, ...):资金流向(主力/超大单/大单净额)。get_billboard_list(stock_list, start_date, end_date):龙虎榜数据。
小结
行情用 get_price,历史快查用 history / attribute_history,当天数据用 get_current_data,财务用 get_fundamentals + query,成分股用 get_index_stocks。注意取天数据不含当天,避免未来函数。下一步学怎么下单:交易函数。