问题描述
解决方案
在 JoinQuant(聚宽)策略中,您可以通过 context.portfolio 或 context.subportfolios 对象来精确查询账户的资金状态。
要查询可转出资金(可取资金)和挂单冻结资金,请使用以下属性:
- 可转出资金:
transferable_cash - 挂单冻结资金:
locked_cash
代码示例
以下代码展示了如何在策略中打印这两个数值:
# -*- coding: utf-8 -*-
def initialize(context):
# 设置按天运行,每天打印一次
run_daily(print_account_info, '14:50')
def print_account_info(context):
# 获取默认的子账户(通常为 subportfolios[0])
# 如果您没有设置多仓位,context.portfolio 和 context.subportfolios[0] 的数据通常是一致的
account = context.subportfolios[0]
# 1. 查询可转出资金 (可取资金)
# 注意:在A股T+1制度下,今日卖出股票获得的资金通常在今日不可取,但可用于买入
can_transfer_out = account.transferable_cash
# 2. 查询挂单冻结资金
# 即下了买单但尚未成交(或部分成交剩余未成交)所锁定的资金
frozen_by_order = account.locked_cash
# 3. 查询可用资金 (可用于交易买入的资金)
# 可用资金 = 可取资金 + 今日卖出所得 + 其他未冻结资金
available_to_trade = account.available_cash
log.info("=" * 30)
log.info(f"当前可转出资金 (可取): {can_transfer_out:.2f}")
log.info(f"当前挂单冻结资金 (锁住): {frozen_by_order:.2f}")
log.info(f"当前可用资金 (可买): {available_to_trade:.2f}")
log.info("=" * 30)
字段详细说明
-
transferable_cash(可取资金):- 表示当前可以从账户中转出(提现)的资金。
- 关键点:它不包括今日卖出证券所得的资金(因为 A 股实行 T+1 结算,今日卖出的钱今日不可提现,但可以用来买股票)。因此,
transferable_cash通常小于或等于available_cash。
-
locked_cash(挂单锁住资金):- 表示因为您下了买入委托(LimitOrder 或 MarketOrder),但订单尚未完全成交而暂时冻结的资金。
- 如果撤销这些未完成的订单,这部分资金会释放回到
available_cash中。
-
available_cash(可用资金):- 表示当前可以用来购买证券的资金。
- 公式大致为:
总资产 - 持仓市值 - 挂单冻结资金(具体计算涉及保证金等,此处为简化理解)。
Q&A
Q: 为什么我的 available_cash 大于 transferable_cash?
A: 这通常是因为您在当天卖出了股票。在 A 股市场(T+1),当天卖出股票回笼的资金可以立即用于购买其他股票(计入 available_cash),但必须等到下一个交易日才能提现或转出(计入 transferable_cash)。
Q: locked_cash 包含交易佣金吗?
A: 是的。在下买单冻结资金时,系统通常会根据订单金额加上预估的手续费(佣金、印花税等)一起冻结。如果最终成交或撤单,多冻结的部分会退回。
Q: 如何释放 locked_cash?
A: 您可以通过调用 cancel_order() 函数撤销未完成的订单。撤单成功后,被锁定的资金会立即释放回可用资金中。
Q: 期货账户的资金查询方式一样吗?
A: 属性名称是一样的。但在期货账户中,locked_cash 指的是挂单占用的保证金。同时期货账户还涉及 margin(持仓保证金),这部分资金既不算在 available_cash 也不算在 locked_cash 中,而是作为持仓占用。