问题描述
请问如何查询自己的持仓期货数量?或者知道自己持有正的数量或者是负的数量?
解决方案
在 JoinQuant(聚宽)平台上,查询期货的持仓数量以及判断是多头(正)还是空头(负),可以通过全局对象 context 中的账户信息来实现。
期货的持仓严格区分多头(买涨)和空头(买跌),因此在 API 中,它们分别存储在不同的字典中:
- 多头持仓(正数量):存储在
context.portfolio.long_positions中。 - 空头持仓(负数量):存储在
context.portfolio.short_positions中。
这两个属性都是字典(dict),键(key)是标的代码(如 'RB1909.XSGE'),值(value)是 Position 对象。你可以通过访问 Position 对象的 total_amount 属性来获取具体的持仓数量。
具体代码示例
你可以在 handle_data 或定时运行的函数中,使用以下代码来查询和打印你的期货持仓情况:
def handle_data(context, data):
# 假设你要查询的期货合约代码
future_code = 'RB1909.XSGE'
# 1. 查询多头持仓(正数量)
if future_code in context.portfolio.long_positions:
long_position = context.portfolio.long_positions[future_code]
long_amount = long_position.total_amount
print(f"标的 {future_code} 的多头持仓数量为: {long_amount}")
else:
print(f"标的 {future_code} 没有多头持仓")
# 2. 查询空头持仓(负数量)
if future_code in context.portfolio.short_positions:
short_position = context.portfolio.short_positions[future_code]
short_amount = short_position.total_amount
print(f"标的 {future_code} 的空头持仓数量为: {short_amount}")
else:
print(f"标的 {future_code} 没有空头持仓")
# 3. 遍历打印所有期货持仓
print("--- 当前所有多头持仓 ---")
for code, pos in context.portfolio.long_positions.items():
print(f"合约: {code}, 多单数量: {pos.total_amount}, 可平数量: {pos.closeable_amount}")
print("--- 当前所有空头持仓 ---")
for code, pos in context.portfolio.short_positions.items():
print(f"合约: {code}, 空单数量: {pos.total_amount}, 可平数量: {pos.closeable_amount}")
Position 对象常用属性解析
当你获取到 Position 对象(如上面的 pos)后,除了 total_amount,还可以获取以下有用信息:
pos.total_amount: 总仓位数量(包含挂单冻结的仓位)。pos.closeable_amount: 可平仓数量(当前可以用来下平仓单的数量)。pos.price: 最新行情价格。pos.avg_cost: 当前持仓成本(开仓均价)。pos.value: 标的价值(计算方法:price * total_amount * 合约乘数)。
总结
- 正的数量(多头):去
context.portfolio.long_positions里面找。 - 负的数量(空头):去
context.portfolio.short_positions里面找。 - 获取到的
total_amount本身是一个正数,代表你持有该方向的合约手数。方向由它所在的字典(long 还是 short)决定。