🚀 AI 一键生成 ptrade 策略代码

PTrade API 深入解析:全面理解 Context 上下文对象

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

问题描述

如何获取当前策略的账户信息、持仓价值和当前时间?

解决方案

在PTrade策略中,所有的账户状态、资金情况以及时间信息都存储在 context 对象中。您可以通过访问 context 下的 portfolioblotter 属性来获取所需信息。

以下是具体的获取方法和代码示例:

1. 获取核心数据的属性

获取账户资金与持仓价值 (context.portfolio)

context.portfolio 对象包含了当前的资金状况和持仓汇总信息:

  • 可用资金: context.portfolio.cash
  • 账户总资产 (现金 + 持仓市值): context.portfolio.portfolio_value
  • 持仓市值 (仅股票/证券价值): context.portfolio.positions_value
  • 持仓详情: context.portfolio.positions (这是一个字典,键为标的代码)

获取当前时间 (context.blotter)

context.blotter 对象用于记录时间和交易细节:

  • 当前时间: context.blotter.current_dt
    • 返回的是一个 Python datetime 对象。
    • 在回测模式下,它是当前回测到的时间点。
    • 在实盘模式下,它是系统的当前时间。

2. 代码实现示例

以下是一个完整的策略示例,展示了如何在 handle_data 中打印这些信息:

def initialize(context):
    # 初始化股票池,这里以恒生电子为例
    g.security = '600570.SS'
    set_universe(g.security)

def handle_data(context, data):
    # 1. 获取当前时间
    # context.blotter.current_dt 是一个 datetime 对象
    current_dt = context.blotter.current_dt
    # 格式化时间字符串,方便阅读
    time_str = current_dt.strftime("%Y-%m-%d %H:%M:%S")
    
    # 2. 获取账户资金信息
    # 可用资金
    available_cash = context.portfolio.cash
    # 账户总资产 (可用资金 + 持仓市值)
    total_assets = context.portfolio.portfolio_value
    # 持仓市值
    market_value = context.portfolio.positions_value
    # 累计收益率
    returns = context.portfolio.returns
    
    # 3. 打印日志信息
    log.info("========================================")
    log.info("当前时间: %s" % time_str)
    log.info("可用资金: %.2f" % available_cash)
    log.info("持仓市值: %.2f" % market_value)
    log.info("账户总值: %.2f" % total_assets)
    log.info("当前收益率: %.2f%%" % (returns * 100))
    
    # 4. 获取具体某只股票的持仓数量 (如果有持仓)
    position = get_position(g.security)
    if position.amount > 0:
        log.info("标的 %s 持仓数量: %d, 持仓成本: %.2f" % (g.security, position.amount, position.cost_basis))
    
    log.info("========================================")

3. 关键点说明

  • Python版本兼容性:PTrade环境通常基于Python 3,但在处理字符串格式化时,建议使用 % 操作符或 .format() 方法,以确保在旧版本(如Python 3.5)环境中也能稳定运行。
  • 时间类型context.blotter.current_dt 返回的是 datetime.datetime 类型,您可以直接使用 .year, .month, .day, .hour 等属性来获取具体的时间单位,用于编写定时逻辑(例如:只在尾盘交易)。
  • 持仓对象:如果您需要获取特定股票的详细持仓(如成本价、可用数量),建议使用 get_position(security_code) 函数,或者访问 context.portfolio.positions[security_code]

Q&A

Q: context.portfolio.portfolio_valuecontext.portfolio.positions_value 有什么区别?
A: portfolio_value 是账户的总资产,等于“可用现金”加上“所有持仓的当前市值”。而 positions_value 仅仅是“所有持仓的当前市值”,不包含现金。

Q: 如何判断当前是否是回测环境还是交易环境?
A: 可以使用 is_trade() 函数。如果返回 True,表示当前在交易环境中运行;如果返回 False,表示在回测环境中运行。

Q: context.blotter.current_dt 在日线回测和分钟回测中有什么不同?
A: 在分钟级别回测中,current_dt 会随着每一分钟的K线推进而变化(例如 09:31, 09:32...)。在日线级别回测中,handle_data 通常在收盘时运行,current_dt 通常显示为当天的 15:00:00。