问题描述
解决方案
在 PTrade 中,获取股票历史 K 线数据主要有两个常用的 API 函数:get_history 和 get_price。
get_history:适用于获取最近 N 条数据(例如:过去 10 天、过去 60 分钟)。get_price:适用于获取指定日期范围的数据(例如:2023年1月1日到2023年2月1日)。
以下是具体的用法说明和代码示例。
1. 使用 get_history (获取最近 N 条数据)
这是策略中最常用的方式,通常用于计算移动平均线等指标。
函数原型:
get_history(count, frequency='1d', field='close', security_list=None, ...)
示例代码:
def initialize(context):
g.security = ['600570.SS', '000001.SZ']
set_universe(g.security)
def handle_data(context, data):
# 1. 获取单只股票,过去 5 天的 开盘价、收盘价、成交量
# 返回类型:pandas.DataFrame
single_data = get_history(5, frequency='1d', field=['open', 'close', 'volume'], security_list='600570.SS')
log.info("单只股票数据:")
log.info(single_data)
# 2. 获取多只股票,过去 5 天的 开盘价、收盘价、成交量
# 返回类型:pandas.Panel (Python 3.5) 或 DataFrame (Python 3.11)
# 注意:如果是在 Python 3.5 环境下获取多只股票多字段,返回的是 Panel,建议取单个字段处理
multi_data = get_history(5, frequency='1d', field=['open', 'close', 'volume'], security_list=g.security)
log.info("多只股票数据:")
log.info(multi_data)
2. 使用 get_price (获取指定日期范围数据)
如果你需要回测特定历史区间的数据,或者在研究模式下分析某段行情,使用此函数。
函数原型:
get_price(security, start_date=None, end_date=None, frequency='1d', fields=None, ...)
示例代码:
def initialize(context):
g.security = '600570.SS'
set_universe(g.security)
def handle_data(context, data):
# 获取指定日期范围内的数据
# 注意:在回测模式下,end_date 不能超过当前回测日期
# start_date 和 end_date 格式支持 'YYYYMMDD' 或 'YYYY-MM-DD'
# 获取单只股票在指定区间的数据
price_data = get_price('600570.SS',
start_date='20230101',
end_date='20230110',
frequency='1d',
fields=['open', 'close', 'volume'])
log.info("指定日期范围数据:")
log.info(price_data)
3. 完整策略示例
下面是一个完整的、可直接运行的策略代码示例。它演示了如何在 handle_data 中获取数据并打印出来。
def initialize(context):
# 初始化股票池
g.security_list = ['600570.SS', '000001.SZ']
set_universe(g.security_list)
def handle_data(context, data):
# ------------------------------------------------------------------
# 场景一:获取单只股票过去 10 天的日线数据
# ------------------------------------------------------------------
stock = '600570.SS'
# count=10: 获取10条K线
# frequency='1d': 日线级别
# field: 指定需要的字段
df_single = get_history(10, frequency='1d', field=['open', 'close', 'volume'], security_list=stock)
log.info("股票 %s 过去10天的行情数据:" % stock)
log.info(df_single)
# 访问具体数据,例如获取昨天的收盘价(数组最后一个元素)
last_close = df_single['close'][-1]
log.info("昨天收盘价: %s" % last_close)
# ------------------------------------------------------------------
# 场景二:获取多只股票过去 60 分钟的分钟线数据
# ------------------------------------------------------------------
# 注意:获取多只股票多字段时,返回的数据结构较为复杂
# 建议针对每只股票单独获取,或者只获取单个字段(如只获取 close)
# 这里演示只获取 'close' 字段,返回的是 DataFrame,列名为股票代码
df_multi_close = get_history(60, frequency='1m', field='close', security_list=g.security_list)
log.info("多只股票过去60分钟的收盘价:")
log.info(df_multi_close)
# ------------------------------------------------------------------
# 场景三:使用 get_price 获取指定日期区间 (仅作演示,需确保日期在回测范围内)
# ------------------------------------------------------------------
# 假设当前回测时间已经超过 2023-02-01
try:
df_price = get_price(stock, start_date='20230101', end_date='20230201', fields=['open', 'close'])
log.info("指定区间数据:")
log.info(df_price.head())
except:
pass
注意事项
- 字段名称:常用的字段包括
'open'(开盘价),'close'(收盘价),'high'(最高价),'low'(最低价),'volume'(成交量),'money'(成交额)。 - 复权处理:这两个函数都有
fq参数。fq='pre':前复权(默认通常是不复权或根据设置,建议显式指定)。fq='post':后复权。fq=None:不复权。- 建议:在计算技术指标(如均线)时,通常使用前复权 (
fq='pre') 以避免分红派息导致的价格跳空影响策略判断。
- 包含当前数据:
get_history有一个include参数。include=False(默认):不包含当前周期(例如日线回测中,不包含当天尚未收盘的数据)。include=True:包含当前周期(数据可能未走完)。
- Python 版本差异:PTrade 支持 Python 3.5 和 Python 3.11。在处理多只股票、多个字段的返回值时,Python 3.5 可能会返回
Panel对象(已在 Pandas 新版中废弃),而 Python 3.11 通常返回 MultiIndex 的DataFrame。建议先打印type(data)确认数据类型。