🚀 AI 一键生成 ptrade 策略代码

PTrade 核心对象:如何使用 Portfolio 对象监控和管理账户状态?

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

问题描述

在策略运行中,如何实时获取我的总资产、可用现金、持仓市值和累计收益率这些信息?

解决方案

在PTrade策略运行中,所有的账户资金和持仓汇总信息都存储在 context.portfolio 对象中。您可以通过访问该对象的不同属性来实时获取您所需的各项数据。

以下是获取总资产、可用现金、持仓市值和累计收益率的具体方法:

1. 获取方式详解

handle_databefore_trading_startafter_trading_end 等函数中,通过传入的 context 参数访问 portfolio 对象:

  • 总资产 (Total Assets):
    使用 context.portfolio.portfolio_value
    含义:当前持有的标的市值与现金的总和。

  • 可用现金 (Available Cash):
    使用 context.portfolio.cash
    含义:当前账户中可用于买入的资金(不包含挂单冻结的资金)。

  • 持仓市值 (Market Value of Positions):
    使用 context.portfolio.positions_value
    含义:当前持有的所有标的的总市值。

  • 累计收益率 (Cumulative Returns):
    使用 context.portfolio.returns
    含义:相对于初始资金的当前收益比例(例如 0.15 代表 15%)。

2. 代码示例

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

def initialize(context):
    # 初始化设置,这里设置一支股票作为示例
    g.security = '600570.SS'
    set_universe(g.security)

def handle_data(context, data):
    # 1. 获取总资产
    total_assets = context.portfolio.portfolio_value
    
    # 2. 获取可用现金
    available_cash = context.portfolio.cash
    
    # 3. 获取持仓市值
    market_value = context.portfolio.positions_value
    
    # 4. 获取累计收益率
    total_returns = context.portfolio.returns
    
    # 打印日志查看结果
    log.info("========== 账户实时状态 ==========")
    log.info("总资产: %.2f" % total_assets)
    log.info("可用现金: %.2f" % available_cash)
    log.info("持仓市值: %.2f" % market_value)
    log.info("累计收益率: %.2f%%" % (total_returns * 100))
    
    # 简单的交易逻辑示例:有现金就买入
    if available_cash > 10000:
        order_value(g.security, 10000)

3. 补充说明

  • 浮动盈亏 (PnL): 如果您需要获取当前的浮动盈亏金额,可以使用 context.portfolio.pnl
  • 已用资金: 如果需要查看已被占用的资金(包括持仓占用),可以使用 context.portfolio.capital_used
  • 单只股票持仓: 如果需要获取特定股票的持仓详情(如持仓数量、成本价),请使用 get_position(security) 接口或访问 context.portfolio.positions[security]

Q&A

Q: context.portfolio.cash 获取的资金包含冻结资金吗?
A: 不包含。context.portfolio.cash 指的是当前可用资金。如果您下了单但尚未成交,这部分资金会被冻结,不会包含在 cash 中,直到撤单或成交后状态变更。

Q: context.portfolio.returns 是如何计算的?
A: 它是基于策略的初始资金计算的。公式大致为:(当前总资产 - 初始资金) / 初始资金

Q: 如何获取单只股票的持仓盈亏?
A: 可以通过 get_position('股票代码').long_pnl(多头浮动盈亏)来获取单只标的的盈亏情况。

Q: 这些数据在回测和实盘中是一样的吗?
A: 接口调用方式是一样的。但在实盘交易中,资金和持仓信息的同步依赖于柜台推送或查询,通常会有极短的延迟(秒级),而回测中数据是即时结算的。