🚀 AI 一键生成 ptrade 策略代码

如何使用 PTrade API 的 get_history 函数获取股票历史 K 线数据?

ptrade | 发布时间: 2025/11/25
以下内容由 EasyQuant 生成。

问题描述

如何用 API 获取一只或多只股票过去一段时间的 K 线数据,比如开盘价、收盘价和成交量?

解决方案

在 PTrade 中,获取股票历史 K 线数据主要有两个常用的 API 函数:get_historyget_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

注意事项

  1. 字段名称:常用的字段包括 'open' (开盘价), 'close' (收盘价), 'high' (最高价), 'low' (最低价), 'volume' (成交量), 'money' (成交额)。
  2. 复权处理:这两个函数都有 fq 参数。
    • fq='pre':前复权(默认通常是不复权或根据设置,建议显式指定)。
    • fq='post':后复权。
    • fq=None:不复权。
    • 建议:在计算技术指标(如均线)时,通常使用前复权 (fq='pre') 以避免分红派息导致的价格跳空影响策略判断。
  3. 包含当前数据get_history 有一个 include 参数。
    • include=False (默认):不包含当前周期(例如日线回测中,不包含当天尚未收盘的数据)。
    • include=True:包含当前周期(数据可能未走完)。
  4. Python 版本差异:PTrade 支持 Python 3.5 和 Python 3.11。在处理多只股票、多个字段的返回值时,Python 3.5 可能会返回 Panel 对象(已在 Pandas 新版中废弃),而 Python 3.11 通常返回 MultiIndex 的 DataFrame。建议先打印 type(data) 确认数据类型。