问题描述
解决方案
在聚宽(JoinQuant)策略中,您可以通过 context.portfolio 对象来获取当前的资金状况和持仓信息。
以下是具体的获取方法和代码示例:
1. 获取可用现金
使用 context.portfolio.available_cash 获取当前账户中可用于交易的资金。
2. 获取持仓股票
使用 context.portfolio.positions 获取持仓详情。这是一个字典(dict),键(key)是标的代码(如 '000001.XSHE'),值(value)是 Position 对象,包含了该标的的具体持仓信息(如数量、成本、价值等)。
代码示例
您可以将以下代码放入 handle_data 或定时运行的函数中进行查看:
def handle_data(context, data):
# --- 查询现金 ---
# 获取可用资金
available_cash = context.portfolio.available_cash
# 获取总资产(现金 + 持仓价值)
total_value = context.portfolio.total_value
log.info(f"当前可用现金: {available_cash}")
log.info(f"当前总资产: {total_value}")
# --- 查询持仓 ---
positions = context.portfolio.positions
# 遍历所有持仓
# 注意:positions 中可能包含已清仓但对象未销毁的记录,建议判断 total_amount > 0
has_holdings = False
for security, position in positions.items():
if position.total_amount > 0:
has_holdings = True
log.info(f"=== 持仓标的: {security} ({position.security}) ===")
log.info(f" 总持仓量: {position.total_amount}")
log.info(f" 可卖数量: {position.closeable_amount}") # T+1 制度下可能与总持仓不同
log.info(f" 开仓均价: {position.avg_cost}")
log.info(f" 当前标的价值: {position.value}")
log.info(f" 当前浮动盈亏: {position.value - position.avg_cost * position.total_amount}")
if not has_holdings:
log.info("当前没有持有任何股票")
关键属性说明
context.portfolio.available_cash: 账户里的闲置资金,可以直接用来买入股票。position.total_amount: 该股票的总持仓股数。position.closeable_amount: 当前可以卖出的股数(考虑了A股T+1规则,今日买入的股票今日不可卖出,此时closeable_amount会小于total_amount)。position.avg_cost: 持仓成本价。position.value: 持仓当前的市值(最新价 × 总持仓量)。