问题描述
解决方案
在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))
代码解析
-
get_positions():- 该函数用于获取持仓信息。
- 当不传入任何参数时,它返回一个字典,包含账户中所有当前的持仓。
- 字典的 Key 是股票代码(如
'600570.SS'),Value 是Position对象。
-
Position对象属性:cost_basis: 持仓成本价(通常是摊薄成本)。enable_amount: 可用数量(即T+1规则下今日可卖出的数量)。amount: 总持仓数量(包含今日买入不可卖出的部分)。
-
context.portfolio.positions:- 这是PTrade框架维护的一个全局持仓字典,其结构与
get_positions()返回的结果一致。在handle_data或其他回调函数中都可以直接读取。
- 这是PTrade框架维护的一个全局持仓字典,其结构与
Q&A
Q: enable_amount 和 amount 有什么区别?
A: amount 是您账户里该股票的总股数。enable_amount 是您当前可以卖出的股数。在A股市场(T+1),当天买入的股票当天不能卖出,所以当天买入的部分会体现在 amount 中,但不会体现在 enable_amount 中。
Q: 如果我没有持仓,get_positions() 会返回什么?
A: 如果没有任何持仓,它将返回一个空的字典 {}。
Q: cost_basis 是如何计算的?
A: cost_basis 通常代表持仓的平均成本(摊薄成本),它会根据买入价格和数量加权平均计算,并扣除卖出带来的盈亏影响(具体计算方式取决于券商柜台的设置,通常为移动加权平均)。
Q: 这个代码可以在回测和实盘中使用吗?
A: 是的,get_positions 和 context.portfolio 在回测和实盘(交易)模式下均可使用。