问题描述
stock='600104.XSHG'
amount = context.portfolio.positions[stock].amount
如上方式获取股票当前持仓数量,报以下WARNING:
Img
但是在文档中没有找到total_amount 或者 closeable_amount的用法,所以可以怎样获取某只股票当前持仓数量呢?
解决方案
在 JoinQuant(聚宽)平台中,context.portfolio.positions[stock].amount 这个属性已经过时(deprecated),为了向前兼容,它目前等同于 closeable_amount,但系统会抛出警告提示您更改。
根据最新的 API 文档,Position(持仓标的信息)对象提供了更精细的仓位属性。要获取某只股票的当前持仓数量,您可以使用以下几个属性,具体取决于您的业务需求:
1. 获取总持仓数量(推荐)
如果您想获取当前账户中实际持有的总股数(包括可卖出的和今天刚买入还不能卖出的,但不包括挂单冻结的),请使用 total_amount:
stock = '600104.XSHG'
# 获取总仓位(不含挂单冻结仓位)
total_amount = context.portfolio.positions[stock].total_amount
注意:如果要获取绝对的当前总持仓(包含因为挂了卖单而被冻结的仓位),需要将 total_amount 和 locked_amount 相加:
real_total_amount = context.portfolio.positions[stock].total_amount + context.portfolio.positions[stock].locked_amount
2. 获取可卖出的持仓数量
如果您获取持仓数量是为了卖出(例如在 A 股 T+1 规则下,今天买入的股票今天不能卖),您应该使用 closeable_amount:
stock = '600104.XSHG'
# 获取当前可卖出的仓位
closeable_amount = context.portfolio.positions[stock].closeable_amount
# 卖出示例:如果可卖数量大于0,则全部卖出
if closeable_amount > 0:
order_target(stock, 0)
3. 其他相关属性
locked_amount: 挂单冻结仓位(例如您下了一个限价卖单,还没成交,这部分股票就会被冻结)。today_amount: 今天开的仓位(今天刚买入的股数)。
总结
将您的代码修改为以下形式即可消除警告:
stock = '600104.XSHG'
# 如果是为了计算总资产或查看总股数:
amount = context.portfolio.positions[stock].total_amount
# 如果是为了判断能卖多少:
amount = context.portfolio.positions[stock].closeable_amount