🚀 AI 一键生成 joinquant 策略代码

JoinQuant 账户中的 locked_cash 是如何计算的?

joinquant | 发布时间: 2025/12/24
以下内容由 EasyQuant 生成。

问题描述

为什么我的可用资金变少了?如何查看因挂单而冻结的资金(locked_cash)?

解决方案

在聚宽(JoinQuant)平台中,可用资金(available_cash)减少通常是由挂单冻结交易成交扣除手续费引起的。其中,因限价单(Limit Order)未成交而导致的资金冻结是新手最容易忽视的原因。

以下是详细的分析和查看方法:

1. 为什么可用资金变少了?

可用资金计算公式大致为:
$$ \text{可用资金} = \text{总现金} - \text{挂单冻结资金} $$

导致可用资金减少的常见原因如下:

  • 挂单冻结(最常见原因): 当您下了一个限价单(Limit Order)买入股票,但该订单尚未成交(状态为 open)时,系统会暂时冻结这部分资金(包含预计的交易成本),以确保成交时有足够的钱支付。这部分资金会从 available_cash 转移到 locked_cash
  • 交易成交: 订单成交后,现金转换为持仓市值,可用资金自然减少。
  • 交易费用: 每次交易产生的佣金(Commission)和印花税(Tax)会直接从现金中扣除。
  • 保证金变化(期货/两融): 如果涉及期货或融资融券,保证金比例的变化或持仓亏损也可能导致可用资金变化。

2. 如何查看因挂单而冻结的资金(locked_cash)?

您可以通过 context.portfolio 对象来访问账户的资金详情。

  • 属性名称: context.portfolio.locked_cash
  • 含义: 当前因未完成的订单(挂单)而锁定的资金金额。

3. 代码示例

以下代码展示了如何在策略中打印当前的可用资金和冻结资金,并演示了下达一个无法立即成交的限价单后,资金是如何变化的。

# -*- coding: utf-8 -*-
def initialize(context):
    # 设置我们要操作的股票,例如平安银行
    g.security = '000001.XSHE'
    # 每天开盘时运行
    run_daily(market_open, time='09:30')

def market_open(context):
    # 1. 打印下单前的资金情况
    log.info("【下单前】可用资金: %.2f" % context.portfolio.available_cash)
    log.info("【下单前】冻结资金: %.2f" % context.portfolio.locked_cash)
    
    # 2. 下一个极低价格的限价单(模拟挂单未成交的情况)
    # 获取当前价格
    current_price = get_current_data()[g.security].last_price
    # 以当前价格的 90% 买入 1000 股,这通常不会立即成交,会形成挂单
    limit_price = current_price * 0.9
    
    log.info("正在以 %.2f 的价格挂单买入 1000 股..." % limit_price)
    order(g.security, 1000, style=LimitOrderStyle(limit_price))
    
    # 3. 打印下单后的资金情况
    # 注意:在回测和模拟交易中,order执行后资金会立即冻结
    log.info("【下单后】可用资金: %.2f" % context.portfolio.available_cash)
    log.info("【下单后】冻结资金: %.2f" % context.portfolio.locked_cash)
    
    # 4. 检查未完成订单
    open_orders = get_open_orders()
    if open_orders:
        log.info("当前存在未完成订单,资金已被冻结。")

4. 关键点总结

  1. available_cash (可用资金):您可以用来购买新标的的资金。
  2. locked_cash (冻结资金):因为挂了买单但还没成交,系统暂时锁住的资金。
  3. transferable_cash (可取资金):可以提现的资金(通常不包含当日卖出股票所得的资金,受T+1规则限制)。
  4. 撤单释放资金:如果您发现 locked_cash 占用过多且不想等待成交,可以使用 cancel_order() 撤销未完成的订单,冻结的资金会立即恢复到 available_cash 中。

Q&A

Q: 如何释放被冻结的资金(locked_cash)?
A: 您需要撤销未完成的订单。可以使用 get_open_orders() 获取未完成订单列表,然后使用 cancel_order(order_id) 进行撤单。撤单成功后,locked_cash 会自动加回 available_cash

Q: 为什么我卖出股票后,可用资金增加了,但可取资金(transferable_cash)没有增加?
A: A股市场实行 T+1 制度。当日卖出股票获得的资金在当日可以用作购买其他股票(即计入 available_cash),但不能当日提现。这部分资金会在下一个交易日变成可取资金(transferable_cash)。

Q: 市价单(Market Order)会冻结资金吗?
A: 会。虽然市价单通常立即成交,但在撮合的瞬间,系统仍会根据当前价格计算预计成本并进行冻结。如果成交极快,您可能观察不到冻结状态的持续,直接看到可用资金减少和持仓增加。但在回测机制中,如果市价单因涨停等原因未完全成交,剩余部分也会产生冻结或被撤销(取决于具体的撮合机制设置)。