🚀 AI 一键生成 ptrade 策略代码

在 PTrade 策略中如何查询账户资金、持仓详情和浮动盈亏?

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

问题描述

在我的策略里,怎么才能知道当前账户里有多少现金,持有哪些股票,以及每只股票的持仓成本和数量是多少?

解决方案

在PTrade策略中,所有的账户资金和持仓信息都存储在 context 对象中。具体来说,主要通过 context.portfolio 对象来获取。

以下是获取您所需信息的具体方法:

1. 获取当前可用现金

使用 context.portfolio.cash 可以获取当前账户的可用资金(不包含冻结资金)。

2. 获取持仓信息

使用 context.portfolio.positions 可以获取当前所有持仓的字典。

  • 字典的键 (Key):是标的代码(例如 '600570.SS')。
  • 字典的值 (Value):是 Position 对象,包含了该标的的具体持仓详情。

3. 获取具体持仓数量和成本

对于每一个 Position 对象,可以通过以下属性获取详情:

  • .amount:总持仓数量。
  • .cost_basis:持仓成本价格(通常是摊薄成本)。
  • .enable_amount:可用数量(即可以卖出的数量,T+1制度下可能小于总持仓)。

代码示例

您可以将以下代码复制到您的策略中(例如放在 handle_dataafter_trading_end 中)来查看账户详情:

def initialize(context):
    # 这里设置股票池,仅作演示
    g.security = '600570.SS'
    set_universe(g.security)

def handle_data(context, data):
    # 1. 获取当前可用现金
    available_cash = context.portfolio.cash
    log.info("当前可用现金: %s" % available_cash)
    
    # 2. 获取所有持仓信息
    # context.portfolio.positions 是一个字典
    positions_dict = context.portfolio.positions
    
    # 判断是否有持仓
    if len(positions_dict) > 0:
        log.info("当前持有以下股票:")
        
        # 遍历持仓字典
        for security_code, position_obj in positions_dict.items():
            # 过滤掉持仓量为0的标的(虽然通常字典里只包含有持仓的,但加判断更稳健)
            if position_obj.amount > 0:
                # 股票代码
                symbol = position_obj.sid
                # 持仓数量
                amount = position_obj.amount
                # 持仓成本
                cost = position_obj.cost_basis
                # 可用数量
                enable_amount = position_obj.enable_amount
                
                log.info("股票: %s, 数量: %s, 成本: %s, 可卖数量: %s" % (symbol, amount, cost, enable_amount))
    else:
        log.info("当前为空仓状态")

补充说明:查询单只股票

如果您只想查询特定某一只股票的持仓情况,可以使用 get_position 函数,这样更直接:

# 获取特定股票的持仓对象
position = get_position('600570.SS')

if position.amount > 0:
    log.info("恒生电子持仓数量: %s" % position.amount)
    log.info("恒生电子持仓成本: %s" % position.cost_basis)
else:
    log.info("未持有恒生电子")