问题描述
解决方案
在 PTrade 中,如果您不想指定 start_date,只想获取最近的 N 根 K 线,您需要使用 count 参数。
根据 PTrade API 文档的规定,start_date 与 count 是互斥的,必须且只能选择输入其中一个。
使用方法
调用 get_price 时,不要传入 start_date,直接设置 count=100,并指定 end_date(可选,不填则默认为当前时间)和 frequency(频率)。
代码示例
以下代码展示了如何获取“恒生电子(600570.SS)”截止到当前时刻的最近 100 根日线数据:
def initialize(context):
g.security = '600570.SS'
set_universe(g.security)
def handle_data(context, data):
# 获取最近 100 根日线数据
# end_date 不传默认为当前回测/交易时间
# count=100 表示获取 100 条数据
# frequency='1d' 表示日线
df = get_price(
g.security,
count=100,
end_date=None,
frequency='1d',
fields=['open', 'high', 'low', 'close', 'volume']
)
log.info("获取到的 K 线数量: %s" % len(df))
log.info(df.tail())
关键参数说明
count(int):- 设置为
100即表示获取 100 条数据。 - 注意:该参数只针对
'1d','1m','5m'等具体频率有效。
- 设置为
start_date:- 必须省略或显式设置为
None。如果同时设置了start_date和count,程序会报错。
- 必须省略或显式设置为
end_date(str, 可选):- 如果不传(默认为
None),系统会自动取当前策略运行的时间(回测中为当前回测日期,实盘中为系统当前日期)。 - 如果需要获取指定历史日期往前推 100 根,可以传入具体的日期字符串(如
'20230101')。
- 如果不传(默认为
frequency(str):- 指定 K 线周期,如
'1d'(日线),'1m'(1分钟线),'30m'(30分钟线) 等。
- 指定 K 线周期,如
注意事项
- 包含关系:
get_price返回的数据通常不包括end_date当天(或当根未走完的 K 线)的数据。它返回的是历史行情。如果您在盘中运行并需要包含当天的实时数据,通常需要结合get_snapshot或使用get_history(get_history的include参数可控制是否包含当前 K 线,但get_price主要用于获取历史切片)。 - 数据类型:默认返回
pandas.DataFrame。
Q&A: PTrade get_price 常见问题
Q: get_price 和 get_history 获取最近 100 根 K 线有什么区别?
A: get_price 是通过指定 end_date 往前推 count 数量来获取数据的,适合获取指定日期段的数据。而 get_history 默认是基于当前策略时间往前推 count 数量。在大多数简单的策略编写中,如果只是想拿“当前时刻往前 N 根”,使用 get_history(100, ...) 往往更简洁,但 get_price 提供了更灵活的 end_date 指定功能。
Q: 为什么我设置了 count=100,但返回的数据少于 100 条?
A: 这通常是因为该股票上市时间不足,或者中间存在停牌,导致有效交易数据不足 100 条。此外,如果 end_date 设置得过早,早于股票上市时间,也可能返回空数据。
Q: 可以同时使用 start_date 和 count 吗?
A: 不可以。API 文档明确规定 start_date 与 count 必须且只能选择输入一个。如果同时输入,系统无法判断截取逻辑,会抛出异常。
Q: get_price 支持哪些频率的 count 参数?
A: 支持 '1m', '5m', '15m', '30m', '60m', '120m', '1d', '1w', '1M' (月线), '1q' (季线), '1y' (年线) 等。注意分钟级数据通常只能获取较近几年的历史。