🚀 AI 一键生成 ptrade 策略代码

PTrade API 教程:get_positions 函数详解,如何高效查询多支股票持仓?

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

问题描述

如何一次性获取我账户里所有股票的持仓成本和可用数量?

解决方案

在PTrade中,要一次性获取账户内所有股票的持仓成本和可用数量,最直接的方法是使用 get_positions() 函数(不传参数),或者直接访问 context.portfolio.positions 对象。

这两个方法都会返回一个字典,键是股票代码,值是 Position 对象。通过访问 Position 对象的 cost_basis(持仓成本)和 enable_amount(可用数量)属性即可获取所需信息。

以下是具体的代码实现示例:

策略代码示例

def initialize(context):
    # 初始化设置,这里为了演示设置一个股票池,实际交易中根据您的策略设定
    g.security = ['600570.SS', '000001.SZ']
    set_universe(g.security)

def handle_data(context, data):
    # 方法一:使用 get_positions() 获取所有持仓
    # 不传入参数时,默认获取账户当前所有持仓
    all_positions = get_positions()
    
    # 检查是否有持仓
    if not all_positions:
        log.info("当前账户没有持仓。")
        return

    log.info("========== 开始打印所有持仓信息 ==========")
    
    # 遍历持仓字典
    for stock_code in all_positions:
        # 获取单个标的持仓对象
        position = all_positions[stock_code]
        
        # 获取持仓成本
        cost = position.cost_basis
        
        # 获取可用数量 (enable_amount是当前可以卖出的数量,amount是总持仓)
        available = position.enable_amount
        
        # 获取总持仓数量 (可选)
        total_amount = position.amount
        
        # 打印信息 (使用Python 3.5兼容的格式化字符串)
        log.info("股票代码: %s, 持仓成本: %.3f, 可用数量: %d, 总持仓: %d" % (
            stock_code, cost, available, total_amount
        ))
        
    log.info("========== 结束打印所有持仓信息 ==========")

    # 方法二:也可以通过 context.portfolio.positions 获取,效果相同
    # for stock_code in context.portfolio.positions:
    #     pos = context.portfolio.positions[stock_code]
    #     log.info("股票: %s, 成本: %s" % (stock_code, pos.cost_basis))

代码解析

  1. get_positions():

    • 该函数用于获取持仓信息。
    • 不传入任何参数时,它返回一个字典,包含账户中所有当前的持仓。
    • 字典的 Key 是股票代码(如 '600570.SS'),Value 是 Position 对象。
  2. Position 对象属性:

    • cost_basis: 持仓成本价(通常是摊薄成本)。
    • enable_amount: 可用数量(即T+1规则下今日可卖出的数量)。
    • amount: 总持仓数量(包含今日买入不可卖出的部分)。
  3. context.portfolio.positions:

    • 这是PTrade框架维护的一个全局持仓字典,其结构与 get_positions() 返回的结果一致。在 handle_data 或其他回调函数中都可以直接读取。

Q&A

Q: enable_amountamount 有什么区别?
A: amount 是您账户里该股票的总股数。enable_amount 是您当前可以卖出的股数。在A股市场(T+1),当天买入的股票当天不能卖出,所以当天买入的部分会体现在 amount 中,但不会体现在 enable_amount 中。

Q: 如果我没有持仓,get_positions() 会返回什么?
A: 如果没有任何持仓,它将返回一个空的字典 {}

Q: cost_basis 是如何计算的?
A: cost_basis 通常代表持仓的平均成本(摊薄成本),它会根据买入价格和数量加权平均计算,并扣除卖出带来的盈亏影响(具体计算方式取决于券商柜台的设置,通常为移动加权平均)。

Q: 这个代码可以在回测和实盘中使用吗?
A: 是的,get_positionscontext.portfolio 在回测和实盘(交易)模式下均可使用。