🚀 AI 一键生成 qmt 策略代码

QMT API 如何查询信用账户的融资融券负债与担保品详情?

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

问题描述

怎么用代码查询我的信用账户里有哪些融资负债,以及哪些股票是担保品?

解决方案

在 QMT 中,查询信用账户(两融账户)的融资负债和担保品主要使用以下两个 API 函数:

  1. get_debt_contract(accId):获取信用账户负债合约明细。通过该函数可以查询到具体的融资合约、未还金额、截止日期等。
  2. get_assure_contract(accId):获取信用账户担保合约明细。通过该函数可以查询账户中作为担保品的持仓股票信息。

策略代码实现

以下是一个完整的 Python 策略代码示例。请注意,你需要将代码中的 YOUR_CREDIT_ACCOUNT_ID 替换为你实际的信用资金账号。

# -*- coding: gbk -*-
import time

def init(ContextInfo):
    # 设置账户类型为信用账户 'CREDIT'
    ContextInfo.accountType = 'CREDIT'
    
    # 【重要】请在此处填写您的信用资金账号
    ContextInfo.accid = 'YOUR_CREDIT_ACCOUNT_ID' 
    
    # 绑定账号,以便接收交易回报(虽然查询函数不强制绑定,但建议加上)
    ContextInfo.set_account(ContextInfo.accid)
    
    print("策略初始化完成,准备查询信用账户信息...")

def handlebar(ContextInfo):
    # 为了避免在回测或历史K线上重复打印,只在最新的一根K线上执行查询
    if not ContextInfo.is_last_bar():
        return

    # 获取当前账号
    acc_id = ContextInfo.accid
    
    print("=" * 50)
    print(f"开始查询账号 {acc_id} 的两融信息")
    print("=" * 50)

    # ---------------------------------------------------
    # 1. 查询融资负债 (Financing Debts)
    # ---------------------------------------------------
    print("【融资负债明细】:")
    
    # 调用 get_debt_contract 获取负债合约列表
    debt_list = get_debt_contract(acc_id)
    
    if len(debt_list) == 0:
        print("当前无融资负债合约。")
    else:
        # 遍历每一个负债合约对象
        for obj in debt_list:
            # 提取常用字段
            code = obj.m_strInstrumentID       # 证券代码
            name = obj.m_strInstrumentName     # 证券名称
            debt_balance = obj.m_dUnRepayBalance # 负债金额 (未还金额)
            contract_date = obj.m_nOpenDate    # 合约开仓日期
            end_date = obj.m_nRetEndDate       # 归还截止日
            compact_type = obj.m_eCompactType  # 合约类型 (48:融资, 49:融券)
            
            type_str = "融资" if compact_type == 48 else "融券"
            
            print(f"合约类型: {type_str} | 代码: {code} ({name}) | "
                  f"负债金额: {debt_balance:.2f} | 开仓日: {contract_date} | 到期日: {end_date}")

    print("-" * 50)

    # ---------------------------------------------------
    # 2. 查询担保品 (Collateral / Assurance)
    # ---------------------------------------------------
    print("【担保品明细】:")
    
    # 调用 get_assure_contract 获取担保合约明细
    assure_list = get_assure_contract(acc_id)
    
    if len(assure_list) == 0:
        print("当前无担保品持仓。")
    else:
        # 遍历每一个担保品对象
        for obj in assure_list:
            # 提取常用字段
            code = obj.m_strInstrumentID       # 证券代码
            name = obj.m_strInstrumentName     # 证券名称
            # 注意:get_assure_contract 返回的对象属性可能因券商柜台差异略有不同
            # 通常包含代码和名称,具体持仓数量建议结合 get_trade_detail_data('POSITION') 确认
            
            # 尝试获取折算率 (部分柜台支持)
            ratio = obj.m_dAssureRatio if hasattr(obj, 'm_dAssureRatio') else 0.0
            
            print(f"担保品代码: {code} ({name}) | 折算率: {ratio}")

    print("=" * 50)

代码说明

  1. 初始化 (init):

    • 设置了 ContextInfo.accid请务必将其修改为你真实的信用账号
    • 使用 ContextInfo.set_account() 绑定账号。
  2. 执行逻辑 (handlebar):

    • if not ContextInfo.is_last_bar(): return:这行代码确保查询逻辑只在策略运行到最新行情时执行一次,防止在回测历史数据时刷屏。
  3. 查询负债 (get_debt_contract):

    • 返回的是一个对象列表,每个对象代表一笔合约。
    • 关键属性:
      • m_strInstrumentID: 标的代码。
      • m_dUnRepayBalance: 最核心的数据,即该笔合约当前的负债金额(未还金额)。
      • m_nRetEndDate: 负债归还的截止日期,用于风控管理。
      • m_eCompactType: 区分是融资(48)还是融券(49)。
  4. 查询担保品 (get_assure_contract):

    • 返回的是信用账户中作为担保品的持仓明细。
    • 关键属性:
      • m_strInstrumentID: 担保品代码。
      • m_dAssureRatio: 担保品折算率(注意:并非所有柜台接口都准确返回此字段,具体以实盘打印为准)。

常见问题 Q&A

Q: 为什么 get_assure_contract 查出来的数量和我的持仓数量不完全一致?
A: get_assure_contract 主要侧重于担保品的属性(如折算率、是否可作为担保)。如果你需要查询精确的持仓数量持仓市值,建议配合使用 get_trade_detail_data(acc_id, 'CREDIT', 'POSITION'),那个接口返回的是标准的持仓对象,包含 m_nVolume (持仓量) 和 m_dMarketValue (市值)。

Q: 如何区分融资负债和融券负债?
A: 在 get_debt_contract 返回的对象中,检查 m_eCompactType 属性。通常 48 代表融资,49 代表融券。

Q: 这些函数在回测模式下有效吗?
A: 无效。get_debt_contractget_assure_contract 是交易接口,仅在实盘模式下连接柜台后才能获取真实数据。回测模式下返回为空或模拟数据。