🚀 AI 一键生成 qmt 策略代码
立即体验
👉 AI 生成代码 👈

国金QMT总资产计算不对?少了的钱去哪了?(附排查代码)

qmt | 发布时间: 2026/5/29
以下内容由 EasyQuant 生成。

问题描述

国金qmt 内总资产计算好像不对

没有委托的订单,现在总资产不应该是 9993427.46 + 6562 = 9999989.46,怎么变成 9999833.46,钱少了

解决方案

遇到总资产与“可用资金 + 持仓市值”不符的情况,在QMT实盘或模拟交易中非常常见。您发现的差额(156元)并不是钱真的“少了”,而是由于底层资金账户的统计口径和部分隐藏状态字段导致的。

在QMT的底层逻辑中,总资产(m_dBalance) ≠ 可用金额(m_dAvailable) + 总市值(m_dInstrumentValue)。完整的计算公式通常还包含以下几个部分:

1. 常见的资金差异原因

  • 冻结资金与冻结手续费(m_dFrozenCash / m_dFrozenCommission):即使您当前没有挂单(未成交的委托),如果在日内有过交易,部分手续费或印花税可能处于“冻结”或“待交收”状态,尚未从总资产中彻底清算,但已经从可用资金中扣除。
  • 待交收金额(m_dBuyWaitMoney / m_dSellWaitMoney):A股实行T+1交收制度。当天卖出股票的资金在当天是“可用不可取”的,这部分资金在底层接口中可能被记入待交收金额,从而导致简单的加总出现偏差。
  • 市值计算的取价差异:您手动计算的市值可能是基于“最新价”,而系统总资产中的市值(m_dInstrumentValue)在某些特定时间段(如盘后)可能是基于“结算价”或“收盘价”计算的。

2. 如何用代码精准排查?

为了找出这156元到底在哪个字段里,您可以编写一段简单的QMT Python策略,调用 get_trade_detail_data 接口,将账户的所有资金明细打印出来对账:

#coding:gbk
def init(ContextInfo):
    # 替换为您的实际资金账号
    ContextInfo.accid = '您的资金账号'

def handlebar(ContextInfo):
    if not ContextInfo.is_last_bar():
        return
    
    # 获取账户资金信息
    account_list = get_trade_detail_data(ContextInfo.accid, 'stock', 'account')
    if len(account_list) > 0:
        acc = account_list[0]
        print("=== 资金账户排查明细 ===")
        print("总资产 (m_dBalance):", acc.m_dBalance)
        print("可用金额 (m_dAvailable):", acc.m_dAvailable)
        print("总市值 (m_dInstrumentValue):", acc.m_dInstrumentValue)
        print("冻结金额 (m_dFrozenCash):", acc.m_dFrozenCash)
        print("冻结手续费 (m_dFrozenCommission):", acc.m_dFrozenCommission)
        print("买入待交收 (m_dBuyWaitMoney):", acc.m_dBuyWaitMoney)
        print("卖出待交收 (m_dSellWaitMoney):", acc.m_dSellWaitMoney)
        print("出入金净值 (m_dCashIn):", acc.m_dCashIn)
        print("========================")

3. 解决建议

运行上述代码后,查看日志输出。您大概率会在 m_dFrozenCash(冻结金额)、m_dFrozenCommission(冻结手续费)或待交收字段中找到这156元的差额。如果是盘中交易产生的手续费或印花税冻结,通常在当日晚间券商清算结算后(一般在晚上20:00 - 22:00之后),总资产和可用资金的数据就会恢复精确对应。