PTrade中get_history函数如何获取历史价格数据,参数含义是什么?
问题描述
解决方案
在 PTrade 量化交易平台中,get_history 是一个非常核心的 API,用于获取指定股票或标的的历史 K 线行情数据。它可以获取单只或多只股票在不同周期(如分钟线、日线、周线等)下的开盘价、收盘价、最高价、最低价、成交量等信息。
函数原型
get_history(count, frequency='1d', field='close', security_list=None, fq=None, include=False, fill='nan', is_dict=False)
参数详解
- count (int):必填参数。表示要获取的 K 线数量,必须大于 0。
- frequency (str):选填参数,默认为
'1d'。表示 K 线周期。支持的周期包括:- 分钟级别:
'1m','5m','15m','30m','60m','120m' - 日/周/月/年级别:
'1d'(日线),'1w'或'weekly'(周线),'mo'或'monthly'(月线),'1q'或'quarter'(季线),'1y'或'yearly'(年线)
- 分钟级别:
- field (str 或 list):选填参数,默认为
['open','high','low','close','volume','money','price']。指明需要获取的行情字段。支持的字段有:'open':开盘价'high':最高价'low':最低价'close':收盘价'volume':交易量'money':交易金额'price':最新价- 注:日线还支持
'is_open','preclose','high_limit','low_limit','unlimited'等字段。
- security_list (str 或 list):选填参数。要获取数据的股票代码或代码列表(如
'600570.SS'或['600570.SS', '000001.SZ'])。如果为None,则默认获取上下文中set_universe设定的股票池中的所有股票。 - fq (str):选填参数,默认为
None。数据复权选项:'pre':前复权'post':后复权'dypre':动态前复权None:不复权
- include (bool):选填参数,默认为
False。是否包含当前周期的数据。True表示包含,False表示不包含。 - fill (str):选填参数,默认为
'nan'。当获取不到某一时刻的分钟数据时,是否用上一分钟的数据进行填充。'pre'表示用上一分钟数据填充,'nan'表示用 NaN 填充(仅交易有效)。 - is_dict (bool):选填参数,默认为
False。是否返回字典格式{str: array()}。设置为True时取数速度相对较快。
返回值说明
返回值的类型取决于传入的参数(特别是 is_dict、security_list 和 field 的数量):
- is_dict=True:返回
OrderedDict,格式为OrderedDict([(股票代码, array([时间, 开, 高, 低, 收, 量, 额, 最新价]))])。 - 单只股票 (is_dict=False):返回
pandas.DataFrame,行索引为时间(datetime),列索引为行情字段。 - 多只股票 (is_dict=False, Python 3.11环境):返回
pandas.DataFrame,包含code列和对应的行情字段列。
代码示例
以下是在 PTrade 策略中使用 get_history 的常见场景:
def initialize(context):
# 设置股票池
g.security = ['600570.SS', '000001.SZ']
set_universe(g.security)
def handle_data(context, data):
# 示例 1:获取单只股票过去 5 天的收盘价(不复权)
his_close = get_history(5, '1d', 'close', security_list='600570.SS')
log.info("恒生电子过去5天收盘价:\n%s" % his_close)
# 示例 2:获取股票池中所有股票过去 10 分钟的成交量
his_vol = get_history(10, '1m', 'volume', security_list=g.security)
log.info("股票池过去10分钟成交量:\n%s" % his_vol)
# 示例 3:获取单只股票过去 5 天的前复权开盘价和收盘价
his_multi_fields = get_history(5, '1d', ['open', 'close'], security_list='600570.SS', fq='pre')
log.info("恒生电子前复权开盘与收盘价:\n%s" % his_multi_fields)
# 示例 4:使用 is_dict=True 加速获取数据
his_dict = get_history(5, '1d', security_list='600570.SS', is_dict=True)
log.info("字典格式返回的历史数据:\n%s" % his_dict)
注意事项
get_history只能获取 2005 年之后的数据。- 针对停牌的股票,时间轴不会跳过停牌日,而是使用停牌前的数据填充,且成交量为 0。
- 在
run_daily或run_interval等多线程定时函数中,尽量避免与handle_data同一时刻调用get_history,以免偶发获取数据为空的问题。